unlock rendering
[carveJwlIkooP6JGAAIwe30JlM.git] / world_gen.c
index 81ad00cbc3c3926e7f2e62ae3344876f15799255..b522cba80fca626acde99aebad4aa650b8075aa9 100644 (file)
@@ -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 */
@@ -494,7 +499,7 @@ VG_STATIC void world_gen_compute_light_indices( world_instance *world ){
 /*
  * 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;
 
@@ -604,18 +609,48 @@ VG_STATIC void async_world_postprocess_render( void *payload, u32 _size ){
    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 */