change shader properties to be vg_msg based
[carveJwlIkooP6JGAAIwe30JlM.git] / world_gen.c
index b86c5cf0dda46157f2aec2d2302ac860289c9098..3d88ecd72f87312d9f6e2ef389005c73b444675f 100644 (file)
@@ -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 <string.h>
 
 /*
  * Add all triangles from the model, which match the material ID
@@ -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 );
@@ -209,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
     */
@@ -266,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, 0.0f );
-
    /*
     * Generate scene: non-collidable geometry
     * ----------------------------------------------------------------
@@ -409,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 );
@@ -569,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;
 
@@ -635,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 );
@@ -654,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);
@@ -723,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;
 
@@ -732,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; i<mdl_arrcount(&world->meta.textures); i++ ){
+   for( u32 i=0; i<mdl_arrcount(&world->meta.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!" );
       }
 
@@ -759,11 +752,19 @@ 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; i<mdl_arrcount(&world->meta.materials); i++ ){
+   for( u32 i=0; i<mdl_arrcount(&world->meta.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_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 */