}
*routes;
- double last_interaction;
+ double time, rewind_from, rewind_to, last_use;
u32 route_count,
route_cap;
#if 0
traffic_driver van_man[6];
#endif
+
+ double sky_time, sky_rate, sky_target_rate;
/* Physics */
v3f render_gate_pos;
int active_route_board;
}
-world;
+world ;
/*
* API
static void world_init(void)
{
+ world.sky_rate = 1.0;
+ world.sky_target_rate = 1.0;
+
shader_terrain_register();
shader_sky_register();
shader_planeinf_register();
static void world_update( v3f pos )
{
+ world.sky_time += world.sky_rate * vg.time_delta;
+ world.sky_rate = vg_lerp( world.sky_rate, world.sky_target_rate,
+ vg.time_delta * 10.0 );
+
world_routes_update();
#if 0
world_routes_debug();
k_route_special_type_collector = 2
};
-static void world_routes_interact(void)
-{
- world.routes.last_interaction = vg.time;
-}
-
static void debug_sbpath( struct route_node *rna, struct route_node *rnb,
u32 colour, float xoffset )
{
*/
static void world_routes_ui_notch( u32 route, float time )
{
+ return; /* FIXME: Temporarily disabled */
+
struct subworld_routes *r = &world.routes;
struct route *pr = &r->routes[route];
shader_routeui_use();
glBindVertexArray( pr->ui.vao );
- float fade_amt = vg.time - pr->ui.fade_timer_start;
+ float fade_amt = r->time - pr->ui.fade_timer_start;
fade_amt = vg_clampf( fade_amt / 1.0f, 0.0f, 1.0f );
float fade_block_size = 0.0f,
fade_colour[3] *= 1.0f-fade_amt;
/* 1 minute timer */
- float timer_delta = (vg.time - world.routes.last_interaction) * (1.0/45.0),
+ float timer_delta = (r->time - r->last_use) * (1.0/45.0),
timer_scale = 1.0f - vg_minf( timer_delta, 1.0f );
/*
pr->ui.fade_start = pr->ui.segment_start;
pr->ui.fade_count = 0;
- pr->ui.fade_timer_start = vg.time;
+ pr->ui.fade_timer_start = r->time;
int orig_seg_count = pr->ui.segment_count;
pr->ui.fade_count ++;
}
- r->routes[route].latest_pass = vg.time;
+ r->routes[route].latest_pass = r->time;
}
/*
*/
static void world_routes_activate_gate( u32 id )
{
- world_routes_interact();
-
struct subworld_routes *r = &world.routes;
struct route_gate *rg = &r->gates[id];
struct route_node *pnode = &r->nodes[rg->node_id],
*pdest = &r->nodes[pnode->next[0]];
+ r->last_use = r->time;
+
struct route_collector *rc = &r->collectors[ pdest->special_id ];
r->active_gate = id;
rg->timing.version = r->current_run_version;
- rg->timing.time = vg.time;
+ rg->timing.time = r->time;
for( u32 i=0; i<r->route_count; i++ )
{
struct route *route = &r->routes[i];
{
route->ui.fade_start = route->ui.segment_start;
route->ui.fade_count = route->ui.segment_count;
- route->ui.fade_timer_start = vg.time;
+ route->ui.fade_timer_start = r->time;
world_routes_ui_clear(i);
vg_success( "CLEARING -> %u %u \n", route->ui.fade_start,
r->current_run_version ++;
rc->timing.version = r->current_run_version;
- rc->timing.time = vg.time;
+ rc->timing.time = r->time;
r->current_run_version ++;
}
static void world_routes_notify_reset(void)
{
struct subworld_routes *r = &world.routes;
- world_routes_interact();
+ r->rewind_from = r->time;
+ r->rewind_to = r->last_use;
+#if 0
for( int i=0; i<r->route_count; i++ )
{
struct route *route = &r->routes[i];
if( route->active )
- world_routes_ui_notch( i, vg.time - route->latest_pass );
+ world_routes_ui_notch( i, r->time - route->latest_pass );
}
+#endif
+}
+
+static void world_routes_rollback_time( double t )
+{
+ struct subworld_routes *r = &world.routes;
+ r->time = vg_lerp( r->rewind_to, r->rewind_from, t );
}
static void world_routes_debug(void)
static void world_routes_update(void)
{
struct subworld_routes *r = &world.routes;
+ r->time += vg.time_delta;
for( int i=0; i<r->route_count; i++ )
{
if( route->active )
{
- world_routes_ui_updatetime( i, vg.time - route->latest_pass );
+ world_routes_ui_updatetime( i, r->time - route->latest_pass );
}
}
}