342 lines
12 KiB
C++
342 lines
12 KiB
C++
#include "render/debugrender.h"
|
|
#include "render/render_shared.h"
|
|
#include "render/render.h"
|
|
#include "render/renderdevice.h"
|
|
#include "render/vertexbuffer.h"
|
|
#include "render/shadersystem.h"
|
|
|
|
#include "glad/glad.h"
|
|
|
|
struct DebugVertex
|
|
{
|
|
Vec3 position;
|
|
Vec3 color;
|
|
};
|
|
|
|
static InputLayoutDesc_t g_debugRenderLayout[] =
|
|
{
|
|
{ VERTEXATTR_VEC3, SHADERSEMANTIC_POSITION },
|
|
{ VERTEXATTR_VEC3, SHADERSEMANTIC_COLOR }
|
|
|
|
};
|
|
|
|
const int kEllipseVertexBufferSize = 114;
|
|
const int kEllipseIndexBufferSize = 672;
|
|
|
|
void FillVertexBuffer( VertexBuffer* _pVertexBuffer, const Vec3& _Color )
|
|
{
|
|
static Vec3 previousColor = Vec3(0.0f, 0.0f, 0.0f);
|
|
|
|
if (previousColor.x == _Color.x &&
|
|
previousColor.y == _Color.y &&
|
|
previousColor.z == _Color.z)
|
|
return;
|
|
|
|
float vertices[] =
|
|
{
|
|
0.0000f,0.0000f,1.0000f, 0.0000f,0.3827f,0.9239f, -0.1464f,0.3536f,0.9239f,
|
|
-0.2706f,0.2706f,0.9239f, -0.3536f,0.1464f,0.9239f, -0.3827f,0.0000f,0.9239f,
|
|
-0.3536f,-0.1464f,0.9239f, -0.2706f,-0.2706f,0.9239f, -0.1464f,-0.3536f,0.9239f,
|
|
0.0000f,-0.3827f,0.9239f, 0.1464f,-0.3536f,0.9239f, 0.2706f,-0.2706f,0.9239f,
|
|
0.3536f,-0.1464f,0.9239f, 0.3827f,0.0000f,0.9239f, 0.3536f,0.1464f,0.9239f,
|
|
0.2706f,0.2706f,0.9239f, 0.1464f,0.3536f,0.9239f, 0.0000f,0.7071f,0.7071f,
|
|
-0.2706f,0.6533f,0.7071f, -0.5000f,0.5000f,0.7071f, -0.6533f,0.2706f,0.7071f,
|
|
-0.7071f,0.0000f,0.7071f, -0.6533f,-0.2706f,0.7071f, -0.5000f,-0.5000f,0.7071f,
|
|
-0.2706f,-0.6533f,0.7071f, 0.0000f,-0.7071f,0.7071f, 0.2706f,-0.6533f,0.7071f,
|
|
0.5000f,-0.5000f,0.7071f, 0.6533f,-0.2706f,0.7071f, 0.7071f,0.0000f,0.7071f,
|
|
0.6533f,0.2706f,0.7071f, 0.5000f,0.5000f,0.7071f, 0.2706f,0.6533f,0.7071f,
|
|
0.0000f,0.9239f,0.3827f, -0.3536f,0.8536f,0.3827f, -0.6533f,0.6533f,0.3827f,
|
|
-0.8536f,0.3536f,0.3827f, -0.9239f,0.0000f,0.3827f, -0.8536f,-0.3536f,0.3827f,
|
|
-0.6533f,-0.6533f,0.3827f, -0.3536f,-0.8536f,0.3827f, 0.0000f,-0.9239f,0.3827f,
|
|
0.3536f,-0.8536f,0.3827f, 0.6533f,-0.6533f,0.3827f, 0.8536f,-0.3536f,0.3827f,
|
|
0.9239f,0.0000f,0.3827f, 0.8536f,0.3536f,0.3827f, 0.6533f,0.6533f,0.3827f,
|
|
0.3536f,0.8536f,0.3827f, 0.0000f,1.0000f,0.0000f, -0.3827f,0.9239f,0.0000f,
|
|
-0.7071f,0.7071f,0.0000f, -0.9239f,0.3827f,0.0000f, -1.0000f,0.0000f,0.0000f,
|
|
-0.9239f,-0.3827f,0.0000f, -0.7071f,-0.7071f,0.0000f, -0.3827f,-0.9239f,0.0000f,
|
|
0.0000f,-1.0000f,0.0000f, 0.3827f,-0.9239f,0.0000f, 0.7071f,-0.7071f,0.0000f,
|
|
0.9239f,-0.3827f,0.0000f, 1.0000f,0.0000f,0.0000f, 0.9239f,0.3827f,0.0000f,
|
|
0.7071f,0.7071f,0.0000f, 0.3827f,0.9239f,0.0000f, 0.0000f,0.9239f,-0.3827f,
|
|
-0.3536f,0.8536f,-0.3827f, -0.6533f,0.6533f,-0.3827f, -0.8536f,0.3536f,-0.3827f,
|
|
-0.9239f,0.0000f,-0.3827f, -0.8536f,-0.3536f,-0.3827f, -0.6533f,-0.6533f,-0.3827f,
|
|
-0.3536f,-0.8536f,-0.3827f, 0.0000f,-0.9239f,-0.3827f, 0.3536f,-0.8536f,-0.3827f,
|
|
0.6533f,-0.6533f,-0.3827f, 0.8536f,-0.3536f,-0.3827f, 0.9239f,0.0000f,-0.3827f,
|
|
0.8536f,0.3536f,-0.3827f, 0.6533f,0.6533f,-0.3827f, 0.3536f,0.8536f,-0.3827f,
|
|
0.0000f,0.7071f,-0.7071f, -0.2706f,0.6533f,-0.7071f, -0.5000f,0.5000f,-0.7071f,
|
|
-0.6533f,0.2706f,-0.7071f, -0.7071f,0.0000f,-0.7071f, -0.6533f,-0.2706f,-0.7071f,
|
|
-0.5000f,-0.5000f,-0.7071f, -0.2706f,-0.6533f,-0.7071f, 0.0000f,-0.7071f,-0.7071f,
|
|
0.2706f,-0.6533f,-0.7071f, 0.5000f,-0.5000f,-0.7071f, 0.6533f,-0.2706f,-0.7071f,
|
|
0.7071f,0.0000f,-0.7071f, 0.6533f,0.2706f,-0.7071f, 0.5000f,0.5000f,-0.7071f,
|
|
0.2706f,0.6533f,-0.7071f, 0.0000f,0.3827f,-0.9239f, -0.1464f,0.3536f,-0.9239f,
|
|
-0.2706f,0.2706f,-0.9239f, -0.3536f,0.1464f,-0.9239f, -0.3827f,0.0000f,-0.9239f,
|
|
-0.3536f,-0.1464f,-0.9239f, -0.2706f,-0.2706f,-0.9239f, -0.1464f,-0.3536f,-0.9239f,
|
|
0.0000f,-0.3827f,-0.9239f, 0.1464f,-0.3536f,-0.9239f, 0.2706f,-0.2706f,-0.9239f,
|
|
0.3536f,-0.1464f,-0.9239f, 0.3827f,0.0000f,-0.9239f, 0.3536f,0.1464f,-0.9239f,
|
|
0.2706f,0.2706f,-0.9239f, 0.1464f,0.3536f,-0.9239f, 0.0000f,0.0000f,-1.0000f
|
|
};
|
|
|
|
const int vcnt = sizeof(vertices) / (sizeof(float) * 3);
|
|
DebugVertex verts[vcnt];
|
|
for (int i = 0; i < vcnt; i++) {
|
|
int k = i * 3;
|
|
|
|
verts[i].position.x = vertices[k];
|
|
verts[i].position.y = vertices[k + 1];
|
|
verts[i].position.z = vertices[k + 2];
|
|
verts[i].color = _Color;
|
|
}
|
|
|
|
DebugVertex* pAGPMemory = ( DebugVertex* )_pVertexBuffer->MapBuffer( BufferAccess::WRITE_ONLY );
|
|
memcpy( pAGPMemory, verts, sizeof( verts ) );
|
|
_pVertexBuffer->UnmapBuffer();
|
|
|
|
previousColor = _Color;
|
|
}
|
|
|
|
IndexBuffer* CreateEllipseIndexBuffer()
|
|
{
|
|
uint16_t faces[224 * 3] =
|
|
{
|
|
0,1,2, 0,2,3, 0,3,4, 0,4,5, 0,5,6, 0,6,7, 0,7,8, 0,8,9, 0,9,10,
|
|
0,10,11, 0,11,12, 0,12,13, 0,13,14, 0,14,15, 0,15,16, 0,16,1, 1,17,18, 1,18,2,
|
|
2,18,19, 2,19,3, 3,19,20, 3,20,4, 4,20,21, 4,21,5, 5,21,22, 5,22,6, 6,22,23,
|
|
6,23,7, 7,23,24, 7,24,8, 8,24,25, 8,25,9, 9,25,26, 9,26,10, 10,26,27, 10,27,11,
|
|
11,27,28, 11,28,12, 12,28,29, 12,29,13, 13,29,30, 13,30,14, 14,30,31, 14,31,15, 15,31,32,
|
|
15,32,16, 16,32,17, 16,17,1, 17,33,34, 17,34,18, 18,34,35, 18,35,19, 19,35,36, 19,36,20,
|
|
20,36,37, 20,37,21, 21,37,38, 21,38,22, 22,38,39, 22,39,23, 23,39,40, 23,40,24, 24,40,41,
|
|
24,41,25, 25,41,42, 25,42,26, 26,42,43, 26,43,27, 27,43,44, 27,44,28, 28,44,45, 28,45,29,
|
|
29,45,46, 29,46,30, 30,46,47, 30,47,31, 31,47,48, 31,48,32, 32,48,33, 32,33,17, 33,49,50,
|
|
33,50,34, 34,50,51, 34,51,35, 35,51,52, 35,52,36, 36,52,53, 36,53,37, 37,53,54, 37,54,38,
|
|
38,54,55, 38,55,39, 39,55,56, 39,56,40, 40,56,57, 40,57,41, 41,57,58, 41,58,42, 42,58,59,
|
|
42,59,43, 43,59,60, 43,60,44, 44,60,61, 44,61,45, 45,61,62, 45,62,46, 46,62,63, 46,63,47,
|
|
47,63,64, 47,64,48, 48,64,49, 48,49,33, 49,65,66, 49,66,50, 50,66,67, 50,67,51, 51,67,68,
|
|
51,68,52, 52,68,69, 52,69,53, 53,69,70, 53,70,54, 54,70,71, 54,71,55, 55,71,72, 55,72,56,
|
|
56,72,73, 56,73,57, 57,73,74, 57,74,58, 58,74,75, 58,75,59, 59,75,76, 59,76,60, 60,76,77,
|
|
60,77,61, 61,77,78, 61,78,62, 62,78,79, 62,79,63, 63,79,80, 63,80,64, 64,80,65, 64,65,49,
|
|
65,81,82, 65,82,66, 66,82,83, 66,83,67, 67,83,84, 67,84,68, 68,84,85, 68,85,69, 69,85,86,
|
|
69,86,70, 70,86,87, 70,87,71, 71,87,88, 71,88,72, 72,88,89, 72,89,73, 73,89,90, 73,90,74,
|
|
74,90,91, 74,91,75, 75,91,92, 75,92,76, 76,92,93, 76,93,77, 77,93,94, 77,94,78, 78,94,95,
|
|
78,95,79, 79,95,96, 79,96,80, 80,96,81, 80,81,65, 81,97,98, 81,98,82, 82,98,99, 82,99,83,
|
|
83,99,100, 83,100,84, 84,100,101, 84,101,85, 85,101,102, 85,102,86, 86,102,103, 86,103,87, 87,103,104,
|
|
87,104,88, 88,104,105, 88,105,89, 89,105,106, 89,106,90, 90,106,107, 90,107,91, 91,107,108, 91,108,92,
|
|
92,108,109, 92,109,93, 93,109,110, 93,110,94, 94,110,111, 94,111,95, 95,111,112, 95,112,96, 96,112,97,
|
|
96,97,81, 113,98,97, 113,99,98, 113,100,99, 113,101,100, 113,102,101, 113,103,102, 113,104,103, 113,105,104,
|
|
113,106,105, 113,107,106, 113,108,107, 113,109,108, 113,110,109, 113,111,110, 113,112,111, 113,97,112
|
|
};
|
|
|
|
return g_renderDevice->CreateIndexBuffer(faces, sizeof(faces));
|
|
}
|
|
|
|
bool g_drawDebug = false;
|
|
DebugRender* g_debugRender;
|
|
|
|
DebugRender::DebugRender()
|
|
{
|
|
m_verticesBuffer = nullptr;
|
|
m_ellipseVertexBuffer = nullptr;
|
|
m_ellipseIndexBuffer = nullptr;
|
|
m_shader = nullptr;
|
|
}
|
|
|
|
DebugRender::~DebugRender()
|
|
{
|
|
m_verticesBuffer = nullptr;
|
|
m_shader = nullptr;
|
|
}
|
|
|
|
void DebugRender::Initialize()
|
|
{
|
|
float points[12];
|
|
m_verticesBuffer = g_renderDevice->CreateVertexBuffer(points, sizeof(points), true);
|
|
|
|
m_ellipseVertexBuffer = g_renderDevice->CreateVertexBuffer(nullptr, kEllipseVertexBufferSize * sizeof(DebugVertex), true);
|
|
m_ellipseIndexBuffer = CreateEllipseIndexBuffer();
|
|
|
|
m_shader = g_shaderSystem->CreateShader("debug_draw",
|
|
"content/shaders/debug_draw.vs",
|
|
"content/shaders/debug_draw.ps",
|
|
g_debugRenderLayout,
|
|
sizeof(g_debugRenderLayout) / sizeof(g_debugRenderLayout[0]));
|
|
|
|
m_shader->m_stride = sizeof(DebugVertex);
|
|
|
|
glGenVertexArrays(1, &m_vao);
|
|
}
|
|
|
|
void DebugRender::Shutdown()
|
|
{
|
|
glDeleteVertexArrays(1, &m_vao);
|
|
|
|
if (m_ellipseIndexBuffer) {
|
|
delete m_ellipseIndexBuffer;
|
|
m_ellipseIndexBuffer = nullptr;
|
|
}
|
|
|
|
if (m_ellipseVertexBuffer) {
|
|
delete m_ellipseVertexBuffer;
|
|
m_ellipseVertexBuffer = nullptr;
|
|
}
|
|
|
|
if (m_verticesBuffer) {
|
|
delete m_verticesBuffer;
|
|
m_verticesBuffer = nullptr;
|
|
}
|
|
}
|
|
|
|
void DebugRender::DrawLine(const Vec3& from, const Vec3& to, const Vec3& color)
|
|
{
|
|
if (!g_drawDebug)
|
|
return;
|
|
|
|
Line line;
|
|
line.from = from;
|
|
line.color0 = color;
|
|
line.to = to;
|
|
line.color1 = color;
|
|
m_lines.push_back(line);
|
|
}
|
|
|
|
void DebugRender::DrawBoundingBox(const BoundingBox& box, const glm::vec3& color)
|
|
{
|
|
glm::vec3 from = glm::vec3(box.min.x, box.min.y, box.min.z);
|
|
glm::vec3 to = glm::vec3(box.max.x, box.max.y, box.max.z);
|
|
|
|
glm::vec3 halfExtents = (to - from) * 0.5f;
|
|
glm::vec3 center = (to + from) * 0.5f;
|
|
int i, j;
|
|
|
|
glm::vec3 edgecoord(1.f, 1.f, 1.f), pa, pb;
|
|
for (i = 0; i < 4; i++)
|
|
{
|
|
for (j = 0; j < 3; j++)
|
|
{
|
|
pa = glm::vec3(edgecoord[0] * halfExtents[0], edgecoord[1] * halfExtents[1],
|
|
edgecoord[2] * halfExtents[2]);
|
|
pa += center;
|
|
|
|
int othercoord = j % 3;
|
|
edgecoord[othercoord] *= -1.f;
|
|
pb = glm::vec3(edgecoord[0] * halfExtents[0], edgecoord[1] * halfExtents[1],
|
|
edgecoord[2] * halfExtents[2]);
|
|
pb += center;
|
|
|
|
DrawLine(Vec3(pa.x, pa.y, pa.z), Vec3(pb.x, pb.y, pb.z) , Vec3(color.x, color.y, color.z) );
|
|
}
|
|
|
|
edgecoord = glm::vec3(-1.f, -1.f, -1.f);
|
|
if (i < 3)
|
|
edgecoord[i] *= -1.f;
|
|
}
|
|
}
|
|
|
|
void DebugRender::DrawEllipse(const glm::mat4& trans, const Vec3& color)
|
|
{
|
|
EllipseDrawCmd drawCmd = {};
|
|
drawCmd.trans = trans;
|
|
drawCmd.color = color;
|
|
m_ellipseDrawCmd.push_back(drawCmd);
|
|
}
|
|
|
|
void DebugRender::RenderFrame()
|
|
{
|
|
if (!g_drawDebug)
|
|
return;
|
|
|
|
BeginDraw();
|
|
|
|
// draw lines
|
|
DrawLinesInternal();
|
|
|
|
// and clear them
|
|
m_lines.clear();
|
|
|
|
// Draw cmds
|
|
DrawCmds();
|
|
|
|
// and clear them
|
|
m_ellipseDrawCmd.clear();
|
|
|
|
EndDraw();
|
|
}
|
|
|
|
void DebugRender::DrawAxis(const Vec3& vec)
|
|
{
|
|
const float length = 0.2f;
|
|
DrawLine(vec, Vec3(vec.x + length, vec.y, vec.z), Vec3(1.0f, 0.0, 0.0f));
|
|
DrawLine(vec, Vec3(vec.x, vec.y + length, vec.z), Vec3(0.0f, 0.0f, 1.0f));
|
|
DrawLine(vec, Vec3(vec.x, vec.y, vec.z + length), Vec3(0.0f, 1.0f, 0.0f));
|
|
}
|
|
|
|
void DebugRender::BeginDraw()
|
|
{
|
|
glGetIntegerv(GL_VERTEX_ARRAY_BINDING, (int*)&m_savedVao);
|
|
|
|
glBindVertexArray(m_vao);
|
|
}
|
|
|
|
void DebugRender::EndDraw()
|
|
{
|
|
glBindVertexArray(m_savedVao);
|
|
}
|
|
|
|
void DebugRender::DrawLinesInternal()
|
|
{
|
|
if (m_lines.empty())
|
|
return;
|
|
|
|
g_renderDevice->SetDepthTest(true);
|
|
g_renderDevice->SetDepthWrite(true);
|
|
|
|
g_renderDevice->SetVerticesBuffer(m_verticesBuffer);
|
|
|
|
m_verticesBuffer->UpdateBuffer(m_lines.data(), m_lines.size() * sizeof(Line));
|
|
|
|
// Bind our shader
|
|
g_shaderSystem->SetShader(m_shader);
|
|
|
|
// #TODO: Fix stupid bug, when we get very far from wireframe and lines can start cliping
|
|
View view = g_renderView;
|
|
view.proj[2][3] -= 0.0001f;
|
|
|
|
glm::mat4 mv = glm::identity<glm::mat4>();
|
|
mv = view.proj * view.view;
|
|
|
|
g_shaderSystem->SetUniformMatrix(m_shader, UNIFORM_MVP_MATRIX, &mv[0]);
|
|
|
|
// draw stuff
|
|
g_renderDevice->DrawArrays(PT_LINES, 0, m_lines.size() * 2);
|
|
}
|
|
|
|
void DebugRender::DrawCmds()
|
|
{
|
|
if (m_ellipseDrawCmd.empty())
|
|
return;
|
|
|
|
g_renderDevice->SetDepthTest(true);
|
|
g_renderDevice->SetDepthWrite(true);
|
|
|
|
g_renderDevice->SetVerticesBuffer(m_ellipseVertexBuffer);
|
|
g_renderDevice->SetIndicesBuffer(m_ellipseIndexBuffer);
|
|
|
|
// Bind our shader
|
|
g_shaderSystem->SetShader(m_shader);
|
|
|
|
for (int i = 0; i < m_ellipseDrawCmd.size(); i++)
|
|
{
|
|
const EllipseDrawCmd& cmd = m_ellipseDrawCmd[i];
|
|
|
|
FillVertexBuffer(m_ellipseVertexBuffer, cmd.color);
|
|
|
|
// #TODO: Fix stupid bug, when we get very far from wireframe and lines can start cliping
|
|
View view = g_renderView;
|
|
view.proj[2][3] -= 0.0001f;
|
|
|
|
glm::mat4 mv = glm::identity<glm::mat4>();
|
|
mv = view.proj * view.view * cmd.trans;
|
|
|
|
g_shaderSystem->SetUniformMatrix(m_shader, UNIFORM_MVP_MATRIX, &mv[0]);
|
|
|
|
// draw stuff
|
|
g_renderDevice->DrawElements( PT_LINES, 672, true );
|
|
}
|
|
}
|