fixe
[carveJwlIkooP6JGAAIwe30JlM.git] / world.h
diff --git a/world.h b/world.h
index 37ff044910b0c238750ec11e484c870f8f1ebf02..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 };
@@ -155,7 +154,10 @@ struct world_instance
                  ent_route_node,
                  ent_path_index,
                  ent_checkpoint,
-                 ent_route;
+                 ent_route,
+                 ent_water;
+
+   ent_gate *rendering_gate;
 
 #if 0
    /*
@@ -353,8 +355,9 @@ 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;
@@ -362,7 +365,6 @@ VG_STATIC struct world_global
    sfd;
 
    v3f render_gate_pos;
-   int active_route_board;
    int in_volume;
 
    int switching_to_new_world;
@@ -452,9 +454,7 @@ VG_STATIC void world_init(void)
    vg_info( "Loading other world systems\n" );
 
    vg_loader_step( world_render_init, NULL );
-#if 0
    vg_loader_step( world_sfd_init, NULL );
-#endif
    vg_loader_step( world_water_init, NULL );
    vg_loader_step( world_gates_init, NULL );
    vg_loader_step( world_routes_init, NULL );
@@ -508,46 +508,46 @@ VG_STATIC void world_update( world_instance *world, v3f pos )
 
    world_routes_update( world );
    world_routes_debug( world );
+
+   /* ---- SFD ------------ */
    
-#if 0
-   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;
-
-         struct route *route = &world->routes[closest];
+         world_global.sfd.active_route_board = closest;
 
-         u32 id = route->track_id;
+         ent_route *route = mdl_arritm( &world->ent_route, closest );
+         u32 id = route->official_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" );
          }
       }
    }
-#endif
+   sfd_update();
    
 #if 0
    /* TODO: Bvh */
@@ -661,7 +661,6 @@ VG_STATIC void world_update( world_instance *world, v3f pos )
 #endif
 
 #if 0
-   sfd_update();
 
    /* process soundscape transactions */
    audio_lock();
@@ -733,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] );
       }
@@ -755,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 );
@@ -774,18 +769,16 @@ VG_STATIC
 struct world_surface *world_tri_index_surface( world_instance *world, 
                                                  u32 index )
 {
-   for( int i=1; i<world->surface_count; i++ )
-   {
-      struct world_surface *mat = &world->surfaces[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 surface */
    return &world->surfaces[0];
 }