Proper viewport disabling with material editor window

This commit is contained in:
antopilo
2025-04-26 23:07:20 -04:00
parent 7cb7a72630
commit 60819fe1d3
9 changed files with 96 additions and 46 deletions

View File

@@ -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;

View File

@@ -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)

View File

@@ -26,6 +26,9 @@ enum class Shapes
Shapes currentShape = Shapes::Sphere;
Ref<Nuake::Viewport> MaterialEditor::SceneViewport = nullptr;
Ref<Nuake::Scene> MaterialEditor::PreviewScene = nullptr;
void MaterialEditor::Enable()
{
SceneViewport->SetActive(true);
@@ -40,33 +43,61 @@ MaterialEditor::MaterialEditor()
{
using namespace Nuake;
PreviewScene = CreateRef<Nuake::Scene>();
PreviewScene->GetEnvironment()->mVolumetric->SetFogAmount(1.0f);
if (!SceneViewport)
{
PreviewScene = CreateRef<Nuake::Scene>();
PreviewScene->GetEnvironment()->mVolumetric->SetFogAmount(1.0f);
auto camera = PreviewScene->CreateEntity("Camera");
camera.GetComponent<Nuake::TransformComponent>().Translation = Nuake::Vector3(-2, 0, -2);
auto& camComponent = camera.AddComponent<Nuake::CameraComponent>();
camComponent.CameraInstance->Fov = 44.0f;
auto light = PreviewScene->CreateEntity("Light");
auto& lightC = light.AddComponent<LightComponent>();
auto& lightT = light.AddComponent<TransformComponent>();
lightC.CastShadows = false;
lightC.Type = LightType::Directional;
auto camera = PreviewScene->CreateEntity("Camera");
camera.GetComponent<Nuake::TransformComponent>().Translation = Nuake::Vector3(-2, 0, -2);
auto& camComponent = camera.AddComponent<Nuake::CameraComponent>();
camComponent.CameraInstance->Fov = 44.0f;
auto light = PreviewScene->CreateEntity("Light");
auto& lightC = light.AddComponent<LightComponent>();
auto& lightT = light.AddComponent<TransformComponent>();
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<TransformComponent>();
lightT.GlobalRotation = glm::quat_cast(rotationMatrix);
//auto& lightT = light.GetComponent<TransformComponent>();
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<CameraComponent>();
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<Nuake::ModelComponent>();
@@ -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<CameraComponent>();
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<Nuake::Material> material)

View File

@@ -4,11 +4,13 @@
#include <Nuake/Scene/Scene.h>
#include "Nuake/Rendering/Vulkan/SceneViewport.h"
class MaterialEditor
{
private:
Ref<Nuake::Scene> PreviewScene;
Ref<Nuake::Viewport> SceneViewport;
static Ref<Nuake::Scene> PreviewScene;
static Ref<Nuake::Viewport> SceneViewport;
public:
MaterialEditor();
~MaterialEditor() = default;

View File

@@ -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();

View File

@@ -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)

View File

@@ -8,6 +8,7 @@ class IEditorWidget
{
protected:
EditorContext& editorContext;
bool visible;
private:
std::string widgetName;
@@ -22,6 +23,14 @@ public:
virtual void OnSceneChanged(Ref<Nuake::Scene> scene) {}
void SetVisible(bool isVisible)
{
visible = isVisible;
}
virtual void OnVisible() {}
virtual void OnHidden() {}
void DockTo(uint32_t dockId)
{
ImGui::DockBuilderDockWindow(widgetName.c_str(), dockId);

View File

@@ -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<Nuake::Scene> 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;

View File

@@ -50,6 +50,9 @@ public:
void Draw() override;
void OnSceneChanged(Ref<Nuake::Scene> scene) override;
void OnVisible() override;
void OnHidden() override;
void OnLineDraw(Nuake::DebugLineCmd& lineCmd);
void OnDebugDraw(Nuake::DebugCmd& debugCmd);