loader stuff
[carveJwlIkooP6JGAAIwe30JlM.git] / world_routes.h
index bb344ed4383db7416dfcfdde84660ba821e1f6a0..b0151b4eecda1f288f0853b8219e437fea71de13 100644 (file)
@@ -649,13 +649,14 @@ VG_STATIC f64 world_routes_scatter_surface_points( world_instance *world,
 VG_STATIC void world_routes_surface_grid( world_instance *world,
                                           pointcloud_buffer *pcbuf )
 {
-   i32 const k_gridlines = 63,
+   i32 const k_gridlines = 32,
              k_gridres   = 255;
 
    v3f inv_ext;
    v3_sub( pcbuf->boundary[1], pcbuf->boundary[0], inv_ext );
    v3_div( (v3f){1.0f,1.0f,1.0f}, inv_ext, inv_ext );
    v4f colour = {0.2f,0.2f,0.2f,1.0f};
+   v3f dir = {0.0f,-1.0f,0.0f};
 
    for( u32 k=0; k<2; k++ ){
       u32 a = k*2,
@@ -669,35 +670,51 @@ VG_STATIC void world_routes_surface_grid( world_instance *world,
             f32 tz = (float)z / (float)k_gridres,
                 pz = vg_lerpf(pcbuf->boundary[0][b],pcbuf->boundary[1][b], tz);
 
-            v3f ro;
+            v3f ro, hit;
             ro[a] = px;
             ro[1] = 1000.0f;
             ro[b] = pz;
 
-            ray_hit hit;
-            hit.dist = INFINITY;
+            bh_iter it;
+            bh_iter_init_ray( 0, &it, ro, dir, INFINITY );
+            i32 idx;
 
-            if( ray_world( world, ro, (v3f){0.0f,-1.0f,0.0f}, &hit )){
-               struct world_surface *m1 = ray_hit_surface( world, &hit );
+            while( bh_next( world->geo_bh, &it, &idx ) ){
+               u32 *tri = &world->scene_geo.arrindices[ idx*3 ];
+               v3f vs[3];
 
-               if( world->water.enabled )
-                  if( hit.pos[1] < world->water.height )
+               for( u32 i=0; i<3; i++ ){
+                  v3_copy( world->scene_geo.arrvertices[tri[i]].co, vs[i] );
+               }
+               
+               f32 t;
+               if( ray_tri( vs, ro, dir, &t ) ){
+                  v3_muladds( ro, dir, t, hit );
+                  struct world_surface *m1 = 
+                     world_tri_index_surface( world, tri[0] );
+
+                  if( !(m1->info.flags & k_material_flag_preview_visibile) )
                      continue;
 
-               if( pcbuf->count >= pcbuf->max ) return;
+                  if( world->water.enabled )
+                     if( hit[1] < world->water.height )
+                        continue;
 
-               pointcloud_vert *vert = &pcbuf->buf[ pcbuf->count ++ ];
+                  if( pcbuf->count >= pcbuf->max ) return;
 
-               v3f co;
-               v3_sub( hit.pos, pcbuf->boundary[0], co );
-               v3_mul( co, inv_ext, co );
+                  pointcloud_vert *vert = &pcbuf->buf[ pcbuf->count ++ ];
 
-               for( u32 i=0; i<3; i++ ){
-                  vert->pos[i] = (co[i]-0.5f) * 32767.0f;
-               }
+                  v3f co;
+                  v3_sub( hit, pcbuf->boundary[0], co );
+                  v3_mul( co, inv_ext, co );
+
+                  for( u32 i=0; i<3; i++ ){
+                     vert->pos[i] = (co[i]-0.5f) * 32767.0f;
+                  }
 
-               for( u32 i=0; i<4; i++ ){
-                  vert->colour[i] = colour[i] * 255.0f;
+                  for( u32 i=0; i<4; i++ ){
+                     vert->colour[i] = colour[i] * 255.0f;
+                  }
                }
             }
          }