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 );
&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 */
}
/* unpack challenge models */
- for( u32 i=0; i<mdl_arrcount( &world->ent_challenge ); i++ ){
- ent_challenge *challenge = mdl_arritm( &world->ent_challenge, i );
+ for( u32 i=0; i<mdl_arrcount( &world->ent_objective ); i++ ){
+ ent_objective *objective = mdl_arritm( &world->ent_objective, i );
- for( u32 j=0; j<challenge->submesh_count; j ++ ){
+ for( u32 j=0; j<objective->submesh_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 );
}
}
/*
* Rendering pass needed to complete the world
*/
-VG_STATIC void async_world_postprocess_render( void *payload, u32 _size ){
+VG_STATIC void async_world_postprocess( void *payload, u32 _size ){
/* create scene lighting buffer */
world_instance *world = payload;
glBufferSubData( GL_UNIFORM_BUFFER, 0,
sizeof(struct ub_world_lighting), &world->ub_lighting );
- /* yes we are using this as the entity begin thing. FIXME */
- world->probabilities[ k_probability_curve_constant ] = 1.0f;
- for( u32 i=0; i<mdl_arrcount(&world->ent_audio); i++ ){
- ent_audio *audio = mdl_arritm(&world->ent_audio,i);
- if( audio->flags & AUDIO_FLAG_AUTO_START ){
- ent_call call;
- call.data = NULL;
- call.function = k_ent_function_trigger;
- call.id = mdl_entity_id( k_ent_audio, i );
- entity_call( world, &call );
+ /*
+ * Allocate cubemaps
+ */
+ for( u32 i=0; i<mdl_arrcount(&world->ent_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;
}
/* Loads textures from the pack file */