whole
[carveJwlIkooP6JGAAIwe30JlM.git] / scene.h
diff --git a/scene.h b/scene.h
index aaecfcce803f3fe04b6af604b83600bb002ac071..8754d00985ba6f1a22af9a42b423bbf736c6b790 100644 (file)
--- 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 )
 {
@@ -137,8 +136,11 @@ static void scene_add_submesh( scene *pscene, mdl_header *mdl,
 
       m4x3_mulv( transform, src->co, pvert->co );
       m3x3_mulv( normal_matrix, src->norm, pvert->norm );
-
-      v4_copy( src->colour, pvert->colour );
+      
+      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 );
    }
 
@@ -152,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;
@@ -194,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 */
 }