|
|
|
@ -97,9 +97,9 @@ struct camera |
|
|
|
|
|
|
|
|
|
|
|
typedef struct gl_buffer |
|
|
|
typedef struct gl_buffer |
|
|
|
{ |
|
|
|
{ |
|
|
|
GLuint buffer_id; |
|
|
|
GLuint buffer_id = 0; |
|
|
|
size_t buffer_len; // NOTE: number of elements in buffer
|
|
|
|
size_t buffer_len = 0; // NOTE: number of elements in buffer
|
|
|
|
GLfloat* buffer; |
|
|
|
GLfloat* buffer = nullptr; |
|
|
|
} gl_buffer; |
|
|
|
} gl_buffer; |
|
|
|
|
|
|
|
|
|
|
|
typedef struct gl_render_group |
|
|
|
typedef struct gl_render_group |
|
|
|
@ -107,22 +107,23 @@ typedef struct gl_render_group |
|
|
|
// NOTE: For now the renderFrame function will assume these are the same size
|
|
|
|
// NOTE: For now the renderFrame function will assume these are the same size
|
|
|
|
gl_buffer vertex_buffer; |
|
|
|
gl_buffer vertex_buffer; |
|
|
|
gl_buffer color_buffer; |
|
|
|
gl_buffer color_buffer; |
|
|
|
GLuint program_id; |
|
|
|
GLuint program_id = 0; |
|
|
|
GLuint matrix_id; // NOTE: reference to a vertex shader's MVP matrix uniform
|
|
|
|
GLuint matrix_id = 0; // NOTE: reference to a vertex shader's MVP matrix uniform
|
|
|
|
GLuint vertex_array_id; |
|
|
|
GLuint vertex_array_id = 0; |
|
|
|
} gl_render_group; |
|
|
|
} gl_render_group; |
|
|
|
|
|
|
|
|
|
|
|
gl_matrix_info g_scene_matrices; |
|
|
|
gl_matrix_info g_scene_matrices; |
|
|
|
gl_render_group g_filled_hex_render_group; |
|
|
|
gl_render_group g_filled_hex_render_group; |
|
|
|
gl_render_group g_hex_line_render_group; |
|
|
|
gl_render_group g_hex_line_render_group; |
|
|
|
gl_render_group g_debug_render_group; |
|
|
|
gl_render_group g_debug_render_group; |
|
|
|
|
|
|
|
gl_render_group g_entity_render_group; |
|
|
|
camera g_camera; |
|
|
|
camera g_camera; |
|
|
|
|
|
|
|
|
|
|
|
// Interface
|
|
|
|
// Interface
|
|
|
|
|
|
|
|
|
|
|
|
bool initRenderer(SDL_Handles &handles, v2i vpDims); |
|
|
|
bool initRenderer(SDL_Handles &handles, v2i vpDims); |
|
|
|
bool addTexture(SDL_Handles &handles, const char * path); |
|
|
|
bool addTexture(SDL_Handles &handles, const char * path); |
|
|
|
bool createScene(std::vector<hex_info>* hexes); |
|
|
|
bool createScene(std::vector<hex_info>* hexes, Entity* entities, uint32 entity_count); |
|
|
|
void moveCamera(bool up, bool left, bool down, bool right, bool forward, bool backward); |
|
|
|
void moveCamera(bool up, bool left, bool down, bool right, bool forward, bool backward); |
|
|
|
void rollCamera(bool CW, bool CCW); |
|
|
|
void rollCamera(bool CW, bool CCW); |
|
|
|
void rotateCamera(int32 xrel, int32 yrel); |
|
|
|
void rotateCamera(int32 xrel, int32 yrel); |
|
|
|
@ -155,8 +156,10 @@ initRenderer(SDL_Handles &handles, v2i vpDims) |
|
|
|
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); |
|
|
|
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); |
|
|
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); |
|
|
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); |
|
|
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); |
|
|
|
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); |
|
|
|
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1); |
|
|
|
// TODO: Line drawing quality seems to depend on graphics driver whims
|
|
|
|
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4); |
|
|
|
// maybe try using textured billboards instead?
|
|
|
|
|
|
|
|
//SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
|
|
|
|
|
|
|
|
//SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
|
|
|
|
SDL_GL_SetSwapInterval(1); // vsync
|
|
|
|
SDL_GL_SetSwapInterval(1); // vsync
|
|
|
|
SDL_GetCurrentDisplayMode(0, &handles.currentDisplayMode); |
|
|
|
SDL_GetCurrentDisplayMode(0, &handles.currentDisplayMode); |
|
|
|
handles.window =
|
|
|
|
handles.window =
|
|
|
|
@ -212,6 +215,7 @@ initRenderer(SDL_Handles &handles, v2i vpDims) |
|
|
|
initShaderProgram(g_filled_hex_render_group, VERTEX_SHADER_CODE, FRAGMENT_SHADER_CODE, "MVP"); |
|
|
|
initShaderProgram(g_filled_hex_render_group, VERTEX_SHADER_CODE, FRAGMENT_SHADER_CODE, "MVP"); |
|
|
|
initShaderProgram(g_hex_line_render_group, VERTEX_SHADER_CODE, LINE_FRAGMENT_SHADER_CODE, "MVP"); |
|
|
|
initShaderProgram(g_hex_line_render_group, VERTEX_SHADER_CODE, LINE_FRAGMENT_SHADER_CODE, "MVP"); |
|
|
|
initShaderProgram(g_debug_render_group, VERTEX_SHADER_CODE, DEBUG_FRAGMENT_SHADER_CODE, "MVP"); |
|
|
|
initShaderProgram(g_debug_render_group, VERTEX_SHADER_CODE, DEBUG_FRAGMENT_SHADER_CODE, "MVP"); |
|
|
|
|
|
|
|
initShaderProgram(g_entity_render_group, VERTEX_SHADER_CODE, FRAGMENT_SHADER_CODE, "MVP"); |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -347,7 +351,7 @@ initMatrices(projection_type p) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool |
|
|
|
bool |
|
|
|
createScene(std::vector<hex_info>* hexes) |
|
|
|
createScene(std::vector<hex_info>* hexes, Entity* entities, uint32 entity_count) |
|
|
|
{ |
|
|
|
{ |
|
|
|
initMatrices(PROJ_TYPE); |
|
|
|
initMatrices(PROJ_TYPE); |
|
|
|
|
|
|
|
|
|
|
|
@ -392,9 +396,11 @@ createScene(std::vector<hex_info>* hexes) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
|
// free temporary buffers
|
|
|
|
// free temporary buffers
|
|
|
|
|
|
|
|
// TODO: temp buffers won't be freed if exit early is hit
|
|
|
|
std::free(vbuf); |
|
|
|
std::free(vbuf); |
|
|
|
std::free(cbuf); |
|
|
|
std::free(cbuf); |
|
|
|
std::free(line_buf); |
|
|
|
std::free(line_buf); |
|
|
|
|
|
|
|
vbuf = cbuf = line_buf = nullptr; |
|
|
|
|
|
|
|
|
|
|
|
// debug draw vertexes
|
|
|
|
// debug draw vertexes
|
|
|
|
|
|
|
|
|
|
|
|
@ -403,6 +409,50 @@ createScene(std::vector<hex_info>* hexes) |
|
|
|
if (!initGLBufferObject(&g_debug_render_group.vertex_buffer, len, GL_DYNAMIC_DRAW, 0)) |
|
|
|
if (!initGLBufferObject(&g_debug_render_group.vertex_buffer, len, GL_DYNAMIC_DRAW, 0)) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///////////////
|
|
|
|
|
|
|
|
// TODO: Testing Entities/assimp model loading
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// g_entity_render_group
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint entity_buf_len = entities[0].num_vertices * 3; |
|
|
|
|
|
|
|
GLfloat* entity_buf = (GLfloat*) std::calloc(entity_buf_len, sizeof(GLfloat)); |
|
|
|
|
|
|
|
GLfloat* entity_color_buf = (GLfloat*) std::calloc(entity_buf_len, sizeof(GLfloat)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// dump vertices into temporary buffer
|
|
|
|
|
|
|
|
uint vertex_index = 0; |
|
|
|
|
|
|
|
uint vertex_prop_index = 0; |
|
|
|
|
|
|
|
GLfloat entity_test_color[3]; |
|
|
|
|
|
|
|
convertColor(entity_test_color, 0x565656FF); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (uint j = 0; j < entity_buf_len; j++) { |
|
|
|
|
|
|
|
const glm::vec3& vertex = entities[0].vertices[vertex_index]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch (vertex_prop_index) { |
|
|
|
|
|
|
|
case 0: entity_buf[j] = vertex.x; break; |
|
|
|
|
|
|
|
case 1: entity_buf[j] = vertex.y; break; |
|
|
|
|
|
|
|
case 2: entity_buf[j] = vertex.z; break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
entity_color_buf[j] = entity_test_color[vertex_prop_index]; |
|
|
|
|
|
|
|
vertex_prop_index++; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (vertex_prop_index == 3) { |
|
|
|
|
|
|
|
vertex_prop_index = 0; |
|
|
|
|
|
|
|
vertex_index++; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!initGLBufferObject(&g_entity_render_group.vertex_buffer, entity_buf_len, |
|
|
|
|
|
|
|
GL_DYNAMIC_DRAW, entity_buf)) |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::free(entity_buf); |
|
|
|
|
|
|
|
std::free(entity_color_buf); |
|
|
|
|
|
|
|
entity_buf = entity_color_buf = nullptr; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/////////
|
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -692,6 +742,9 @@ renderFrame(std::vector<hex_info> *hexes) |
|
|
|
// hex lines
|
|
|
|
// hex lines
|
|
|
|
|
|
|
|
|
|
|
|
drawRenderGroup(&g_hex_line_render_group, GL_LINES); |
|
|
|
drawRenderGroup(&g_hex_line_render_group, GL_LINES); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: testing entity rendering
|
|
|
|
|
|
|
|
drawRenderGroup(&g_entity_render_group, GL_TRIANGLES); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
void |
|
|
|
@ -719,7 +772,8 @@ freeBuffers() |
|
|
|
std::vector<gl_render_group> groups = { |
|
|
|
std::vector<gl_render_group> groups = { |
|
|
|
g_filled_hex_render_group, |
|
|
|
g_filled_hex_render_group, |
|
|
|
g_hex_line_render_group, |
|
|
|
g_hex_line_render_group, |
|
|
|
g_debug_render_group |
|
|
|
g_debug_render_group, |
|
|
|
|
|
|
|
//g_entity_render_group TODO: handle enitiy memory separately
|
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
for (gl_render_group group : groups) |
|
|
|
for (gl_render_group group : groups) |
|
|
|
|