- * Append a model into the scene with a given transform
- */
-static void scene_add_submesh( scene *pscene, mdl_header *mdl,
- mdl_submesh *sm, m4x3f transform )
-{
- pscene->verts = buffer_reserve( pscene->verts, pscene->vertex_count,
- &pscene->vertex_cap, sm->vertex_count, sizeof(mdl_vert) );
- pscene->indices = buffer_reserve( pscene->indices, pscene->indice_count,
- &pscene->indice_cap, sm->indice_count, sizeof(u32) );
-
- m3x3f normal_matrix;
- m3x3_copy( transform, normal_matrix );
- v3_normalize( normal_matrix[0] );
- v3_normalize( normal_matrix[1] );
- v3_normalize( normal_matrix[2] );
-
- /* Transform and place vertices */
- mdl_vert *src_verts = mdl_submesh_vertices( mdl, sm );
- u32 *src_indices = mdl_submesh_indices( mdl, sm );
-
- boxf bbxnew;
- box_copy( sm->bbx, bbxnew );
- m4x3_transform_aabb( transform, bbxnew );
- box_concat( pscene->bbx, bbxnew );
-
- for( u32 i=0; i<sm->vertex_count; i++ )
- {
- mdl_vert *pvert = &pscene->verts[ pscene->vertex_count+i ],
- *src = &src_verts[ i ];
-
- m4x3_mulv( transform, src->co, pvert->co );
- m3x3_mulv( normal_matrix, src->norm, pvert->norm );
-
- pvert->colour[0] = src->colour[0];
- pvert->colour[1] = src->colour[1];
- pvert->colour[2] = src->colour[2];
- pvert->colour[3] = src->colour[3];
- v2_copy( src->uv, pvert->uv );
- }
-
- for( u32 i=0; i<sm->indice_count; i++ )
- {
- u32 *pidx = &pscene->indices[ pscene->indice_count+i ];
- *pidx = src_indices[i] + pscene->vertex_count;
- }
-
- pscene->vertex_count += sm->vertex_count;
- pscene->indice_count += sm->indice_count;
-}
-
-/*
- * One by one adders for simplified access (mostly procedural stuff)
- */
-static void scene_push_tri( scene *pscene, u32 tri[3] )
-{
- pscene->indices = buffer_reserve( pscene->indices, pscene->indice_count,
- &pscene->indice_cap, 3, sizeof(u32) );
-
- u32 *dst = &pscene->indices[pscene->indice_count];
- dst[0] = tri[0];
- dst[1] = tri[1];
- dst[2] = tri[2];
-
- pscene->indice_count += 3;
-}
-
-static void scene_push_vert( scene *pscene, mdl_vert *v )
-{
- pscene->verts = buffer_reserve( pscene->verts, pscene->vertex_count,
- &pscene->vertex_cap, 1, sizeof(mdl_vert) );
-
- pscene->verts[pscene->vertex_count ++] = *v;
-}
-
-static void scene_copy_slice( scene *pscene, mdl_submesh *sm )
-{
- sm->indice_start = pscene->submesh.indice_start;
- sm->indice_count = pscene->indice_count - sm->indice_start;
-
- sm->vertex_start = pscene->submesh.vertex_start;
- sm->vertex_count = pscene->vertex_count - sm->vertex_start;
-
- pscene->submesh.indice_start = pscene->indice_count;
- pscene->submesh.vertex_start = pscene->vertex_count;
-}
-
-static void scene_fix( scene *pscene )
-{
- buffer_fix( pscene->verts, pscene->vertex_count,
- &pscene->vertex_cap, sizeof( mdl_vert ));
-
- buffer_fix( pscene->indices, pscene->indice_count,
- &pscene->indice_cap, sizeof( mdl_vert ));
-}
-
-static void scene_upload( scene *pscene )
-{
- mesh_upload( &pscene->mesh,
- pscene->verts, pscene->vertex_count,
- pscene->indices, pscene->indice_count );
-
- vg_info( "Scene upload\n" );
- vg_info( " indices:%u\n", pscene->indice_count );
- vg_info( " verts:%u\n", pscene->vertex_count );
-}
-
-static void scene_bind( scene *pscene )
-{
- mesh_bind( &pscene->mesh );
-}
-
-static void scene_draw( scene *pscene )
-{
- mesh_drawn( 0, pscene->indice_count );
-}
-
-static void scene_free_offline_buffers( scene *pscene )
-{
- free( pscene->verts );
- free( pscene->indices );
-}
-
-static void scene_free( scene *pscene )
-{
- scene_free_offline_buffers( pscene );
- /* TODO: bvh */
-}
-
-static void scene_register(void)
-{
-}
-
-/*
- * BVH implementation