X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_gen.c;h=b7aaf50995caef93d29660110007cd35696928f5;hb=1a40e653040837e47a4aba82d6b9f9800901fd64;hp=c31c2c2dd904955be10e8c7fde126cdfd2b2438e;hpb=7eba38b8178c82040618a518634d8ff4813e2ff2;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_gen.c b/world_gen.c index c31c2c2..b7aaf50 100644 --- a/world_gen.c +++ b/world_gen.c @@ -46,9 +46,9 @@ VG_STATIC void world_add_all_if_material( m4x3f transform, scene_context *scene, * | | * |________| */ -VG_STATIC void world_gen_add_blob( scene_context *scene, ray_hit *hit ) +VG_STATIC void world_gen_add_blob( world_instance *world, + scene_context *scene, ray_hit *hit ) { - world_instance *world = world_loading_instance(); m4x3f transform; v4f qsurface, qrandom; v3f axis; @@ -106,13 +106,13 @@ VG_STATIC void world_gen_add_blob( scene_context *scene, ray_hit *hit ) /* * Sprinkle foliage models over the map on terrain material */ -VG_STATIC void world_apply_procedural_foliage( scene_context *scene, +VG_STATIC void world_apply_procedural_foliage( world_instance *world, + scene_context *scene, struct world_surface *mat ) { if( vg.quality_profile == k_quality_profile_low ) return; - world_instance *world = world_loading_instance(); vg_info( "Applying foliage (%u)\n", mat->info.pstr_name ); v3f volume; @@ -139,7 +139,7 @@ VG_STATIC void world_apply_procedural_foliage( scene_context *scene, if( ray_world( world, pos, (v3f){0.0f,-1.0f,0.0f}, &hit )){ struct world_surface *m1 = ray_hit_surface( world, &hit ); if((hit.normal[1] > 0.8f) && (m1 == mat) && (hit.pos[1] > 0.0f+10.0f)){ - world_gen_add_blob( scene, &hit ); + world_gen_add_blob( world, scene, &hit ); count ++; } } @@ -164,12 +164,10 @@ void world_unpack_submesh_dynamic( world_instance *world, /* * Create the main meshes for the world */ -VG_STATIC void world_gen_generate_meshes(void) -{ +VG_STATIC void world_gen_generate_meshes( world_instance *world ){ /* * Compile meshes into the world scenes */ - world_instance *world = world_loading_instance(); scene_init( &world->scene_geo, 320000, 1200000 ); u32 buf_size = scene_mem_required( &world->scene_geo ); u8 *buffer = vg_linear_alloc( world->heap, buf_size ); @@ -250,8 +248,10 @@ VG_STATIC void world_gen_generate_meshes(void) &world->scene_no_collide, &world->meta, i ); } - if( surf->info.flags & k_material_flag_grow_grass ) - world_apply_procedural_foliage( &world->scene_no_collide, surf ); + if( surf->info.flags & k_material_flag_grow_grass ){ + world_apply_procedural_foliage( world, &world->scene_no_collide, + surf ); + } scene_copy_slice( &world->scene_no_collide, &surf->sm_no_collide ); } @@ -282,12 +282,24 @@ VG_STATIC void world_gen_generate_meshes(void) } } + /* unpack gate models */ + for( u32 i=0; ient_gate ); i++ ){ + ent_gate *gate = mdl_arritm( &world->ent_gate, i ); + + if( !(gate->flags & k_ent_gate_custom_mesh) ) continue; + + for( u32 j=0; jsubmesh_count; j ++ ){ + mdl_submesh *sm = mdl_arritm( &world->meta.submeshs, + gate->submesh_start+j ); + world_unpack_submesh_dynamic( world, &world->scene_no_collide, sm ); + } + } + vg_async_dispatch( call, async_scene_upload ); } /* signed distance function for cone */ -static f32 fsd_cone_infinite( v3f p, v2f c ) -{ +static f32 fsd_cone_infinite( v3f p, v2f c ){ v2f q = { v2_length( (v2f){ p[0], p[2] } ), -p[1] }; float s = vg_maxf( 0.0f, v2_dot( q, c ) ); @@ -309,8 +321,7 @@ struct light_indices_upload_info{ /* * Async reciever to buffer light index data */ -VG_STATIC void async_upload_light_indices( void *payload, u32 size ) -{ +VG_STATIC void async_upload_light_indices( void *payload, u32 size ){ struct light_indices_upload_info *info = payload; glGenTextures( 1, &info->world->tex_light_cubes ); @@ -325,10 +336,8 @@ VG_STATIC void async_upload_light_indices( void *payload, u32 size ) /* * Computes light indices for world */ -VG_STATIC void world_gen_compute_light_indices(void) -{ +VG_STATIC void world_gen_compute_light_indices( world_instance *world ){ /* light cubes */ - world_instance *world = world_loading_instance(); v3f cubes_min, cubes_max; v3_muls( world->scene_geo.bbx[0], 1.0f/k_world_light_cube_size, cubes_min ); v3_muls( world->scene_geo.bbx[1], 1.0f/k_world_light_cube_size, cubes_max ); @@ -485,10 +494,9 @@ VG_STATIC void world_gen_compute_light_indices(void) /* * Rendering pass needed to complete the world */ -VG_STATIC void async_world_postprocess_render( void *payload, u32 _size ) -{ +VG_STATIC void async_world_postprocess( void *payload, u32 _size ){ /* create scene lighting buffer */ - world_instance *world = world_loading_instance(); + world_instance *world = payload; u32 size = VG_MAX(mdl_arrcount(&world->ent_light),1) * sizeof(float)*12; vg_info( "Upload %ubytes (lighting)\n", size ); @@ -596,24 +604,11 @@ VG_STATIC void async_world_postprocess_render( void *payload, u32 _size ) glBufferSubData( GL_UNIFORM_BUFFER, 0, sizeof(struct ub_world_lighting), &world->ub_lighting ); - /* yes we are using this as the entity begin thing. FIXME */ - world->probabilities[ k_probability_curve_constant ] = 1.0f; - for( u32 i=0; ient_audio); i++ ){ - ent_audio *audio = mdl_arritm(&world->ent_audio,i); - if( audio->flags & AUDIO_FLAG_AUTO_START ){ - ent_call call; - call.data = NULL; - call.function = k_ent_function_trigger; - call.id = mdl_entity_id( k_ent_audio, i ); - entity_call( world, &call ); - } - } + world->status = k_world_status_loaded; } /* Loads textures from the pack file */ -VG_STATIC void world_gen_load_surfaces(void) -{ - world_instance *world = world_loading_instance(); +VG_STATIC void world_gen_load_surfaces( world_instance *world ){ vg_info( "Loading textures\n" ); world->texture_count = 0;