From 57bce04d236d4dec630c20f7603584e8ec23057f Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Thu, 6 Jul 2023 18:50:29 -0400 Subject: [PATCH] Added mouse picking for selecting entities - Added entity id uniform to the gbuffer - Added entity id to RenderList - Added selecting when clicking on an entity --- Editor/resources/Shaders/gbuffer.shader | 3 ++- Editor/src/Windows/EditorInterface.cpp | 18 ++++++++++++++++++ Nuake/src/Rendering/RenderList.h | 6 ++++-- Nuake/src/Rendering/Renderer.cpp | 6 +++--- Nuake/src/Rendering/Renderer.h | 2 +- Nuake/src/Rendering/SceneRenderer.cpp | 8 ++++++-- 6 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Editor/resources/Shaders/gbuffer.shader b/Editor/resources/Shaders/gbuffer.shader index 1708ab4a..9d7aa722 100644 --- a/Editor/resources/Shaders/gbuffer.shader +++ b/Editor/resources/Shaders/gbuffer.shader @@ -53,6 +53,7 @@ uniform sampler2D m_Roughness; uniform sampler2D m_AO; uniform sampler2D m_Normal; uniform sampler2D m_Displacement; +uniform int u_EntityID; layout(std140, binding = 32) uniform u_MaterialUniform { @@ -104,5 +105,5 @@ void main() gMaterial.g = finalAO; gMaterial.b = finalRoughness; - gEntityID = int(gAlbedo.r * 255.0); + gEntityID = int(u_EntityID); } \ No newline at end of file diff --git a/Editor/src/Windows/EditorInterface.cpp b/Editor/src/Windows/EditorInterface.cpp index 5eb4614a..0b3ae306 100644 --- a/Editor/src/Windows/EditorInterface.cpp +++ b/Editor/src/Windows/EditorInterface.cpp @@ -231,11 +231,29 @@ namespace Nuake { tc.SetGlobalTransform(transform); } } + + if (m_IsHoveringViewport && Input::IsMouseButtonPressed(GLFW_MOUSE_BUTTON_1) && !ImGuizmo::IsUsing()) + { + const auto windowPosNuake = Vector2(windowPos.x, windowPos.y); + auto& gbuffer = Engine::GetCurrentScene()->mSceneRenderer->GetGBuffer(); + auto pixelPos = Input::GetMousePosition() - windowPosNuake; + pixelPos.y = gbuffer.GetSize().y - pixelPos.y; // imgui coords are inverted on the Y axis + + gbuffer.Bind(); + + if (const int result = gbuffer.ReadPixel(3, pixelPos); result >= 0) + { + Selection = EditorSelection(Entity{ (entt::entity)result, Engine::GetCurrentScene().get() }); + } + + gbuffer.Unbind(); + } } else { ImGui::PopStyleVar(); } + ImGui::End(); } diff --git a/Nuake/src/Rendering/RenderList.h b/Nuake/src/Rendering/RenderList.h index 62747b00..4694a589 100644 --- a/Nuake/src/Rendering/RenderList.h +++ b/Nuake/src/Rendering/RenderList.h @@ -12,6 +12,7 @@ namespace Nuake { Ref Mesh; Matrix4 transform; + uint32_t entityId; }; class RenderList @@ -22,14 +23,14 @@ namespace Nuake this->m_RenderList = std::map, std::vector>(); } - void AddToRenderList(Ref mesh, Matrix4 transform) + void AddToRenderList(Ref mesh, Matrix4 transform, const uint32_t entityId = -1) { Ref material = mesh->GetMaterial(); if (m_RenderList.find(material) == m_RenderList.end()) m_RenderList[material] = std::vector(); - m_RenderList[material].push_back({mesh, transform}); + m_RenderList[material].push_back({mesh, transform, entityId}); } void Flush(Shader* shader, bool depthOnly = false) @@ -43,6 +44,7 @@ namespace Nuake for (auto& m : i.second) { shader->SetUniformMat4f("u_Model", m.transform); + shader->SetUniform1i("u_EntityID", m.entityId); m.Mesh->Draw(shader, false); } } diff --git a/Nuake/src/Rendering/Renderer.cpp b/Nuake/src/Rendering/Renderer.cpp index b316d193..bed53287 100644 --- a/Nuake/src/Rendering/Renderer.cpp +++ b/Nuake/src/Rendering/Renderer.cpp @@ -108,14 +108,14 @@ namespace Nuake { } - void Renderer::SubmitMesh(Ref mesh, Matrix4 transform) + void Renderer::SubmitMesh(Ref mesh, Matrix4 transform, const uint32_t entityId) { - m_RenderList.AddToRenderList(mesh, transform); + m_RenderList.AddToRenderList(mesh, transform, entityId); } void Renderer::SubmitCube(Matrix4 transform) { - m_RenderList.AddToRenderList(CubeMesh, transform); + m_RenderList.AddToRenderList(CubeMesh, transform, -1); } void Renderer::Flush(Shader* shader, bool depthOnly) diff --git a/Nuake/src/Rendering/Renderer.h b/Nuake/src/Rendering/Renderer.h index 54b89185..dae75fe9 100644 --- a/Nuake/src/Rendering/Renderer.h +++ b/Nuake/src/Rendering/Renderer.h @@ -60,7 +60,7 @@ namespace Nuake static void LoadShaders(); static void BeginScene(); - static void SubmitMesh(Ref mesh, Matrix4 transform); + static void SubmitMesh(Ref mesh, Matrix4 transform, const uint32_t entityId = -1); static void SubmitCube(Matrix4 transform); static void Flush(Shader* shader, bool depthOnly = false); diff --git a/Nuake/src/Rendering/SceneRenderer.cpp b/Nuake/src/Rendering/SceneRenderer.cpp index fe11ddad..44bf3960 100644 --- a/Nuake/src/Rendering/SceneRenderer.cpp +++ b/Nuake/src/Rendering/SceneRenderer.cpp @@ -223,7 +223,9 @@ namespace Nuake { if (mesh.ModelResource && visibility.Visible) { for (auto& m : mesh.ModelResource->GetMeshes()) - Renderer::SubmitMesh(m, transform.GetGlobalTransform()); + { + Renderer::SubmitMesh(m, transform.GetGlobalTransform(), (uint32_t)e); + } } } @@ -240,7 +242,9 @@ namespace Nuake { continue; for (auto& b : model.Meshes) - Renderer::SubmitMesh(b, transform.GetGlobalTransform()); + { + Renderer::SubmitMesh(b, transform.GetGlobalTransform(), (uint32_t)e); + } } Renderer::Flush(gBufferShader, false); }