diff --git a/Editor/src/Windows/SceneEditor/Widgets/ViewportWidget.cpp b/Editor/src/Windows/SceneEditor/Widgets/ViewportWidget.cpp index b530e0b5..5f7abc81 100644 --- a/Editor/src/Windows/SceneEditor/Widgets/ViewportWidget.cpp +++ b/Editor/src/Windows/SceneEditor/Widgets/ViewportWidget.cpp @@ -5,10 +5,29 @@ #include "../../EditorInterface.h" +#include "src/Rendering/Vulkan/VulkanRenderer.h" +#include "src/Rendering/Vulkan/SceneViewport.h" + #include 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(); + auto viewport = vkRenderer.CreateViewport(viewId, defaultSize); + vkRenderer.RegisterSceneViewport(context.GetScene(), viewport->GetID()); + sceneViewport = viewport; +} + +ViewportWidget::~ViewportWidget() +{ + Nuake::VkRenderer::Get().RemoveViewport(sceneViewport->GetID()); +} + void ViewportWidget::Update(float ts) { diff --git a/Editor/src/Windows/SceneEditor/Widgets/ViewportWidget.h b/Editor/src/Windows/SceneEditor/Widgets/ViewportWidget.h index e51d1585..6d77e0a2 100644 --- a/Editor/src/Windows/SceneEditor/Widgets/ViewportWidget.h +++ b/Editor/src/Windows/SceneEditor/Widgets/ViewportWidget.h @@ -6,17 +6,24 @@ class EditorContext; +namespace MyNamespace +{ + class Viewport; +} + class ViewportWidget : public IEditorWidget { private: + Ref sceneViewport; + ImGuizmo::OPERATION CurrentOperation = ImGuizmo::TRANSLATE; ImGuizmo::MODE CurrentMode = ImGuizmo::WORLD; bool UseSnapping = true; Nuake::Vector3 CurrentSnapping = { 0.05f, 0.05f, 0.05f }; public: - ViewportWidget(EditorContext& context) : IEditorWidget(context) {} - ~ViewportWidget() = default; + ViewportWidget(EditorContext& context) : IEditorWidget(context); + ~ViewportWidget(); public: void Update(float ts) override; diff --git a/Nuake/src/Rendering/Vulkan/SceneViewport.cpp b/Nuake/src/Rendering/Vulkan/SceneViewport.cpp new file mode 100644 index 00000000..b5d118bb --- /dev/null +++ b/Nuake/src/Rendering/Vulkan/SceneViewport.cpp @@ -0,0 +1,15 @@ +#include "SceneViewport.h" + +#include "src/Rendering/Vulkan/VulkanImage/VulkanImage.h" + +using namespace Nuake; + +Viewport::Viewport(UUID inViewId, const Vector2& inViewportSize) : + id(UUID()), + viewportSize(inViewportSize), + viewId(inViewId) +{ + // Create render target + renderTarget = CreateRef(ImageFormat::RGBA8, viewportSize); +} + diff --git a/Nuake/src/Rendering/Vulkan/SceneViewport.h b/Nuake/src/Rendering/Vulkan/SceneViewport.h new file mode 100644 index 00000000..16541d95 --- /dev/null +++ b/Nuake/src/Rendering/Vulkan/SceneViewport.h @@ -0,0 +1,35 @@ +#pragma once +#include "src/Core/Core.h" +#include "src/Core/Maths.h" +#include "src/Resource/UUID.h" + + +namespace Nuake +{ + class VulkanImage; + + class Viewport + { + private: + UUID id; + Vector2 viewportSize; + + UUID viewId; + Ref renderTarget; + + public: + Viewport(UUID viewId, const Vector2& size); + ~Viewport() = default; + + public: + UUID GetID() const { return id; } + + const Vector2& GetViewportSize() const { return viewportSize; } + void SetViewportSize(const Vector2& size) + { + viewportSize = size; + } + + Ref GetRenderTarget() const { return renderTarget; } + }; +} \ No newline at end of file diff --git a/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp b/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp index f4ff2b7c..fd131ebe 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp +++ b/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp @@ -380,10 +380,55 @@ void VkRenderer::UpdateDescriptorSets() vkUpdateDescriptorSets(Device, 1, &drawImageWrite, 0, nullptr); } -void VkRenderer::DrawScene(RenderContext ctx) +Ref VkRenderer::CreateViewport(const UUID& viewId, const Vector2& size) { - SceneRenderer->BeginScene(ctx); - SceneRenderer->EndScene(); + + Ref newViewport = CreateRef(viewId, size); + Viewports[viewId] = newViewport; + return newViewport; +} + +void VkRenderer::RemoveViewport(const UUID& viewportId) +{ + Viewports.erase(viewportId); +} + +void VkRenderer::RegisterSceneViewport(const Ref& scene, const UUID& viewportId) +{ + if (Viewports.find(viewportId) == Viewports.end()) + { + Logger::Log("Failed to register scene viewport: viewport not found", "vulkan", CRITICAL); + return; + } + + SceneViewports[scene].push_back(viewportId); +} + +void VkRenderer::UnRegisterSceneViewport(const Ref& scene, const UUID& viewportId) +{ + if (SceneViewports.find(scene) == SceneViewports.end()) + { + Logger::Log("Failed to unregister scene viewport: scene not found", "vulkan", CRITICAL); + return; + } + + auto& viewports = SceneViewports[scene]; + auto it = std::find(viewports.begin(), viewports.end(), viewportId); + if (it != viewports.end()) + { + viewports.erase(it); + } +} + +void PrepareSceneData(const Ref& scene) +{ + // Prepare scene data + +} + +void DrawSceneViewport(const Ref& scene, const UUID& viewportId) +{ + // Draw scene viewport } void VkRenderer::InitImgui() diff --git a/Nuake/src/Rendering/Vulkan/VulkanRenderer.h b/Nuake/src/Rendering/Vulkan/VulkanRenderer.h index 2e88ba57..1e354717 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanRenderer.h +++ b/Nuake/src/Rendering/Vulkan/VulkanRenderer.h @@ -12,6 +12,8 @@ #include "VulkanAllocatedBuffer.h" #include "VulkanSceneRenderer.h" +#include "src/Resource/UUID.h" + #include #include @@ -131,6 +133,8 @@ namespace Nuake // Renderer configuration constexpr uint32_t FRAME_OVERLAP = 2; + + class Viewport; class VkRenderer { @@ -163,6 +167,8 @@ namespace Nuake DeletionQueue MainDeletionQueue; DescriptorAllocator GlobalDescriptorAllocator; + + public: VkDescriptorSet DrawImageDescriptors; VkDescriptorSetLayout DrawImageDescriptorLayout; @@ -174,6 +180,8 @@ namespace Nuake Ref SceneRenderer; + + public: static VkRenderer& Get() { @@ -192,6 +200,9 @@ namespace Nuake Ref DepthImage; VkExtent2D DrawExtent; + std::map> Viewports; + std::map, std::vector> SceneViewports; + public: void Initialize(); void CleanUp(); @@ -210,6 +221,15 @@ namespace Nuake void DrawScene(RenderContext ctx); void InitImgui(); + Ref CreateViewport(const UUID& viewId, const Vector2& size); + void RemoveViewport(const UUID& viewportId); + + void RegisterSceneViewport(const Ref& scene, const UUID& viewportId); + void UnRegisterSceneViewport(const Ref& scene, const UUID& viewportId); + + void PrepareSceneData(const Ref& scene); + void DrawSceneViewport(const Ref& scene, const UUID& viewportId); + void BeginScene(const UUID& camera); bool Draw(); void EndDraw();