fixe
[carveJwlIkooP6JGAAIwe30JlM.git] / world.h
diff --git a/world.h b/world.h
index acfd462d4d2cb1e8746ee081d8ae1bec64fedf81..80bf3b6bafad33620b4738fb314440cfd581a6d3 100644 (file)
--- a/world.h
+++ b/world.h
@@ -18,6 +18,7 @@ typedef struct world_instance world_instance;
 #include "rigidbody.h"
 #include "bvh.h"
 #include "model.h"
+#include "entity.h"
 
 #include "shaders/scene_standard.h"
 #include "shaders/scene_standard_alphatest.h"
@@ -28,8 +29,6 @@ typedef struct world_instance world_instance;
 
 #include "shaders/model_sky.h"
 
-typedef struct teleport_gate teleport_gate;
-
 enum { k_max_ui_segments = 8 };
 
 enum { k_max_ui_elements = k_max_ui_segments };
@@ -97,6 +96,7 @@ struct world_instance
 
       float g_water_fog;
       float g_time;
+      float g_realtime;
       float g_shadow_length;
       float g_shadow_spread;
 
@@ -134,24 +134,32 @@ struct world_instance
    /*
     * Main world .mdl 
     */
-   mdl_context *meta;
-
-   /*
-    * Materials / textures 
-    */
+   mdl_context meta;
 
    GLuint *textures;
    u32 texture_count;
 
-   struct world_material
+   struct world_surface
    {
       mdl_material info;
       mdl_submesh sm_geo,
                   sm_no_collide;
    }
-   * materials;
-   u32 material_count;
+   * surfaces;
+   u32 surface_count;
+
+   mdl_array_ptr ent_spawn,
+                 ent_gate,
+                 ent_light,
+                 ent_route_node,
+                 ent_path_index,
+                 ent_checkpoint,
+                 ent_route,
+                 ent_water;
+
+   ent_gate *rendering_gate;
 
+#if 0
    /*
     * Named safe places to respawn
     */
@@ -214,9 +222,6 @@ struct world_instance
       struct classtype_world_light *inf;
       m4x3f inverse_world;
       v2f angle_sin_cos;
-
-      /* enabled.. etc? 
-       * TODO: we should order entities in the binary by their type */
    }
    * lights;
    u32 light_count;
@@ -225,6 +230,7 @@ struct world_instance
     * Routes (world_routes.h)
     * --------------------------------------------------------------------------
     */
+
    struct route_node
    {
       v3f co, right, up, h;
@@ -294,6 +300,7 @@ struct world_instance
    }
    *collectors;
    u32 collector_count;
+#endif
 
 
    /* logic 
@@ -329,15 +336,13 @@ VG_STATIC struct world_global
 
    /* rendering */
    glmesh skydome;
-   mdl_submesh dome_upper, dome_lower;
-
-   glmesh mesh_gate_surface;
+   glmesh mesh_gate;
+   mdl_submesh sm_gate_surface,
+               sm_gate_marker[4];
 
    double sky_time, sky_rate, sky_target_rate;
 
-   /* gates, TODO: active_gate should also know which instance */
-   u32 active_gate,
-       current_run_version;
+   u32 current_run_version;
    double time, rewind_from, rewind_to, last_use;
 
    /* water rendering */
@@ -350,38 +355,16 @@ VG_STATIC struct world_global
    /* split flap display */
    struct
    {
-      mdl_submesh *sm_module, *sm_card;
       glmesh mesh_base, mesh_display;
+      mdl_submesh sm_base;
+      u32 active_route_board;
 
       u32 w, h;
       float *buffer;
    }
    sfd;
 
-   /* timing bars, fixed maximum amount */
-   struct route_ui_bar
-   {
-      GLuint vao, vbo, ebo;
-
-      u32  indices_head;
-      u32  vertex_head;
-
-      struct route_ui_segment
-      {
-         float length;
-         u32 vertex_start, vertex_count,
-             index_start, index_count, notches;
-      }
-      segments[k_max_ui_segments];
-
-      u32 segment_start, segment_count, fade_start, fade_count;
-      double fade_timer_start;
-      float xpos;
-   }
-   ui_bars[16];
-
    v3f render_gate_pos;
