mirror of
https://github.com/antopilo/Nuake.git
synced 2026-09-09 20:08:57 +03:00
Merge pull request #11 from antopilo/feature/editor-mouse-picking
Feature/editor mouse picking
This commit is contained in:
@@ -40,6 +40,7 @@ void main()
|
||||
layout(location = 0) out vec4 gAlbedo;
|
||||
layout(location = 1) out vec4 gNormal;
|
||||
layout(location = 2) out vec4 gMaterial;
|
||||
layout(location = 3) out int gEntityID;
|
||||
|
||||
in vec3 FragPos;
|
||||
in vec2 UV;
|
||||
@@ -52,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
|
||||
{
|
||||
@@ -102,4 +104,6 @@ void main()
|
||||
gMaterial.r = finalMetalness;
|
||||
gMaterial.g = finalAO;
|
||||
gMaterial.b = finalRoughness;
|
||||
|
||||
gEntityID = int(u_EntityID);
|
||||
}
|
||||
@@ -231,11 +231,33 @@ 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 - 1), Engine::GetCurrentScene().get()});
|
||||
}
|
||||
else
|
||||
{
|
||||
Selection = EditorSelection(); // None
|
||||
}
|
||||
|
||||
gbuffer.Unbind();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ImGui::PopStyleVar();
|
||||
}
|
||||
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
|
||||
@@ -126,6 +126,14 @@ namespace Nuake
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
||||
}
|
||||
|
||||
int FrameBuffer::ReadPixel(uint32_t attachment, const Vector2 coords)
|
||||
{
|
||||
glReadBuffer(GL_COLOR_ATTACHMENT0 + attachment);
|
||||
int pixelData;
|
||||
glReadPixels((int)coords.x, (int)coords.y, 1, 1, GL_RED_INTEGER, GL_INT, &pixelData);
|
||||
return pixelData;
|
||||
}
|
||||
|
||||
void FrameBuffer::SetDrawBuffer(GLenum draw)
|
||||
{
|
||||
Bind();
|
||||
|
||||
@@ -38,6 +38,8 @@ namespace Nuake
|
||||
void SetSize(const Vector2& size) { m_Size = size; }
|
||||
void UpdateSize(Vector2 size);
|
||||
|
||||
|
||||
int ReadPixel(uint32_t attachment, const Vector2 coords);
|
||||
void SetDrawBuffer(GLenum draw);
|
||||
void SetReadBuffer(GLenum read);
|
||||
};
|
||||
|
||||
@@ -12,6 +12,7 @@ namespace Nuake
|
||||
{
|
||||
Ref<Mesh> Mesh;
|
||||
Matrix4 transform;
|
||||
int32_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 int32_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 + 1);
|
||||
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 int32_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 int32_t entityId = -1);
|
||||
static void SubmitCube(Matrix4 transform);
|
||||
static void Flush(Shader* shader, bool depthOnly = false);
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace Nuake {
|
||||
mGBuffer->SetTexture(CreateRef<Texture>(defaultResolution, GL_RGB), GL_COLOR_ATTACHMENT0);
|
||||
mGBuffer->SetTexture(CreateRef<Texture>(defaultResolution, GL_RGB), GL_COLOR_ATTACHMENT1);
|
||||
mGBuffer->SetTexture(CreateRef<Texture>(defaultResolution, GL_RGB), GL_COLOR_ATTACHMENT2);
|
||||
mGBuffer->SetTexture(CreateRef<Texture>(defaultResolution, GL_RGB), GL_COLOR_ATTACHMENT3);
|
||||
mGBuffer->SetTexture(CreateRef<Texture>(defaultResolution, GL_RED_INTEGER, GL_R32I, GL_INT), GL_COLOR_ATTACHMENT3);
|
||||
|
||||
mShadingBuffer = CreateScope<FrameBuffer>(true, defaultResolution);
|
||||
mShadingBuffer->SetTexture(CreateRef<Texture>(defaultResolution, GL_RGB, GL_RGB16F, GL_FLOAT));
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -18,6 +18,12 @@ namespace Nuake {
|
||||
void RenderScene(Scene& scene, FrameBuffer& framebuffer);
|
||||
|
||||
Scope<SSR> mSSR;
|
||||
|
||||
FrameBuffer& GetGBuffer() const
|
||||
{
|
||||
return *mGBuffer;
|
||||
}
|
||||
|
||||
private:
|
||||
Matrix4 mProjection, mView;
|
||||
Vector3 mCamPos;
|
||||
|
||||
Reference in New Issue
Block a user