X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=scene.h;h=8754d00985ba6f1a22af9a42b423bbf736c6b790;hb=d045af680c6b8ca267a7aded69e2e510e659d2ab;hp=3e3829ecc526c3299cdb9bc8b69db7df09468ac7;hpb=9c85e110fa8b965195438d96625ff9753af362a6;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/scene.h b/scene.h index 3e3829e..8754d00 100644 --- a/scene.h +++ b/scene.h @@ -106,7 +106,6 @@ static void *buffer_fix( void *buffer, u32 count, u32 *cap, size_t emsize ) /* * 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 ) { @@ -114,6 +113,12 @@ static void scene_add_submesh( scene *pscene, mdl_header *mdl, &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 ); @@ -130,9 +135,12 @@ static void scene_add_submesh( scene *pscene, mdl_header *mdl, *src = &src_verts[ i ]; m4x3_mulv( transform, src->co, pvert->co ); - m3x3_mulv( transform, src->norm, pvert->norm ); - - v4_copy( src->colour, pvert->colour ); + 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 ); } @@ -146,6 +154,30 @@ static void scene_add_submesh( scene *pscene, mdl_header *mdl, 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; @@ -188,11 +220,15 @@ static void scene_draw( scene *pscene ) mesh_drawn( 0, pscene->indice_count ); } -static void scene_free( scene *pscene ) +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 */ }