Added sphere gizmo

This commit is contained in:
antopilo
2023-03-15 22:10:54 -04:00
parent 58a803a37a
commit 41f6d02de1
3 changed files with 69 additions and 7 deletions

View File

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

View File

@@ -1,6 +1,7 @@
#include "GizmoDrawer.h"
#include <src/Rendering/Buffers/VertexBuffer.h>
#include <src/Scene/Components/CameraComponent.h>
#include <src/Scene/Components/SphereCollider.h>
#include <src/Resource/ModelLoader.h>
#include <src/Rendering/RenderList.h>
#include <dependencies/GLEW/include/GL/glew.h>
@@ -20,6 +21,8 @@ GizmoDrawer::GizmoDrawer()
mAxisLineBuffer->AddBuffer(*mAxisLineVertexBuffer, *vblayout);
GenerateSphereGizmo();
// Load gizmos
ModelLoader loader;
_gizmos = std::map<std::string, Ref<Model>>();
@@ -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<float>() * 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<Nuake::VertexArray>();
mCircleBuffer->Bind();
mCircleVertexBuffer = CreateRef<VertexBuffer>(circleVertices.data(), circleVertices.size() * sizeof(Nuake::LineVertex));
auto vblayout = CreateRef<VertexBufferLayout>();
vblayout->Push<float>(3);
vblayout->Push<float>(4);
mCircleBuffer->AddBuffer(*mCircleVertexBuffer, *vblayout);
}
void GizmoDrawer::DrawGizmos(Ref<Scene> 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> scene)
Nuake::RenderCommand::DrawLines(0, 6);
}
auto sphereColliderView = scene->m_Registry.view<TransformComponent, SphereColliderComponent>();
for (auto e : sphereColliderView)
{
auto [transform, sphere] = scene->m_Registry.get<TransformComponent, SphereColliderComponent>(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());

View File

@@ -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<LineVertex> circleVertices;
Ref<VertexArray> mAxisLineBuffer;
Ref<VertexBuffer> mAxisLineVertexBuffer;
Ref<VertexArray> mCircleBuffer;
Ref<VertexBuffer> mCircleVertexBuffer;
Shader* mLineShader;
void GenerateSphereGizmo();
public:
GizmoDrawer();
~GizmoDrawer() = default;