diff --git a/Editor/resources/Shaders/line.shader b/Editor/resources/Shaders/line.shader index 7c175fe7..6224d449 100644 --- a/Editor/resources/Shaders/line.shader +++ b/Editor/resources/Shaders/line.shader @@ -2,7 +2,7 @@ #version 460 core layout(location = 0) in vec3 VertexPosition; -layout(location = 0) in vec4 VertexColor; +layout(location = 1) in vec4 VertexColor; uniform mat4 u_Projection; uniform mat4 u_View; diff --git a/Editor/src/Misc/GizmoDrawer.cpp b/Editor/src/Misc/GizmoDrawer.cpp index d2384878..bfd60480 100644 --- a/Editor/src/Misc/GizmoDrawer.cpp +++ b/Editor/src/Misc/GizmoDrawer.cpp @@ -1,6 +1,7 @@ #include "GizmoDrawer.h" #include #include +#include #include #include #include @@ -20,6 +21,8 @@ GizmoDrawer::GizmoDrawer() mAxisLineBuffer->AddBuffer(*mAxisLineVertexBuffer, *vblayout); + GenerateSphereGizmo(); + // Load gizmos ModelLoader loader; _gizmos = std::map>(); @@ -27,11 +30,53 @@ GizmoDrawer::GizmoDrawer() _gizmos["light"] = loader.LoadModel("resources/Models/Light.gltf"); } +void GizmoDrawer::GenerateSphereGizmo() +{ + const float subDivision = 32.0f; + + constexpr const float pi = glm::pi() * 4.0; + float increment = pi / subDivision; + for (int i = 0; i < subDivision * 2.0; i++) + { + float current = increment * (i); + float x = glm::cos(current) * 1.0; + float z = glm::sin(current) * 1.0; + + current = increment * (i + 1); + float x2 = glm::cos(current) * 1.0; + float z2 = glm::sin(current) * 1.0; + + Vector3 vert1, vert2; + if (i < subDivision) + { + vert1 = Vector3(x, z, 0); + vert2 = Vector3(x2, z2, 0); + } + else + { + vert1 = Vector3(x, 0, z); + vert2 = Vector3(x2, 0, z2); + } + circleVertices.push_back(LineVertex{ vert1, Color(1.0, 0, 0.7, 1.0) }); + circleVertices.push_back(LineVertex{ vert2, Color(1.0, 0, 0.7, 1.0) }); + } + + mCircleBuffer = CreateRef(); + mCircleBuffer->Bind(); + + mCircleVertexBuffer = CreateRef(circleVertices.data(), circleVertices.size() * sizeof(Nuake::LineVertex)); + auto vblayout = CreateRef(); + vblayout->Push(3); + vblayout->Push(4); + + mCircleBuffer->AddBuffer(*mCircleVertexBuffer, *vblayout); +} + void GizmoDrawer::DrawGizmos(Ref scene) { using namespace Nuake; - RenderCommand::Disable(RendererEnum::DEPTH_TEST); - + //RenderCommand::Disable(RendererEnum::DEPTH_TEST); + RenderCommand::Enable(RendererEnum::DEPTH_TEST); // Draw Axis lignes. { mLineShader->Bind(); @@ -42,6 +87,18 @@ void GizmoDrawer::DrawGizmos(Ref scene) Nuake::RenderCommand::DrawLines(0, 6); } + auto sphereColliderView = scene->m_Registry.view(); + for (auto e : sphereColliderView) + { + auto [transform, sphere] = scene->m_Registry.get(e); + mLineShader->Bind(); + mLineShader->SetUniformMat4f("u_View", glm::scale(glm::translate(scene->m_EditorCamera->GetTransform(), transform.Translation), Vector3(sphere.Radius))); + mLineShader->SetUniformMat4f("u_Projection", scene->m_EditorCamera->GetPerspective()); + + mCircleBuffer->Bind(); + Nuake::RenderCommand::DrawLines(0, 128); + } + auto flatShader = ShaderManager::GetShader("resources/Shaders/flat.shader"); flatShader->Bind(); flatShader->SetUniformMat4f("u_View", scene->m_EditorCamera->GetTransform()); diff --git a/Editor/src/Misc/GizmoDrawer.h b/Editor/src/Misc/GizmoDrawer.h index a05127e7..abdfca18 100644 --- a/Editor/src/Misc/GizmoDrawer.h +++ b/Editor/src/Misc/GizmoDrawer.h @@ -18,16 +18,21 @@ private: { LineVertex {{10000.f, 0.0f, 0.0f}, {1.f, 0.f, 0.f, 1.f}}, LineVertex {{0.0f, 0.0f, 0.0f }, {1.f, 0.f, 0.f, 1.f}}, - LineVertex {{0.f, 0.f, 10000.f }, {0.f, 1.f, 0.f, 1.f}}, - LineVertex {{0.0f, 0.0f, 0.0f }, {0.f, 1.f, 0.f, 1.f}}, - LineVertex {{0.f, 10000.f, 0.0f }, {0.f, 0.f, 1.f, 1.f}}, - LineVertex {{0.0f, 0.0f, 0.0f }, {0.f, 0.f, 1.f, 1.f}} + LineVertex {{0.f, 0.f, 10000.f }, {0.f, 0.f, 1.f, 1.f}}, + LineVertex {{0.0f, 0.0f, 0.0f }, {0.f, 0.f, 1.f, 1.f}}, + LineVertex {{0.f, 10000.f, 0.0f }, {0.f, 1.f, 0.f, 1.f}}, + LineVertex {{0.0f, 0.0f, 0.0f }, {0.f, 1.f, 0.f, 1.f}} }; + std::vector circleVertices; Ref mAxisLineBuffer; Ref mAxisLineVertexBuffer; + Ref mCircleBuffer; + Ref mCircleVertexBuffer; Shader* mLineShader; + void GenerateSphereGizmo(); + public: GizmoDrawer(); ~GizmoDrawer() = default;