POWER
[carveJwlIkooP6JGAAIwe30JlM.git] / world.h
diff --git a/world.h b/world.h
index 7b265cd96d1513ea47452fbacd91841d64fe91a8..e5c039a495113f8ae528ed8b7e4890d1e3ad7064 100644 (file)
--- a/world.h
+++ b/world.h
@@ -46,6 +46,19 @@ enum logic_type
    k_logic_type_achievement   = 3
 };
 
+enum geo_type
+{
+   k_geo_type_solid = 0,
+   k_geo_type_nonsolid = 1,
+   k_geo_type_water = 2
+};
+
+enum material_flag
+{
+   k_material_flag_skate_surface = 0x1,
+   k_material_flag_collision = 0x2
+};
+
 VG_STATIC struct gworld
 {
    /*
@@ -110,6 +123,7 @@ VG_STATIC struct gworld
 
    v3f render_gate_pos;
    int active_route_board;
+   int in_trigger;
 
    /* This is a small flag we use to changelevel.
     * It will not be cleared until all sounds stop playing 
@@ -126,13 +140,30 @@ VG_STATIC struct gworld
     * (world_gen.h)
     * --------------------------------------------------------------------------
     */
-   void *dynamic_vgl;
+   void *dynamic_vgl, 
+        *audio_vgl;  /* sub buffer of the audio buffer */
 
    /*
     * Main world .mdl 
     */
    mdl_context *meta;
 
+   /*
+    * Materials / textures 
+    */
+
+   GLuint *textures;
+   u32 texture_count;
+
+   struct world_material
+   {
+      mdl_material info;
+      mdl_submesh sm_geo,
+                  sm_no_collide;
+   }
+   * materials;
+   u32 material_count;
+
    /*
     * Named safe places to respawn
     */
@@ -161,42 +192,46 @@ VG_STATIC struct gworld
    u32 audio_things_count;
 
    /*
-    * Relays, random, etc
+    * Relays
     */
-   struct logic_entity
+   struct logic_relay
    {
       v3f pos;
-      enum logic_type logic_type;
-      int enabled;
 
-      /* indexes the action array */
-      u32 action_start, action_count;
+      struct relay_target
+      {
+         u32 sub_id;
+         enum classtype classtype;
+      }
+      targets[4];
+      u32 target_count;
    }
-   * logic_entities;
-   u32 logic_entity_count;
+   * logic_relays;
+   u32 relay_count;
 
    /*
-    * Action array
+    * Box trigger entities
     */
-   struct logic_action
+   struct trigger_zone
    {
-      u32 event,     /* on trigger, on enable, etc (TODO: Enum) */
-          target_id; /* thing to target, 0: self */
+      m4x3f transform, inv_transform;
 
+      struct relay_target target;
    }
-   * logic_actions;
-   u32 logic_action_count;
+   * triggers;
+   u32 trigger_count;
 
    /*
-    * Box trigger entities
+    * Achievements
     */
-   struct trigger_zone
+   struct logic_achievement
    {
-      m4x3f transform, inv_transform;
-      u32   trigger_entity;
+      v3f pos;
+      const char *achievement_id;
+      u32 achieved;
    }
-   * triggers;
-   u32 trigger_count;
+   * logic_achievements;
+   u32 achievement_count;
 
 
    /*
@@ -283,19 +318,14 @@ VG_STATIC struct gworld
            *geo_bh;
 
    /* graphics */
+   glmesh mesh_route_lines;
+
    glmesh mesh_geo, 
           mesh_no_collide,
-          mesh_route_lines,
           mesh_water;
 
+   mdl_submesh sm_foliage_main;
    rigidbody rb_geo;
-
-   /* TODO Maybe make this less hardcoded...
-    *      im on it, boss*/
-   mdl_submesh sm_geo_std_oob,   sm_geo_std, sm_geo_vb,
-               sm_foliage_main,  sm_foliage_alphatest,
-               sm_graffiti, sm_subworld, sm_terrain;
-
 }
 world;
 
@@ -431,6 +461,77 @@ VG_STATIC void world_init(void)
                                                    VG_MEMORY_SYSTEM );
 }
 