-   int active_route_board;
    int in_volume;
 
    int switching_to_new_world;
@@ -405,7 +388,7 @@ VG_STATIC
 int ray_hit_is_ramp( world_instance *world, ray_hit *hit );
 
 VG_STATIC 
-struct world_material *ray_hit_material( world_instance *world, ray_hit *hit );
+struct world_surface *ray_hit_surface( world_instance *world, ray_hit *hit );
 
 VG_STATIC 
 void ray_world_get_tri( world_instance *world, ray_hit *hit, v3f tri[3] );
@@ -454,14 +437,16 @@ VG_STATIC void world_init(void)
    vg_info( "Loading world resources\n" );
    
    vg_linear_clear( vg_mem.scratch );
-   mdl_context *msky = mdl_load_full( vg_mem.scratch, "models/rs_skydome.mdl" );
 
-   mdl_node *nupper = mdl_node_from_name( msky, "dome_complete" );
-   world_global.dome_upper = *mdl_node_submesh( msky, nupper, 0 );
+   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_close( &msky );
 
    vg_acquire_thread_sync();
    {
-      mdl_unpack_glmesh( msky, &world_global.skydome );
+      mdl_unpack_glmesh( &msky, &world_global.skydome );
    }
    vg_release_thread_sync();
 
@@ -491,6 +476,7 @@ VG_STATIC void world_update( world_instance *world, v3f pos )
    struct ub_world_lighting *state = &world->ub_lighting;
 
    state->g_time = g_time;
+   state->g_realtime = vg.time;
    state->g_debug_indices = k_debug_light_indices;
    state->g_light_preview = k_light_preview;
    state->g_debug_complexity = k_debug_light_complexity;
@@ -521,49 +507,49 @@ VG_STATIC void world_update( world_instance *world, v3f pos )
                                     vg.time_delta * 5.0 );
 
    world_routes_update( world );
-#if 0
-   world_routes_debug();
-#endif
+   world_routes_debug( world );
+
+   /* ---- SFD ------------ */
    
