clean boardshop idea
[carveJwlIkooP6JGAAIwe30JlM.git] / world.h
diff --git a/world.h b/world.h
index 5318f8e326408c6d75624b2ed4ab8f7b38453328..f065cb3ccf78abe82a48966da1c396b8d30e9408 100644 (file)
--- a/world.h
+++ b/world.h
@@ -165,7 +165,10 @@ struct world_instance {
                  ent_audio_clip,
                  ent_audio,
                  ent_volume,
-                 ent_traffic;
+                 ent_traffic,
+                 ent_skateshop,
+                 ent_marker,
+                 ent_camera;
 
    ent_gate *rendering_gate;
 
@@ -174,9 +177,9 @@ struct world_instance {
     */
 
    /* world geometry */
-   scene *scene_geo, 
-         *scene_no_collide,
-         *scene_lines;
+   scene_context scene_geo,
+                 scene_no_collide,
+                 scene_lines;
 
    /* spacial mappings */
    bh_tree *audio_bh,
@@ -221,6 +224,7 @@ struct world_global{
       glmesh mesh_base, mesh_display;
       mdl_submesh sm_base;
       u32 active_route_board;
+      scene_context scene;
 
       u32 w, h;
       float *buffer;
@@ -386,15 +390,9 @@ VG_STATIC void world_init(void)
    mdl_context msky;
    mdl_open( &msky, "models/rs_skydome.mdl", vg_mem.scratch );
    mdl_load_metadata_block( &msky, vg_mem.scratch );
-   mdl_load_mesh_block( &msky, vg_mem.scratch );
+   mdl_async_load_glmesh( &msky, &world_global.skydome );
    mdl_close( &msky );
 
-   vg_acquire_thread_sync();
-   {
-      mdl_unpack_glmesh( &msky, &world_global.skydome );
-   }
-   vg_release_thread_sync();
-
    /* Other systems */
    vg_info( "Loading other world systems\n" );
 
@@ -410,22 +408,14 @@ VG_STATIC void world_init(void)
                                                    VG_MEMORY_SYSTEM );
 }
 
-typedef struct ent_call ent_call;
-struct ent_call{
-   ent_index ent;
-   u32 function;
-   void *data;
-};
-
-VG_STATIC void entity_call( world_instance *world, ent_call *call );
-
 VG_STATIC void ent_volume_call( world_instance *world, ent_call *call )
 {
-   ent_volume *volume = mdl_arritm( &world->ent_volume, call->ent.index );
-   if( !volume->target.type ) return;
+   u32 index = mdl_entity_id_id( call->id );
+   ent_volume *volume = mdl_arritm( &world->ent_volume, index );
+   if( !volume->target ) return;
 
    if( call->function == k_ent_function_trigger ){
-      call->ent = volume->target;
+      call->id = volume->target;
 
       if( volume->type == k_volume_subtype_particle ){
          float *co = alloca( sizeof(float)*3 );
@@ -438,14 +428,16 @@ VG_STATIC void ent_volume_call( world_instance *world, ent_call *call )
          call->data = co;
          entity_call( world, call );
       }
-      else
+      else{
          entity_call( world, call );
+      }
    }
 }
 
 VG_STATIC void ent_audio_call( world_instance *world, ent_call *call )
 {
-   ent_audio *audio = mdl_arritm( &world->ent_audio, call->ent.index );
+   u32 index = mdl_entity_id_id( call->id );
+   ent_audio *audio = mdl_arritm( &world->ent_audio, index );
 
    v3f sound_co;
 
@@ -456,7 +448,7 @@ VG_STATIC void ent_audio_call( world_instance *world, ent_call *call )
       v3_copy( audio->transform.co, sound_co );
    }
    else
-      vg_fatal_exit_loop( "ent_audio_call (invalid function id)" );
+      vg_fatal_error( "ent_audio_call (invalid function id)" );
 
    float chance = vg_randf()*100.0f,
          bar = 0.0f;
@@ -529,15 +521,6 @@ VG_STATIC void ent_audio_call( world_instance *world, ent_call *call )
    }
 }
 
-VG_STATIC void entity_call( world_instance *world, ent_call *call )
-{
-   if( call->ent.type == k_ent_volume ){
-      ent_volume_call( world, call );
-   } else if( call->ent.type == k_ent_audio ){
-      ent_audio_call( world, call );
-   }
-}
-
 VG_STATIC void world_update( world_instance *world, v3f pos )
 {
    world_global.sky_time += world_global.sky_rate * vg.time_delta;
@@ -689,9 +672,8 @@ VG_STATIC void world_update( world_instance *world, v3f pos )
 
             if( !world_global.in_volume ){
                ent_call basecall;
-               basecall.ent.index = idx;
-               basecall.ent.type = k_ent_volume;
                basecall.function = k_ent_function_trigger;
+               basecall.id = mdl_entity_id( k_ent_volume, idx );
                basecall.data = NULL;
 
                entity_call( world, &basecall );
@@ -705,9 +687,7 @@ VG_STATIC void world_update( world_instance *world, v3f pos )
 
          for( int j=0; j<random_ticks; j++ ){
             ent_call basecall;
-            basecall.ent.index = idx;
-            basecall.ent.type = k_ent_volume;
-            basecall.function = k_ent_function_trigger;
+            basecall.id = mdl_entity_id( k_ent_volume, idx );
             basecall.data = NULL;
 
             entity_call( world, &basecall );
@@ -749,13 +729,13 @@ VG_STATIC void ray_world_get_tri( world_instance *world,
                                   ray_hit *hit, v3f tri[3] )
 {
    for( int i=0; i<3; i++ )
-      v3_copy( world->scene_geo->arrvertices[ hit->tri[i] ].co, tri[i] );
+      v3_copy( world->scene_geo.arrvertices[ hit->tri[i] ].co, tri[i] );
 }
 
 VG_STATIC int ray_world( world_instance *world,
                          v3f pos, v3f dir, ray_hit *hit )
 {
-   return scene_raycast( world->scene_geo, world->geo_bh, pos, dir, hit );
+   return scene_raycast( &world->scene_geo, world->geo_bh, pos, dir, hit );
 }
 
 /*
@@ -788,14 +768,14 @@ VG_STATIC int spherecast_world( world_instance *world,
 
    int idx;
    while( bh_next( world->geo_bh, &it, region, &idx ) ){
-      u32 *ptri = &world->scene_geo->arrindices[ idx*3 ];
+      u32 *ptri = &world->scene_geo.arrindices[ idx*3 ];
       v3f tri[3];
 
       boxf box;
       box_init_inf( box );
 
       for( int j=0; j<3; j++ ){
-         v3_copy( world->scene_geo->arrvertices[ptri[j]].co, tri[j] );
+         v3_copy( world->scene_geo.arrvertices[ptri[j]].co, tri[j] );
          box_addpt( box, tri[j] );
       }