void __attribute__((noreturn)) gl_main_loop(global_context *ctx){ int i,j,k; while(!gl_window_should_close(ctx->window)){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if(ctx->update_userdata){ ctx->update_userdata(ctx->userdata); } for(i=0;i<ctx->num_scenes;i++){ gl_scene *scene = &(ctx->scenes[i]); //or gl_scene scene = ctx->scenes[i]; bind_scene(scene); if(scene->update_scene){ scene->update_scene(scene, ctx->userdata); } //bind uniform blocks for(j=0;j<scene->num_buffers;j++){ gl_buffer *buf = scene->buffers + j*sizeof(gl_buffer); bind_buffer(buf); if(buf->update_buffer){ buf->update_buffer(buf, ctx->userdata); } /* TODO: update the buffer struct to contain index limits and optimze this by calling glDrawRangeElements instead. */ glDrawElements(buf->draw_mode, buf->draw_count, buf->index_type, (void*)buf->index_offset); } } gl_swap_buffers(ctx->window); gl_poll_events(); } exit(0);//need a way to specify an exit value }
void gl_retained_mesh::draw() const { m_buffer.prepare_for_render(); bind_buffer(); assert( GL_NO_ERROR == glGetError() ); if( m_indices.size() > 0 ) glDrawElements( m_primitiveType, static_cast<GLsizei>( m_indices.size() ), GL_UNSIGNED_INT, reinterpret_cast<const GLvoid*>( &m_indices[0] ) ); if( GL_NO_ERROR != glGetError() ) { throw std::runtime_error( "gl_retained_mesh.draw: Failed to draw mesh because OpenGL entered an error state after glDrawElements call." ); } }
void gl_retained_mesh::init_buffer() { gl_retained_object_manager& manager = gl_retained_object_manager::get_manager(); manager.add_ref_to_vao( m_vaoId ); m_bufferId = manager.get_new_vbo( m_vaoId ); if( GL_NO_ERROR != glGetError() ) { throw std::runtime_error( "gl_retained_mesh.init_buffer: Failed to initialize buffer because OpenGL entered an error state when trying " + std::string( "to generate a buffer for mesh indices." ) ); } bind_buffer(); }
void gl_display_object(t_resources *res, t_mesh *mesh, t_mode mode) { t_mat *model_mat; set_uniform(res, mode); if (mode == MODE_COLOR) glUseProgram(res->shader_color->program_id); else glUseProgram(res->shader_texture->program_id); model_mat = model_matrix(mesh); glUniformMatrix4fv(get_uniform_id(&res->gl_model_uni, mode), 1, GL_FALSE, model_mat->array); bind_buffer(mesh->gl_buff_vertex, 0, 3); if (mode == MODE_COLOR) bind_buffer(mesh->gl_buff_colors, 1, 3); else bind_buffer(mesh->gl_buff_uv, 1, 2); bind_buffer(mesh->gl_buff_normal, 2, 3); glDrawArrays(GL_TRIANGLES, 0, mesh->size); glDisableVertexAttribArray(0); glDisableVertexAttribArray(1); free(model_mat); }
static auto bind(buffer_target tgt, buffer_name buf) noexcept { return bind_buffer(tgt, buf); }