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
This commit is contained in:
Antoine Pilote
2023-07-06 18:50:29 -04:00
parent 3b6eac356b
commit 57bce04d23
6 changed files with 34 additions and 9 deletions

View File

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

View File

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

View File

@@ -12,6 +12,7 @@ namespace Nuake
{
Ref<Mesh> Mesh;
Matrix4 transform;
uint32_t entityId;
};
class RenderList
@@ -22,14 +23,14 @@ namespace Nuake
this->m_RenderList = std::map<Ref<Material>, std::vector<RenderMesh>>();
}
void AddToRenderList(Ref<Mesh> mesh, Matrix4 transform)
void AddToRenderList(Ref<Mesh> mesh, Matrix4 transform, const uint32_t entityId = -1)
{
Ref<Material> material = mesh->GetMaterial();
if (m_RenderList.find(material) == m_RenderList.end())
m_RenderList[material] = std::vector<RenderMesh>();
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);
}
}

View File

@@ -108,14 +108,14 @@ namespace Nuake
{
}
void Renderer::SubmitMesh(Ref<Mesh> mesh, Matrix4 transform)
void Renderer::SubmitMesh(Ref<Mesh> 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)

View File

@@ -60,7 +60,7 @@ namespace Nuake
static void LoadShaders();
static void BeginScene();
static void SubmitMesh(Ref<Mesh> mesh, Matrix4 transform);
static void SubmitMesh(Ref<Mesh> mesh, Matrix4 transform, const uint32_t entityId = -1);
static void SubmitCube(Matrix4 transform);
static void Flush(Shader* shader, bool depthOnly = false);

View File

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