- v3_zero( world.rb_geo.co );
- q_identity( world.rb_geo.q );
-
- world.rb_geo.type = k_rb_shape_scene;
- world.rb_geo.inf.scene.pscene = &world.geo;
- world.rb_geo.is_world = 1;
- rb_init( &world.rb_geo );
-}
-
-static void world_init(void)
-{
- vg_tex2d_init( (vg_tex2d *[]){ &tex_terrain_colours,
- &tex_terrain_noise,
- &tex_alphatest,
- &tex_graffiti }, 4 );
-
- mdl_header *mcars = mdl_load( "models/rs_cars.mdl" );
- mdl_unpack_glmesh( mcars, &world.cars );
- mdl_node *nholden = mdl_node_from_name( mcars, "holden" );
- world.car_holden = *mdl_node_submesh( mcars, nholden, 0 );
- free(mcars);
-
-
- mdl_header *msky = mdl_load("models/rs_skydome.mdl");
- mdl_unpack_glmesh( msky, &world.skydome );
-
- mdl_node *nlower = mdl_node_from_name( msky, "dome_lower" ),
- *nupper = mdl_node_from_name( msky, "dome_upper" );
-
- world.dome_lower = *mdl_node_submesh( msky, nlower, 0 );
- world.dome_upper = *mdl_node_submesh( msky, nupper, 0 );
- free(msky);
-
-
- /* Other systems */
- world_sfd_init();
- world_audio_init();
-}
-
-static void world_update(void)
-{
- world_routes_update();
- world_routes_debug();
-
- int closest = 0;
- float min_dist = INFINITY;
-
- for( int i=0; i<world.routes.route_count; i++ )
- {
- float dist = v3_dist2( world.routes.routes[i].scoreboard_transform[3],
- player_get_pos() );
-
- if( dist < min_dist )
- {
- min_dist = dist;
- closest = i;
- }
- }
-
- if( (world.active_route_board != closest) || network_scores_updated )
- {
- network_scores_updated = 0;
- world.active_route_board = closest;
- struct subworld_sfd *sfd = subworld_sfd();
-
- struct route *route = &world.routes.routes[closest];
-
- u32 id = route->track_id;
-
- if( id != 0xffffffff )
- {
- struct netmsg_board *local_board = &scoreboard_client_data.boards[id];
-
- for( int i=0; i<13; i++ )
- {
- sfd_encode( &sfd->tester, i, &local_board->data[27*i] );
- }
- }
- }
-
- sfd_update( &world.sfd.tester );
-
-#if 0
- rb_solver_reset();
- rb_build_manifold_terrain_sphere( &world.mr_ball );
-
- for( int i=0; i<5; i++ )
- rb_solve_contacts( rb_contact_buffer, rb_contact_count );
-
- rb_iter( &world.mr_ball );
- rb_update_transform( &world.mr_ball );
- rb_debug( &world.mr_ball, 0 );
-
- for( int i=0; i<vg_list_size(world.van_man); i++ )
- {
- traffic_drive( &world.van_man[i] );
- traffic_visualize_car( &world.van_man[i] );
- }
-#endif
-}
-
-/*
- * Rendering
- */
-
-static void bind_terrain_textures(void)
-{
- vg_tex2d_bind( &tex_terrain_noise, 0 );
- vg_tex2d_bind( &tex_terrain_colours, 1 );
-}
-
-static void render_world_vb( m4x4f projection, v3f camera )
-{
- m4x3f identity_matrix;
- m4x3_identity( identity_matrix );
-
- shader_vblend_use();
- shader_vblend_uTexGarbage(0);
- shader_vblend_uTexGradients(1);
- shader_link_standard_ub( _shader_vblend.id, 2 );
- bind_terrain_textures();
-
- shader_vblend_uPv( projection );
- shader_vblend_uMdl( identity_matrix );
- shader_vblend_uCamera( camera );
-
- scene_bind( &world.geo );
- mdl_draw_submesh( &world.sm_geo_vb );
-
- mesh_bind( &world.cars );
-
-#if 0
- for( int i=0; i<vg_list_size(world.van_man); i++ )
- {
- shader_vblend_uMdl( world.van_man[i].transform );
- mdl_draw_submesh( &world.car_holden );
- }
-#endif
-}
-
-static void render_world_alphatest( m4x4f projection, v3f camera )
-{
- m4x3f identity_matrix;
- m4x3_identity( identity_matrix );
-
- shader_alphatest_use();
- shader_alphatest_uTexGarbage(0);
- shader_alphatest_uTexMain(1);
- shader_link_standard_ub( _shader_alphatest.id, 2 );
-
- vg_tex2d_bind( &tex_terrain_noise, 0 );
- vg_tex2d_bind( &tex_alphatest, 1 );
-
- shader_alphatest_uPv( projection );
- shader_alphatest_uMdl( identity_matrix );
- shader_alphatest_uCamera( camera );
-
- glDisable(GL_CULL_FACE);
- scene_bind( &world.foliage );
- mdl_draw_submesh( &world.sm_foliage_alphatest );