diff --git a/src/hexgame.cpp b/src/hexgame.cpp index b46d81a..0cd58f6 100644 --- a/src/hexgame.cpp +++ b/src/hexgame.cpp @@ -476,7 +476,11 @@ int main(int argc, char* argv[]) return 1; } - createScene(hexInfoArray); + if (!createScene(hexInfoArray)) + { + LOG(ERROR) << "Error in vertex data, exiting\n"; + return 1; + } // TODO: rewrite gooey diff --git a/src/renderer.h b/src/renderer.h index ae6def8..904c457 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -16,7 +16,8 @@ // Interface bool initRenderer(SDL_Handles &handles, v2i vpDims); -// TODO: re-implement debug erender +bool createScene(std::vector* hexes); +// TODO: re-implement debug renderer void debugRender(HexDrawMode mode, hex_info *startHex, hex_info *currentHex); void renderFrame(const std::vector *hexes); void freeBuffers(); @@ -52,6 +53,15 @@ const char * LINE_FRAGMENT_SHADER_CODE = "}"; +typedef struct clear_col +{ + real32 R; + real32 G; + real32 B; + real32 A; +} clear_col; +clear_col g_clear_col { 75.f / 255.f, 135.f / 255.f, 135.f / 255.f, 1.f }; + typedef struct gl_matrix_info { glm::mat4 projection; @@ -89,9 +99,9 @@ bool initShaderProgram(gl_render_group &rg, const char * vertex_code, const char // enable debug output https://www.khronos.org/opengl/wiki/OpenGL_Error void openglDebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); -void createScene(std::vector* hexes); void parseHexToGLBuffer(GLfloat buf[], int idx, const hex_info &hex); -bool fillColorBuffer(GLfloat* buf, int len, std::vector *hexes); +bool fillColorBuffer(GLfloat buf[], int len, std::vector *hexes); +bool checkGLBufferSize(GLenum buf_type, int expected_size, int line_num); bool @@ -183,7 +193,7 @@ initShaderProgram(gl_render_group &rg, const char * vertex_code, const char * fr return true; } -void +bool createScene(std::vector* hexes) { //////////////////// @@ -224,6 +234,9 @@ createScene(std::vector* hexes) glBindBuffer(GL_ARRAY_BUFFER, g_filled_hex_render_group.vertex_buffer.buffer_id); glBufferData(GL_ARRAY_BUFFER, vertex_buffer->buffer_len * sizeof(GLfloat), vertex_buffer->buffer, GL_DYNAMIC_DRAW); + if (!checkGLBufferSize(GL_ARRAY_BUFFER, vertex_buffer->buffer_len * sizeof(GLfloat), __LINE__)) + return false; + // color data for hex vertices gl_buffer *color_buffer = &g_filled_hex_render_group.color_buffer; @@ -231,21 +244,18 @@ createScene(std::vector* hexes) color_buffer->buffer = (GLfloat*) std::calloc(color_buffer->buffer_len, sizeof(GLfloat)); if (!fillColorBuffer(color_buffer->buffer, color_buffer->buffer_len, hexes)) - { - //freeBuffers(); - //return false; - // TODO: check for retval in main() and run cleanUp() - return; - } + return false; glGenBuffers(1, &color_buffer->buffer_id); glBindBuffer(GL_ARRAY_BUFFER, color_buffer->buffer_id); glBufferData(GL_ARRAY_BUFFER, color_buffer->buffer_len * sizeof(GLfloat), color_buffer->buffer, GL_DYNAMIC_DRAW); + if (!checkGLBufferSize(GL_ARRAY_BUFFER, color_buffer->buffer_len * sizeof(GLfloat), __LINE__)) + return false; // hex line vertex data - // todo: surely there's a way to use indexed drawing for line vertices eg) line_loop + // TODO: surely there's a way to use indexed drawing for line vertices eg) line_loop // and still use one buffer for multiple shapes/paths gldrawarraysintanced?, gldrawelements? // https://gamedev.stackexchange.com/questions/104310/opengl-4-5-primitive-restart-vs-base-index int line_vertices_per_hex = 6 * 2; // 12 vertices since we're using line segments atm @@ -285,6 +295,11 @@ createScene(std::vector* hexes) glGenBuffers(1, &line_vertex_buffer->buffer_id); glBindBuffer(GL_ARRAY_BUFFER, line_vertex_buffer->buffer_id); glBufferData(GL_ARRAY_BUFFER, line_vertex_buffer->buffer_len * sizeof(GLfloat), line_vertex_buffer->buffer, GL_STATIC_DRAW); + + if (!checkGLBufferSize(GL_ARRAY_BUFFER, line_vertex_buffer->buffer_len * sizeof(GLfloat), __LINE__)) + return false; + + return true; } void @@ -338,20 +353,20 @@ fillColorBuffer(GLfloat buf[], int len, std::vector *hexes) { if (!buf || len < 1) { - // TODO: log fatal error + LOG(ERROR) << "buffer length mismatch\n"; return false; } if (!hexes || hexes->size() == 0) { - // TODO: log fatal error + LOG(ERROR) << "hex_info input error\n"; return false; } // 3 floats per vertex, 3 vertexes per triangle, 6 triangles per hex if (len != (int) hexes->size() * 3 * 3 * 6) { - // TODO: log fatal error + LOG(ERROR) << "hex_info input error\n"; return false; } @@ -372,14 +387,21 @@ fillColorBuffer(GLfloat buf[], int len, std::vector *hexes) return true; } -typedef struct clear_col +// NOTE: this will only work after a call to glBindBuffer +bool +checkGLBufferSize(GLenum buf_type, int expected_size, int line_num) { - real32 R; - real32 G; - real32 B; - real32 A; -} clear_col; -clear_col g_clear_col { 75.f / 255.f, 135.f / 255.f, 135.f / 255.f, 1.f }; + GLint gl_size; + glGetBufferParameteriv(buf_type, GL_BUFFER_SIZE ,&gl_size); + + if (expected_size != gl_size) + { + LOG(ERROR) << "line: " << line_num << "gl buffer size mismatch\n"; + return false; + } + + return true; +} void openglDebugCallback(GLenum source, GLenum type, GLuint id, GLenum severity,