Added grid debug rendering primitive.
parent
ce88204c02
commit
40aec4a122
126
src/srender.c
126
src/srender.c
|
@ -25,8 +25,8 @@ typedef struct srview {
|
||||||
} srview;
|
} srview;
|
||||||
|
|
||||||
typedef struct srcmdbuf {
|
typedef struct srcmdbuf {
|
||||||
|
int nbufsize;
|
||||||
int ncmds;
|
int ncmds;
|
||||||
int idx;
|
|
||||||
srcmd* cmds;
|
srcmd* cmds;
|
||||||
} srcmdbuf;
|
} srcmdbuf;
|
||||||
|
|
||||||
|
@ -48,6 +48,13 @@ typedef union srvrtxdata {
|
||||||
};
|
};
|
||||||
} srvrtxdata;
|
} srvrtxdata;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Vertex Buffer Object for all debug objects (coord frame, grid, cube, ...)
|
||||||
|
//
|
||||||
|
const GLint DEBUG_VBO_SIZE = 1024;
|
||||||
|
GLuint gDebugShapesVBOId = 0;
|
||||||
|
GLuint gDebugShapesVAId = 0;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Simple Mesh Data
|
// Simple Mesh Data
|
||||||
//
|
//
|
||||||
|
@ -58,9 +65,13 @@ typedef struct srmeshdata {
|
||||||
GLuint vao_id;
|
GLuint vao_id;
|
||||||
GLuint vb_id;
|
GLuint vb_id;
|
||||||
GLuint idb_id;
|
GLuint idb_id;
|
||||||
|
|
||||||
|
GLuint count;
|
||||||
|
GLenum mode;
|
||||||
} srmeshdata;
|
} srmeshdata;
|
||||||
|
|
||||||
static srmeshdata gCoordFrameMesh = {0};
|
static srmeshdata gCoordFrameMesh = {0};
|
||||||
|
static srmeshdata gGridMesh = {0};
|
||||||
|
|
||||||
typedef struct srshader {
|
typedef struct srshader {
|
||||||
const char* vert_fname;
|
const char* vert_fname;
|
||||||
|
@ -211,11 +222,14 @@ void init_shaders() {
|
||||||
void init_debug_meshes() {
|
void init_debug_meshes() {
|
||||||
assert(gCoordFrameMesh.nvertices == 0);
|
assert(gCoordFrameMesh.nvertices == 0);
|
||||||
|
|
||||||
glGenVertexArrays(1, &gCoordFrameMesh.vao_id);
|
glGenVertexArrays(1, &gDebugShapesVAId);
|
||||||
glBindVertexArray(gCoordFrameMesh.vao_id);
|
glBindVertexArray(gDebugShapesVAId);
|
||||||
|
|
||||||
glGenBuffers(1, &gCoordFrameMesh.vb_id);
|
glGenBuffers(1, &gDebugShapesVBOId);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, gCoordFrameMesh.vb_id);
|
glBindBuffer(GL_ARRAY_BUFFER, gDebugShapesVBOId);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(union srvrtxdata) * DEBUG_VBO_SIZE, NULL, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
GLintptr dbg_vbuf_offset = 0;
|
||||||
|
|
||||||
glEnableVertexAttribArray(0);
|
glEnableVertexAttribArray(0);
|
||||||
glVertexAttribPointer(
|
glVertexAttribPointer(
|
||||||
|
@ -254,6 +268,11 @@ void init_debug_meshes() {
|
||||||
(sizeof(srvrtxdata)),
|
(sizeof(srvrtxdata)),
|
||||||
(void*)(sizeof(float) * 9));
|
(void*)(sizeof(float) * 9));
|
||||||
|
|
||||||
|
//
|
||||||
|
// Coordinate Frame
|
||||||
|
//
|
||||||
|
gCoordFrameMesh.vao_id = gDebugShapesVAId;
|
||||||
|
gCoordFrameMesh.vb_id = gDebugShapesVBOId;
|
||||||
gCoordFrameMesh.nvertices = 6;
|
gCoordFrameMesh.nvertices = 6;
|
||||||
|
|
||||||
srvrtxdata coord_frame_vertices[] = {
|
srvrtxdata coord_frame_vertices[] = {
|
||||||
|
@ -267,12 +286,12 @@ void init_debug_meshes() {
|
||||||
{0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, 0, 255, 255}};
|
{0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, 0, 255, 255}};
|
||||||
GLuint coord_frame_indices[] = {0, 1, 2, 3, 4, 5};
|
GLuint coord_frame_indices[] = {0, 1, 2, 3, 4, 5};
|
||||||
|
|
||||||
glBufferData(
|
glBufferSubData(
|
||||||
GL_ARRAY_BUFFER,
|
GL_ARRAY_BUFFER,
|
||||||
|
dbg_vbuf_offset,
|
||||||
sizeof(coord_frame_vertices),
|
sizeof(coord_frame_vertices),
|
||||||
coord_frame_vertices,
|
coord_frame_vertices);
|
||||||
GL_STATIC_DRAW);
|
dbg_vbuf_offset = sizeof (coord_frame_vertices);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
|
|
||||||
glGenBuffers(1, &gCoordFrameMesh.idb_id);
|
glGenBuffers(1, &gCoordFrameMesh.idb_id);
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gCoordFrameMesh.idb_id);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gCoordFrameMesh.idb_id);
|
||||||
|
@ -281,7 +300,69 @@ void init_debug_meshes() {
|
||||||
sizeof(coord_frame_indices),
|
sizeof(coord_frame_indices),
|
||||||
coord_frame_indices,
|
coord_frame_indices,
|
||||||
GL_STATIC_DRAW);
|
GL_STATIC_DRAW);
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
|
||||||
|
gCoordFrameMesh.mode = GL_LINES;
|
||||||
|
gCoordFrameMesh.count = 6;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Coordinate Frame
|
||||||
|
//
|
||||||
|
gGridMesh.vao_id = gDebugShapesVAId;
|
||||||
|
gGridMesh.vb_id = gDebugShapesVBOId;
|
||||||
|
gGridMesh.nvertices = 44;
|
||||||
|
|
||||||
|
srvrtxdata* grid_vertices = calloc(44, sizeof(srvrtxdata));
|
||||||
|
srvrtxdata grid_def_vertex = {
|
||||||
|
0.f, 0.f, 0.f, 1.f,
|
||||||
|
0.f, 1.f, 0.f,
|
||||||
|
0.f, 0.f,
|
||||||
|
255, 255, 255, 255
|
||||||
|
};
|
||||||
|
// lines along parallel to x axis
|
||||||
|
for (int i = 0; i <= 10; i++) {
|
||||||
|
memcpy (&grid_vertices[2*i], &grid_def_vertex, sizeof(srvrtxdata));
|
||||||
|
memcpy (&grid_vertices[2*i + 1], &grid_def_vertex, sizeof(srvrtxdata));
|
||||||
|
grid_vertices[2 * i].pos[0] = -5.0f + i * 1.0f;
|
||||||
|
grid_vertices[2 * i].pos[2] = 5.0f;
|
||||||
|
grid_vertices[2 * i + 1].pos[0] = -5.0f + i * 1.0f;
|
||||||
|
grid_vertices[2 * i + 1].pos[2] = -5.0f;
|
||||||
|
}
|
||||||
|
// lines parallel to z axis
|
||||||
|
for (int i = 11; i <= 21; i++) {
|
||||||
|
memcpy (&grid_vertices[2*i], &grid_def_vertex, sizeof(srvrtxdata));
|
||||||
|
memcpy (&grid_vertices[2*i + 1], &grid_def_vertex, sizeof(srvrtxdata));
|
||||||
|
grid_vertices[2 * i].pos[0] = -5.0f;
|
||||||
|
grid_vertices[2 * i].pos[2] = -5.0f + (i - 11) * 1.0f;
|
||||||
|
grid_vertices[2 * i + 1].pos[0] = 5.0f;
|
||||||
|
grid_vertices[2 * i + 1].pos[2] = -5.0f + (i - 11) * 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, gDebugShapesVBOId);
|
||||||
|
glBufferSubData(
|
||||||
|
GL_ARRAY_BUFFER,
|
||||||
|
dbg_vbuf_offset,
|
||||||
|
sizeof(srvrtxdata) * 44,
|
||||||
|
grid_vertices);
|
||||||
|
dbg_vbuf_offset += sizeof (srvrtxdata) * 44;
|
||||||
|
|
||||||
|
free(grid_vertices);
|
||||||
|
|
||||||
|
GLuint grid_indices[44];
|
||||||
|
for (int i = 0; i < 22; i++) {
|
||||||
|
grid_indices[2 * i] = 2*i + 6;
|
||||||
|
grid_indices[2 * i + 1] = (2*i+1) + 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
glGenBuffers(1, &gGridMesh.idb_id);
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gGridMesh.idb_id);
|
||||||
|
glBufferData(
|
||||||
|
GL_ELEMENT_ARRAY_BUFFER,
|
||||||
|
sizeof(grid_indices),
|
||||||
|
grid_indices,
|
||||||
|
GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
gGridMesh.mode = GL_LINES;
|
||||||
|
gGridMesh.count = 44;
|
||||||
|
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
};
|
};
|
||||||
|
@ -419,7 +500,17 @@ void srndr_run_frame_command(const srcmd* cmd) {
|
||||||
glBindVertexArray(gCoordFrameMesh.vao_id);
|
glBindVertexArray(gCoordFrameMesh.vao_id);
|
||||||
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gCoordFrameMesh.idb_id);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gCoordFrameMesh.idb_id);
|
||||||
glDrawElements(GL_LINES, 6, GL_UNSIGNED_INT, (void*)0);
|
glDrawElements(gCoordFrameMesh.mode, gCoordFrameMesh.count, GL_UNSIGNED_INT, (void*)0);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
glBindVertexArray(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void srndr_run_grid_command(const srcmd* cmd) {
|
||||||
|
glBindVertexArray(gGridMesh.vao_id);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gGridMesh.idb_id);
|
||||||
|
glDrawElements(gGridMesh.mode, gGridMesh.count, GL_UNSIGNED_INT, (void*)0);
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
|
@ -455,6 +546,9 @@ void srndr_render(srndr* srndr, srview* sview, srcmdbuf* scmdbuf) {
|
||||||
case SRndrCmdTypeFrame:
|
case SRndrCmdTypeFrame:
|
||||||
srndr_run_frame_command(cmd);
|
srndr_run_frame_command(cmd);
|
||||||
break;
|
break;
|
||||||
|
case SRndrCmdTypeGrid:
|
||||||
|
srndr_run_grid_command(cmd);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
gLog("Invalid command type %d at index %d", cmd->type, i);
|
gLog("Invalid command type %d at index %d", cmd->type, i);
|
||||||
break;
|
break;
|
||||||
|
@ -469,19 +563,19 @@ void srndr_render(srndr* srndr, srview* sview, srcmdbuf* scmdbuf) {
|
||||||
//
|
//
|
||||||
srcmdbuf* srcmdbuf_create(unsigned int size_max) {
|
srcmdbuf* srcmdbuf_create(unsigned int size_max) {
|
||||||
srcmdbuf* result = malloc(sizeof(srcmdbuf));
|
srcmdbuf* result = malloc(sizeof(srcmdbuf));
|
||||||
result->ncmds = size_max;
|
result->nbufsize = size_max;
|
||||||
result->idx = 0;
|
result->ncmds = 0;
|
||||||
result->cmds = calloc(sizeof(srcmd), size_max);
|
result->cmds = calloc(sizeof(srcmd), size_max);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void srcmdbuf_clear(srcmdbuf* cmdbuf) { cmdbuf->idx = 0; }
|
void srcmdbuf_clear(srcmdbuf* cmdbuf) { cmdbuf->ncmds = 0; }
|
||||||
|
|
||||||
srcmd* srcmd_create(srcmdbuf* cmdbuf) {
|
srcmd* srcmd_create(srcmdbuf* cmdbuf) {
|
||||||
if (cmdbuf->idx == cmdbuf->ncmds) {
|
if (cmdbuf->ncmds == cmdbuf->nbufsize) {
|
||||||
gLog("Warning: number of render commands maxed out!");
|
gLog("Warning: number of render commands maxed out!");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return &(cmdbuf->cmds[cmdbuf->idx++]);
|
return &(cmdbuf->cmds[cmdbuf->ncmds++]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,8 +20,8 @@ typedef enum {
|
||||||
} SRndrCmdType;
|
} SRndrCmdType;
|
||||||
|
|
||||||
typedef struct srcmd {
|
typedef struct srcmd {
|
||||||
simd4x4f mat;
|
simd4x4f mat;
|
||||||
simd4f color;
|
simd4f color;
|
||||||
SRndrCmdType type;
|
SRndrCmdType type;
|
||||||
} srcmd;
|
} srcmd;
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ void srview_get_output_texture(srview* sv, GLuint* texture);
|
||||||
// Command Buffer and Commands
|
// Command Buffer and Commands
|
||||||
//
|
//
|
||||||
srcmdbuf* srcmdbuf_create(unsigned int size_max);
|
srcmdbuf* srcmdbuf_create(unsigned int size_max);
|
||||||
void srcmdbuf_clear (srcmdbuf* cmdbuf);
|
void srcmdbuf_clear(srcmdbuf* cmdbuf);
|
||||||
srcmd* srcmd_create(srcmdbuf* cmdbuf);
|
srcmd* srcmd_create(srcmdbuf* cmdbuf);
|
||||||
|
|
||||||
void srndr_render(srndr* srndr, srview* sview, srcmdbuf* scmdbuf);
|
void srndr_render(srndr* srndr, srview* sview, srcmdbuf* scmdbuf);
|
||||||
|
|
|
@ -170,7 +170,18 @@ void DoRender() {
|
||||||
simd4f_create(1.f, 1.f, 1.f, 1.f),
|
simd4f_create(1.f, 1.f, 1.f, 1.f),
|
||||||
simd4f_create(0.f, 0.f, 0.f, 1.f),
|
simd4f_create(0.f, 0.f, 0.f, 1.f),
|
||||||
simd4f_create(0.f, 1.f, 0.f, 1.f));
|
simd4f_create(0.f, 1.f, 0.f, 1.f));
|
||||||
simd4x4f_ortho(&proj, -5.0f, 5.0f, -5.0f, 5.0f, -5.0f, 5.0f);
|
|
||||||
|
float view_width = content_avail.x / 50.f;
|
||||||
|
float view_height = content_avail.y / 50.f;
|
||||||
|
|
||||||
|
simd4x4f_ortho(
|
||||||
|
&proj,
|
||||||
|
-0.5f * view_width,
|
||||||
|
0.5f * view_width,
|
||||||
|
-0.5f * view_height,
|
||||||
|
0.5f * view_height,
|
||||||
|
-50.0f,
|
||||||
|
50.0f);
|
||||||
srview_set_view(gView, view);
|
srview_set_view(gView, view);
|
||||||
srview_set_proj(gView, proj);
|
srview_set_proj(gView, proj);
|
||||||
|
|
||||||
|
@ -181,6 +192,11 @@ void DoRender() {
|
||||||
simd4x4f_identity(&cmd->mat);
|
simd4x4f_identity(&cmd->mat);
|
||||||
cmd->color = simd4f_create(1.f, 1.f, 1.f, 1.f);
|
cmd->color = simd4f_create(1.f, 1.f, 1.f, 1.f);
|
||||||
|
|
||||||
|
cmd = srcmd_create(gRndrCmds);
|
||||||
|
cmd->type = SRndrCmdTypeGrid;
|
||||||
|
simd4x4f_identity(&cmd->mat);
|
||||||
|
cmd->color = simd4f_create(1.f, 1.f, 1.f, 1.f);
|
||||||
|
|
||||||
// Perform the actual render
|
// Perform the actual render
|
||||||
srndr_render(gRndr, gView, gRndrCmds);
|
srndr_render(gRndr, gView, gRndrCmds);
|
||||||
GLuint view_texture;
|
GLuint view_texture;
|
||||||
|
|
Loading…
Reference in New Issue