X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_gen.h;h=89fea39c9f5068227257a806da896f1aad23db4a;hb=3e8fda9c7cbc50d1ae95195905c953bdeedf71b9;hp=96928b60bd166b05fb58c52810b43f6f83b4a130;hpb=777083e1f715a26d3f68be4ba5bdf2cbcaa84a05;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_gen.h b/world_gen.h index 96928b6..89fea39 100644 --- a/world_gen.h +++ b/world_gen.h @@ -27,18 +27,76 @@ VG_STATIC void world_add_all_if_material( m4x3f transform, scene *pscene, mdl_node_transform( pnode, transform2 ); m4x3_mul( transform, transform2, transform2 ); - scene_add_submesh( pscene, mdl, sm, transform2 ); + scene_add_mdl_submesh( pscene, mdl, sm, transform2 ); } } } } +VG_STATIC void world_add_blob( scene *pscene, ray_hit *hit ) +{ + m4x3f transform; + v4f qsurface, qrandom; + v3f axis; + + v3_cross( (v3f){0.0f,1.0f,0.0f}, hit->normal, axis ); + + 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_randf()*VG_TAUf ); + q_mul( qsurface, qrandom, qsurface ); + q_m3x3( qsurface, transform ); + v3_copy( hit->pos, transform[3] ); + + scene_vert verts[] = + { + { .co = { -1.00f, 0.0f, 0.0f } }, + { .co = { 1.00f, 0.0f, 0.0f } }, + { .co = { -1.00f, 1.2f, 0.0f } }, + { .co = { 1.00f, 1.2f, 0.0f } }, + { .co = { -0.25f, 2.0f, 0.0f } }, + { .co = { 0.25f, 2.0f, 0.0f } } + }; + + const u32 indices[] = { 0,1,3, 0,3,2, 2,3,5, 2,5,4 }; + + if( pscene->vertex_count + vg_list_size(verts) > pscene->max_vertices ) + vg_fatal_exit_loop( "Scene vertex buffer overflow" ); + + if( pscene->indice_count + vg_list_size(indices) > pscene->max_indices ) + vg_fatal_exit_loop( "Scene index buffer overflow" ); + + scene_vert *dst_verts = &pscene->arrvertices[ pscene->vertex_count ]; + u32 *dst_indices = &pscene->arrindices [ pscene->indice_count ]; + + scene_vert *ref = &world.scene_geo->arrvertices[ hit->tri[0] ]; + + for( u32 i=0; ico, pvert->co ); + scene_vert_pack_norm( pvert, transform[1] ); + + v2_copy( ref->uv, pvert->uv ); + } + + for( u32 i=0; ivertex_count; + + pscene->vertex_count += vg_list_size(verts); + pscene->indice_count += vg_list_size(indices); +} + /* Sprinkle foliage models over the map on terrain material */ VG_STATIC void world_apply_procedural_foliage( struct world_material *mat ) { if( vg.quality_profile == k_quality_profile_low ) return; + vg_info( "Applying foliage (%u)\n", mat->info.pstr_name ); + vg_linear_clear( vg_mem.scratch ); mdl_context *mfoliage = @@ -48,11 +106,17 @@ VG_STATIC void world_apply_procedural_foliage( struct world_material *mat ) v3_sub( world.scene_geo->bbx[1], world.scene_geo->bbx[0], volume ); volume[1] = 1.0f; - m4x3f transform; mdl_node *mblob = mdl_node_from_name( mfoliage, "blob" ); mdl_submesh *sm_blob = mdl_node_submesh( mfoliage, mblob, 0 ); - for( int i=0;i<100000;i++ ) + int count = 0; + + float area = volume[0]*volume[2]; + u32 particles = 0.08f * area; + + vg_info( "Map area: %f. Max particles: %u\n", area, particles ); + + for( int i=0;i 0.8f) && (m1 == mat) && (hit.pos[1] > 0.0f+10.0f)) { - v4f qsurface, qrandom; - v3f axis; - - v3_cross( (v3f){0.0f,1.0f,0.0f}, hit.normal, axis ); - - 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_randf()*VG_TAUf ); - q_mul( qsurface, qrandom, qsurface ); - q_m3x3( qsurface, transform ); - - v3_copy( hit.pos, transform[3] ); - scene_add_submesh( world.scene_no_collide, mfoliage, - sm_blob, transform); + world_add_blob( world.scene_no_collide, &hit ); + count ++; } } } + + vg_info( "%d foliage models added\n", count ); } VG_STATIC void world_ents_allocate(void) @@ -306,102 +360,6 @@ VG_STATIC void world_entities_process(void) } } -VG_STATIC void edge_bh_expand_bound( void *user, boxf bound, u32 item_index ) -{ - struct grind_edge *edge_array = user, - *edge = &edge_array[ item_index ]; - - box_addpt( bound, edge->p0 ); - box_addpt( bound, edge->p1 ); -} - -VG_STATIC float edge_bh_centroid( void *user, u32 item_index, int axis ) -{ - struct grind_edge *edge_array = user, - *edge = &edge_array[ item_index ]; - - return (edge->p0[axis] + edge->p1[axis]) * 0.5f; -} - -VG_STATIC void edge_bh_swap( void *user, u32 ia, u32 ib ) -{ - struct grind_edge *edge_array = user, - *e0 = &edge_array[ ia ], - *e1 = &edge_array[ ib ], - et; - et = *e0; - *e0 = *e1; - *e1 = et; -} - -VG_STATIC void edge_bh_closest( void *user, u32 index, v3f point, v3f closest ) -{ - struct grind_edge *edge_array = user, - *edge = &edge_array[ index ]; - - closest_point_segment( edge->p0, edge->p1, point, closest ); -} - -VG_STATIC bh_system bh_system_edges = -{ - .expand_bound = edge_bh_expand_bound, - .item_centroid = edge_bh_centroid, - .item_closest = edge_bh_closest, - .item_swap = edge_bh_swap, - .item_debug = NULL, - .cast_ray = NULL -}; - -VG_STATIC void world_generate_edges(void) -{ - vg_info( "Generating edge array\n" ); - world.grind_edges = vg_linear_alloc( world.dynamic_vgl, - 5000*sizeof(struct grind_edge ) ); - world.grind_edge_count = 0; - - u32 fs_count = 0; - for( u32 i=0; ivertex_count; i++ ) - if( world.scene_geo->arrvertices[i].weights[0] ) - fs_count ++; - - vg_info( "Grind verts: %u\n", fs_count ); - - for( u32 i=0; iindice_count/3; i++ ) - { - u32 *ptri = &world.scene_geo->arrindices[ i*3 ]; - - for( int j=0; j<3; j++ ) - { - u32 i0 = ptri[j], - i1 = ptri[(j+1)%3]; - - mdl_vert *v0 = &world.scene_geo->arrvertices[ i0 ], - *v1 = &world.scene_geo->arrvertices[ i1 ]; - - if( v0->weights[0] ) - { - if( world.grind_edge_count == 5000 ) - vg_fatal_exit_loop( "Edge capacity exceeded" ); - - struct grind_edge *ge = - &world.grind_edges[ world.grind_edge_count ++ ]; - - v3_copy( v0->co, ge->p0 ); - v3_copy( v1->co, ge->p1 ); - } - } - } - - vg_info( "Grind edge count: %u\n", world.grind_edge_count ); - - world.grind_edges = vg_linear_resize( world.dynamic_vgl, world.grind_edges, - world.grind_edge_count*sizeof(struct grind_edge) ); - - world.grind_bh = bh_create( world.dynamic_vgl, &bh_system_edges, - world.grind_edges, world.grind_edge_count, - 2 ); -} - VG_STATIC void world_generate(void) { /* @@ -461,13 +419,6 @@ VG_STATIC void world_generate(void) world.scene_no_collide = scene_init( world.dynamic_vgl, 200000, 500000 ); -#if 0 - vg_info( "Applying foliage\n" ); - srand(0); - world_apply_procedural_foliage(); - scene_copy_slice( world.scene_no_collide, &world.sm_foliage_main ); -#endif - for( int i=0; ibbx[1], world.scene_geo->bbx[0], extent ); @@ -537,33 +485,34 @@ VG_STATIC void world_post_process(void) rl = 1.0f / (fr-fl), tb = 1.0f / (ft-fb); - m4x4_zero( ortho ); - ortho[0][0] = 2.0f * rl; - ortho[2][1] = 2.0f * tb; - ortho[3][0] = (fr + fl) * -rl; - ortho[3][1] = (ft + fb) * -tb; - ortho[3][3] = 1.0f; - m4x3_identity( camera ); + m4x4_zero( ortho.mtx.p ); + ortho.mtx.p[0][0] = 2.0f * rl; + ortho.mtx.p[2][1] = 2.0f * tb; + ortho.mtx.p[3][0] = (fr + fl) * -rl; + 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 ); glDisable(GL_DEPTH_TEST); glDisable(GL_BLEND); glDisable(GL_CULL_FACE); - glBindFramebuffer( GL_FRAMEBUFFER, gpipeline.fb_depthmap ); - glViewport( 0, 0, 1024, 1024 ); - shader_fscolour_use(); - shader_fscolour_uColour( (v4f){-9999.0f,-9999.0f,-9999.0f,-9999.0f} ); + render_fb_bind( gpipeline.fb_heightmap ); + shader_blitcolour_use(); + shader_blitcolour_uColour( (v4f){-9999.0f,-9999.0f,-9999.0f,-9999.0f} ); render_fsquad(); /* todo: hmm?? */ glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); glBlendEquation(GL_MAX); - render_world_depth( ortho, camera ); + + render_world_depth( &ortho ); glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); glBindFramebuffer( GL_FRAMEBUFFER, 0 ); - /* * TODO: World settings entity */ @@ -587,11 +536,12 @@ VG_STATIC void world_post_process(void) vg_release_thread_sync(); +#if 0 /* * Setup scene collider */ - reset_player( 1, (const char *[]){"start"} ); +#endif } VG_STATIC void world_process_resources(void) @@ -655,6 +605,8 @@ VG_STATIC void world_process_resources(void) VG_STATIC void world_unload(void) { + vg_acquire_thread_sync(); + /* free meshes */ mesh_free( &world.mesh_route_lines ); mesh_free( &world.mesh_geo ); @@ -698,10 +650,7 @@ VG_STATIC void world_unload(void) world.scene_geo = NULL; world.scene_no_collide = NULL; world.scene_lines = NULL; - world.grind_edges = NULL; - world.grind_edge_count = 0; - world.grind_bh = NULL; world.geo_bh = NULL; world.trigger_bh = NULL; world.audio_bh = NULL; @@ -734,6 +683,8 @@ VG_STATIC void world_unload(void) world.collector_count = 0; world.water.enabled = 0; + + vg_release_thread_sync(); } VG_STATIC void world_load(void)