I use 3 function for every primitive - example here ( I cut out the other planes ) VBO_Quad -> creates the data in the machines memory
Upload_VBO transfers everything to GPU memory
Draw_VBO displays it
extern VBO_Struct* VBO_Quad( GLfloat lg_x, GLfloat lg_y, GLfloat lg_z, RGBA_Struct* base_col )
{
VBO_Struct* vbo;
VBO_Index_Buffer_Struct* ib;
VBO_Data_Struct* vdr;
int c1;
lg_x /= 2.0f; lg_y /= 2.0f; lg_z /= 2.0f;
vbo = Create_VBO_Struct(); // Erzeuge das VOB_1_Struct
Init_VBO_Struct( vbo, 24, 1 ); // Initialisiere es mit 8 vboertices und 1 Indexbuffer
vbo->idb_ptr[ 0 ] = Init_VBO_Index_Buffer_Struct( 24 ); // ein Indexbuffer mit 24 Einträgen
vdr = vbo->vb;
/*************************************/
/* Vertics Vorderseite <> 0 -- 3 */
/*************************************/
vdr->vx.x = -lg_x; vdr->vx.y = -lg_y; vdr->vx.z = lg_z; memcpy( &vdr->v_norm, &_z_plus_norm, vertex_struct_size ); memcpy( &vdr->col, base_col, rgba_struct_size ); vdr++;
vdr->vx.x = lg_x; vdr->vx.y = -lg_y; vdr->vx.z = lg_z; memcpy( &vdr->v_norm, &_z_plus_norm, vertex_struct_size ); memcpy( &vdr->col, base_col, rgba_struct_size ); vdr++;
vdr->vx.x = lg_x; vdr->vx.y = lg_y; vdr->vx.z = lg_z; memcpy( &vdr->v_norm, &_z_plus_norm, vertex_struct_size ); memcpy( &vdr->col, base_col, rgba_struct_size ); vdr++;
vdr->vx.x = -lg_x; vdr->vx.y = lg_y; vdr->vx.z = lg_z; memcpy( &vdr->v_norm, &_z_plus_norm, vertex_struct_size ); memcpy( &vdr->col, base_col, rgba_struct_size ); vdr++;
ib = vbo->idb_ptr[ 0 ];
ib->draw_id = 8; // Quads
for( c1 = 0; c1 < 24; c1++ ) ib->i_ptr[ c1 ] = c1;
return( vbo );
}
extern int32_t VBO_Upload( VBO_Struct* vbo )
{
VBO_Index_Buffer_Struct* v_idb;
uint32_t c1;
glGenBuffers( 1, &vbo->id );
glBindBuffer( GL_ARRAY_BUFFER, vbo->id );
glBufferData( GL_ARRAY_BUFFER, vbo->vb_size, vbo->vb, GL_DYNAMIC_DRAW );
for( c1 = 0; c1 < vbo->idb_numb; c1++ )
{
v_idb = vbo->idb_ptr[ c1 ];
glGenBuffers( 1, &v_idb->id );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, v_idb->id );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, v_idb->size, v_idb->i_ptr, GL_STATIC_DRAW );
}
return( 1 );
}
extern void Draw_VBO( VBO_Struct* vbo )
{
VBO_Index_Buffer_Struct* v_ib;
uint32_t c1;
glBindBuffer( GL_ARRAY_BUFFER, vbo->id );
glColorPointer ( 4, GL_UNSIGNED_BYTE, vbo->stride, vbo->col_offset ); // Colorpointer setzen
glVertexPointer( 3, GL_FLOAT, vbo->stride, vbo->vertex_offset ); // Vertexpointer setzen
glNormalPointer( GL_FLOAT, vbo->stride, vbo->normal_offset ); // Normalenpointer setzen
for( c1 = 0; c1 < vbo->idb_numb; c1++ )
{
v_ib = vbo->idb_ptr[ c1 ]; // Pointer auf Indexbuffer
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, v_ib->id ); // Indexbuffer aktivieren
switch( v_ib->draw_id )
{
case 2: // GL_LINE_STRIP
{
glDrawElements( GL_LINE_STRIP, v_ib->numb, GL_UNSIGNED_INT, NULL ); // TRIANGLES zeichnen
break;
}
case 4: // GL_TRIANGLES
{
glDrawElements( GL_TRIANGLES, v_ib->numb, GL_UNSIGNED_INT, NULL ); // TRIANGLES zeichnen
break;
}
case 5: // TRIANGLE_FAN
{
glDrawElements( GL_TRIANGLE_FAN, v_ib->numb, GL_UNSIGNED_INT, NULL ); // TRIANGLE_FAN zeichnen
break;
}
case 7: // POLYGON
{
glDrawElements( GL_POLYGON, v_ib->numb, GL_UNSIGNED_INT, NULL ); // POLYGON zeichnen
break;
}
case 8: // GL_QUADS
{
glDrawElements( GL_QUADS, v_ib->numb, GL_UNSIGNED_INT, NULL ); // QUADS zeichnen
break;
}
case 9: // GL_STRIP
{
glDrawElements( GL_QUAD_STRIP, v_ib->numb, GL_UNSIGNED_INT, NULL ); // QUADS_STRIP zeichnen
break;
}
} // Ende des switch Blocks
}
glBindBuffer( GL_ARRAY_BUFFER, 0 );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
}