From cede05a309957504eb1ea7982de3461364c650a5 Mon Sep 17 00:00:00 2001 From: antopilo Date: Sat, 8 Feb 2025 18:32:02 -0500 Subject: [PATCH] Viewport now resets to the correct camera after changing scene --- .../Windows/SceneEditor/SceneEditorWindow.cpp | 5 +++++ .../SceneEditor/Widgets/IEditorWidget.h | 2 ++ .../SceneEditor/Widgets/ViewportWidget.cpp | 18 ++++++++++++++++++ .../SceneEditor/Widgets/ViewportWidget.h | 1 + 4 files changed, 26 insertions(+) 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