review save method
[carveJwlIkooP6JGAAIwe30JlM.git] / world_gen.c
index 799059a5f423626e00dd8a9969f94f3ece09a58e..81ad00cbc3c3926e7f2e62ae3344876f15799255 100644 (file)
@@ -46,9 +46,9 @@ VG_STATIC void world_add_all_if_material( m4x3f transform, scene_context *scene,
  * |        |
  * |________|
  */
-VG_STATIC void world_gen_add_blob( scene_context *scene, ray_hit *hit )
+VG_STATIC void world_gen_add_blob( world_instance *world,
+                                   scene_context *scene, ray_hit *hit )
 {
-   world_instance *world = world_loading_instance();
    m4x3f transform;
    v4f qsurface, qrandom;
    v3f axis;
@@ -106,13 +106,13 @@ VG_STATIC void world_gen_add_blob( scene_context *scene, ray_hit *hit )
 /* 
  * Sprinkle foliage models over the map on terrain material 
  */
-VG_STATIC void world_apply_procedural_foliage( scene_context *scene,
+VG_STATIC void world_apply_procedural_foliage( world_instance *world,
+                                               scene_context *scene,
                                                struct world_surface *mat )
 {
    if( vg.quality_profile == k_quality_profile_low )
       return;
 
-   world_instance *world = world_loading_instance();
    vg_info( "Applying foliage (%u)\n", mat->info.pstr_name );
 
    v3f volume;
@@ -139,7 +139,7 @@ VG_STATIC void world_apply_procedural_foliage( scene_context *scene,
       if( ray_world( world, pos, (v3f){0.0f,-1.0f,0.0f}, &hit )){
          struct world_surface *m1 = ray_hit_surface( world, &hit );
          if((hit.normal[1] > 0.8f) && (m1 == mat) && (hit.pos[1] > 0.0f+10.0f)){
-            world_gen_add_blob( scene, &hit );
+            world_gen_add_blob( world, scene, &hit );
             count ++;
          }
       }
@@ -148,15 +148,26 @@ VG_STATIC void world_apply_procedural_foliage( scene_context *scene,
    vg_info( "%d foliage models added\n", count );
 }
 
+VG_STATIC 
+void world_unpack_submesh_dynamic( world_instance *world,
+                                   scene_context *scene, mdl_submesh *sm ){
+   if( sm->flags & k_submesh_flag_consumed ) return;
+
+   m4x3f identity;
+   m4x3_identity( identity );
+   scene_add_mdl_submesh( scene, &world->meta, sm, identity );
+
+   scene_copy_slice( scene, sm );
+   sm->flags |= k_submesh_flag_consumed;
+}
+
 /*
  * Create the main meshes for the world
  */
-VG_STATIC void world_gen_generate_meshes(void)
-{
+VG_STATIC void world_gen_generate_meshes( world_instance *world ){
    /* 
     * Compile meshes into the world scenes
     */
-   world_instance *world = world_loading_instance();
    scene_init( &world->scene_geo, 320000, 1200000 );
    u32 buf_size = scene_mem_required( &world->scene_geo );
    u8 *buffer = vg_linear_alloc( world->heap, buf_size );
@@ -227,7 +238,7 @@ VG_STATIC void world_gen_generate_meshes(void)
 
    vg_async_item *call = scene_alloc_async( &world->scene_no_collide,
                                             &world->mesh_no_collide,
-                                            200000, 500000 );
+                                            250000, 500000 );
 
    for( u32 i=0; i<world->surface_count; i++ ){
       struct world_surface *surf = &world->surfaces[ i ];
@@ -237,30 +248,50 @@ VG_STATIC void world_gen_generate_meshes(void)
                                     &world->scene_no_collide, &world->meta, i );
       }
 
-      if( surf->info.flags & k_material_flag_grow_grass )
-         world_apply_procedural_foliage( &world->scene_no_collide, surf );
+      if( surf->info.flags & k_material_flag_grow_grass ){
+         world_apply_procedural_foliage( world, &world->scene_no_collide, 
+                                         surf );
+      }
 
       scene_copy_slice( &world->scene_no_collide, &surf->sm_no_collide );
    }
 
+   /* unpack traffic models.. TODO: should we just put all these submeshes in a
+    * dynamic models list? and then the actual entitities point to the 
+    * models. we only have 2 types at the moment which need dynamic models but
+    * would make sense to do this when/if we have more.
+    */
    for( u32 i=0; i<mdl_arrcount( &world->ent_traffic ); i++ ){
       ent_traffic *vehc = mdl_arritm( &world->ent_traffic, i );
 
       for( u32 j=0; j<vehc->submesh_count; j++ ){
          mdl_submesh *sm = mdl_arritm( &world->meta.submeshs, 
                                        vehc->submesh_start+j );
+         world_unpack_submesh_dynamic( world, &world->scene_no_collide, sm );
+      }
+   }
 
-         if( sm->flags & k_submesh_flag_consumed ){
-            continue;
-         }
+   /* unpack challenge models */
+   for( u32 i=0; i<mdl_arrcount( &world->ent_challenge ); i++ ){
+      ent_challenge *challenge = mdl_arritm( &world->ent_challenge, i );
+
+      for( u32 j=0; j<challenge->submesh_count; j ++ ){
+         mdl_submesh *sm = mdl_arritm( &world->meta.submeshs, 
+                                       challenge->submesh_start+j );
+         world_unpack_submesh_dynamic( world, &world->scene_no_collide, sm );
+      }
+   }
+
+   /* unpack gate models */
+   for( u32 i=0; i<mdl_arrcount( &world->ent_gate ); i++ ){
+      ent_gate *gate = mdl_arritm( &world->ent_gate, i );
 
-         m4x3f identity;
-         m4x3_identity( identity );
-         scene_add_mdl_submesh( &world->scene_no_collide, 
-                                &world->meta, sm, identity );
+      if( !(gate->flags & k_ent_gate_custom_mesh) ) continue;
 
-         scene_copy_slice( &world->scene_no_collide, sm );
-         sm->flags |= k_submesh_flag_consumed;
+      for( u32 j=0; j<gate->submesh_count; j ++ ){
+         mdl_submesh *sm = mdl_arritm( &world->meta.submeshs, 
+                                       gate->submesh_start+j );
+         world_unpack_submesh_dynamic( world, &world->scene_no_collide, sm );
       }
    }
 
@@ -268,8 +299,7 @@ VG_STATIC void world_gen_generate_meshes(void)
 }
 
 /* signed distance function for cone */
-static f32 fsd_cone_infinite( v3f p, v2f c )
-{
+static f32 fsd_cone_infinite( v3f p, v2f c ){
    v2f q = { v2_length( (v2f){ p[0], p[2] } ), -p[1] };
    float s = vg_maxf( 0.0f, v2_dot( q, c ) );
 
@@ -291,8 +321,7 @@ struct light_indices_upload_info{
 /*
  * Async reciever to buffer light index data 
  */
-VG_STATIC void async_upload_light_indices( void *payload, u32 size )
-{
+VG_STATIC void async_upload_light_indices( void *payload, u32 size ){
    struct light_indices_upload_info *info = payload;
 
    glGenTextures( 1, &info->world->tex_light_cubes );
@@ -307,10 +336,8 @@ VG_STATIC void async_upload_light_indices( void *payload, u32 size )
 /*
  * Computes light indices for world
  */
-VG_STATIC void world_gen_compute_light_indices(void)
-{
+VG_STATIC void world_gen_compute_light_indices( world_instance *world ){
    /* light cubes */
-   world_instance *world = world_loading_instance();
    v3f cubes_min, cubes_max;
    v3_muls( world->scene_geo.bbx[0], 1.0f/k_world_light_cube_size, cubes_min );
    v3_muls( world->scene_geo.bbx[1], 1.0f/k_world_light_cube_size, cubes_max );
@@ -467,10 +494,9 @@ VG_STATIC void world_gen_compute_light_indices(void)
 /*
  * Rendering pass needed to complete the world
  */
-VG_STATIC void async_world_postprocess_render( void *payload, u32 _size )
-{
+VG_STATIC void async_world_postprocess_render( void *payload, u32 _size ){
    /* create scene lighting buffer */
-   world_instance *world = world_loading_instance();
+   world_instance *world = payload;
 
    u32 size = VG_MAX(mdl_arrcount(&world->ent_light),1) * sizeof(float)*12;
    vg_info( "Upload %ubytes (lighting)\n", size );
@@ -577,12 +603,23 @@ VG_STATIC void async_world_postprocess_render( void *payload, u32 _size )
    glBindBuffer( GL_UNIFORM_BUFFER, world->ubo_lighting );
    glBufferSubData( GL_UNIFORM_BUFFER, 0, 
                     sizeof(struct ub_world_lighting), &world->ub_lighting );
+
+   /* yes we are using this as the entity begin thing. FIXME */
+   world->probabilities[ k_probability_curve_constant ] = 1.0f;
+   for( u32 i=0; i<mdl_arrcount(&world->ent_audio); i++ ){
+      ent_audio *audio = mdl_arritm(&world->ent_audio,i);
+      if( audio->flags & AUDIO_FLAG_AUTO_START ){
+         ent_call call;
+         call.data = NULL;
+         call.function = k_ent_function_trigger;
+         call.id = mdl_entity_id( k_ent_audio, i );
+         entity_call( world, &call );
+      }
+   }
 }
 
 /* Loads textures from the pack file */
-VG_STATIC void world_gen_load_surfaces(void)
-{
-   world_instance *world = world_loading_instance();
+VG_STATIC void world_gen_load_surfaces( world_instance *world ){
    vg_info( "Loading textures\n" );
    world->texture_count = 0;