X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_gen.c;h=7c0f7560d74d205fb8127626bfd72d4e413d7519;hb=dbbdf411d1aaf70cb995c3371cfae37fd0b7dbcc;hp=b7aaf50995caef93d29660110007cd35696928f5;hpb=2329044d44a5aff035b01926f7901d9e89ad284e;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_gen.c b/world_gen.c index b7aaf50..7c0f756 100644 --- a/world_gen.c +++ b/world_gen.c @@ -136,7 +136,8 @@ VG_STATIC void world_apply_procedural_foliage( world_instance *world, ray_hit hit; hit.dist = INFINITY; - if( ray_world( world, pos, (v3f){0.0f,-1.0f,0.0f}, &hit )){ + if( ray_world( world, pos, (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( world, scene, &hit ); @@ -191,6 +192,10 @@ VG_STATIC void world_gen_generate_meshes( world_instance *world ){ &world->meta, i ); scene_copy_slice( &world->scene_geo, &surf->sm_geo ); + scene_set_vertex_flags( &world->scene_geo, + surf->sm_geo.vertex_start, + surf->sm_geo.vertex_count, + (u16)(surf->info.flags & 0xffff) ); } /* compress that bad boy */ @@ -272,12 +277,12 @@ VG_STATIC void world_gen_generate_meshes( world_instance *world ){ } /* unpack challenge models */ - for( u32 i=0; ient_challenge ); i++ ){ - ent_challenge *challenge = mdl_arritm( &world->ent_challenge, i ); + for( u32 i=0; ient_objective ); i++ ){ + ent_objective *objective = mdl_arritm( &world->ent_objective, i ); - for( u32 j=0; jsubmesh_count; j ++ ){ + for( u32 j=0; jsubmesh_count; j ++ ){ mdl_submesh *sm = mdl_arritm( &world->meta.submeshs, - challenge->submesh_start+j ); + objective->submesh_start+j ); world_unpack_submesh_dynamic( world, &world->scene_no_collide, sm ); } } @@ -430,12 +435,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 ); @@ -604,6 +611,47 @@ VG_STATIC void async_world_postprocess( void *payload, u32 _size ){ glBufferSubData( GL_UNIFORM_BUFFER, 0, sizeof(struct ub_world_lighting), &world->ub_lighting ); + /* + * Allocate cubemaps + */ + for( u32 i=0; ient_cubemap); i++ ){ + ent_cubemap *cm = mdl_arritm(&world->ent_cubemap,i); + + glGenTextures( 1, &cm->texture_id ); + glBindTexture( GL_TEXTURE_CUBE_MAP, cm->texture_id ); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + + for( u32 j=0; j<6; j ++ ) { + glTexImage2D( GL_TEXTURE_CUBE_MAP_POSITIVE_X + j, 0, GL_RGB, + WORLD_CUBEMAP_RES, WORLD_CUBEMAP_RES, + 0, GL_RGB, GL_UNSIGNED_BYTE, NULL ); + } + + glGenFramebuffers( 1, &cm->framebuffer_id ); + glBindFramebuffer( GL_FRAMEBUFFER, cm->framebuffer_id ); + glGenRenderbuffers(1, &cm->renderbuffer_id ); + glBindRenderbuffer( GL_RENDERBUFFER, cm->renderbuffer_id ); + glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, + WORLD_CUBEMAP_RES, WORLD_CUBEMAP_RES ); + + glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_CUBE_MAP_POSITIVE_X, cm->texture_id, 0 ); + glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, + GL_RENDERBUFFER, cm->renderbuffer_id ); + + glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_CUBE_MAP_POSITIVE_X, cm->texture_id, 0 ); + + if( glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE ){ + vg_error( "Cubemap framebuffer incomplete.\n" ); + } + } + + glBindFramebuffer( GL_FRAMEBUFFER, 0 ); world->status = k_world_status_loaded; }