CHGICKEN
[carveJwlIkooP6JGAAIwe30JlM.git] / scene.h
diff --git a/scene.h b/scene.h
index af24b6cee41cb4c2739407d13af486a9737e4a9b..ff970007dfb5fce17dbfc9c03f2a3be2b27c9bbb 100644 (file)
--- a/scene.h
+++ b/scene.h
@@ -181,6 +181,50 @@ static void scene_add_model( scene *pscene, model *mdl, submodel *submodel,
    pscene->indice_count += submodel->indice_count;
 }
 
+static void scene_add_foliage( scene *pscene, model *mdl, submodel *submodel,
+      m4x3f transform )
+{
+   pscene->verts = buffer_reserve( pscene->verts, pscene->vertex_count, 
+         &pscene->vertex_cap, submodel->vertex_count, sizeof(model_vert) );
+   pscene->indices = buffer_reserve( pscene->indices, pscene->indice_count,
+         &pscene->indice_cap, submodel->indice_count, sizeof(u32) );
+   
+   /* Transform and place vertices */
+   model_vert *src_verts = submodel_vert_data( mdl, submodel );
+   u32 *src_indices = submodel_indice_data( mdl, submodel );
+   
+   boxf bbxnew;
+   box_copy( submodel->bbx, bbxnew );
+   m4x3_transform_aabb( transform, bbxnew );
+   box_concat( pscene->bbx, bbxnew );
+   
+   float rand_hue = vg_randf();
+   for( u32 i=0; i<submodel->vertex_count; i++ )
+   {
+      model_vert *pvert = &pscene->verts[ pscene->vertex_count+i ],
+                 *src = &src_verts[ i ];
+
+      m4x3_mulv( transform, src->co, pvert->co );
+      m3x3_mulv( transform, src->norm, pvert->norm );
+
+      v4_copy( src->colour, pvert->colour );
+      v2_copy( src->uv, pvert->uv );
+      
+      float rel_y = src->co[1] / submodel->bbx[1][1];
+      pvert->colour[0] = rel_y;
+      pvert->colour[2] = rand_hue;
+   }
+
+   for( u32 i=0; i<submodel->indice_count; i++ )
+   {
+      u32 *pidx = &pscene->indices[ pscene->indice_count+i ];
+      *pidx = src_indices[i] + pscene->vertex_count;
+   }
+
+   pscene->vertex_count += submodel->vertex_count;
+   pscene->indice_count += submodel->indice_count;
+}
+
 static void scene_copy_slice( scene *pscene, submodel *sm )
 {
    sm->indice_start = pscene->submesh.indice_start;