#include "world_routes.h"
#include "world_gate.h"
#include "world_load.h"
-#include "highscores.h"
#include "network.h"
#include "font.h"
double start_time = 0.0;
u32 last_version=0;
+ f64 last_time = 0.0;
+ ent_checkpoint *last_cp = NULL;
u32 valid_sections=0;
int clean = !localplayer.rewinded_since_last_gate;
else valid_sections = 0;
}
- last_version = rg->timing_version;
-
vg_info( "%u %f [%s]\n", rg->timing_version, rg->timing_time,
i? ((rg->flags & k_ent_gate_clean_pass)? "CLEAN": " "):
" N/A ");
if( !(rg->flags & k_ent_gate_clean_pass) )
clean = 0;
+
+ last_version = rg->timing_version;
+ last_time = rg->timing_time;
+ last_cp = cp;
}
if( world_static.current_run_version == last_version+1 ){
if( route->checkpoints_count == 1 ){
route->timing_base = world_static.time;
}
+
+ f32 section = world_static.time - last_time;
+ if( (section < last_cp->best_time) || (last_cp->best_time == 0.0f) ){
+ last_cp->best_time = section;
+ }
}
else valid_sections = 0;
vg_info( "valid sections: %u\n", valid_sections );
vg_info( "----------------------------\n" );
+
+ route->ui_residual = 1.0f;
+ route->ui_residual_block_w = route->ui_first_block_width;
}
/*
v3_muladds( ha.pos, up, 0.06f+gap, va.co );
v3_muladds( hb.pos, up, 0.06f+gap, vb.co );
- scene_vert_pack_norm( &va, up );
- scene_vert_pack_norm( &vb, up );
+ scene_vert_pack_norm( &va, up, 0.0f );
+ scene_vert_pack_norm( &vb, up, 0.0f );
float t1 = (travel_length / total_length) * patch_count;
va.uv[0] = t1;
vg_info( "Generating route meshes\n" );
vg_async_stall();
- vg_rand_seed( 2000 );
vg_async_item *call_scene = scene_alloc_async( &world->scene_lines,
&world->mesh_route_lines,
200000, 300000 );
route->flags = 0x00;
route->best_laptime = 0.0;
+ route->ui_stopper = 0.0f;
+ route->ui_residual = 0.0f;
if( mdl_arrcount(&world->ent_region) )
route->flags |= k_ent_route_flag_out_of_zone;
ent_gate *gate = mdl_arritm( &world->ent_gate, i );
}
+ for( u32 i=0; i<mdl_arrcount(&world->ent_checkpoint); i++ ){
+ ent_checkpoint *cp = mdl_arritm( &world->ent_checkpoint, i );
+ cp->best_time = 0.0;
+ }
+
world_routes_clear( world );
}
rb_presolve_contacts( rb_contact_buffer, rb_contact_count );
for( int i=0; i<rb_contact_count; i++ ){
- rb_contact_restitution( rb_contact_buffer+i, vg_randf64() );
+ rb_contact_restitution( rb_contact_buffer+i, vg_randf64(&vg.rand) );
}
for( int i=0; i<6; i++ ){
text->gate = gate;
text->route = route;
- if( route->valid_checkpoints >= route->checkpoints_count ){
+ vg_str str;
+ vg_strnull( &str, text->text, sizeof(text->text) );
+
+ if( route->valid_checkpoints >= route->checkpoints_count )
+ {
double lap_time = world_static.time - route->timing_base,
time_centiseconds = lap_time * 100.0;
seconds %= 60;
minutes %= 60;
- if( minutes > 9 ) minutes = 9;
+ if( minutes > 9 )
+ minutes = 9;
- int j=0;
- if( minutes ){
- highscore_intr( text->text, minutes, 1, ' ' ); j++;
- text->text[j++] = ':';
+ if( minutes )
+ {
+ vg_strcati32r( &str, minutes, 1, ' ' );
+ vg_strcatch( &str, ':' );
}
- if( seconds >= 10 || minutes ){
- highscore_intr( text->text+j, seconds, 2, '0' ); j+=2;
+ if( seconds >= 10 || minutes )
+ {
+ vg_strcati32r( &str, seconds, 2, '0' );
}
- else{
- highscore_intr( text->text+j, seconds, 1, '0' ); j++;
+ else
+ {
+ vg_strcati32r( &str, seconds, 1, '0' );
}
- text->text[j++] = '.';
- highscore_intr( text->text+j, centiseconds, 1, '0' ); j++;
- text->text[j] = '\0';
+ vg_strcatch( &str, '.' );
+ vg_strcati32r( &str, centiseconds, 1, '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';
+ else
+ {
+ vg_strcati32r( &str, route->valid_checkpoints, 1, ' ' );
+ vg_strcatch( &str, '/' );
+ vg_strcati32r( &str, route->checkpoints_count + 1, 1, ' ' );
}
gui_font3d.font = &gui.font;
v3_muls( origin, -1.0f, particle->mlocal[3] );
v3_copy( world_co, particle->obj.rb.co );
- v3_muls( imp_v, 1.0f+vg_randf64(), particle->obj.rb.v );
+ v3_muls( imp_v, 1.0f+vg_randf64(&vg.rand), particle->obj.rb.v );
particle->obj.rb.v[1] += 2.0f;
v4_copy( q, particle->obj.rb.q );
- particle->obj.rb.w[0] = vg_randf64()*2.0f-1.0f;
- particle->obj.rb.w[1] = vg_randf64()*2.0f-1.0f;
- particle->obj.rb.w[2] = vg_randf64()*2.0f-1.0f;
+ particle->obj.rb.w[0] = vg_randf64(&vg.rand)*2.0f-1.0f;
+ particle->obj.rb.w[1] = vg_randf64(&vg.rand)*2.0f-1.0f;
+ particle->obj.rb.w[2] = vg_randf64(&vg.rand)*2.0f-1.0f;
particle->obj.type = k_rb_shape_sphere;
particle->obj.inf.sphere.radius = r*0.6f;
for( u32 j=0; j<4; j++ ){
if( gate->routes[j] == run_id ){
m4x3f mmdl;
- ent_gate_get_mdl_mtx( gate, mmdl );
+ m4x3_copy( gate->to_world, mmdl );
+ m3x3_scale( mmdl, (v3f){ gate->dimensions[0],
+ gate->dimensions[1], 1.0f } );
+
m4x3_mul( world_mmdl, mmdl, mmdl );
shader_model_gate_uMdl( mmdl );
mdl_draw_submesh( &world_gates.sm_marker[j] );