X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_gen.c;h=df5b342e40fb11965c963a0ce4009db6a4da31bb;hb=74b2136d5b41b18e2eec698f1fd11b503aa1100a;hp=6bef3ef9ed6e53fd82b6f0c5ca9684bdf49aa09e;hpb=6190deb68aa1c9e92ede62ea05c2a755bf5516de;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_gen.c b/world_gen.c index 6bef3ef..df5b342 100644 --- a/world_gen.c +++ b/world_gen.c @@ -18,7 +18,7 @@ * Add all triangles from the model, which match the material ID * applies affine transform to the model */ -VG_STATIC void world_add_all_if_material( m4x3f transform, scene_context *scene, +static void world_add_all_if_material( m4x3f transform, scene_context *scene, mdl_context *mdl, u32 id ) { for( u32 i=0; imeshs); i++ ){ @@ -46,7 +46,7 @@ VG_STATIC void world_add_all_if_material( m4x3f transform, scene_context *scene, * | | * |________| */ -VG_STATIC void world_gen_add_blob( world_instance *world, +static void world_gen_add_blob( world_instance *world, scene_context *scene, ray_hit *hit ) { m4x3f transform; @@ -85,13 +85,12 @@ VG_STATIC void world_gen_add_blob( world_instance *world, scene_vert *ref = &world->scene_geo.arrvertices[ hit->tri[0] ]; - for( u32 i=0; ico, pvert->co ); - scene_vert_pack_norm( pvert, transform[1] ); + scene_vert_pack_norm( pvert, transform[1], 0.0f ); v2_copy( ref->uv, pvert->uv ); } @@ -106,7 +105,7 @@ VG_STATIC void world_gen_add_blob( world_instance *world, /* * Sprinkle foliage models over the map on terrain material */ -VG_STATIC void world_apply_procedural_foliage( world_instance *world, +static void world_apply_procedural_foliage( world_instance *world, scene_context *scene, struct world_surface *mat ) { @@ -149,7 +148,7 @@ VG_STATIC void world_apply_procedural_foliage( world_instance *world, vg_info( "%d foliage models added\n", count ); } -VG_STATIC +static void world_unpack_submesh_dynamic( world_instance *world, scene_context *scene, mdl_submesh *sm ){ if( sm->flags & k_submesh_flag_consumed ) return; @@ -165,7 +164,7 @@ void world_unpack_submesh_dynamic( world_instance *world, /* * Create the main meshes for the world */ -VG_STATIC void world_gen_generate_meshes( world_instance *world ){ +static void world_gen_generate_meshes( world_instance *world ){ /* * Compile meshes into the world scenes */ @@ -287,6 +286,17 @@ VG_STATIC void world_gen_generate_meshes( world_instance *world ){ } } + /* unpack region models */ + for( u32 i=0; ient_region ); i++ ){ + ent_region *region = mdl_arritm( &world->ent_region, i ); + + for( u32 j=0; jsubmesh_count; j ++ ){ + mdl_submesh *sm = mdl_arritm( &world->meta.submeshs, + region->submesh_start+j ); + world_unpack_submesh_dynamic( world, &world->scene_no_collide, sm ); + } + } + /* unpack gate models */ for( u32 i=0; ient_gate ); i++ ){ ent_gate *gate = mdl_arritm( &world->ent_gate, i ); @@ -300,6 +310,17 @@ VG_STATIC void world_gen_generate_meshes( world_instance *world ){ } } + /* unpack prop models */ + for( u32 i=0; ient_prop ); i++ ){ + ent_prop *prop = mdl_arritm( &world->ent_prop, i ); + + for( u32 j=0; jsubmesh_count; j ++ ){ + mdl_submesh *sm = mdl_arritm( &world->meta.submeshs, + prop->submesh_start+j ); + world_unpack_submesh_dynamic( world, &world->scene_no_collide, sm ); + } + } + vg_async_dispatch( call, async_scene_upload ); } @@ -326,7 +347,7 @@ struct light_indices_upload_info{ /* * Async reciever to buffer light index data */ -VG_STATIC void async_upload_light_indices( void *payload, u32 size ){ +static void async_upload_light_indices( void *payload, u32 size ){ struct light_indices_upload_info *info = payload; glGenTextures( 1, &info->world->tex_light_cubes ); @@ -341,7 +362,7 @@ VG_STATIC void async_upload_light_indices( void *payload, u32 size ){ /* * Computes light indices for world */ -VG_STATIC void world_gen_compute_light_indices( world_instance *world ){ +static void world_gen_compute_light_indices( world_instance *world ){ /* light cubes */ v3f cubes_min, cubes_max; v3_muls( world->scene_geo.bbx[0], 1.0f/k_world_light_cube_size, cubes_min ); @@ -435,12 +456,14 @@ VG_STATIC void world_gen_compute_light_indices( world_instance *world ){ v3f closest; closest_point_aabb( light->transform.co, bbx, closest ); - float dist = v3_dist( closest, light->transform.co ), - influence = 1.0f/(dist+1.0f); + f32 dist2 = v3_dist2( closest, light->transform.co ); - if( dist > light->range ) + if( dist2 > light->range*light->range ) continue; + f32 dist = sqrtf(dist2), + influence = 1.0f/(dist+1.0f); + if( light->type == k_light_type_spot){ v3f local; m4x3_mulv( light->inverse_world, center, local ); @@ -499,7 +522,7 @@ VG_STATIC void world_gen_compute_light_indices( world_instance *world ){ /* * Rendering pass needed to complete the world */ -VG_STATIC void async_world_postprocess( void *payload, u32 _size ){ +static void async_world_postprocess( void *payload, u32 _size ){ /* create scene lighting buffer */ world_instance *world = payload; @@ -650,11 +673,10 @@ VG_STATIC void async_world_postprocess( void *payload, u32 _size ){ } glBindFramebuffer( GL_FRAMEBUFFER, 0 ); - world->status = k_world_status_loaded; } /* Loads textures from the pack file */ -VG_STATIC void world_gen_load_surfaces( world_instance *world ){ +static void world_gen_load_surfaces( world_instance *world ){ vg_info( "Loading textures\n" ); world->texture_count = 0;