added scene_vert struct, result is good
[carveJwlIkooP6JGAAIwe30JlM.git] / world_gen.h
index 3a66523991d09c1efac6812fb7c48a40c8b6532e..89fea39c9f5068227257a806da896f1aad23db4a 100644 (file)
@@ -27,12 +27,68 @@ VG_STATIC void world_add_all_if_material( m4x3f transform, scene *pscene,
             mdl_node_transform( pnode, transform2 );
             m4x3_mul( transform, transform2, transform2 );
 
-            scene_add_submesh( pscene, mdl, sm, transform2 );
+            scene_add_mdl_submesh( pscene, mdl, sm, transform2 );
          }
       }
    }
 }
 
+VG_STATIC void world_add_blob( scene *pscene, ray_hit *hit )
+{
+   m4x3f transform;
+   v4f qsurface, qrandom;
+   v3f axis;
+
+   v3_cross( (v3f){0.0f,1.0f,0.0f}, hit->normal, axis );
+
+   float angle = v3_dot(hit->normal,(v3f){0.0f,1.0f,0.0f});
+   q_axis_angle( qsurface, axis, angle );
+   q_axis_angle( qrandom, (v3f){0.0f,1.0f,0.0f}, vg_randf()*VG_TAUf );
+   q_mul( qsurface, qrandom, qsurface );
+   q_m3x3( qsurface, transform );
+   v3_copy( hit->pos, transform[3] );
+
+   scene_vert verts[] = 
+   {
+      { .co = { -1.00f, 0.0f, 0.0f } },
+      { .co = {  1.00f, 0.0f, 0.0f } },
+      { .co = { -1.00f, 1.2f, 0.0f } },
+      { .co = {  1.00f, 1.2f, 0.0f } },
+      { .co = { -0.25f, 2.0f, 0.0f } },
+      { .co = {  0.25f, 2.0f, 0.0f } }
+   };
+
+   const u32 indices[] = { 0,1,3, 0,3,2, 2,3,5, 2,5,4 };
+
+   if( pscene->vertex_count + vg_list_size(verts) > pscene->max_vertices )
+      vg_fatal_exit_loop( "Scene vertex buffer overflow" );
+
+   if( pscene->indice_count + vg_list_size(indices) > pscene->max_indices )
+      vg_fatal_exit_loop( "Scene index buffer overflow" );
+
+   scene_vert *dst_verts = &pscene->arrvertices[ pscene->vertex_count ];
+   u32 *dst_indices      = &pscene->arrindices [ pscene->indice_count ];
+
+   scene_vert *ref       = &world.scene_geo->arrvertices[ hit->tri[0] ];
+
+   for( u32 i=0; i<vg_list_size(verts); i++ )
+   {
+      scene_vert *pvert = &dst_verts[ i ],
+                 *src   = &verts[ i ];
+
+      m4x3_mulv( transform, src->co, pvert->co );
+      scene_vert_pack_norm( pvert, transform[1] );
+
+      v2_copy( ref->uv, pvert->uv );
+   }
+
+   for( u32 i=0; i<vg_list_size(indices); i++ )
+      dst_indices[i] = indices[i] + pscene->vertex_count;
+
+   pscene->vertex_count += vg_list_size(verts);
+   pscene->indice_count += vg_list_size(indices);
+}
+
 /* Sprinkle foliage models over the map on terrain material */
 VG_STATIC void world_apply_procedural_foliage( struct world_material *mat )
 {
@@ -50,7 +106,6 @@ VG_STATIC void world_apply_procedural_foliage( struct world_material *mat )
    v3_sub( world.scene_geo->bbx[1], world.scene_geo->bbx[0], volume );
    volume[1] = 1.0f;
 
-   m4x3f transform;
    mdl_node *mblob = mdl_node_from_name( mfoliage, "blob" );
    mdl_submesh *sm_blob = mdl_node_submesh( mfoliage, mblob, 0 );
 
@@ -76,21 +131,7 @@ VG_STATIC void world_apply_procedural_foliage( struct world_material *mat )
          struct world_material *m1 = ray_hit_material( &hit );
          if((hit.normal[1] > 0.8f) && (m1 == mat) && (hit.pos[1] > 0.0f+10.0f))
          {
-            v4f qsurface, qrandom;
-            v3f axis;
-
-            v3_cross( (v3f){0.0f,1.0f,0.0f}, hit.normal, axis );
-
-            float angle = v3_dot(hit.normal,(v3f){0.0f,1.0f,0.0f});
-            q_axis_angle( qsurface, axis, angle );
-            q_axis_angle( qrandom, (v3f){0.0f,1.0f,0.0f}, vg_randf()*VG_TAUf );
-            q_mul( qsurface, qrandom, qsurface );
-            q_m3x3( qsurface, transform );
-
-            v3_copy( hit.pos, transform[3] );
-            scene_add_submesh( world.scene_no_collide, mfoliage, 
-                               sm_blob, transform);
-
+            world_add_blob( world.scene_no_collide, &hit );
             count ++;
          }
       }
