X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_routes.c;h=3e21df0def867a4187f0c776aad3b2116747715e;hb=dbbdf411d1aaf70cb995c3371cfae37fd0b7dbcc;hp=d2816d111ba4a4a45ddb4dbb26224911b734ac01;hpb=302b008f2298f54a95a5c5e0b46f2f573b49bb8e;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_routes.c b/world_routes.c index d2816d1..3e21df0 100644 --- a/world_routes.c +++ b/world_routes.c @@ -133,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; @@ -365,8 +365,8 @@ void world_routes_place_curve( world_instance *world, ent_route *route, ha.dist = 8.0f; hb.dist = 8.0f; - int resa = ray_world( world, sa, down, &ha ), - resb = ray_world( world, sb, down, &hb ); + int resa = ray_world( world, sa, down, &ha, k_material_flag_ghosts ), + resb = ray_world( world, sb, down, &hb, k_material_flag_ghosts ); if( pcbuf && resa ){ world_routes_pointcloud_spot( world, pcbuf, ha.pos, @@ -712,6 +712,10 @@ VG_STATIC void world_routes_surface_grid( world_instance *world, u32 *tri = &world->scene_geo.arrindices[ idx*3 ]; v3f vs[3]; + u16 mask = k_material_flag_preview_visibile; + if( !(world->scene_geo.arrvertices[tri[0]].flags & mask) ) + continue; + for( u32 i=0; i<3; i++ ){ v3_copy( world->scene_geo.arrvertices[tri[i]].co, vs[i] ); } @@ -719,11 +723,6 @@ VG_STATIC void world_routes_surface_grid( world_instance *world, f32 t; if( ray_tri( vs, ro, dir, &t ) ){ v3_muladds( ro, dir, t, hit ); - struct world_surface *m1 = - world_tri_index_surface( world, tri[0] ); - - if( !(m1->info.flags & k_material_flag_preview_visibile) ) - continue; if( world->water.enabled ) if( hit[1] < world->water.height ) @@ -745,22 +744,20 @@ VG_STATIC void world_routes_surface_grid( world_instance *world, } } -VG_STATIC void world_write_preview( pointcloud_buffer *pcbuf ){ +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 ); - if( world_loader.reg ){ - /* Don't want to override the one we get from the workshop */ - if( world_loader.reg->alias.workshop_id ) return; - - addon_get_content_folder( world_loader.reg, &path ); - } - else{ - vg_strcat( &path, "maps/" ); - vg_strcat( &path, world_loader.override_name ); - } - + addon_get_content_folder( reg, &path ); vg_strcat( &path, "/preview.bin" ); if( !vg_strgood( &path ) ) vg_fatal_error( "Path too long\n" ); @@ -770,14 +767,14 @@ VG_STATIC void world_write_preview( pointcloud_buffer *pcbuf ){ 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 +786,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,8 +847,10 @@ 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; + +#if VG_RELEASE area = world_routes_scatter_surface_points( world, pcbuf, 16.0f ); world_routes_surface_grid( world, pcbuf ); @@ -862,11 +861,14 @@ VG_STATIC void world_gen_routes_generate(void) 2.0f, 50.0f, 128, (v4f){0.2f,0.2f,0.2f,1.0f} ); } +#endif - vg_info( "Distrubuted %u points over %fkm^2!\n", + vg_info( "Distributed %u points over %fkm^2!\n", pcbuf->count, area/1e6f ); - world_write_preview( pcbuf ); + world_write_preview( instance_id? world_static.addon_client: + world_static.addon_hub, + pcbuf ); vg_async_dispatch( call_pointcloud, async_pointcloud_sub ); } @@ -875,9 +877,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++ ){ @@ -912,7 +912,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++ ){ @@ -981,7 +982,8 @@ VG_STATIC void world_routes_fixedupdate( world_instance *world ) int l = rb_sphere__scene( particle->obj.rb.to_world, &particle->obj.inf.sphere, - NULL, &world->rb_geo.inf.scene, buf ); + NULL, &world->rb_geo.inf.scene, buf, + k_material_flag_ghosts ); for( int j=0; jobj.rb; @@ -1110,12 +1112,15 @@ VG_STATIC void world_routes_update_timer_texts( world_instance *world ) positions[0][1] = h1; } - m3x3_copy( gate->to_world, text->transform ); + m4x3f mmdl; + ent_gate_get_mdl_mtx( gate, mmdl ); + + m3x3_copy( mmdl, text->transform ); float ratio = v3_length(text->transform[0]) / v3_length(text->transform[1]); m3x3_scale( text->transform, (v3f){ size, size*ratio, 0.1f } ); - m4x3_mulv( gate->to_world, positions[j], text->transform[3] ); + m4x3_mulv( mmdl, positions[j], text->transform[3] ); } } } @@ -1243,7 +1248,8 @@ VG_STATIC void render_world_routes( world_instance *world, camera *cam, colour[3] = 1.0f-text->route->factive; shader_model_font_uColour( colour ); - font3d_simple_draw( &gui.font, 0, text->text, cam, text->transform ); + font3d_simple_draw( &gui.font, 0, k_font_shader_default, + text->text, cam, text->transform ); } shader_model_font_uOffset( (v4f){0.0f,0.0f,0.0f,1.0f} ); @@ -1305,7 +1311,10 @@ VG_STATIC void render_world_routes( world_instance *world, camera *cam, ent_checkpoint *cp = mdl_arritm( &world->ent_checkpoint, next ); ent_gate *gate = mdl_arritm( &world->ent_gate, cp->gate_index ); - shader_model_gate_uMdl( gate->to_world ); + + m4x3f mmdl; + ent_gate_get_mdl_mtx( gate, mmdl ); + shader_model_gate_uMdl( mmdl ); for( u32 j=0; j<4; j++ ){ if( gate->routes[j] == i ){