a change to rigidbody semantics
[carveJwlIkooP6JGAAIwe30JlM.git] / world_routes.h
index 5a81d0c77acdd33831275d9b3d4235c41202da8b..792b7e8dc89ccdbe8a1bf1aa7476101291d106d4 100644 (file)
@@ -94,20 +94,16 @@ VG_STATIC void world_routes_time_lap( world_instance *world, ent_route *route )
       if( i == 0 )
          start_time = rg->timing_time;
       else{
-         if( last_version+1 == rg->timing_version )
-            valid_count ++;
-         else
-            valid_count = 0;
+         if( last_version+1 == rg->timing_version ) valid_count ++;
+         else valid_count = 0;
       }
 
       last_version = rg->timing_version;
       vg_info( "%u %f\n", rg->timing_version, rg->timing_time );
    }
 
-   if( world_global.current_run_version == last_version+1 )
-      valid_count ++;
-   else
-      valid_count = 0;
+   if( world_global.current_run_version == last_version+1 ) valid_count ++;
+   else valid_count = 0;
 
    vg_info( "%u %f\n", world_global.current_run_version, world_global.time );
 
@@ -606,6 +602,132 @@ VG_STATIC void world_bind_light_index( world_instance *world,
                                        GLuint shader, GLuint location, 
                                        int slot );
 