-   if( world->route_count > 0 )
-   {
-      int closest = 0;
+   if( mdl_arrcount( &world->ent_route ) ){
+      u32 closest = 0;
       float min_dist = INFINITY;
 
-      for( int i=0; i<world->route_count; i++ )
-      {
-         float d = v3_dist2( world->routes[i].scoreboard_transform[3], pos );
+      for( u32 i=0; i<mdl_arrcount( &world->ent_route ); i++ ){
+         ent_route *route = mdl_arritm( &world->ent_route, i );
+         float dist = v3_dist2( route->board_transform[3], pos );
 
-         if( d < min_dist )
-         {
-            min_dist = d;
+         if( dist < min_dist ){
+            min_dist = dist;
             closest = i;
          }
       }
 
-      if( (world_global.active_route_board != closest) 
+      if( (world_global.sfd.active_route_board != closest) 
           || network_scores_updated )
       {
          network_scores_updated = 0;
-         world_global.active_route_board = closest;
+         world_global.sfd.active_route_board = closest;
 
-         struct route *route = &world->routes[closest];
+         ent_route *route = mdl_arritm( &world->ent_route, closest );
+         u32 id = route->official_track_id;
 
-         u32 id = route->track_id;
-
-         if( id != 0xffffffff )
-         {
+         if( id != 0xffffffff ){
             struct netmsg_board *local_board = 
                &scoreboard_client_data.boards[id];
 
-            for( int i=0; i<13; i++ )
-            {
+            for( int i=0; i<13; i++ ){
                sfd_encode( i, &local_board->data[27*i] );
             }
+         }else{
+            sfd_encode( 0, mdl_pstr( &world->meta, route->pstr_name ) );
+            sfd_encode( 1, "No data" );
          }
       }
    }
+   sfd_update();
    
+#if 0
    /* TODO: Bvh */
 
    static float random_accum = 0.0f;
@@ -571,8 +557,7 @@ VG_STATIC void world_update( world_instance *world, v3f pos )
 
    u32 random_ticks = 0;
 
-   while( random_accum > 0.1f )
-   {
+   while( random_accum > 0.1f ){
       random_accum -= 0.1f;
       random_ticks ++;
    }
@@ -650,11 +635,12 @@ VG_STATIC void world_update( world_instance *world, v3f pos )
                                                            0xff0000ff );
       }
    }
+#endif
 
+#if 0
    if( k_debug_light_indices )
    {
-      for( int i=0; i<world->light_count; i++ )
-      {
+      for( int i=0; i<world->light_count; i++ ){
          struct world_light *light = &world->lights[i];
          struct classtype_world_light *inf = light->inf;
 
@@ -672,7 +658,9 @@ VG_STATIC void world_update( world_instance *world, v3f pos )
    }
 
    world_global.in_volume = in_volume;
-   sfd_update();
+#endif
+
+#if 0
 
    /* process soundscape transactions */
    audio_lock();
@@ -693,6 +681,7 @@ VG_STATIC void world_update( world_instance *world, v3f pos )
       }
    }
    audio_unlock();
+#endif
 }
 
 /* 
@@ -743,16 +732,14 @@ VG_STATIC int spherecast_world( world_instance *world,
    float min_t = 1.0f;
 
    int idx;
-   while( bh_next( world->geo_bh, &it, region, &idx ) )
-   {
+   while( bh_next( world->geo_bh, &it, region, &idx ) ){
       u32 *ptri = &world->scene_geo->arrindices[ idx*3 ];
       v3f tri[3];
 
       boxf box;
       box_init_inf( box );
 
-      for( int j=0; j<3; j++ )
-      {
+      for( int j=0; j<3; j++ ){
          v3_copy( world->scene_geo->arrvertices[ptri[j]].co, tri[j] );
          box_addpt( box, tri[j] );
       }
@@ -765,10 +752,8 @@ VG_STATIC int spherecast_world( world_instance *world,
       
       float t;
       v3f n1;
-      if( spherecast_triangle( tri, pa, dir, r, &t, n1 ) )
-      {
-         if( t < min_t )
-         {
+      if( spherecast_triangle( tri, pa, dir, r, &t, n1 ) ){
+         if( t < min_t ){
             min_t = t;
             hit = idx;
             v3_copy( n1, n );
@@ -781,34 +766,32 @@ VG_STATIC int spherecast_world( world_instance *world,
 }
 
 VG_STATIC 
-struct world_material *world_tri_index_material( world_instance *world, 
+struct world_surface *world_tri_index_surface( world_instance *world, 
                                                  u32 index )
 {
-   for( int i=1; i<world->material_count; i++ )
-   {
-      struct world_material *mat = &world->materials[i];
+   for( int i=1; i<world->surface_count; i++ ){
+      struct world_surface *surf = &world->surfaces[i];
 
-      if( (index >= mat->sm_geo.vertex_start) &&
-          (index  < mat->sm_geo.vertex_start+mat->sm_geo.vertex_count ) )
+      if( (index >= surf->sm_geo.vertex_start) &&
+          (index  < surf->sm_geo.vertex_start+surf->sm_geo.vertex_count ) )
       {
-         return mat;
+         return surf;
       }
    }
 
-   /* error material */
-   return &world->materials[0];
+   return &world->surfaces[0];
 }
 
-VG_STATIC struct world_material *world_contact_material( world_instance *world,
+VG_STATIC struct world_surface *world_contact_surface( world_instance *world,
                                                          rb_ct *ct )
 {
-   return world_tri_index_material( world, ct->element_id );
+   return world_tri_index_surface( world, ct->element_id );
 }
 
-VG_STATIC struct world_material *ray_hit_material( world_instance *world,
-                                                   ray_hit *hit )
+VG_STATIC struct world_surface *ray_hit_surface( world_instance *world,
+                                                 ray_hit *hit )
 {
-   return world_tri_index_material( world, hit->tri[0] );
+   return world_tri_index_surface( world, hit->tri[0] );
 }
 
 #endif /* WORLD_H */