@@ -319,102 +360,6 @@ VG_STATIC void world_entities_process(void)
    }
 }
 
-VG_STATIC void edge_bh_expand_bound( void *user, boxf bound, u32 item_index )
-{
-   struct grind_edge *edge_array = user,
-                     *edge = &edge_array[ item_index ];
-   
-  box_addpt( bound, edge->p0 );
-  box_addpt( bound, edge->p1 );
-}
-
-VG_STATIC float edge_bh_centroid( void *user, u32 item_index, int axis )
-{
-   struct grind_edge *edge_array = user,
-                     *edge = &edge_array[ item_index ];
-
-   return (edge->p0[axis] + edge->p1[axis]) * 0.5f;
-}
-
-VG_STATIC void edge_bh_swap( void *user, u32 ia, u32 ib )
-{
-   struct grind_edge *edge_array = user,
-                     *e0 = &edge_array[ ia ],
-                     *e1 = &edge_array[ ib ],
-                      et;
-   et = *e0;
-   *e0 = *e1;
-   *e1 = et;
-}
-
-VG_STATIC void edge_bh_closest( void *user, u32 index, v3f point, v3f closest )
-{
-   struct grind_edge *edge_array = user,
-                     *edge = &edge_array[ index ];
-   
-   closest_point_segment( edge->p0, edge->p1, point, closest );
-}
-
-VG_STATIC bh_system bh_system_edges =
-{
-   .expand_bound = edge_bh_expand_bound,
-   .item_centroid = edge_bh_centroid,
-   .item_closest = edge_bh_closest,
-   .item_swap = edge_bh_swap,
-   .item_debug = NULL,
-   .cast_ray = NULL
-};
-
-VG_STATIC void world_generate_edges(void)
-{
-   vg_info( "Generating edge array\n" );
-   world.grind_edges = vg_linear_alloc( world.dynamic_vgl, 
-                                        5000*sizeof(struct grind_edge ) );
-   world.grind_edge_count = 0;
-
-   u32 fs_count = 0;
-   for( u32 i=0; i<world.scene_geo->vertex_count; i++ )
-      if( world.scene_geo->arrvertices[i].weights[0] )
-         fs_count ++;
-
-   vg_info( "Grind verts: %u\n", fs_count );
-
-   for( u32 i=0; i<world.scene_geo->indice_count/3; i++ )
-   {
-      u32 *ptri = &world.scene_geo->arrindices[ i*3 ];
-
-      for( int j=0; j<3; j++ )
-      {
-         u32 i0 = ptri[j],
-             i1 = ptri[(j+1)%3];
-
-         mdl_vert *v0 = &world.scene_geo->arrvertices[ i0 ],
-                  *v1 = &world.scene_geo->arrvertices[ i1 ];
-
-         if( v0->weights[0] )
-         {
-            if( world.grind_edge_count == 5000 )
-               vg_fatal_exit_loop( "Edge capacity exceeded" );
-
-            struct grind_edge *ge = 
-               &world.grind_edges[ world.grind_edge_count ++ ];
-
-            v3_copy( v0->co, ge->p0 );
-            v3_copy( v1->co, ge->p1 );
-         }
-      }
-   }
-
-   vg_info( "Grind edge count: %u\n", world.grind_edge_count );
-
-   world.grind_edges = vg_linear_resize( world.dynamic_vgl, world.grind_edges,
-                           world.grind_edge_count*sizeof(struct grind_edge) );
-
-   world.grind_bh = bh_create( world.dynamic_vgl, &bh_system_edges, 
-                               world.grind_edges, world.grind_edge_count, 
-                               2 );
-}
-
 VG_STATIC void world_generate(void)
 {
    /* 
@@ -499,8 +444,6 @@ VG_STATIC void world_generate(void)
 
    vg_linear_del( world.dynamic_vgl, world.scene_no_collide );
    world.scene_no_collide = NULL;
-
-   world_generate_edges();
 }
 
 VG_STATIC int reset_player( int argc, char const *argv[] );
@@ -707,10 +650,7 @@ VG_STATIC void world_unload(void)
    world.scene_geo = NULL;
    world.scene_no_collide = NULL;
    world.scene_lines = NULL;
-   world.grind_edges = NULL;
-   world.grind_edge_count = 0;
 
-   world.grind_bh = NULL;
    world.geo_bh = NULL;
    world.trigger_bh = NULL;
    world.audio_bh = NULL;