mirror of
https://github.com/antopilo/Nuake.git
synced 2026-09-09 20:08:57 +03:00
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:
@@ -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);
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user