+VG_STATIC void world_audio_init(void)
+{
+   u32 size = vg_linear_remaining( vg_audio.audio_pool ) 
+               - sizeof(vg_linear_allocator);
+
+   world.audio_vgl = vg_create_linear_allocator( vg_audio.audio_pool, 
+                                                 size, VG_MEMORY_SYSTEM );
+}
+
+VG_STATIC void world_trigger_achievement( u32 uid )
+{
+   struct logic_achievement *ach = &world.logic_achievements[ uid ];
+
+   if( ach->achieved )
+      return;
+
+   steam_set_achievement( ach->achievement_id );
+   steam_store_achievements();
+
+   ach->achieved = 1;
+}
+
+VG_STATIC void world_run_relay( struct relay_target *rt );
+VG_STATIC void world_trigger_relay( u32 uid )
+{
+   struct logic_relay *relay = &world.logic_relays[ uid ];
+
+   for( int i=0; i<relay->target_count; i++ )
+   {
+      world_run_relay( &relay->targets[i] );
+   }
+}
+
+VG_STATIC void world_trigger_audio( u32 uid )
+{
+   struct world_audio_thing *wat = &world.audio_things[ uid ];
+
+   audio_lock();
+   audio_player_playclip( &wat->player, 
+                          &wat->temp_embedded_clip );
+   audio_unlock();
+}
+
+VG_STATIC void world_run_relay( struct relay_target *rt )
+{
+   struct entity_instruction
+   {
+      enum classtype classtype;
+      void (*p_trigger)( u32 uid );
+   }
+   entity_instructions[] =
+   {
+      { k_classtype_logic_achievement, world_trigger_achievement },
+      { k_classtype_logic_relay, world_trigger_relay },
+      { k_classtype_audio, world_trigger_audio }
+   };
+
+   for( int i=0; i<vg_list_size(entity_instructions); i++ )
+   {
+      struct entity_instruction *instr = &entity_instructions[i];
+
+      if( instr->classtype == rt->classtype )
+      {
+         instr->p_trigger( rt->sub_id );
+         return;
+      }
+   }
+
+   vg_error( "Don't know how to trigger classtype %d\n", rt->classtype );
+}
+
 VG_STATIC void world_update( v3f pos )
 {
    if( world.switching_to_new_world )
@@ -502,14 +603,10 @@ VG_STATIC void world_update( v3f pos )
       }
    }
 
-#if 0
-   VG_STATIC int in_zone = 0;
-
-   int in_zone_this_time = 0;
-
-   for( int i=0; i<world.achievement_zones_count; i++ )
+   int in_trigger = 0;
+   for( int i=0; i<world.trigger_count; i++ )
    {
-      struct achievement_zone *zone = &world.achievement_zones[i];
+      struct trigger_zone *zone = &world.triggers[i];
 
       v3f local;
       m4x3_mulv( zone->inv_transform, pos, local );
@@ -518,23 +615,12 @@ VG_STATIC void world_update( v3f pos )
           (fabsf(local[1]) <= 1.0f) &&
           (fabsf(local[2]) <= 1.0f) )
       {
-         in_zone_this_time = 1;
+         in_trigger = 1;
 
-         if( !in_zone && zone->ptarget )
+         if( !world.in_trigger )
          {
-            audio_lock();
-            audio_player_playclip( &zone->ptarget->player, 
-                                   &zone->ptarget->temp_embedded_clip );
-            audio_unlock();
+            world_run_relay( &zone->target );
          }
-
-         if( !zone->triggered )
-         {
-            steam_set_achievement( zone->name );
-            steam_store_achievements();
-         }
-
-         zone->triggered = 1;
       }
 
       vg_line_boxf_transformed( zone->transform, (boxf){{-1.0f,-1.0f,-1.0f},
@@ -542,9 +628,7 @@ VG_STATIC void world_update( v3f pos )
                                                         0xff00ff00 );
    }
 
-   in_zone = in_zone_this_time;
-#endif
-   
+   world.in_trigger = in_trigger;
    sfd_update();
 }
 
@@ -567,20 +651,26 @@ VG_STATIC int ray_world( v3f pos, v3f dir, ray_hit *hit )
 
 VG_STATIC int ray_hit_is_terrain( ray_hit *hit )
 {
+   return 0;
+#if 0
    u32 valid_start = 0,
        valid_end   = world.sm_terrain.vertex_count;
 
    return (hit->tri[0] >= valid_start) &&
           (hit->tri[0]  < valid_end);
+#endif
 }
 
 VG_STATIC int ray_hit_is_ramp( ray_hit *hit )
 {
+   return 1;
+#if 0
    u32 valid_start = world.sm_geo_std.vertex_start,
        valid_end   = world.sm_geo_vb.vertex_start;
 
    return (hit->tri[0] >= valid_start) &&
           (hit->tri[0]  < valid_end);
+#endif
 }
 
 #endif /* WORLD_H */