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,
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;
+ }
}
}
}