change shader properties to be vg_msg based
[carveJwlIkooP6JGAAIwe30JlM.git] / world_entity.c
index 88e0e7e1a240815bc38bde6606efa077f919d09d..cdc76f1ae23d96d5bde4957843f86ea791e7ba7a 100644 (file)
@@ -115,31 +115,32 @@ void world_entity_focus_preupdate(void)
    vg_slewf( &world_static.focus_strength, active, 
              vg.time_frame_delta * (1.0f/0.5f) );
 
+   if( world_static.focused_entity == 0 )
+      return;
+
    u32 type = mdl_entity_id_type( world_static.focused_entity ),
        index = mdl_entity_id_id( world_static.focused_entity );
+
    world_instance *world = world_current_instance();
 
-   /* TODO: Table. */
-   if( type == k_ent_skateshop )
-   {
-      ent_skateshop *skateshop = mdl_arritm( &world->ent_skateshop, index );
-      ent_skateshop_preupdate( skateshop, active );
-   }
-   else if( type == k_ent_challenge )
-   {
-      ent_challenge *challenge = mdl_arritm( &world->ent_challenge, index );
-      ent_challenge_preupdate( challenge, active );
-   }
-   else if( type == k_ent_route )
+   static void (*table[])( ent_focus_context *ctx ) =
    {
-      ent_route *route = mdl_arritm( &world->ent_route, index );
-      ent_route_preupdate( route, active );
-   }
-   else if( type == k_ent_npc )
+      [ k_ent_skateshop ] = ent_skateshop_preupdate,
+      [ k_ent_challenge ] = ent_challenge_preupdate,
+      [ k_ent_route ] = ent_route_preupdate,
+      [ k_ent_npc ] = ent_npc_preupdate,
+   };
+
+   if( (type > vg_list_size(table)) || (table[type] == NULL) )
    {
-      ent_npc *npc = mdl_arritm( &world->ent_npc, index );
-      ent_npc_preupdate( npc, active );
+      vg_fatal_error( "No pre-update method set for entity (%u#%u)\n",
+                      type, index );
    }
+
+   table[type]( &(ent_focus_context){
+                  .world = world,
+                  .index = index,
+                  .active = active } );
 }
 
 /* additional renderings like text etc.. */
@@ -347,16 +348,20 @@ void world_default_spawn_pos( world_instance *world, v3f pos )
    }
 }
 
-void ent_volume_call( world_instance *world, ent_call *call )
+entity_call_result ent_volume_call( world_instance *world, ent_call *call )
 {
    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 ){
+   if( !volume->target ) 
+      return k_entity_call_result_OK;
+
+   if( call->function == k_ent_function_trigger )
+   {
       call->id = volume->target;
 
-      if( volume->flags & k_ent_volume_flag_particles ){
+      if( volume->flags & k_ent_volume_flag_particles )
+      {
          float *co = alloca( sizeof(float)*3 );
          co[0] = vg_randf64(&vg.rand)*2.0f-1.0f;
          co[1] = vg_randf64(&vg.rand)*2.0f-1.0f;
@@ -367,29 +372,40 @@ void ent_volume_call( world_instance *world, ent_call *call )
          call->data = co;
          entity_call( world, call );
       }
-      else{
+      else
+      {
          call->function = volume->trigger.event;
          entity_call( world, call );
       }
+
+      return k_entity_call_result_OK;
    }
-   else if( call->function == k_ent_function_trigger_leave ){
+   else if( call->function == k_ent_function_trigger_leave )
+   {
       call->id = volume->target;
 
-      if( volume->flags & k_ent_volume_flag_particles ){
+      if( volume->flags & k_ent_volume_flag_particles )
+      {
          vg_warn( "Invalid condition; calling leave on particle volume.\n" );
       }
-      else{
+      else
+      {
          call->function = volume->trigger.event_leave;
          entity_call( world, call );
       }
+
+      return k_entity_call_result_OK;
    }
+
+   return k_entity_call_result_unhandled;
 }
 
-void ent_audio_call( world_instance *world, ent_call *call )
+entity_call_result ent_audio_call( world_instance *world, ent_call *call )
 {
-   if( world->status == k_world_status_unloading ){
+   if( world->status == k_world_status_unloading )
+   {
       vg_warn( "cannot modify audio while unloading world\n" );
-      return;
+      return k_entity_call_result_invalid;
    }
 
    u8 world_id = (world - world_static.instances) + 1;
@@ -398,14 +414,16 @@ void ent_audio_call( world_instance *world, ent_call *call )
 
    v3f sound_co;
 
-   if( call->function == k_ent_function_particle_spawn ){
+   if( call->function == k_ent_function_particle_spawn )
+   {
       v3_copy( call->data, sound_co );
    }
-   else if( call->function == k_ent_function_trigger ){
+   else if( call->function == k_ent_function_trigger )
+   {
       v3_copy( audio->transform.co, sound_co );
    }
    else
-      return;
+      return k_entity_call_result_unhandled;
 
    float chance = vg_randf64(&vg.rand)*100.0f,
          bar = 0.0f;
@@ -458,7 +476,7 @@ void ent_audio_call( world_instance *world, ent_call *call )
                if( existing ){
                   if( existing->source == &clip->_.clip ){
                      audio_unlock();
-                     return;
+                     return k_entity_call_result_OK;
                   }
                  
                   existing->group = 0;
@@ -479,20 +497,24 @@ void ent_audio_call( world_instance *world, ent_call *call )
          }
 
          audio_unlock();
-         return;
+         return k_entity_call_result_OK;
       }
    }
+   return k_entity_call_result_OK;
 }
 
 
-void ent_ccmd_call( world_instance *world, ent_call *call )
+entity_call_result ent_ccmd_call( world_instance *world, ent_call *call )
 {
-   if( call->function == k_ent_function_trigger ){
+   if( call->function == k_ent_function_trigger )
+   {
       u32 index = mdl_entity_id_id( call->id );
       ent_ccmd *ccmd = mdl_arritm( &world->ent_ccmd, index );
-      vg_execute_console_input( mdl_pstr(&world->meta, ccmd->pstr_command), 
-                                0 );
+      vg_execute_console_input( mdl_pstr(&world->meta, ccmd->pstr_command), 0 );
+      return k_entity_call_result_OK;
    }
+   else
+      return k_entity_call_result_unhandled;
 }
 
 /*
@@ -745,7 +767,7 @@ void world_entity_start( world_instance *world, vg_msg *sav )
       const char *alias = mdl_pstr( &world->meta, challenge->pstr_alias );
 
       u32 result;
-      vg_msg_getkvintg( sav, alias, k_vg_msg_u32, &result );
+      vg_msg_getkvintg( sav, alias, k_vg_msg_u32, &result, NULL );
 
       if( result ){
          ent_call call;
@@ -766,11 +788,12 @@ void world_entity_start( world_instance *world, vg_msg *sav )
                                mdl_pstr(&world->meta,route->pstr_name) ) ){
 
             u32 flags;
-            vg_msg_getkvintg( &route_info, "flags", k_vg_msg_u32, &flags );
+            vg_msg_getkvintg( &route_info, "flags", k_vg_msg_u32,    
+                              &flags, NULL );
             route->flags |= flags;
 
             vg_msg_getkvintg( &route_info, "best_laptime", k_vg_msg_f64,
-                              &route->best_laptime );
+                              &route->best_laptime, NULL );
 
             f32 sections[ route->checkpoints_count ];
             vg_msg_cmd cmd;