+VG_STATIC void world_routes_update_timer_texts( world_instance *world )
+{
+   world_global.timer_text_count = 0;
+
+   for( u32 i=0; i<mdl_arrcount(&world->ent_route); i++ ){
+      ent_route *route = mdl_arritm( &world->ent_route, i );
+
+      if( route->active_checkpoint != 0xffff ){
+         u32 next = route->active_checkpoint+1;
+             next = next % route->checkpoints_count;
+             next += route->checkpoints_start;
+
+         ent_checkpoint *cp = mdl_arritm( &world->ent_checkpoint, next );
+         ent_gate *gate = mdl_arritm( &world->ent_gate, cp->gate_index );
+         ent_gate *dest = mdl_arritm( &world->ent_gate, gate->target );
+         
+         u32 j=0;
+         for( ; j<4; j++ ){
+            if( dest->routes[j] == i ){
+               break;
+            }
+         }
+
+         float h0 = 0.8f,
+               h1 = 1.2f,
+               depth = 0.4f,
+               size = 0.4f;
+
+         struct timer_text *text = 
+            &world_global.timer_texts[ world_global.timer_text_count ++ ];
+
+         text->gate = gate;
+         text->route = route;
+
+         if( route->valid_checkpoints >= route->checkpoints_count ){
+            double lap_time = world_global.time - route->timing_base,
+                   time_centiseconds = lap_time * 100.0;
+
+            if( time_centiseconds > (float)0xfffe ) time_centiseconds = 0.0;
+
+            u16 centiseconds = time_centiseconds,
+                seconds      = centiseconds / 100,
+                minutes      = seconds / 60;
+
+            centiseconds %= 100;
+            seconds     %= 60;
+            minutes     %= 60;
+
+            if( minutes > 9 ) minutes = 9;
+            
+            int j=0;
+            if( minutes ){
+               highscore_intr( text->text, minutes, 1, ' ' ); j++;
+               text->text[j++] = ':';
+            }
+            
+            if( seconds >= 10 || minutes ){
+               highscore_intr( text->text+j, seconds, 2, '0' ); j+=2;
+            }
+            else{
+               highscore_intr( text->text+j, seconds, 1, '0' ); j++;
+            }
+
+            text->text[j++] = '.';
+            highscore_intr( text->text+j, centiseconds, 1, '0' ); j++;
+            text->text[j] = '\0';
+         }
+         else{
+            highscore_intr( text->text, route->valid_checkpoints, 1, ' ' );
+            text->text[1] = '/';
+            highscore_intr( text->text+2, route->checkpoints_count+1, 1, ' ' );
+            text->text[3] = '\0';
+         }
+
+         float align_r  = font3d_string_width( &world_global.font, 0, 
+                                               text->text );
+               align_r *= size;
+
+         v3f positions[] = {
+            { -0.92f, h0, depth },
+            {  0.92f - align_r, h0, depth },
+            { -0.92f, h1, depth },
+            {  0.92f - align_r, h1, depth },
+         };
+
+         if( dest->route_count == 1 ){
+            positions[0][0] = -align_r*0.5f;
+            positions[0][1] = h1;
+         }
+
+         m3x3_copy( gate->to_world, text->transform );
+         float ratio = v3_length(text->transform[0]) / 
+                        v3_length(text->transform[1]);
+
+         m3x3_scale( text->transform, (v3f){ size, size*ratio, 0.1f } );
+         m4x3_mulv( gate->to_world, positions[j], text->transform[3] );
+      }
+   }
+}
+
+VG_STATIC void world_routes_fracture( world_instance *world, ent_gate *gate )
+{
+   world_global.text_particle_count = 0;
+   
+   for( u32 i=0; i<world_global.timer_text_count; i++ ){
+      struct timer_text *text = &world_global.timer_texts[i];
+
+      if( text->gate == gate ){
+         v3f co, s;
+         v4f q;
+         m4x3_decompose( text->transform, co, q, s );
+
+         for( u32 j=0;; j++ ){
+            char c = text->text[j];
+            if( !c ) break;
+
+            if( c < '0' || c > '9' ) continue;
+            
+            struct text_particle *particle = 
+               &world_global.text_particles[world_global.text_particle_count++];
+
+         }
+      }
+   }
+}
+
 VG_STATIC void render_world_routes( world_instance *world, camera *cam, 
                                     int layer_depth )
 {
@@ -646,74 +768,19 @@ VG_STATIC void render_world_routes( world_instance *world, camera *cam,
    /* timers
     * ---------------------------------------------------- */
    if( layer_depth == 0 ){
-      font3d_bind( &test_font, cam );
-
-      for( u32 i=0; i<mdl_arrcount(&world->ent_route); i++ ){
-         ent_route *route = mdl_arritm( &world->ent_route, i );
-
-         if( route->active_checkpoint != 0xffff ){
-            v4f colour;
-            float brightness = 0.3f + world->ub_lighting.g_day_phase;
-            v3_muls( route->colour, brightness, colour );
-            colour[3] = 1.0f-route->factive;
-
-            shader_model_font_uColour( colour );
-
-            u32 next = route->active_checkpoint+1+layer_depth;
-                next = next % route->checkpoints_count;
-                next += route->checkpoints_start;
+      font3d_bind( &world_global.font, cam );
 
-            ent_checkpoint *cp = mdl_arritm( &world->ent_checkpoint, next );
-            ent_gate *gate = mdl_arritm( &world->ent_gate, cp->gate_index );
+      for( u32 i=0; i<world_global.timer_text_count; i++ ){
+         struct timer_text *text = &world_global.timer_texts[i];
 
-            
-            u32 j=0;
-            for( ; j<4; j++ ){
-               if( gate->routes[j] == i ){
-                  break;
-               }
-            }
-            float h0 = 0.8f,
-                  h1 = 1.2f,
-                  depth = 0.4f,
-                  size = 0.4f;
-
-            char text[256];
-
-            if( route->valid_checkpoints >= route->checkpoints_count ){
-               double lap_time = world_global.time - route->timing_base;
-               snprintf( text, 255, "%.1f", lap_time );
-            }
-            else{
-               snprintf( text, 255, "%hu/%hu", route->valid_checkpoints,
-                                               route->checkpoints_count );
-            }
-
-            float align_r = font3d_string_width( &test_font, 0, text ) * size;
-
-            v3f positions[] = {
-               { -0.92f, h0, depth },
-               {  0.92f - align_r, h0, depth },
-               { -0.92f, h1, depth },
-               {  0.92f - align_r, h1, depth },
-            };
-
-            ent_gate *dest = mdl_arritm( &world->ent_gate, gate->target );
-
-            if( dest->route_count == 1 ){
-               positions[0][0] = -align_r*0.5f;
-               positions[0][1] = h1;
-            }
-
-            m4x3f model;
-            m3x3_copy( gate->to_world, model );
-            float ratio = v3_length(model[0]) / v3_length(model[1]);
-
-            m3x3_scale( model, (v3f){ size, size*ratio, 0.1f } );
-            m4x3_mulv( gate->to_world, positions[j], model[3] );
+         v4f colour;
+         float brightness = 0.3f + world->ub_lighting.g_day_phase;
+         v3_muls( text->route->colour, brightness, colour );
+         colour[3] = 1.0f-text->route->factive;
 
-            font3d_simple_draw( &test_font, 0, text, cam, model );
-         }
+         shader_model_font_uColour( colour );
+         font3d_simple_draw( &world_global.font, 0, text->text, 
+                             cam, text->transform );
       }
    }