diff --git a/Data/Shaders/Vulkan/depth_aware_blur.frag b/Data/Shaders/Vulkan/depth_aware_blur.frag index a2875997..ce841498 100644 --- a/Data/Shaders/Vulkan/depth_aware_blur.frag +++ b/Data/Shaders/Vulkan/depth_aware_blur.frag @@ -36,7 +36,7 @@ PSOutput main(PSInput input) { int depthTexture = pushConstants.DepthTextureID; float upSampledDepth = textures[depthTexture].Sample(mySampler[0], input.UV).r; - float3 upSampledColor = textures[pushConstants.VolumetricTextureID].Sample(mySampler[0], input.UV).rgb; + float3 upSampledColor = textures[pushConstants.VolumetricTextureID].Sample(mySampler[1], input.UV).rgb; float3 color = 0.0f.xxx; float totalWeight = 0.0f; @@ -53,7 +53,7 @@ PSOutput main(PSInput input) { float2 uvOffset = float2(offsets[i].x * 4.0, offsets[i].y * 4.0) ; uvOffset = PixelToUV(uvOffset, textures[pushConstants.DepthTextureID]); - float3 downscaledColor = textures[pushConstants.VolumetricTextureID].Sample(mySampler[0], input.UV + uvOffset).rgb; + float3 downscaledColor = textures[pushConstants.VolumetricTextureID].Sample(mySampler[1], input.UV + uvOffset).rgb; float downscaledDepth = textures[pushConstants.DepthTextureID].Sample(mySampler[0], input.UV + uvOffset).r; float currentWeight = 1.0f; diff --git a/Editor/Source/Editor/ComponentsPanel/CameraPanel.h b/Editor/Source/Editor/ComponentsPanel/CameraPanel.h index 7ab97def..822ba90f 100644 --- a/Editor/Source/Editor/ComponentsPanel/CameraPanel.h +++ b/Editor/Source/Editor/ComponentsPanel/CameraPanel.h @@ -21,6 +21,8 @@ public: const UUID viewId = componentPtr->CameraInstance->ID; previewViewport = vkRenderer.CreateViewport(viewId, { 200, 200 }); + previewViewport->SetDebugName("CameraPreviewViewport"); + vkRenderer.RegisterSceneViewport(scene->Shared(), previewViewport->GetID()); } if (componentPtr == nullptr) diff --git a/Editor/Source/Editor/ComponentsPanel/MaterialEditor.cpp b/Editor/Source/Editor/ComponentsPanel/MaterialEditor.cpp index 9c743f10..edf467e0 100644 --- a/Editor/Source/Editor/ComponentsPanel/MaterialEditor.cpp +++ b/Editor/Source/Editor/ComponentsPanel/MaterialEditor.cpp @@ -26,6 +26,9 @@ enum class Shapes Shapes currentShape = Shapes::Sphere; +Ref MaterialEditor::SceneViewport = nullptr; +Ref MaterialEditor::PreviewScene = nullptr; + void MaterialEditor::Enable() { SceneViewport->SetActive(true); @@ -40,33 +43,61 @@ MaterialEditor::MaterialEditor() { using namespace Nuake; - PreviewScene = CreateRef(); - PreviewScene->GetEnvironment()->mVolumetric->SetFogAmount(1.0f); + if (!SceneViewport) + { + PreviewScene = CreateRef(); + PreviewScene->GetEnvironment()->mVolumetric->SetFogAmount(1.0f); + + auto camera = PreviewScene->CreateEntity("Camera"); + camera.GetComponent().Translation = Nuake::Vector3(-2, 0, -2); + auto& camComponent = camera.AddComponent(); + camComponent.CameraInstance->Fov = 44.0f; + auto light = PreviewScene->CreateEntity("Light"); + auto& lightC = light.AddComponent(); + auto& lightT = light.AddComponent(); + lightC.CastShadows = false; + lightC.Type = LightType::Directional; - auto camera = PreviewScene->CreateEntity("Camera"); - camera.GetComponent().Translation = Nuake::Vector3(-2, 0, -2); - auto& camComponent = camera.AddComponent(); - camComponent.CameraInstance->Fov = 44.0f; - auto light = PreviewScene->CreateEntity("Light"); - auto& lightC = light.AddComponent(); - auto& lightT = light.AddComponent(); - lightC.CastShadows = false; - lightC.Type = LightType::Directional; + glm::vec3 forward = glm::normalize(Vector3(.33, -.33, -.33)); + glm::vec3 up = glm::vec3(0, 1, 0); - glm::vec3 forward = glm::normalize(Vector3(.33, -.33, -.33)); - glm::vec3 up = glm::vec3(0, 1, 0); + // Prevent up being colinear with forward + if (glm::abs(glm::dot(forward, up)) > 0.999f) + up = glm::vec3(1, 0, 0); - // Prevent up being colinear with forward - if (glm::abs(glm::dot(forward, up)) > 0.999f) - up = glm::vec3(1, 0, 0); + glm::vec3 right = glm::normalize(glm::cross(up, forward)); + up = glm::cross(forward, right); - glm::vec3 right = glm::normalize(glm::cross(up, forward)); - up = glm::cross(forward, right); + glm::mat3 rotationMatrix(right, up, forward); - glm::mat3 rotationMatrix(right, up, forward); + //auto& lightT = light.GetComponent(); + lightT.GlobalRotation = glm::quat_cast(rotationMatrix); - //auto& lightT = light.GetComponent(); - lightT.GlobalRotation = glm::quat_cast(rotationMatrix); + auto& vkRenderer = Nuake::VkRenderer::Get(); + const UUID viewId = camComponent.CameraInstance->ID; + + SceneViewport = vkRenderer.CreateViewport(viewId, { 200, 200 }); + SceneViewport->SetActive(false); + SceneViewport->SetDebugName("MaterialPreview"); + SceneViewport->GetOnDebugDraw().AddStatic([](DebugCmd& cmd) { + Matrix4 transform = Matrix4(1.0f); + //cmd.DrawQuad(transform); + }); + SceneViewport->GetOnLineDraw().AddStatic([](DebugLineCmd& cmd) { + Matrix4 transform = Matrix4(1.0f); + + auto cam = cmd.GetScene()->GetEntity("Camera"); + auto& camc = cam.GetComponent(); + auto& cami = camc.CameraInstance; + auto proj = cami->GetPerspective(); + auto view = cami->GetTransform(); + //cmd.DrawSphere(proj * view * transform, { 1, 0, 0, 1 }, 2.0f, false); + }); + + //PreviewScene->GetEnvironment()->AmbientColor = { 0, 0, 0, 0 }; + vkRenderer.RegisterSceneViewport(PreviewScene, SceneViewport->GetID()); + } + auto sphere = PreviewScene->CreateEntity("Sphere"); auto& modelComponent = sphere.AddComponent(); @@ -223,27 +254,7 @@ MaterialEditor::MaterialEditor() ResourceManager::RegisterResource(cubeModel); modelComponent.ModelResource = cubeModel->ID; - auto& vkRenderer = Nuake::VkRenderer::Get(); - const UUID viewId = camComponent.CameraInstance->ID; - - SceneViewport = vkRenderer.CreateViewport(viewId, {200, 200}); - SceneViewport->GetOnDebugDraw().AddStatic([](DebugCmd& cmd) { - Matrix4 transform = Matrix4(1.0f); - //cmd.DrawQuad(transform); - }); - SceneViewport->GetOnLineDraw().AddStatic([](DebugLineCmd& cmd) { - Matrix4 transform = Matrix4(1.0f); - - auto cam = cmd.GetScene()->GetEntity("Camera"); - auto& camc = cam.GetComponent(); - auto& cami = camc.CameraInstance; - auto proj = cami->GetPerspective(); - auto view = cami->GetTransform(); - //cmd.DrawSphere(proj * view * transform, { 1, 0, 0, 1 }, 2.0f, false); - }); - - //PreviewScene->GetEnvironment()->AmbientColor = { 0, 0, 0, 0 }; - vkRenderer.RegisterSceneViewport(PreviewScene, SceneViewport->GetID()); + } void MaterialEditor::Draw(Ref material) diff --git a/Editor/Source/Editor/ComponentsPanel/MaterialEditor.h b/Editor/Source/Editor/ComponentsPanel/MaterialEditor.h index 0a228090..792a38d7 100644 --- a/Editor/Source/Editor/ComponentsPanel/MaterialEditor.h +++ b/Editor/Source/Editor/ComponentsPanel/MaterialEditor.h @@ -4,11 +4,13 @@ #include #include "Nuake/Rendering/Vulkan/SceneViewport.h" + class MaterialEditor { private: - Ref PreviewScene; - Ref SceneViewport; + static Ref PreviewScene; + static Ref SceneViewport; + public: MaterialEditor(); ~MaterialEditor() = default; diff --git a/Editor/Source/Editor/Windows/EditorInterface.cpp b/Editor/Source/Editor/Windows/EditorInterface.cpp index 446172ea..1e49e8b2 100644 --- a/Editor/Source/Editor/Windows/EditorInterface.cpp +++ b/Editor/Source/Editor/Windows/EditorInterface.cpp @@ -2693,6 +2693,12 @@ namespace Nuake { GPUResources& gpu = GPUResources::Get(); auto buffers = gpu.GetAllBuffers(); + ImGui::Text("Render Info"); + + auto stats = VkRenderer::Get().Stats; + ImGui::Text(("View rendered: " + std::to_string(stats.ViewRenderers)).c_str()); + ImGui::Text(("View skipped: " + std::to_string(stats.ViewRenderSkipped)).c_str()); + ImGui::Text("General Info"); const size_t textureCount = gpu.GetAllTextures().size(); diff --git a/Editor/Source/Editor/Windows/SceneEditor/SceneEditorWindow.cpp b/Editor/Source/Editor/Windows/SceneEditor/SceneEditorWindow.cpp index f7a7a4d9..8dc41c2a 100644 --- a/Editor/Source/Editor/Windows/SceneEditor/SceneEditorWindow.cpp +++ b/Editor/Source/Editor/Windows/SceneEditor/SceneEditorWindow.cpp @@ -80,6 +80,7 @@ void SceneEditorWindow::Draw() ImGui::DockSpace(dockspaceId, ImGui::GetContentRegionAvail(), ImGuiDockNodeFlags_None, &localSceneEditorClass); for (auto& widget : widgets) { + widget->OnVisible(); widget->Draw(); } @@ -100,6 +101,11 @@ void SceneEditorWindow::Draw() else { this->isFocused = false; + + for (auto& widget : widgets) + { + widget->OnHidden(); + } } ImGui::End(); if (!layoutInitialized) diff --git a/Editor/Source/Editor/Windows/SceneEditor/Widgets/IEditorWidget.h b/Editor/Source/Editor/Windows/SceneEditor/Widgets/IEditorWidget.h index 33445cfc..0e753fb3 100644 --- a/Editor/Source/Editor/Windows/SceneEditor/Widgets/IEditorWidget.h +++ b/Editor/Source/Editor/Windows/SceneEditor/Widgets/IEditorWidget.h @@ -8,6 +8,7 @@ class IEditorWidget { protected: EditorContext& editorContext; + bool visible; private: std::string widgetName; @@ -22,6 +23,14 @@ public: virtual void OnSceneChanged(Ref scene) {} + void SetVisible(bool isVisible) + { + visible = isVisible; + } + + virtual void OnVisible() {} + virtual void OnHidden() {} + 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 1da1cc45..09b944bc 100644 --- a/Editor/Source/Editor/Windows/SceneEditor/Widgets/ViewportWidget.cpp +++ b/Editor/Source/Editor/Windows/SceneEditor/Widgets/ViewportWidget.cpp @@ -59,6 +59,16 @@ void ViewportWidget::Update(float ts) } } +void ViewportWidget::OnVisible() +{ + sceneViewport->SetActive(true); +} + +void ViewportWidget::OnHidden() +{ + sceneViewport->SetActive(false); +} + void ViewportWidget::Draw() { auto oldTarget = overlayOpacity.TargetValue; @@ -270,6 +280,7 @@ void ViewportWidget::OnSceneChanged(Ref scene) // Create new viewport with same reoslution const UUID viewId = editorContext.GetScene()->GetCurrentCamera()->ID; auto viewport = vkRenderer.CreateViewport(viewId, currentResolution); + viewport->SetDebugName("ViewportWidget(" + scene->GetName() + ")"); vkRenderer.RegisterSceneViewport(scene, viewport->GetID()); sceneViewport = viewport; diff --git a/Editor/Source/Editor/Windows/SceneEditor/Widgets/ViewportWidget.h b/Editor/Source/Editor/Windows/SceneEditor/Widgets/ViewportWidget.h index db8c3bef..dd57e0b4 100644 --- a/Editor/Source/Editor/Windows/SceneEditor/Widgets/ViewportWidget.h +++ b/Editor/Source/Editor/Windows/SceneEditor/Widgets/ViewportWidget.h @@ -50,6 +50,9 @@ public: void Draw() override; void OnSceneChanged(Ref scene) override; + void OnVisible() override; + void OnHidden() override; + void OnLineDraw(Nuake::DebugLineCmd& lineCmd); void OnDebugDraw(Nuake::DebugCmd& debugCmd);