LPD3DTLVERTEX get_terrain_3d_buffered_vertices ( int number_of_vertices ) { if ( vertex_buffer == -1 ) { // // Open up a vertex buffer // base_index = 0; vertex_buffer = 0; vertex_buffer_indices[vertex_buffer].base_index = 0; vertex_buffer_indices[vertex_buffer].number_of_vertices_buffered = 0; buffered_vertices = get_d3d_alpha_vertex_buffer_vertices ( vertex_buffer ); } if ( vertex_buffer_indices[vertex_buffer].number_of_vertices_buffered + number_of_vertices > 256 ) { // // Move onto the next vertex buffer // ASSERT ( vertex_buffer < ( MAX_ALPHA_VERTEX_BUFFERS -1 ) ); unlock_d3d_alpha_vertex_buffer ( vertex_buffer ); vertex_buffer_indices[vertex_buffer].number = base_index - vertex_buffer_indices[vertex_buffer].base_index; vertex_buffer++; vertex_buffer_indices[vertex_buffer].base_index = base_index; vertex_buffer_indices[vertex_buffer].number_of_vertices_buffered = 0; buffered_vertices = get_d3d_alpha_vertex_buffer_vertices ( vertex_buffer ); } return ( &buffered_vertices[vertex_buffer_indices[vertex_buffer].number_of_vertices_buffered] ); }
void draw_terrain_3d_buffered_polygons ( void ) { if ( vertex_buffer != -1 ) { // // Finalise the last vertex buffer used // unlock_d3d_alpha_vertex_buffer ( vertex_buffer ); vertex_buffer_indices[vertex_buffer].number = base_index - vertex_buffer_indices[vertex_buffer].base_index; if ( base_index ) { int count; // // Flush any buffered primitives // finalise_primitives (); // // Set the alpha blend modes // set_d3d_alpha_fog_zbuffer ( TRUE, FALSE, TRUE, FALSE ); // // Set the texture handle // set_d3d_texture ( 0, load_hardware_texture_map ( terrain_buffered_polygons_texture ) ); // // Draw all the buffered vertex buffers // for ( count = 0; count <= vertex_buffer; count++ ) { #ifdef _WIN32 unsigned int d3drval; d3drval = IDirect3DDevice7_DrawIndexedPrimitiveVB ( d3d.device, D3DPT_TRIANGLELIST, d3d.alpha_vertex_buffer[count], 0, vertex_buffer_indices[count].number_of_vertices_buffered, &buffered_indices[ vertex_buffer_indices[count].base_index ], vertex_buffer_indices[count].number, ( unsigned long ) ( 0 ) ); if ( d3drval != DD_OK ) { debug_log ( "Unable to draw buffered triangles: %s", get_ddraw_error_message ( d3drval ) ); } #endif Transform(); glVertexPointer(3, GL_FLOAT, sizeof(D3DTLVERTEX), 0); glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(D3DTLVERTEX), (GLvoid *) offsetof(D3DTLVERTEX, r)); glTexCoordPointer(2, GL_FLOAT, sizeof(D3DTLVERTEX), (GLvoid *) offsetof(D3DTLVERTEX, tu)); glDrawElements(GL_TRIANGLES,vertex_buffer_indices[count].number,GL_UNSIGNED_SHORT, (GLvoid *) buffered_indices[ vertex_buffer_indices[count].base_index]); // OpenGlDrawIndexedBuffer(GL_TRIANGLES,d3d.alpha_vertex_buffer[count],0,vertex_buffer_indices[count].number_of_vertices_buffered, // buffered_indices[ vertex_buffer_indices[count].base_index]); } // // Turn the blend mode off // set_d3d_alpha_fog_zbuffer ( FALSE, TRUE, TRUE, TRUE ); } // // Reset the things! // reset_terrain_3d_buffered_polygons (); } }
void draw_terrain_3d_buffered_polygons ( void ) { if ( vertex_buffer != -1 ) { // // Finalise the last vertex buffer used // unlock_d3d_alpha_vertex_buffer ( vertex_buffer ); vertex_buffer_indices[vertex_buffer].number = base_index - vertex_buffer_indices[vertex_buffer].base_index; if ( base_index ) { int count; // // Flush any buffered primitives // finalise_primitives (); // // Set the alpha blend modes // set_d3d_alpha_fog_zbuffer ( TRUE, FALSE, TRUE, FALSE ); // // Set the texture handle // set_d3d_texture ( 0, terrain_buffered_polygons_texture ); // // Draw all the buffered vertex buffers // for ( count = 0; count <= vertex_buffer; count++ ) { f3d_draw_vb ( D3DPT_TRIANGLELIST, d3d.alpha_vertex_buffer[count], 0, vertex_buffer_indices[count].number_of_vertices_buffered, &buffered_indices[ vertex_buffer_indices[count].base_index ], vertex_buffer_indices[count].number ); } // // Turn the blend mode off // set_d3d_alpha_fog_zbuffer ( FALSE, TRUE, TRUE, TRUE ); } // // Reset the things! // reset_terrain_3d_buffered_polygons (); } }