diff --git a/Editor/src/Windows/SceneEditor/Widgets/ViewportWidget.cpp b/Editor/src/Windows/SceneEditor/Widgets/ViewportWidget.cpp index 5f7abc81..9c7f101a 100644 --- a/Editor/src/Windows/SceneEditor/Widgets/ViewportWidget.cpp +++ b/Editor/src/Windows/SceneEditor/Widgets/ViewportWidget.cpp @@ -14,7 +14,6 @@ using namespace Nuake; ViewportWidget::ViewportWidget(EditorContext& context) : IEditorWidget(context) { - const Vector2& defaultSize = { 1280, 720 }; const UUID viewId = editorContext.GetScene()->m_EditorCamera->ID; auto& vkRenderer = Nuake::VkRenderer::Get(); @@ -47,7 +46,7 @@ void ViewportWidget::Draw() Vector2 viewportPanelSize = glm::vec2(regionAvail.x, regionAvail.y); // This is important for make UI mouse coord relative to viewport - // Input::SetViewportDimensions(m_ViewportPos, viewportPanelSize); + // Nuake::Input::SetViewportDimensions(m_ViewportPos, viewportPanelSize); VkDescriptorSet textureDesc = VkRenderer::Get().DrawImage->GetImGuiDescriptorSet(); diff --git a/Editor/src/Windows/SceneEditor/Widgets/ViewportWidget.h b/Editor/src/Windows/SceneEditor/Widgets/ViewportWidget.h index 6d77e0a2..08d9de61 100644 --- a/Editor/src/Windows/SceneEditor/Widgets/ViewportWidget.h +++ b/Editor/src/Windows/SceneEditor/Widgets/ViewportWidget.h @@ -6,7 +6,7 @@ class EditorContext; -namespace MyNamespace +namespace Nuake { class Viewport; } @@ -14,7 +14,7 @@ namespace MyNamespace class ViewportWidget : public IEditorWidget { private: - Ref sceneViewport; + Ref sceneViewport; ImGuizmo::OPERATION CurrentOperation = ImGuizmo::TRANSLATE; ImGuizmo::MODE CurrentMode = ImGuizmo::WORLD; @@ -22,7 +22,7 @@ private: Nuake::Vector3 CurrentSnapping = { 0.05f, 0.05f, 0.05f }; public: - ViewportWidget(EditorContext& context) : IEditorWidget(context); + ViewportWidget(EditorContext& context); ~ViewportWidget(); public: diff --git a/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp b/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp index fd131ebe..5b820ba3 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp +++ b/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp @@ -16,7 +16,7 @@ #include "VulkanAllocatedBuffer.h" #include "VkResources.h" - +#include "SceneViewport.h" #include "src/Rendering/Vertex.h" #include "VulkanSceneRenderer.h" @@ -362,6 +362,12 @@ void VkRenderer::InitDescriptors() } } +void VkRenderer::DrawScene(RenderContext ctx) +{ + SceneRenderer->BeginScene(ctx); + SceneRenderer->EndScene(); +} + void VkRenderer::UpdateDescriptorSets() { VkDescriptorImageInfo imgInfo{}; @@ -382,15 +388,35 @@ void VkRenderer::UpdateDescriptorSets() Ref VkRenderer::CreateViewport(const UUID& viewId, const Vector2& size) { - Ref newViewport = CreateRef(viewId, size); - Viewports[viewId] = newViewport; + Viewports[newViewport->GetID()] = newViewport; return newViewport; } void VkRenderer::RemoveViewport(const UUID& viewportId) { Viewports.erase(viewportId); + + // Make sure we erase them from the Scene -> Viewport map. + // Also remove the scene if the view count reaches 0 to avoid + // dangling reference to the scenes. We should use Scene ID instead + // of shared pointers. + // + // TODO(antopilo) make scene resources. + for (auto& [scene, views] : SceneViewports) + { + auto it = std::find(views.begin(), views.end(), viewportId); + if (it != views.end()) + { + views.erase(it); + + if (SceneViewports[scene].empty()) + { + SceneViewports.erase(scene); + return; + } + } + } } void VkRenderer::RegisterSceneViewport(const Ref& scene, const UUID& viewportId)