surface_collision.h (1521B)
1 #ifndef SURFACE_COLLISION_H 2 #define SURFACE_COLLISION_H 3 4 #include <PR/ultratypes.h> 5 6 #include "types.h" 7 8 // Range level area is 16384x16384 (-8192 to +8192 in x and z) 9 #define LEVEL_BOUNDARY_MAX 0x2000 // 8192 10 11 #define CELL_SIZE (1 << 10) // 0x400 12 13 #define CELL_HEIGHT_LIMIT 20000 14 #define FLOOR_LOWER_LIMIT -11000 15 #define FLOOR_LOWER_LIMIT_MISC (FLOOR_LOWER_LIMIT + 1000) 16 // same as FLOOR_LOWER_LIMIT_MISC, explicitly for shadow.c 17 // It doesn't match if ".0" is removed or ".f" is added 18 #define FLOOR_LOWER_LIMIT_SHADOW (FLOOR_LOWER_LIMIT + 1000.0) 19 20 struct WallCollisionData { 21 /*0x00*/ f32 x, y, z; 22 /*0x0C*/ f32 offsetY; 23 /*0x10*/ f32 radius; 24 /*0x14*/ u8 filler[2]; 25 /*0x16*/ s16 numWalls; 26 /*0x18*/ struct Surface *walls[4]; 27 }; 28 29 struct FloorGeometry { 30 u8 filler[16]; // possibly position data? 31 f32 normalX; 32 f32 normalY; 33 f32 normalZ; 34 f32 originOffset; 35 }; 36 37 s32 f32_find_wall_collision(f32 *xPtr, f32 *yPtr, f32 *zPtr, f32 offsetY, f32 radius); 38 s32 find_wall_collisions(struct WallCollisionData *colData); 39 f32 find_ceil(f32 posX, f32 posY, f32 posZ, struct Surface **pceil); 40 f32 find_floor_height_and_data(f32 xPos, f32 yPos, f32 zPos, struct FloorGeometry **floorGeo); 41 f32 find_floor_height(f32 x, f32 y, f32 z); 42 f32 find_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfloor); 43 f32 find_water_level(f32 x, f32 z); 44 f32 find_poison_gas_level(f32 x, f32 z); 45 void debug_surface_list_info(f32 xPos, f32 zPos); 46 47 #endif // SURFACE_COLLISION_H