X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_routes.h;h=f5add0bb6ba162d336509e66935debc6b2dd288d;hb=8c376ed2e4021a18b0a6c6e800109d67ad09d198;hp=792b7e8dc89ccdbe8a1bf1aa7476101291d106d4;hpb=e5dfbef890431a69291a9f0a9ca4a88ea8d0705a;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_routes.h b/world_routes.h index 792b7e8..f5add0b 100644 --- a/world_routes.h +++ b/world_routes.h @@ -84,13 +84,17 @@ VG_STATIC void world_routes_time_lap( world_instance *world, ent_route *route ) u32 valid_count=0; for( u32 i=0; icheckpoints_count; i++ ){ - u32 cpid = route->checkpoints_start+(i+route->active_checkpoint); - cpid = cpid % route->checkpoints_count; + u32 cpid = (i+route->active_checkpoint) % route->checkpoints_count; + cpid += route->checkpoints_start; ent_checkpoint *cp = mdl_arritm( &world->ent_checkpoint, cpid ); ent_gate *rg = mdl_arritm( &world->ent_gate, cp->gate_index ); rg = mdl_arritm( &world->ent_gate, rg->target ); + if( i == 1 ){ + route->timing_base = rg->timing_time; + } + if( i == 0 ) start_time = rg->timing_time; else{ @@ -102,7 +106,13 @@ VG_STATIC void world_routes_time_lap( world_instance *world, ent_route *route ) vg_info( "%u %f\n", rg->timing_version, rg->timing_time ); } - if( world_global.current_run_version == last_version+1 ) valid_count ++; + if( world_global.current_run_version == last_version+1 ){ + valid_count ++; + + if( route->checkpoints_count == 1 ){ + route->timing_base = world_global.time; + } + } else valid_count = 0; vg_info( "%u %f\n", world_global.current_run_version, world_global.time ); @@ -113,7 +123,6 @@ VG_STATIC void world_routes_time_lap( world_instance *world, ent_route *route ) } route->valid_checkpoints = valid_count+1; - route->timing_base = start_time; vg_info( "valid: %u\n", valid_count ); vg_info( "----------------------------\n" ); @@ -125,10 +134,19 @@ VG_STATIC void world_routes_time_lap( world_instance *world, ent_route *route ) VG_STATIC void world_routes_activate_entry_gate( world_instance *world, ent_gate *rg ) { - ent_gate *dest = mdl_arritm( &world->ent_gate, rg->target ); - world_global.last_use = world_global.time; + /* disable all routes and leave the world */ + if( rg->type == k_gate_type_nonlocel ){ + for( u32 i=0; ient_route); i++ ){ + ent_route *route = mdl_arritm( &world->ent_route, i ); + route->active_checkpoint = 0xffff; + } + return; + } + + ent_gate *dest = mdl_arritm( &world->ent_gate, rg->target ); + for( u32 i=0; ient_route); i++ ){ ent_route *route = mdl_arritm( &world->ent_route, i ); @@ -446,7 +464,7 @@ VG_STATIC void world_routes_create_mesh( world_instance *world, u32 route_id ) VG_STATIC void world_routes_generate( world_instance *world ) { vg_info( "Generating route meshes\n" ); - world->scene_lines = scene_init( world_global.generic_heap, 200000, 300000 ); + world->scene_lines = scene_init( world->heap, 200000, 300000 ); for( u32 i=0; ient_gate); i++ ){ ent_gate *gate = mdl_arritm( &world->ent_gate, i ); @@ -495,7 +513,7 @@ VG_STATIC void world_routes_generate( world_instance *world ) scene_upload( world->scene_lines, &world->mesh_route_lines ); } vg_release_thread_sync(); - vg_linear_del( world_global.generic_heap, world->scene_lines ); + vg_linear_del( world->heap, world->scene_lines ); world_routes_clear( world ); } @@ -556,11 +574,6 @@ VG_STATIC void world_routes_ent_init( world_instance *world ) for( u32 i=0; ient_gate); i++ ){ ent_gate *gate = mdl_arritm( &world->ent_gate, i ); - - vg_info( "ROUTES :: %hu %hu %hu %hu\n", gate->routes[0], - gate->routes[1], - gate->routes[2], - gate->routes[3] ); } world_routes_clear( world ); @@ -575,7 +588,7 @@ VG_STATIC void world_routes_ent_init( world_instance *world ) VG_STATIC void world_routes_init(void) { world_global.current_run_version = 200; - world_global.time = RESET_MAX_TIME*2.0; + world_global.time = 300.0; world_global.last_use = 0.0; shader_scene_route_register(); @@ -592,6 +605,55 @@ VG_STATIC void world_routes_update( world_instance *world ) int target = route->active_checkpoint == 0xffff? 0: 1; route->factive = vg_lerpf( route->factive, target, 0.6f*vg.time_delta ); } + + for( u32 i=0; iobj, VG__RED ); + } +} + +VG_STATIC void world_routes_fixedupdate( world_instance *world ) +{ + rb_solver_reset(); + + for( u32 i=0; iobj.rb.to_world, + &particle->obj.inf.sphere, + NULL, &world->rb_geo.inf.scene, buf ); + + for( int j=0; jobj.rb; + buf[j].rbb = &world->rb_geo.rb; + } + + rb_contact_count += l; + } + } + + rb_presolve_contacts( rb_contact_buffer, rb_contact_count ); + + for( int i=0; iobj.rb ); + } + + for( u32 i=0; iobj.rb ); + } } VG_STATIC void bind_terrain_noise(void); @@ -702,28 +764,76 @@ VG_STATIC void world_routes_update_timer_texts( world_instance *world ) } } -VG_STATIC void world_routes_fracture( world_instance *world, ent_gate *gate ) +VG_STATIC void world_routes_fracture( world_instance *world, ent_gate *gate, + v3f imp_co, v3f imp_v ) { world_global.text_particle_count = 0; for( u32 i=0; igate == gate ){ - v3f co, s; - v4f q; - m4x3_decompose( text->transform, co, q, s ); + if( text->gate != gate ) continue; - for( u32 j=0;; j++ ){ - char c = text->text[j]; - if( !c ) break; + m4x3f transform; + m4x3_mul( gate->transport, text->transform, transform ); - if( c < '0' || c > '9' ) continue; - + v3f co, s; + v4f q; + m4x3_decompose( transform, co, q, s ); + + v3f offset; + v3_zero( offset ); + + 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; + + for( u32 j=0;; j++ ){ + char c = text->text[j]; + if( !c ) break; + + ent_glyph *glyph = font3d_glyph( &world_global.font, 0, c ); + if( !glyph ) continue; + + if( c >= (u32)'0' && c <= (u32)'9' && glyph->indice_count ){ struct text_particle *particle = &world_global.text_particles[world_global.text_particle_count++]; + particle->glyph = glyph; + v4_copy( colour, particle->colour ); + + v3f origin; + v2_muls( glyph->size, 0.5f, origin ); + origin[2] = -0.5f; + + v3f world_co; + + v3_add( offset, origin, world_co ); + m4x3_mulv( transform, world_co, world_co ); + + float r = vg_maxf( s[0]*glyph->size[0], s[1]*glyph->size[1] )*0.5f; + + m3x3_identity( particle->mlocal ); + m3x3_scale( particle->mlocal, s ); + origin[2] *= s[2]; + v3_muls( origin, -1.0f, particle->mlocal[3] ); + + v3_copy( world_co, particle->obj.rb.co ); + v3_muls( imp_v, 1.0f+vg_randf(), particle->obj.rb.v ); + particle->obj.rb.v[1] += 2.0f; + + v4_copy( q, particle->obj.rb.q ); + particle->obj.rb.w[0] = vg_randf()*2.0f-1.0f; + particle->obj.rb.w[1] = vg_randf()*2.0f-1.0f; + particle->obj.rb.w[2] = vg_randf()*2.0f-1.0f; + + particle->obj.type = k_rb_shape_sphere; + particle->obj.inf.sphere.radius = r*0.6f; + + rb_init_object( &particle->obj ); } + offset[0] += glyph->size[0]; } } } @@ -749,8 +859,6 @@ VG_STATIC void render_world_routes( world_instance *world, camera *cam, shader_scene_route_uPvmPrev( cam->mtx_prev.pv ); shader_scene_route_uMdl( identity_matrix ); shader_scene_route_uCamera( cam->transform[3] ); - shader_scene_route_uBoard0( TEMP_BOARD_0 ); - shader_scene_route_uBoard1( TEMP_BOARD_1 ); mesh_bind( &world->mesh_route_lines ); @@ -782,6 +890,31 @@ VG_STATIC void render_world_routes( world_instance *world, camera *cam, font3d_simple_draw( &world_global.font, 0, text->text, cam, text->transform ); } + + shader_model_font_uOffset( (v3f){0.0f,0.0f,0.0f} ); + + for( u32 i=0; imdl, prev_mtx ); + m4x4_mul( cam->mtx_prev.pv, prev_mtx, prev_mtx ); + + shader_model_font_uPvmPrev( prev_mtx ); + + v4f q; + m4x3f model; + rb_extrapolate( &particle->obj.rb, model[3], q ); + q_m3x3( q, model ); + + m4x3_mul( model, particle->mlocal, particle->mdl ); + shader_model_font_uMdl( particle->mdl ); + shader_model_font_uColour( particle->colour ); + + mesh_drawn( particle->glyph->indice_start, + particle->glyph->indice_count ); + } } /* gate markers