better water
[carveJwlIkooP6JGAAIwe30JlM.git] / world.h
diff --git a/world.h b/world.h
index 7272b802c78201b30cfdff58bb460f654046ab3c..af0507fafc0db0f33b0a4f33e6ba0a10d6b3f9f3 100644 (file)
--- a/world.h
+++ b/world.h
@@ -1,9 +1,10 @@
+#include "common.h"
+
+static int ray_world( v3f pos, v3f dir, ray_hit *hit );
+
 #ifndef WORLD_H
 #define WORLD_H
 
-#define VG_3D
-#include "vg/vg.h"
-
 #include "scene.h"
 #include "terrain.h"
 #include "render.h"
@@ -22,22 +23,16 @@ static struct gworld
 
    v3f tutorial;
 
-#if 0
-   rigidbody box;
-#endif
-
-   teleport_gate gates[16];
+   teleport_gate gates[64];
    u32 gate_count;
    
-   rigidbody temp_rbs[32];
+   rigidbody temp_rbs[128];
    u32 rb_count;
 
    bh_tree bhcubes;
 }
 world;
 
-
-
 static void render_world( m4x4f projection, m4x3f camera )
 {
    render_sky( camera );
@@ -53,6 +48,8 @@ static void render_world( m4x4f projection, m4x3f camera )
    scene_bind( &world.foliage );
    scene_draw( &world.foliage );
    glEnable(GL_CULL_FACE);
+
+   vg_line_boxf( world.geo.bbx, 0xff00ff00 );
 }
 
 static void ray_world_get_tri( ray_hit *hit, v3f tri[3] )
@@ -63,7 +60,7 @@ static void ray_world_get_tri( ray_hit *hit, v3f tri[3] )
 
 static int ray_world( v3f pos, v3f dir, ray_hit *hit )
 {
-   return bvh_raycast( &world.geo, pos, dir, hit );
+   return scene_raycast( &world.geo, pos, dir, hit );
 }
 
 static int ray_hit_is_ramp( ray_hit *hit )
@@ -71,7 +68,6 @@ static int ray_hit_is_ramp( ray_hit *hit )
    return hit->tri[0] < world.sm_road.vertex_count;
 }
 
-static bh_system bh_system_rigidbodies;
 static void world_load(void)
 {
    /* Setup scene */
@@ -96,6 +92,10 @@ static void world_load(void)
 
    scene_copy_slice( &world.geo, &world.sm_terrain );
 
+   vg_info( "BBX: %.3f %.3f %.3f -> %.3f %.3f %.3f\n",
+         world.geo.bbx[0][0], world.geo.bbx[0][1], world.geo.bbx[0][2],
+         world.geo.bbx[1][0], world.geo.bbx[1][1], world.geo.bbx[1][2] );
+
    /* 
     * TODO: Parametric marker import
     */
@@ -145,12 +145,14 @@ static void world_load(void)
          water_init();
          water_set_surface( &surf, sm->pivot[1] );
 
+         vg_info( "%.3f\n", sm->pivot[1] );
+
          break;
       }
    }
 
    scene_upload( &world.geo );
-   bvh_create( &world.geo );
+   scene_bh_create( &world.geo );
    
    water_compute_depth( world.geo.bbx );
 
@@ -201,6 +203,7 @@ static void world_load(void)
    {
       v3f pos;
       v3_mul( volume, (v3f){ vg_randf(), 1000.0f, vg_randf() }, pos );
+      pos[1] = 1000.0f;
       v3_add( pos, world.geo.bbx[0], pos );
       
       ray_hit hit;
@@ -209,7 +212,7 @@ static void world_load(void)
       if( ray_world( pos, (v3f){0.0f,-1.0f,0.0f}, &hit ))
       {
          if( hit.normal[1] > 0.8f && !ray_hit_is_ramp(&hit) &&
-             hit.pos[1] > wrender.height )
+             hit.pos[1] > water_height()+10.0f )
          {
             v4f qsurface, qrandom;
             v3f axis;
@@ -224,7 +227,7 @@ static void world_load(void)
 
             v3_copy( hit.pos, transform[3] );
             
-            if( vg_randf() < 0.00000006f )
+            if( vg_randf() < 0.0006f )
             {
                m3x3_identity( transform );
                scene_add_foliage( &world.foliage, mfoliage, sm_tree, transform);
@@ -238,8 +241,8 @@ static void world_load(void)
    free( mfoliage );
    scene_upload( &world.foliage );
    
-   world.bhcubes.user = world.temp_rbs;
-   bh_create( &world.bhcubes, &bh_system_rigidbodies, world.rb_count );
+   bh_create( &world.bhcubes, 
+         &bh_system_rigidbodies, world.temp_rbs, world.rb_count );
 }
 
 #endif /* WORLD_H */