+ float a = state->g_time_of_day * VG_PIf * 2.0f;
+ state->g_sun_dir[0] = sinf( a );
+ state->g_sun_dir[1] = cosf( a );
+ state->g_sun_dir[2] = 0.2f;
+ v3_normalize( state->g_sun_dir );
+
+
+ world->probabilities[ k_probability_curve_constant ] = 1.0f;
+
+ float dp = state->g_day_phase;
+
+ world->probabilities[ k_probability_curve_wildlife_day ] =
+ (dp*dp*0.8f+state->g_sunset_phase)*0.8f;
+ world->probabilities[ k_probability_curve_wildlife_night ] =
+ 1.0f-powf(fabsf((state->g_time_of_day-0.5f)*5.0f),5.0f);
+
+
+ glBindBuffer( GL_UNIFORM_BUFFER, world->ubo_lighting );
+ glBufferSubData( GL_UNIFORM_BUFFER, 0,
+ sizeof(struct ub_world_lighting), &world->ub_lighting );
+ /* TEMP!!!!!! */
+
+ world_global.sky_time += world_global.sky_rate * vg.time_delta;
+ world_global.sky_rate = vg_lerp( world_global.sky_rate,
+ world_global.sky_target_rate,
+ vg.time_delta * 5.0 );
+
+ world_routes_update( world );
+ world_routes_debug( world );
+
+ /* ---- SFD ------------ */
+
+ if( mdl_arrcount( &world->ent_route ) ){
+ u32 closest = 0;
+ float min_dist = INFINITY;
+
+ 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( dist < min_dist ){
+ min_dist = dist;
+ closest = i;
+ }
+ }
+
+ if( (world_global.sfd.active_route_board != closest)
+ || network_scores_updated )
+ {
+ network_scores_updated = 0;
+ world_global.sfd.active_route_board = closest;
+
+ ent_route *route = mdl_arritm( &world->ent_route, closest );
+ u32 id = route->official_track_id;
+
+ if( id != 0xffffffff ){
+ struct netmsg_board *local_board =
+ &scoreboard_client_data.boards[id];
+
+ 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" );
+ }
+ }
+ }
+ sfd_update();
+
+
+
+ static float random_accum = 0.0f;
+ random_accum += vg.time_delta;
+
+ u32 random_ticks = 0;
+
+ while( random_accum > 0.1f ){
+ random_accum -= 0.1f;
+ random_ticks ++;
+ }
+
+ float radius = 25.0f;
+ boxf volume_proximity;
+ v3_add( pos, (v3f){ radius, radius, radius }, volume_proximity[1] );
+ v3_sub( pos, (v3f){ radius, radius, radius }, volume_proximity[0] );
+
+ bh_iter it;
+ bh_iter_init( 0, &it );
+ int idx;
+
+ int in_volume = 0;
+
+ while( bh_next( world->volume_bh, &it, volume_proximity, &idx ) ){
+ ent_volume *volume = mdl_arritm( &world->ent_volume, idx );
+
+ boxf cube = {{-1.0f,-1.0f,-1.0f},{1.0f,1.0f,1.0f}};
+
+ if( volume->type == k_volume_subtype_trigger ){
+ v3f local;
+ m4x3_mulv( volume->to_local, pos, local );
+
+ if( (fabsf(local[0]) <= 1.0f) &&
+ (fabsf(local[1]) <= 1.0f) &&
+ (fabsf(local[2]) <= 1.0f) )
+ {
+ in_volume = 1;
+ vg_line_boxf_transformed( volume->to_world, cube, 0xff00ff00 );
+
+ if( !world_global.in_volume ){
+ ent_call basecall;
+ basecall.ent.index = idx;
+ basecall.ent.type = k_ent_volume;
+ basecall.function = k_ent_function_trigger;
+ basecall.data = NULL;
+
+ entity_call( world, &basecall );
+ }
+ }
+ else
+ vg_line_boxf_transformed( volume->to_world, cube, 0xff0000ff );
+ }
+ else if( volume->type == k_volume_subtype_particle ){
+ vg_line_boxf_transformed( volume->to_world, cube, 0xff00c0ff );
+
+ for( int j=0; j<random_ticks; j++ ){
+ ent_call basecall;
+ basecall.ent.index = idx;
+ basecall.ent.type = k_ent_volume;
+ basecall.function = k_ent_function_trigger;
+ basecall.data = NULL;
+
+ entity_call( world, &basecall );
+ }
+ }
+ }
+ world_global.in_volume = in_volume;