/*
* 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->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 );
*src = &src_verts[ i ];
m4x3_mulv( transform, src->co, pvert->co );
- m3x3_mulv( transform, src->norm, pvert->norm );
+ m3x3_mulv( normal_matrix, src->norm, pvert->norm );
v4_copy( src->colour, pvert->colour );
v2_copy( src->uv, pvert->uv );
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;
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 */
}