diff --git a/Editor/Source/Editor/Windows/SceneEditor/SceneEditorWindow.cpp b/Editor/Source/Editor/Windows/SceneEditor/SceneEditorWindow.cpp index 986f71e2..aed44093 100644 --- a/Editor/Source/Editor/Windows/SceneEditor/SceneEditorWindow.cpp +++ b/Editor/Source/Editor/Windows/SceneEditor/SceneEditorWindow.cpp @@ -121,6 +121,11 @@ bool SceneEditorWindow::IsFocused() const void SceneEditorWindow::SetScene(Ref scene) { editorContext.SetScene(scene); + + for (auto& widget : widgets) + { + widget->OnSceneChanged(scene); + } } Ref SceneEditorWindow::GetScene() const diff --git a/Editor/Source/Editor/Windows/SceneEditor/Widgets/IEditorWidget.h b/Editor/Source/Editor/Windows/SceneEditor/Widgets/IEditorWidget.h index bc0d76a7..33445cfc 100644 --- a/Editor/Source/Editor/Windows/SceneEditor/Widgets/IEditorWidget.h +++ b/Editor/Source/Editor/Windows/SceneEditor/Widgets/IEditorWidget.h @@ -20,6 +20,8 @@ public: virtual void Update(float ts) = 0; virtual void Draw() = 0; + virtual void OnSceneChanged(Ref scene) {} + void DockTo(uint32_t dockId) { ImGui::DockBuilderDockWindow(widgetName.c_str(), dockId); diff --git a/Editor/Source/Editor/Windows/SceneEditor/Widgets/ViewportWidget.cpp b/Editor/Source/Editor/Windows/SceneEditor/Widgets/ViewportWidget.cpp index 2f6444f3..1aa012fa 100644 --- a/Editor/Source/Editor/Windows/SceneEditor/Widgets/ViewportWidget.cpp +++ b/Editor/Source/Editor/Windows/SceneEditor/Widgets/ViewportWidget.cpp @@ -182,4 +182,22 @@ void ViewportWidget::Draw() ImGui::PopStyleVar(); } ImGui::End(); +} + +void ViewportWidget::OnSceneChanged(Ref scene) +{ + auto& vkRenderer = Nuake::VkRenderer::Get(); + + // Recreate new viewport with new scene with the same resolution + const Vector2 currentResolution = sceneViewport->GetViewportSize(); + + // Remove old viewport + vkRenderer.RemoveViewport(sceneViewport->GetID()); + + // Create new viewport with same reoslution + const UUID viewId = editorContext.GetScene()->m_EditorCamera->ID; + auto viewport = vkRenderer.CreateViewport(viewId, currentResolution); + vkRenderer.RegisterSceneViewport(scene, viewport->GetID()); + + sceneViewport = viewport; } \ No newline at end of file diff --git a/Editor/Source/Editor/Windows/SceneEditor/Widgets/ViewportWidget.h b/Editor/Source/Editor/Windows/SceneEditor/Widgets/ViewportWidget.h index 2caf88f9..0e2fbd5a 100644 --- a/Editor/Source/Editor/Windows/SceneEditor/Widgets/ViewportWidget.h +++ b/Editor/Source/Editor/Windows/SceneEditor/Widgets/ViewportWidget.h @@ -29,4 +29,5 @@ public: public: void Update(float ts) override; void Draw() override; + void OnSceneChanged(Ref scene) override; }; \ No newline at end of file