X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_routes.h;h=b0151b4eecda1f288f0853b8219e437fea71de13;hb=63b5ac44f74599b21c4b9b18398c29b797337bea;hp=bb344ed4383db7416dfcfdde84660ba821e1f6a0;hpb=38e07d851915d4ea3d25eeb28a3ace78fb0d1c12;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/world_routes.h b/world_routes.h index bb344ed..b0151b4 100644 --- a/world_routes.h +++ b/world_routes.h @@ -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; + } } } }