+ return total_area;
+}
+
+VG_STATIC void world_routes_surface_grid( world_instance *world,
+ pointcloud_buffer *pcbuf )
+{
+ 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,
+ b = (k^0x1)*2;
+
+ for( i32 x=0; x<=k_gridlines; x++ ){
+ f32 t = (float)x / (float)k_gridlines,
+ px = vg_lerpf( pcbuf->boundary[0][a], pcbuf->boundary[1][a], t );
+
+ for( i32 z=0; z<=k_gridres; z++ ){
+ f32 tz = (float)z / (float)k_gridres,
+ pz = vg_lerpf(pcbuf->boundary[0][b],pcbuf->boundary[1][b], tz);
+
+ v3f ro, hit;
+ ro[a] = px;
+ ro[1] = 1000.0f;
+ ro[b] = pz;
+
+ bh_iter it;
+ bh_iter_init_ray( 0, &it, ro, dir, INFINITY );
+ i32 idx;
+
+ while( bh_next( world->geo_bh, &it, &idx ) ){
+ u32 *tri = &world->scene_geo.arrindices[ idx*3 ];
+ v3f vs[3];
+
+ 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( world->water.enabled )
+ if( hit[1] < world->water.height )
+ continue;
+
+ if( pcbuf->count >= pcbuf->max ) return;
+
+ pointcloud_vert *vert = &pcbuf->buf[ pcbuf->count ++ ];
+
+ 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;
+ }
+ }
+ }
+ }
+ }
+ }