X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_routes.c;h=26261a1ed72cc56e4658827dbf83af118e24b1c6;hb=4b8fc63f926737ca0593a4e471550f9f4995c538;hp=efde3644dd07d3203988a0d1ddb577ad42d9cafe;hpb=4c95c9c3e6033cd1360adacef3c80fc4da933715;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_routes.c b/world_routes.c index efde364..26261a1 100644 --- a/world_routes.c +++ b/world_routes.c @@ -6,6 +6,7 @@ #define ROUTES_C #include +#include "entity.h" #include "world_routes.h" #include "world_gate.h" #include "world_load.h" @@ -22,7 +23,7 @@ VG_STATIC void world_routes_local_set_record( world_instance *world, ent_route *route, - double lap_time ) + f64 lap_time ) { vg_success( " NEW LAP TIME: %f\n", lap_time ); @@ -31,18 +32,13 @@ void world_routes_local_set_record( world_instance *world, ent_route *route, if( time_centiseconds > (float)0xfffe ) /* skill issue */ return; - highscore_record temp; - temp.trackid = route->official_track_id; - temp.datetime = time(NULL); - temp.playerid = 0; - temp.points = 0; - temp.time = time_centiseconds; - -#if 0 - highscores_push_record( &temp ); -#endif - struct track_info *ti = &track_infos[ route->official_track_id ]; + highscore_record *record = &ti->record; + record->trackid = route->official_track_id; + record->datetime = time(NULL); + record->playerid = 0; + record->points = 0; + record->time = time_centiseconds; ti->push = 1; if( ti->achievement_id ){ @@ -137,7 +133,7 @@ VG_STATIC void world_routes_activate_entry_gate( world_instance *world, world_static.last_use = world_static.time; /* disable all routes and leave the world */ - if( rg->type == k_gate_type_nonlocel ){ + if( rg->flags & k_ent_gate_nonlocal ){ for( u32 i=0; ient_route); i++ ){ ent_route *route = mdl_arritm( &world->ent_route, i ); route->active_checkpoint = 0xffff; @@ -183,7 +179,7 @@ VG_STATIC void world_routes_debug( world_instance *world ) { for( u32 i=0; ient_route_node); i++ ){ ent_route_node *rn = mdl_arritm(&world->ent_route_node,i); - vg_line_pt3( rn->co, 0.25f, VG__WHITE ); + vg_line_point( rn->co, 0.25f, VG__WHITE ); } for( u32 i=0; ient_route); i++ ){ @@ -255,15 +251,12 @@ void world_routes_pointcloud_spot( world_instance *world, v3_sub( point, pcbuf->boundary[0], pos ); v3_mul( pos, inv_ext, pos ); - for( u32 i=0; i<3; i++ ){ - vert->pos[i] = (pos[i]-0.5f) * 32767.0f; - } - float dist = 1.0f-(v3_length(jitter)); - for( u32 i=0; i<4; i++ ){ - vert->colour[i] = colour[i] * 255.0f * dist*dist; - } + v4f final_colour; + v4_muls( colour, dist*dist, final_colour ); + + pointcloud_packvert( vert, pos, final_colour ); } } @@ -307,14 +300,7 @@ void world_routes_pointcloud_tower( world_instance *world, v3_sub( point, pcbuf->boundary[0], point ); v3_mul( point, inv_ext, point ); - /* TODO....... */ - for( u32 i=0; i<3; i++ ){ - vert->pos[i] = (point[i]-0.5f) * 32767.0f; - } - - for( u32 i=0; i<4; i++ ){ - vert->colour[i] = colour[i] * 255.0f; - } + pointcloud_packvert( vert, point, colour ); } } @@ -667,10 +653,6 @@ VG_STATIC f64 world_routes_scatter_surface_points( world_instance *world, v3_sub( pt, pcbuf->boundary[0], pos ); v3_mul( pos, inv_ext, pos ); - for( u32 i=0; i<3; i++ ){ - vert->pos[i] = (pos[i]-0.5f) * 32767.0f; - } - static v4f colours[] = { [k_surface_prop_concrete] = { 0.13, 0.15, 0.17, 1.0 }, [k_surface_prop_grass] = { 0.07, 0.1, 0.14, 1.0 }, @@ -680,16 +662,13 @@ VG_STATIC f64 world_routes_scatter_surface_points( world_instance *world, }; v4f col = {0.0f,0.0f,0.0f,0.0f}; - if( surf->info.surface_prop < vg_list_size(colours) ){ + if( surf->info.surface_prop < vg_list_size(colours) ) v4_copy( colours[surf->info.surface_prop], col ); - } f32 brightness = v3_dot(vn,light_dir)*0.5f+0.5f; v3_muls( col, brightness, col ); - for( u32 j=0; j<4; j++ ){ - vert->colour[j] = col[j] * 255.0f; - } + pointcloud_packvert( vert, pos, col ); } } @@ -758,13 +737,7 @@ VG_STATIC void world_routes_surface_grid( world_instance *world, v3_sub( hit, pcbuf->boundary[0], co ); v3_mul( co, inv_ext, co ); - for( u32 i=0; i<3; i++ ){ - vert->pos[i] = (co[i]-0.5f) * 32767.0f; - } - - for( u32 i=0; i<4; i++ ){ - vert->colour[i] = colour[i] * 255.0f; - } + pointcloud_packvert( vert, co, colour ); } } } @@ -772,12 +745,37 @@ VG_STATIC void world_routes_surface_grid( world_instance *world, } } +VG_STATIC void world_write_preview( addon_reg *reg, pointcloud_buffer *pcbuf ){ + if( reg->alias.workshop_id ) return; + + /* + * FIXME: BUG: cannot correctly handle workshop because there is a stalling + * call below, which deadlocks the scene upload. TODO: improve the async + * stack to handle out of order execution. MAYBE + */ + + char path_buf[4096]; + vg_str path; + vg_strnull( &path, path_buf, 4096 ); + + addon_get_content_folder( reg, &path ); + vg_strcat( &path, "/preview.bin" ); + + if( !vg_strgood( &path ) ) vg_fatal_error( "Path too long\n" ); + FILE *fp = fopen( path_buf, "wb" ); + if( !fp ) vg_fatal_error( "Cannot open '%s' for writing\n", path_buf ); + + fwrite( pcbuf, sizeof(struct pointcloud_buffer) + + sizeof(struct pointcloud_vert)*pcbuf->count, 1, fp ); + fclose( fp ); + vg_info( "written %s\n", path_buf ); +} + /* * Create the strips of colour that run through the world along course paths */ -VG_STATIC void world_gen_routes_generate(void) -{ - world_instance *world = world_loading_instance(); +VG_STATIC void world_gen_routes_generate( u32 instance_id ){ + world_instance *world = &world_static.instances[ instance_id ]; vg_info( "Generating route meshes\n" ); vg_async_stall(); @@ -789,7 +787,7 @@ VG_STATIC void world_gen_routes_generate(void) vg_async_item *call_pointcloud = NULL; pointcloud_buffer *pcbuf = NULL; - if( world_loader.generate_point_cloud ){ + if( instance_id <= 1 /*world_loader.generate_point_cloud*/ ){ call_pointcloud = vg_async_alloc( sizeof(pointcloud_buffer) + sizeof(pointcloud_vert)*POINTCLOUD_POINTS ); @@ -850,7 +848,7 @@ VG_STATIC void world_gen_routes_generate(void) world_routes_gen_meshes( world, i, &world->scene_lines, pcbuf ); } - if( world_loader.generate_point_cloud ){ + if( instance_id <= 1 /*world_loader.generate_point_cloud*/ ){ f64 area = 0.0; area = world_routes_scatter_surface_points( world, pcbuf, 16.0f ); world_routes_surface_grid( world, pcbuf ); @@ -866,23 +864,9 @@ VG_STATIC void world_gen_routes_generate(void) vg_info( "Distrubuted %u points over %fkm^2!\n", pcbuf->count, area/1e6f ); - if( world_loader.location == k_world_load_type_local ){ - char path_buf[4096]; - vg_str path; - vg_strnull( &path, path_buf, 4096 ); - vg_strcat( &path, "maps/" ); - vg_strcat( &path, world_loader.name ); - vg_strcat( &path, "/preview.bin" ); - - if( !vg_strgood( &path ) ) vg_fatal_error( "Path too long\n" ); - FILE *fp = fopen( path_buf, "wb" ); - if( !fp ) vg_fatal_error( "Cannot open '%s' for writing\n", path_buf ); - - fwrite( pcbuf, sizeof(pcbuf) + - sizeof(struct pointcloud_vert)*pcbuf->count, 1, fp ); - fclose( fp ); - } - + world_write_preview( instance_id? world_static.addon_client: + world_static.addon_hub, + pcbuf ); vg_async_dispatch( call_pointcloud, async_pointcloud_sub ); } @@ -891,9 +875,7 @@ VG_STATIC void world_gen_routes_generate(void) } /* load all routes from model header */ -VG_STATIC void world_gen_routes_ent_init(void) -{ - world_instance *world = world_loading_instance(); +VG_STATIC void world_gen_routes_ent_init( world_instance *world ){ vg_info( "Initializing routes\n" ); for( u32 i=0; ient_gate); i++ ){ @@ -928,7 +910,8 @@ VG_STATIC void world_gen_routes_ent_init(void) } } - if( gate->type == k_gate_type_teleport ){ + if( (gate->flags & k_ent_gate_linked) & + !(gate->flags & k_ent_gate_nonlocal) ){ gate = mdl_arritm(&world->ent_gate, gate->target ); for( u32 k=0; k<4; k++ ){