X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_gen.c;h=e2ec14af8edd774ad28c7f441b624d3c66109d4c;hb=53b534974303043efaf1d887711fcd349f6a2885;hp=7d3cc81dc30be79cdfd4c68df8d13e2b5d1e9e05;hpb=2c91a71533b4ce86b9e7fd708420ae05c74d8f52;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_gen.c b/world_gen.c index 7d3cc81..e2ec14a 100644 --- a/world_gen.c +++ b/world_gen.c @@ -46,7 +46,7 @@ static void world_add_all_if_material( m4x3f transform, scene_context *scene, * | | * |________| */ -static void world_gen_add_blob( world_instance *world, +static void world_gen_add_blob( vg_rand *rand, world_instance *world, scene_context *scene, ray_hit *hit ) { m4x3f transform; @@ -57,7 +57,7 @@ static void world_gen_add_blob( world_instance *world, float angle = v3_dot(hit->normal,(v3f){0.0f,1.0f,0.0f}); q_axis_angle( qsurface, axis, angle ); - q_axis_angle( qrandom, (v3f){0.0f,1.0f,0.0f}, vg_randf64()*VG_TAUf ); + q_axis_angle( qrandom, (v3f){0.0f,1.0f,0.0f}, vg_randf64(rand)*VG_TAUf ); q_mul( qsurface, qrandom, qsurface ); q_m3x3( qsurface, transform ); v3_copy( hit->pos, transform[3] ); @@ -85,13 +85,12 @@ 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 ); } @@ -124,9 +123,10 @@ static void world_apply_procedural_foliage( world_instance *world, float area = volume[0]*volume[2]; u32 particles = 0.08f * area; - /* TODO: Quasirandom? */ vg_info( "Map area: %f. Max particles: %u\n", area, particles ); + u64 t0 = SDL_GetPerformanceCounter(); +#if 0 for( u32 i=0; iscene_geo.bbx[0], co ); + + ray_hit hit; + hit.dist = INFINITY; + + if( ray_world( world, co, (v3f){0.0f,-1.0f,0.0f}, &hit, + k_material_flag_ghosts )){ + 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( &rand, world, scene, &hit ); + count ++; + } + } + + } + } + } + +#endif + + + + u64 t1 = SDL_GetPerformanceCounter(), + utime_blobs = t1-t0, + ufreq = SDL_GetPerformanceFrequency(); + f64 ftime_blobs = ((f64)utime_blobs / (f64)ufreq)*1000.0; - vg_info( "%d foliage models added\n", count ); + vg_info( "%d foliage models added. %f%% (%fms)\n", count, + 100.0*((f64)count/(f64)particles), ftime_blobs); } static @@ -273,6 +317,7 @@ static void world_gen_generate_meshes( world_instance *world ){ mdl_submesh *sm = mdl_arritm( &world->meta.submeshs, vehc->submesh_start+j ); world_unpack_submesh_dynamic( world, &world->scene_no_collide, sm ); + world->surfaces[ sm->material_id ].flags |= WORLD_SURFACE_HAS_TRAFFIC; } } @@ -287,6 +332,17 @@ 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 +356,18 @@ 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->surfaces[ sm->material_id ].flags |= WORLD_SURFACE_HAS_PROPS; + world_unpack_submesh_dynamic( world, &world->scene_no_collide, sm ); + } + } + vg_async_dispatch( call, async_scene_upload ); } @@ -662,8 +730,7 @@ static void world_gen_load_surfaces( world_instance *world ){ world->texture_count = world->meta.textures.count+1; world->textures = vg_linear_alloc( world->heap, vg_align8(sizeof(GLuint)*world->texture_count) ); - - vg_tex2d_replace_with_error( &world->textures[0] ); + world->textures[0] = vg.tex_missing; for( u32 i=0; imeta.textures); i++ ){ mdl_texture *tex = mdl_arritm( &world->meta.textures, i ); @@ -693,8 +760,9 @@ static void world_gen_load_surfaces( world_instance *world ){ memset( errmat, 0, sizeof(struct world_surface) ); for( u32 i=0; imeta.materials); i++ ){ - world->surfaces[i+1].info = - *(mdl_material *)mdl_arritm( &world->meta.materials, i ); + struct world_surface *surf = &world->surfaces[i+1]; + surf->info = *(mdl_material *)mdl_arritm( &world->meta.materials, i ); + surf->flags = 0; } }