1 #ifndef WORLD_PHYSICS_C
2 #define WORLD_PHYSICS_C
5 #include "world_physics.h"
7 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 static int ray_world( world_instance
*world
,
15 v3f pos
, v3f dir
, ray_hit
*hit
, u16 ignore
)
17 return scene_raycast( &world
->scene_geo
, world
->geo_bh
, pos
, dir
, hit
,
22 * Cast a sphere from a to b and see what time it hits
24 static int spherecast_world( world_instance
*world
,
25 v3f pa
, v3f pb
, float r
, float *t
, v3f n
,
29 box_init_inf( region
);
30 box_addpt( region
, pa
);
31 box_addpt( region
, pb
);
33 v3_add( (v3f
){ r
, r
, r
}, region
[1], region
[1] );
34 v3_add( (v3f
){-r
,-r
,-r
}, region
[0], region
[0] );
37 v3_sub( pb
, pa
, dir
);
40 dir_inv
[0] = 1.0f
/dir
[0];
41 dir_inv
[1] = 1.0f
/dir
[1];
42 dir_inv
[2] = 1.0f
/dir
[2];
48 bh_iter_init_box( 0, &it
, region
);
50 while( bh_next( world
->geo_bh
, &it
, &idx
) ){
51 u32
*ptri
= &world
->scene_geo
.arrindices
[ idx
*3 ];
52 if( world
->scene_geo
.arrvertices
[ptri
[0]].flags
& ignore
) continue;
57 for( int j
=0; j
<3; j
++ ){
58 v3_copy( world
->scene_geo
.arrvertices
[ptri
[j
]].co
, tri
[j
] );
59 box_addpt( box
, tri
[j
] );
62 v3_add( (v3f
){ r
, r
, r
}, box
[1], box
[1] );
63 v3_add( (v3f
){-r
,-r
,-r
}, box
[0], box
[0] );
65 if( !ray_aabb1( box
, pa
, dir_inv
, 1.0f
) )
70 if( spherecast_triangle( tri
, pa
, dir
, r
, &t
, n1
) ){
84 struct world_surface
*world_tri_index_surface( world_instance
*world
,
87 for( int i
=1; i
<world
->surface_count
; i
++ ){
88 struct world_surface
*surf
= &world
->surfaces
[i
];
90 if( (index
>= surf
->sm_geo
.vertex_start
) &&
91 (index
< surf
->sm_geo
.vertex_start
+surf
->sm_geo
.vertex_count
) )
97 return &world
->surfaces
[0];
100 static struct world_surface
*world_contact_surface( world_instance
*world
,
103 return world_tri_index_surface( world
, ct
->element_id
);
106 static struct world_surface
*ray_hit_surface( world_instance
*world
,
109 return world_tri_index_surface( world
, hit
->tri
[0] );
112 #endif /* WORLD_PHYSICS_C */