X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_gen.c;h=04d6131ec51e52da759a0ddf27b57a8592327576;hb=HEAD;hp=543be6d178fb2d72426db6ba55db601c38830720;hpb=0c3d1d55160d5ce911ead69de84b1d8200a0036f;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_gen.c b/world_gen.c index 543be6d..04d6131 100644 --- a/world_gen.c +++ b/world_gen.c @@ -4,15 +4,12 @@ * World generation/population. Different to regular loading, since it needs to * create geometry, apply procedural stuff and save that image to files etc. */ - -#ifndef WORLD_GEN_C -#define WORLD_GEN_C - #include "world.h" #include "world_gen.h" #include "world_load.h" #include "world_volumes.h" #include "world_gate.h" +#include /* * Add all triangles from the model, which match the material ID @@ -46,7 +43,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 +54,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] ); @@ -109,7 +106,8 @@ static void world_apply_procedural_foliage( world_instance *world, scene_context *scene, struct world_surface *mat ) { - if( vg.quality_profile == k_quality_profile_low ) + if( (vg.quality_profile == k_quality_profile_low) || + (vg.quality_profile == k_quality_profile_min) ) return; vg_info( "Applying foliage (%u)\n", mat->info.pstr_name ); @@ -123,9 +121,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 @@ -164,7 +207,8 @@ void world_unpack_submesh_dynamic( world_instance *world, /* * Create the main meshes for the world */ -static void world_gen_generate_meshes( world_instance *world ){ +void world_gen_generate_meshes( world_instance *world ) +{ /* * Compile meshes into the world scenes */ @@ -221,19 +265,8 @@ static void world_gen_generate_meshes( world_instance *world ){ /* need send off the memory to the gpu before we can create the bvh. */ vg_async_stall(); vg_info( "creating bvh\n" ); - - /* setup spacial mapping and rigidbody */ world->geo_bh = scene_bh_create( world->heap, &world->scene_geo ); - v3_zero( world->rb_geo.rb.co ); - v3_zero( world->rb_geo.rb.v ); - q_identity( world->rb_geo.rb.q ); - v3_zero( world->rb_geo.rb.w ); - - world->rb_geo.type = k_rb_shape_scene; - world->rb_geo.inf.scene.bh_scene = world->geo_bh; - rb_init_object( &world->rb_geo ); - /* * Generate scene: non-collidable geometry * ---------------------------------------------------------------- @@ -364,7 +397,8 @@ static void async_upload_light_indices( void *payload, u32 size ){ /* * Computes light indices for world */ -static void world_gen_compute_light_indices( world_instance *world ){ +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 ); @@ -524,7 +558,8 @@ static void world_gen_compute_light_indices( world_instance *world ){ /* * Rendering pass needed to complete the world */ -static void async_world_postprocess( void *payload, u32 _size ){ +void async_world_postprocess( void *payload, u32 _size ) +{ /* create scene lighting buffer */ world_instance *world = payload; @@ -590,7 +625,7 @@ static void async_world_postprocess( void *payload, u32 _size ){ /* * Rendering the depth map */ - camera ortho; + vg_camera ortho; v3f extent; v3_sub( world->scene_geo.bbx[1], world->scene_geo.bbx[0], extent ); @@ -609,8 +644,8 @@ static void async_world_postprocess( void *payload, u32 _size ){ ortho.mtx.p[3][1] = (ft + fb) * -tb; ortho.mtx.p[3][3] = 1.0f; m4x3_identity( ortho.transform ); - camera_update_view( &ortho ); - camera_finalize( &ortho ); + vg_camera_update_view( &ortho ); + vg_camera_finalize( &ortho ); glDisable(GL_DEPTH_TEST); glDisable(GL_BLEND); @@ -678,7 +713,8 @@ static void async_world_postprocess( void *payload, u32 _size ){ } /* Loads textures from the pack file */ -static void world_gen_load_surfaces( world_instance *world ){ +void world_gen_load_surfaces( world_instance *world ) +{ vg_info( "Loading textures\n" ); world->texture_count = 0; @@ -687,10 +723,12 @@ static void world_gen_load_surfaces( world_instance *world ){ vg_align8(sizeof(GLuint)*world->texture_count) ); world->textures[0] = vg.tex_missing; - for( u32 i=0; imeta.textures); i++ ){ + for( u32 i=0; imeta.textures); i++ ) + { mdl_texture *tex = mdl_arritm( &world->meta.textures, i ); - if( !tex->file.pack_size ){ + if( !tex->file.pack_size ) + { vg_fatal_error( "World models must have packed textures!" ); } @@ -714,11 +752,25 @@ static void world_gen_load_surfaces( world_instance *world ){ struct world_surface *errmat = &world->surfaces[0]; memset( errmat, 0, sizeof(struct world_surface) ); - for( u32 i=0; imeta.materials); i++ ){ + for( u32 i=0; imeta.materials); i++ ) + { struct world_surface *surf = &world->surfaces[i+1]; surf->info = *(mdl_material *)mdl_arritm( &world->meta.materials, i ); surf->flags = 0; + + if( surf->info.shader == k_shader_water ) + { + struct shader_props_water *props = surf->info.props.compiled; + world->ub_lighting.g_water_fog = props->fog_scale; + } + + if( surf->info.shader == k_shader_standard_cutout || + surf->info.shader == k_shader_foliage ) + { + struct shader_props_standard *props = surf->info.props.compiled; + surf->alpha_tex = props->tex_diffuse; + } + else + surf->alpha_tex = 0; } } - -#endif /* WORLD_GEN_C */