Esempio n. 1
0
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);
}
Esempio n. 5
0
	static
	auto bind(buffer_target tgt, buffer_name buf)
	noexcept
	{
		return bind_buffer(tgt, buf);
	}