1 #ifndef WORLD_PHYSICS_C
2 #define WORLD_PHYSICS_C
5 #include "world_physics.h"
7 void ray_world_get_tri( world_instance
*world
, ray_hit
*hit
, v3f tri
[3] )
9 for( int i
=0; i
<3; i
++ )
10 v3_copy( world
->scene_geo
.arrvertices
[ hit
->tri
[i
] ].co
, tri
[i
] );
13 int ray_world( world_instance
*world
,
14 v3f pos
, v3f dir
, ray_hit
*hit
, u16 ignore
)
16 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 int spherecast_world( world_instance
*world
,
24 v3f pa
, v3f pb
, float r
, float *t
, v3f n
, u16 ignore
)
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 ];
50 if( world
->scene_geo
.arrvertices
[ptri
[0]].flags
& ignore
) continue;
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
) ){
81 struct world_surface
*world_tri_index_surface( world_instance
*world
,
84 for( int i
=1; i
<world
->surface_count
; i
++ ){
85 struct world_surface
*surf
= &world
->surfaces
[i
];
87 if( (index
>= surf
->sm_geo
.vertex_start
) &&
88 (index
< surf
->sm_geo
.vertex_start
+surf
->sm_geo
.vertex_count
) )
94 return &world
->surfaces
[0];
97 struct world_surface
*world_contact_surface( world_instance
*world
, rb_ct
*ct
)
99 return world_tri_index_surface( world
, ct
->element_id
);
102 struct world_surface
*ray_hit_surface( world_instance
*world
, ray_hit
*hit
)
104 return world_tri_index_surface( world
, hit
->tri
[0] );
107 #endif /* WORLD_PHYSICS_C */