1 #ifndef WORLD_PHYSICS_C
2 #define WORLD_PHYSICS_C
5 #include "world_physics.h"
7 VG_STATIC
void ray_world_get_tri( world_instance
*world
,
8 ray_hit
*hit
, v3f tri
[3] )
10 for( int i
=0; i
<3; i
++ )
11 v3_copy( world
->scene_geo
.arrvertices
[ hit
->tri
[i
] ].co
, tri
[i
] );
14 VG_STATIC
int ray_world( world_instance
*world
,
15 v3f pos
, v3f dir
, ray_hit
*hit
)
17 return scene_raycast( &world
->scene_geo
, world
->geo_bh
, pos
, dir
, hit
);
21 * Cast a sphere from a to b and see what time it hits
23 VG_STATIC
int spherecast_world( world_instance
*world
,
24 v3f pa
, v3f pb
, float r
, float *t
, v3f n
)
27 box_init_inf( region
);
28 box_addpt( region
, pa
);
29 box_addpt( region
, pb
);
31 v3_add( (v3f
){ r
, r
, r
}, region
[1], region
[1] );
32 v3_add( (v3f
){-r
,-r
,-r
}, region
[0], region
[0] );
35 v3_sub( pb
, pa
, dir
);
38 dir_inv
[0] = 1.0f
/dir
[0];
39 dir_inv
[1] = 1.0f
/dir
[1];
40 dir_inv
[2] = 1.0f
/dir
[2];
46 bh_iter_init_box( 0, &it
, region
);
48 while( bh_next( world
->geo_bh
, &it
, &idx
) ){
49 u32
*ptri
= &world
->scene_geo
.arrindices
[ idx
*3 ];
55 for( int j
=0; j
<3; j
++ ){
56 v3_copy( world
->scene_geo
.arrvertices
[ptri
[j
]].co
, tri
[j
] );
57 box_addpt( box
, tri
[j
] );
60 v3_add( (v3f
){ r
, r
, r
}, box
[1], box
[1] );
61 v3_add( (v3f
){-r
,-r
,-r
}, box
[0], box
[0] );
63 if( !ray_aabb1( box
, pa
, dir_inv
, 1.0f
) )
68 if( spherecast_triangle( tri
, pa
, dir
, r
, &t
, n1
) ){
82 struct world_surface
*world_tri_index_surface( world_instance
*world
,
85 for( int i
=1; i
<world
->surface_count
; i
++ ){
86 struct world_surface
*surf
= &world
->surfaces
[i
];
88 if( (index
>= surf
->sm_geo
.vertex_start
) &&
89 (index
< surf
->sm_geo
.vertex_start
+surf
->sm_geo
.vertex_count
) )
95 return &world
->surfaces
[0];
98 VG_STATIC
struct world_surface
*world_contact_surface( world_instance
*world
,
101 return world_tri_index_surface( world
, ct
->element_id
);
104 VG_STATIC
struct world_surface
*ray_hit_surface( world_instance
*world
,
107 return world_tri_index_surface( world
, hit
->tri
[0] );
110 #endif /* WORLD_PHYSICS_C */