mirror of
https://github.com/zeldaret/mm.git
synced 2024-12-04 19:16:38 +00:00
19da43859e
* Thanks Fig * cleanup * more docs * cleanup * oops * cleanup comment * add comment to SurfaceType_GetSceneExitIndex * fix bss
596 lines
29 KiB
C
596 lines
29 KiB
C
#ifndef Z64BGCHECK_H
|
|
#define Z64BGCHECK_H
|
|
|
|
struct PlayState;
|
|
struct Actor;
|
|
struct DynaPolyActor;
|
|
|
|
#define SS_NULL 0xFFFF
|
|
|
|
#define COLPOLY_NORMAL_FRAC (1.0f / SHT_MAX)
|
|
#define COLPOLY_SNORMAL(x) ((s16)((x) * SHT_MAX))
|
|
#define COLPOLY_GET_NORMAL(n) ((n)*COLPOLY_NORMAL_FRAC)
|
|
#define COLPOLY_VIA_FLAG_TEST(vIA, flags) ((vIA) & (((flags)&7) << 13))
|
|
#define COLPOLY_VTX_INDEX(vI) ((vI)&0x1FFF)
|
|
|
|
#define DYNAPOLY_INVALIDATE_LOOKUP (1 << 0)
|
|
|
|
#define BGACTOR_NEG_ONE -1
|
|
#define BG_ACTOR_MAX 50
|
|
#define DYNA_WATERBOX_MAX 30
|
|
#define BGCHECK_SCENE BG_ACTOR_MAX
|
|
#define BGCHECK_Y_MAX 32000.0f
|
|
#define BGCHECK_Y_MIN -32000.0f
|
|
#define BGCHECK_XYZ_ABSMAX 32760.0f
|
|
#define BGCHECK_SUBDIV_OVERLAP 50
|
|
#define BGCHECK_SUBDIV_MIN 150.0f
|
|
|
|
#define WATERBOX_ROOM(p) ((((s32)p) >> 13) & 0x3F)
|
|
|
|
// bccFlags (bgcheck check flags)
|
|
#define BGCHECK_CHECK_WALL (1 << 0)
|
|
#define BGCHECK_CHECK_FLOOR (1 << 1)
|
|
#define BGCHECK_CHECK_CEILING (1 << 2)
|
|
#define BGCHECK_CHECK_ONE_FACE (1 << 3)
|
|
#define BGCHECK_CHECK_DYNA (1 << 4)
|
|
#define BGCHECK_CHECK_ALL \
|
|
(BGCHECK_CHECK_WALL | BGCHECK_CHECK_FLOOR | BGCHECK_CHECK_CEILING | BGCHECK_CHECK_ONE_FACE | BGCHECK_CHECK_DYNA)
|
|
|
|
// bciFlags (bgcheck ignore flags)
|
|
#define BGCHECK_IGNORE_NONE 0
|
|
#define BGCHECK_IGNORE_CEILING (1 << 0)
|
|
#define BGCHECK_IGNORE_WALL (1 << 1)
|
|
#define BGCHECK_IGNORE_FLOOR (1 << 2)
|
|
|
|
// xpFlags (poly exclusion flags)
|
|
#define COLPOLY_IGNORE_NONE 0
|
|
#define COLPOLY_IGNORE_CAMERA (1 << 0)
|
|
#define COLPOLY_IGNORE_ENTITY (1 << 1)
|
|
#define COLPOLY_IGNORE_PROJECTILES (1 << 2)
|
|
|
|
// CollisionContext flags
|
|
#define BGCHECK_FLAG_REVERSE_CONVEYOR_FLOW 1
|
|
|
|
typedef struct {
|
|
/* 0x0 */ Vec3s pos;
|
|
} BgVertex; // size = 0x6
|
|
|
|
typedef struct {
|
|
/* 0x00 */ Vec3f scale;
|
|
/* 0x0C */ Vec3s rot;
|
|
/* 0x14 */ Vec3f pos;
|
|
} ScaleRotPos; // size = 0x20
|
|
|
|
typedef struct CollisionPoly {
|
|
/* 0x0 */ u16 type;
|
|
union {
|
|
/* 0x2 */ u16 vtxData[3];
|
|
struct {
|
|
/* 0x2 */ u16 flags_vIA; // 0xE000 is poly exclusion flags (xpFlags), 0x1FFF is vtxId
|
|
/* 0x4 */ u16 flags_vIB; // 0xE000 is flags, 0x1FFF is vtxId
|
|
// 0x2000 = poly IsConveyor surface
|
|
/* 0x6 */ u16 vIC;
|
|
};
|
|
};
|
|
/* 0x8 */ Vec3s normal; // Unit normal vector
|
|
// Value ranges from -0x7FFF to 0x7FFF, representing -1.0 to 1.0; 0x8000 is invalid
|
|
|
|
/* 0xE */ s16 dist; // Plane distance from origin along the normal
|
|
} CollisionPoly; // size = 0x10
|
|
|
|
typedef struct {
|
|
/* 0x0 */ u16 setting; // camera setting described by CameraSettingType enum
|
|
/* 0x2 */ s16 count; // only used when `bgCamFuncData` is a list of points used for crawlspaces (unused oot legacy)
|
|
/* 0x4 */ Vec3s* bgCamFuncData; // s16 data grouped in threes (ex. Vec3s), is usually of type `BgCamFuncData`
|
|
} BgCamInfo; // size = 0x8
|
|
|
|
typedef BgCamInfo CamData; // TODO: ZAPD compatibility
|
|
|
|
// The structure used for all instances of s16 data from `BgCamInfo`.
|
|
typedef struct {
|
|
/* 0x00 */ Vec3s pos;
|
|
/* 0x06 */ Vec3s rot;
|
|
/* 0x0C */ s16 fov;
|
|
/* 0x0E */ union {
|
|
s16 roomImageOverrideBgCamIndex;
|
|
s16 unk_0E;
|
|
};
|
|
/* 0x10 */ s16 unk_10;
|
|
} BgCamFuncData; // size = 0x12
|
|
|
|
typedef struct {
|
|
/* 0x0 */ Vec3s minPos;
|
|
/* 0x6 */ s16 xLength;
|
|
/* 0x8 */ s16 zLength;
|
|
/* 0xC */ u32 properties;
|
|
// 0x0008_0000 = ?
|
|
// 0x0007_E000 = room index, 0x3F = all rooms
|
|
// 0x0000_1F00 = lighting setting index
|
|
// 0x0000_00FF = bgCam index
|
|
} WaterBox; // size = 0x10
|
|
|
|
typedef enum FloorType {
|
|
/* 0 */ FLOOR_TYPE_0,
|
|
/* 1 */ FLOOR_TYPE_1,
|
|
/* 2 */ FLOOR_TYPE_2,
|
|
/* 3 */ FLOOR_TYPE_3,
|
|
/* 4 */ FLOOR_TYPE_4,
|
|
/* 5 */ FLOOR_TYPE_5,
|
|
/* 6 */ FLOOR_TYPE_6,
|
|
/* 7 */ FLOOR_TYPE_7,
|
|
/* 8 */ FLOOR_TYPE_8,
|
|
/* 9 */ FLOOR_TYPE_9,
|
|
/* 10 */ FLOOR_TYPE_10,
|
|
/* 11 */ FLOOR_TYPE_11,
|
|
/* 12 */ FLOOR_TYPE_12,
|
|
/* 13 */ FLOOR_TYPE_13,
|
|
/* 14 */ FLOOR_TYPE_14,
|
|
/* 15 */ FLOOR_TYPE_15
|
|
} FloorType;
|
|
|
|
typedef enum WallType {
|
|
/* 0 */ WALL_TYPE_0,
|
|
/* 1 */ WALL_TYPE_1,
|
|
/* 2 */ WALL_TYPE_2,
|
|
/* 3 */ WALL_TYPE_3,
|
|
/* 4 */ WALL_TYPE_4,
|
|
/* 5 */ WALL_TYPE_5,
|
|
/* 6 */ WALL_TYPE_6,
|
|
/* 7 */ WALL_TYPE_7,
|
|
/* 8 */ WALL_TYPE_8,
|
|
/* 9 */ WALL_TYPE_9,
|
|
/* 10 */ WALL_TYPE_10,
|
|
/* 11 */ WALL_TYPE_11,
|
|
/* 12 */ WALL_TYPE_12,
|
|
/* 32 */ WALL_TYPE_MAX = 32
|
|
} WallType;
|
|
|
|
#define WALL_FLAG_0 (1 << 0)
|
|
#define WALL_FLAG_1 (1 << 1)
|
|
#define WALL_FLAG_2 (1 << 2)
|
|
#define WALL_FLAG_3 (1 << 3)
|
|
#define WALL_FLAG_4 (1 << 4)
|
|
#define WALL_FLAG_5 (1 << 5)
|
|
#define WALL_FLAG_6 (1 << 6)
|
|
|
|
// SurfaceType can leave footsteps imprints in the material
|
|
#define MATERIAL_PROPERTY_SOFT_IMPRINT (1 << 0)
|
|
|
|
typedef enum FloorProperty {
|
|
/* 0 */ FLOOR_PROPERTY_0,
|
|
/* 1 */ FLOOR_PROPERTY_1,
|
|
/* 2 */ FLOOR_PROPERTY_2,
|
|
/* 5 */ FLOOR_PROPERTY_5 = 5,
|
|
/* 6 */ FLOOR_PROPERTY_6,
|
|
/* 7 */ FLOOR_PROPERTY_7,
|
|
/* 8 */ FLOOR_PROPERTY_8,
|
|
/* 9 */ FLOOR_PROPERTY_9,
|
|
/* 11 */ FLOOR_PROPERTY_11 = 11,
|
|
/* 12 */ FLOOR_PROPERTY_12,
|
|
/* 13 */ FLOOR_PROPERTY_13
|
|
} FloorProperty;
|
|
|
|
typedef enum SurfaceSfxOffset {
|
|
/* 0 */ SURFACE_SFX_OFFSET_DIRT,
|
|
/* 1 */ SURFACE_SFX_OFFSET_SAND,
|
|
/* 2 */ SURFACE_SFX_OFFSET_STONE,
|
|
/* 3 */ SURFACE_SFX_OFFSET_DIRT_SHALLOW,
|
|
/* 4 */ SURFACE_SFX_OFFSET_WATER_SHALLOW,
|
|
/* 5 */ SURFACE_SFX_OFFSET_WATER_DEEP,
|
|
/* 6 */ SURFACE_SFX_OFFSET_TALL_GRASS,
|
|
/* 7 */ SURFACE_SFX_OFFSET_LAVA, // MAGMA?
|
|
/* 8 */ SURFACE_SFX_OFFSET_GRASS,
|
|
/* 9 */ SURFACE_SFX_OFFSET_CARPET,
|
|
/* 10 */ SURFACE_SFX_OFFSET_WOOD,
|
|
/* 11 */ SURFACE_SFX_OFFSET_BRIDGE, // WOOD_PLANK?
|
|
/* 12 */ SURFACE_SFX_OFFSET_VINE, // METAL?
|
|
/* 13 */ SURFACE_SFX_OFFSET_DIRT_DEEP,
|
|
/* 14 */ SURFACE_SFX_OFFSET_SNOW,
|
|
/* 15 */ SURFACE_SFX_OFFSET_ICE
|
|
} SurfaceSfxOffset;
|
|
|
|
typedef enum SurfaceMaterial {
|
|
/* 0 */ SURFACE_MATERIAL_DIRT,
|
|
/* 1 */ SURFACE_MATERIAL_SAND,
|
|
/* 2 */ SURFACE_MATERIAL_STONE,
|
|
/* 3 */ SURFACE_MATERIAL_DIRT_SHALLOW,
|
|
/* 4 */ SURFACE_MATERIAL_WATER_SHALLOW,
|
|
/* 5 */ SURFACE_MATERIAL_WATER_DEEP,
|
|
/* 6 */ SURFACE_MATERIAL_TALL_GRASS,
|
|
/* 7 */ SURFACE_MATERIAL_LAVA, // MAGMA?
|
|
/* 8 */ SURFACE_MATERIAL_GRASS,
|
|
/* 9 */ SURFACE_MATERIAL_BRIDGE, // WOOD_PLANK?
|
|
/* 10 */ SURFACE_MATERIAL_WOOD,
|
|
/* 11 */ SURFACE_MATERIAL_DIRT_SOFT,
|
|
/* 12 */ SURFACE_MATERIAL_ICE,
|
|
/* 13 */ SURFACE_MATERIAL_CARPET,
|
|
/* 14 */ SURFACE_MATERIAL_SNOW,
|
|
/* 15 */ SURFACE_MATERIAL_MAX
|
|
} SurfaceMaterial;
|
|
|
|
typedef enum FloorEffect {
|
|
/* 0 */ FLOOR_EFFECT_0,
|
|
/* 1 */ FLOOR_EFFECT_1,
|
|
/* 2 */ FLOOR_EFFECT_2,
|
|
/* 3 */ FLOOR_EFFECT_3
|
|
} FloorEffect;
|
|
|
|
typedef enum ConveyorSpeed {
|
|
/* 0 */ CONVEYOR_SPEED_DISABLED,
|
|
/* 1 */ CONVEYOR_SPEED_SLOW,
|
|
/* 2 */ CONVEYOR_SPEED_MEDIUM,
|
|
/* 3 */ CONVEYOR_SPEED_FAST,
|
|
/* 4 */ CONVEYOR_SPEED_MAX
|
|
} ConveyorSpeed;
|
|
|
|
#define CONVEYOR_DIRECTION_TO_BINANG(conveyorDirection) ((conveyorDirection) * (0x10000 / 64))
|
|
|
|
typedef struct {
|
|
/* 0x0 */ u32 data[2];
|
|
|
|
// Word 0
|
|
// 0x8000_0000 = horse blocked
|
|
// 0x4000_0000 = floor surface recessed by 1 unit
|
|
// 0x3C00_0000 = ? (floor property?)
|
|
// 0x03E0_0000 = ? (wall property?)
|
|
// 0x001C_0000 = ?
|
|
// 0x0003_E000 = ?
|
|
// 0x0000_1F00 = scene exit index
|
|
// 0x0000_00FF = bgCam index
|
|
// Word 1
|
|
// 0x0800_0000 = wall damage
|
|
// 0x07E0_0000 = conveyor direction
|
|
// 0x001C_0000 = conveyor speed
|
|
// 0x0002_0000 = is hookable surface
|
|
// 0x0001_F800 = echo/reverb
|
|
// 0x0000_07C0 = lighting setting index
|
|
// 0x0000_0030 = surface slope
|
|
// 0x0000_000F = type
|
|
|
|
} SurfaceType; // size = 0x8
|
|
|
|
typedef struct {
|
|
/* 0x00 */ Vec3s minBounds; // minimum coordinates of poly bounding box
|
|
/* 0x06 */ Vec3s maxBounds; // maximum coordinates of poly bounding box
|
|
/* 0x0C */ u16 numVertices;
|
|
/* 0x10 */ Vec3s* vtxList;
|
|
/* 0x14 */ u16 numPolygons;
|
|
/* 0x18 */ CollisionPoly* polyList;
|
|
/* 0x1C */ SurfaceType* surfaceTypeList;
|
|
/* 0x20 */ BgCamInfo* bgCamList;
|
|
/* 0x24 */ u16 numWaterBoxes;
|
|
/* 0x28 */ WaterBox* waterBoxes;
|
|
} CollisionHeader; // size = 0x2C
|
|
|
|
typedef struct {
|
|
/* 0x0 */ s16 polyId;
|
|
/* 0x2 */ u16 next; // index of the next SSNode in the list, or SS_NULL if last element
|
|
} SSNode; // size = 0x4
|
|
|
|
// represents a linked list of type SSNode
|
|
typedef struct {
|
|
/* 0x0 */ u16 head; // index of the first SSNode in the list, or SS_NULL if the list is empty
|
|
} SSList; // size = 0x2
|
|
|
|
typedef struct {
|
|
/* 0x0 */ u16 max;
|
|
/* 0x2 */ u16 count;
|
|
/* 0x4 */ SSNode* tbl;
|
|
/* 0x8 */ u8* polyCheckTbl;
|
|
} SSNodeList; // size = 0xC
|
|
|
|
typedef struct {
|
|
/* 0x0 */ SSNode* tbl;
|
|
/* 0x4 */ u32 count;
|
|
/* 0x8 */ s32 maxNodes;
|
|
} DynaSSNodeList; // size = 0xC
|
|
|
|
typedef struct {
|
|
/* 0x0 */ s32 unk0;
|
|
/* 0x4 */ WaterBox* boxes;
|
|
} DynaWaterBoxList; // size = 0x8
|
|
|
|
typedef struct {
|
|
/* 0x0 */ SSList floor;
|
|
/* 0x2 */ SSList wall;
|
|
/* 0x4 */ SSList ceiling;
|
|
} StaticLookup; // size = 0x6
|
|
|
|
typedef struct {
|
|
/* 0x0 */ s16 polyStartIndex;
|
|
/* 0x2 */ SSList ceiling;
|
|
/* 0x4 */ SSList wall;
|
|
/* 0x6 */ SSList floor;
|
|
} DynaLookup; // size = 0x8
|
|
|
|
typedef struct {
|
|
/* 0x00 */ Actor* actor;
|
|
/* 0x04 */ CollisionHeader* colHeader;
|
|
/* 0x08 */ DynaLookup dynaLookup;
|
|
/* 0x10 */ u16 vtxStartIndex;
|
|
/* 0x12 */ u16 waterboxesStartIndex;
|
|
/* 0x14 */ ScaleRotPos prevTransform;
|
|
/* 0x34 */ ScaleRotPos curTransform;
|
|
/* 0x54 */ Sphere16 boundingSphere;
|
|
/* 0x5C */ f32 minY;
|
|
/* 0x60 */ f32 maxY;
|
|
} BgActor; // size = 0x64
|
|
|
|
#define BGACTOR_IN_USE (1 << 0) // The bgActor entry is in use
|
|
#define BGACTOR_1 (1 << 1)
|
|
#define BGACTOR_COLLISION_DISABLED (1 << 2) // The collision of the bgActor is disabled
|
|
#define BGACTOR_CEILING_COLLISION_DISABLED (1 << 3) // The ceiling collision of the bgActor is ignored
|
|
#define BGACTOR_FLOOR_COLLISION_DISABLED (1 << 5) // The floor collision of the bgActor is ignored
|
|
|
|
typedef struct {
|
|
/* 0x0000 */ u8 bitFlag;
|
|
/* 0x0004 */ BgActor bgActors[BG_ACTOR_MAX];
|
|
/* 0x138C */ u16 bgActorFlags[BG_ACTOR_MAX];
|
|
/* 0x13F0 */ CollisionPoly* polyList;
|
|
/* 0x13F4 */ Vec3s* vtxList;
|
|
/* 0x13F8 */ DynaWaterBoxList waterBoxList;
|
|
/* 0x1400 */ DynaSSNodeList polyNodes;
|
|
/* 0x140C */ s32 polyNodesMax;
|
|
/* 0x1410 */ s32 polyListMax;
|
|
/* 0x1414 */ s32 vtxListMax;
|
|
} DynaCollisionContext; // size = 0x1418
|
|
|
|
typedef struct {
|
|
/* 0x0000 */ CollisionHeader* colHeader; // scene's static collision
|
|
/* 0x0004 */ Vec3f minBounds; // minimum coordinates of collision bounding box
|
|
/* 0x0010 */ Vec3f maxBounds; // maximum coordinates of collision bounding box
|
|
/* 0x001C */ Vec3i subdivAmount; // x, y, z subdivisions of the scene's static collision
|
|
/* 0x0028 */ Vec3f subdivLength; // x, y, z subdivision worldspace lengths
|
|
/* 0x0034 */ Vec3f subdivLengthInv; // inverse of subdivision length
|
|
/* 0x0040 */ StaticLookup* lookupTbl; // 3d array of length subdivAmount
|
|
/* 0x0044 */ SSNodeList polyNodes;
|
|
/* 0x0050 */ DynaCollisionContext dyna;
|
|
/* 0x1468 */ u32 memSize; // Size of all allocated memory plus CollisionContext
|
|
/* 0x146C */ u32 flags; // bit 0 reverses conveyor direction (i.e. water flow in Great Bay Temple)
|
|
} CollisionContext; // size = 0x1470
|
|
|
|
typedef struct {
|
|
/* 0x00 */ struct PlayState* play;
|
|
/* 0x04 */ CollisionContext* colCtx;
|
|
/* 0x08 */ u16 xpFlags;
|
|
/* 0x0C */ CollisionPoly** resultPoly;
|
|
/* 0x10 */ f32 yIntersect;
|
|
/* 0x14 */ Vec3f* pos;
|
|
/* 0x18 */ s32* bgId;
|
|
/* 0x1C */ s32 unk1C;
|
|
/* 0x20 */ struct Actor* actor;
|
|
/* 0x24 */ u32 unk_24;
|
|
/* 0x28 */ f32 checkDist;
|
|
/* 0x2C */ DynaCollisionContext* dyna;
|
|
/* 0x30 */ SSList* ssList;
|
|
} DynaRaycast; // size = 0x34
|
|
|
|
typedef struct
|
|
{
|
|
/* 0x00 */ StaticLookup* lookup;
|
|
/* 0x04 */ SSList* ssList;
|
|
/* 0x08 */ CollisionContext* colCtx;
|
|
/* 0x0C */ u16 xpFlags1;
|
|
/* 0x0E */ u16 xpFlags2;
|
|
/* 0x10 */ Vec3f* posA;
|
|
/* 0x14 */ Vec3f* posB;
|
|
/* 0x18 */ Vec3f* outPos;
|
|
/* 0x1C */ CollisionPoly** outPoly;
|
|
/* 0x20 */ f32 outDistSq;
|
|
/* 0x24 */ f32 checkDist;
|
|
/* 0x28 */ s32 bccFlags;
|
|
/* 0x2C */ Actor* actor;
|
|
} StaticLineTest; // size = 0x30
|
|
|
|
typedef struct {
|
|
/* 0x00 */ CollisionContext* colCtx;
|
|
/* 0x04 */ u16 xpFlags;
|
|
/* 0x08 */ DynaCollisionContext* dyna;
|
|
/* 0x0C */ SSList* ssList;
|
|
/* 0x10 */ Vec3f* posA;
|
|
/* 0x14 */ Vec3f* posB;
|
|
/* 0x18 */ Vec3f* posResult;
|
|
/* 0x1C */ CollisionPoly** resultPoly;
|
|
/* 0x20 */ s32 checkOneFace; // bccFlags & 0x8
|
|
/* 0x24 */ f32* distSq; // distance from posA to poly squared
|
|
/* 0x28 */ f32 checkDist; // distance from poly
|
|
/* 0x2C */ Actor* actor;
|
|
/* 0x30 */ s32 bgId;
|
|
} DynaLineTest; // size = 0x34
|
|
|
|
typedef struct {
|
|
/* 0x00 */ CollisionPoly* poly;
|
|
/* 0x04 */ Vec3s* vtxList;
|
|
/* 0x08 */ Vec3f* posA;
|
|
/* 0x0C */ Vec3f* posB;
|
|
/* 0x10 */ Vec3f* planeIntersect;
|
|
/* 0x14 */ s32 checkOneFace;
|
|
/* 0x18 */ f32 checkDist;
|
|
} BgLineVsPolyTest; // size = 0x1C
|
|
|
|
typedef struct {
|
|
/* 0x0 */ s16 sceneId;
|
|
/* 0x4 */ u32 memSize;
|
|
} BgSpecialSceneMaxMemory; // size = 0x8
|
|
|
|
typedef struct {
|
|
/* 0x0 */ s16 sceneId;
|
|
/* 0x2 */ s16 maxNodes;
|
|
/* 0x4 */ s16 maxPolygons;
|
|
/* 0x6 */ s16 maxVertices;
|
|
} BgSpecialSceneMaxObjects; // size = 0x8
|
|
|
|
typedef struct {
|
|
/* 0x0 */ s16 sceneId;
|
|
/* 0x2 */ s16 xSubdivisions;
|
|
/* 0x4 */ s16 ySubdivisions;
|
|
/* 0x6 */ s16 zSubdivisions;
|
|
/* 0x8 */ s32 unk8;
|
|
} BgSpecialSceneMeshSubdivision; // size = 0xC
|
|
|
|
typedef struct {
|
|
/* 0x0 */ s16 sceneId;
|
|
/* 0x2 */ Vec3s subdivAmount;
|
|
/* 0x8 */ s32 nodeListMax; // if -1, dynamically compute max nodes
|
|
} BgCheckSceneSubdivisionEntry; // size = 0xC
|
|
|
|
void SSNode_SetValue(SSNode* node, s16* polyIndex, u16 next);
|
|
void SSList_SetNull(SSList* ssList);
|
|
void SSNodeList_SetSSListHead(SSNodeList* list, SSList* ssList, s16* polyIndex);
|
|
void DynaSSNodeList_SetSSListHead(DynaSSNodeList* list, SSList* ssList, s16* polyIndex);
|
|
void DynaSSNodeList_Init(struct PlayState* play, DynaSSNodeList* list);
|
|
void DynaSSNodeList_Alloc(struct PlayState* play, DynaSSNodeList* list, u32 numNodes);
|
|
void DynaSSNodeList_ResetCount(DynaSSNodeList* list);
|
|
u16 DynaSSNodeList_GetNextNodeIdx(DynaSSNodeList* list);
|
|
void BgCheck_Vec3sToVec3f(Vec3s* src, Vec3f* dest);
|
|
void BgCheck_Vec3fToVec3s(Vec3s* dest, Vec3f* src);
|
|
f32 func_800BFD84(CollisionPoly *poly, f32 arg1, f32 arg2);
|
|
s32 func_800BFDEC(CollisionPoly* polyA, CollisionPoly* polyB, u32* outVtxId0, u32* outVtxId1);
|
|
s16 CollisionPoly_GetMinY(CollisionPoly* poly, Vec3s* vertices);
|
|
void CollisionPoly_GetNormalF(CollisionPoly* poly, f32* nx, f32* ny, f32* nz);
|
|
void func_800C0094(CollisionPoly* poly, f32 tx, f32 ty, f32 tz, MtxF* dest);
|
|
f32 CollisionPoly_GetPointDistanceFromPlane(CollisionPoly* poly, Vec3f* point);
|
|
void CollisionPoly_GetVerticesByBgId(CollisionPoly* poly, s32 bgId, CollisionContext* colCtx, Vec3f* dest);
|
|
s32 CollisionPoly_SphVsPoly(CollisionPoly* poly, Vec3s* vtxList, Vec3f* center, f32 radius);
|
|
void StaticLookup_AddPolyToSSList(CollisionContext* colCtx, SSList* ssList, CollisionPoly* polyList, Vec3s* vtxList, s16 polyId);
|
|
void StaticLookup_AddPoly(StaticLookup* lookup, CollisionContext* colCtx, CollisionPoly* polyList, Vec3s* vtxList, s16 index);
|
|
void BgCheck_GetSubdivisionMinBounds(CollisionContext* colCtx, Vec3f* pos, s32* sx, s32* sy, s32* sz);
|
|
void BgCheck_GetSubdivisionMaxBounds(CollisionContext* colCtx, Vec3f* pos, s32* sx, s32* sy, s32* sz);
|
|
void BgCheck_GetPolySubdivisionBounds(CollisionContext* colCtx, Vec3s* vtxList, CollisionPoly* polyList, s32* subdivMinX, s32* subdivMinY, s32* subdivMinZ, s32* subdivMaxX, s32* subdivMaxY, s32* subdivMaxZ, s16 polyId);
|
|
s32 BgCheck_PolyIntersectsSubdivision(Vec3f* min, Vec3f* max, CollisionPoly* polyList, Vec3s* vtxList, s16 polyId);
|
|
u32 BgCheck_InitStaticLookup(CollisionContext* colCtx, struct PlayState* play, StaticLookup* lookupTbl);
|
|
s32 BgCheck_IsSmallMemScene(struct PlayState* play);
|
|
s32 BgCheck_TryGetCustomMemsize(s32 sceneId, u32* memSize);
|
|
void BgCheck_SetSubdivisionDimension(f32 min, s32 subdivAmount, f32* max, f32* subdivLength, f32* subdivLengthInv);
|
|
s32 BgCheck_GetSpecialSceneMaxObjects(struct PlayState* play, s32* maxNodes, s32* maxPolygons, s32* maxVertices);
|
|
void BgCheck_Allocate(CollisionContext* colCtx, struct PlayState* play, CollisionHeader* colHeader);
|
|
void BgCheck_SetContextFlags(CollisionContext* colCtx, u32 flags);
|
|
void BgCheck_UnsetContextFlags(CollisionContext* colCtx, u32 flags);
|
|
CollisionHeader* BgCheck_GetCollisionHeader(CollisionContext* colCtx, s32 bgId);
|
|
f32 BgCheck_RaycastFloorImpl(struct PlayState* play, CollisionContext* colCtx, u16 xpFlags, CollisionPoly** outPoly, s32* outBgId, Vec3f* pos, Actor* actor, u32 arg7, f32 checkDist, s32 arg9);
|
|
f32 BgCheck_CameraRaycastFloor1(CollisionContext* colCtx, CollisionPoly** outPoly, Vec3f* pos);
|
|
f32 BgCheck_EntityRaycastFloor1(CollisionContext* colCtx, CollisionPoly** outPoly, Vec3f* pos);
|
|
f32 BgCheck_EntityRaycastFloor2(struct PlayState* play, CollisionContext* colCtx, CollisionPoly** outPoly, Vec3f* pos);
|
|
f32 BgCheck_EntityRaycastFloor2_1(struct PlayState* play, CollisionContext* colCtx, CollisionPoly** outPoly, Vec3f* pos);
|
|
f32 BgCheck_EntityRaycastFloor3(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos);
|
|
f32 BgCheck_EntityRaycastFloor5(CollisionContext* colCtx, CollisionPoly** outPoly, s32* outBgId, Actor* actor, Vec3f* pos);
|
|
f32 BgCheck_EntityRaycastFloor5_2(struct PlayState* play, CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos);
|
|
f32 BgCheck_EntityRaycastFloor5_3(struct PlayState* play, CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos);
|
|
f32 BgCheck_EntityRaycastFloor6(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos, f32 checkDist);
|
|
f32 BgCheck_EntityRaycastFloor7(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos);
|
|
f32 BgCheck_AnyRaycastFloor1(CollisionContext* colCtx, CollisionPoly* outPoly, Vec3f* pos);
|
|
f32 BgCheck_AnyRaycastFloor2(CollisionContext* colCtx, CollisionPoly* outPoly, s32* bgId, Vec3f* pos);
|
|
f32 BgCheck_CameraRaycastFloor2(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos);
|
|
f32 BgCheck_EntityRaycastFloor8(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos);
|
|
f32 BgCheck_EntityRaycastFloor9(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos);
|
|
s32 BgCheck_CheckWallImpl(CollisionContext* colCtx, u16 xpFlags, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, CollisionPoly** outPoly, s32* outBgId, Actor* actor, f32 checkHeight, u8 argA);
|
|
s32 BgCheck_EntitySphVsWall1(CollisionContext* colCtx, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, CollisionPoly** outPoly, f32 checkHeight);
|
|
s32 BgCheck_EntitySphVsWall2(CollisionContext* colCtx, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, CollisionPoly** outPoly, s32* outBgId, f32 checkHeight);
|
|
s32 BgCheck_EntitySphVsWall3(CollisionContext* colCtx, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, CollisionPoly** outPoly, s32* outBgId, Actor* actor, f32 checkHeight);
|
|
s32 BgCheck_EntitySphVsWall4(CollisionContext* colCtx, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, CollisionPoly** outPoly, s32* outBgId, Actor* actor, f32 checkHeight);
|
|
s32 BgCheck_CheckCeilingImpl(CollisionContext* colCtx, u16 xpFlags, f32* outY, Vec3f* pos, f32 checkHeight, CollisionPoly** outPoly, s32* outBgId, Actor* actor);
|
|
s32 BgCheck_AnyCheckCeiling(CollisionContext* colCtx, f32* outY, Vec3f* pos, f32 checkHeight);
|
|
s32 BgCheck_EntityCheckCeiling(CollisionContext* colCtx, f32* outY, Vec3f* pos, f32 checkHeight, CollisionPoly** outPoly, s32* outBgId, Actor* actor);
|
|
s32 BgCheck_CameraLineTest1(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId);
|
|
s32 BgCheck_CameraLineTest2(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId);
|
|
s32 BgCheck_EntityLineTest1(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId);
|
|
s32 BgCheck_EntityLineTest2(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId, Actor* actor);
|
|
s32 BgCheck_EntityLineTest3(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId, Actor* actor, f32 checkDist);
|
|
s32 BgCheck_ProjectileLineTest(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId);
|
|
s32 BgCheck_AnyLineTest1(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkOneFace);
|
|
s32 BgCheck_AnyLineTest2(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace);
|
|
s32 BgCheck_AnyLineTest3(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 checkWall, s32 checkFloor, s32 checkCeil, s32 checkOneFace, s32* bgId);
|
|
s32 BgCheck_SphVsFirstPolyImpl(CollisionContext* colCtx, u16 xpFlags, CollisionPoly** outPoly, s32* outBgId, Vec3f* center, f32 radius, Actor* actor, u16 bciFlags);
|
|
s32 BgCheck_SphVsFirstPoly(CollisionContext* colCtx, Vec3f* center, f32 radius);
|
|
s32 BgCheck_SphVsFirstWall(CollisionContext* colCtx, Vec3f* center, f32 radius);
|
|
void SSNodeList_Init(SSNodeList* this);
|
|
void SSNodeList_Alloc(struct PlayState* play, SSNodeList* this, s32 tblMax, s32 numPolys);
|
|
SSNode* SSNodeList_GetNextNode(SSNodeList* this);
|
|
u16 SSNodeList_GetNextNodeIdx(SSNodeList* this);
|
|
void ScaleRotPos_Init(ScaleRotPos* srp);
|
|
void ScaleRotPos_SetValue(ScaleRotPos* srp, Vec3f* scale, Vec3s* rot, Vec3f* pos);
|
|
s32 ScaleRotPos_IsEqual(ScaleRotPos* a, ScaleRotPos* b);
|
|
void DynaLookup_ResetLists(DynaLookup* dynaLookup);
|
|
void DynaLookup_Reset(DynaLookup* dynaLookup);
|
|
void DynaLookup_ResetVtxStartIndex(u16* vtxStartIndex);
|
|
void DynaLookup_ResetWaterBoxStartIndex(u16* waterBoxStartIndex);
|
|
void BgActor_Init(struct PlayState* play, BgActor* bgActor);
|
|
void BgActor_SetActor(BgActor* bgActor, Actor* actor, CollisionHeader* colHeader);
|
|
s32 BgActor_IsTransformUnchanged(BgActor* bgActor);
|
|
void DynaPoly_NullPolyList(CollisionPoly** polyList);
|
|
void DynaPoly_AllocPolyList(struct PlayState* play, CollisionPoly** polyList, s32 numPolys);
|
|
void DynaPoly_NullVtxList(Vec3s** vtxList);
|
|
void DynaPoly_AllocVtxList(struct PlayState* play, Vec3s** vtxList, s32 numVtx);
|
|
void DynaPoly_InitWaterBoxList(DynaWaterBoxList* waterBoxList);
|
|
void DynaPoly_AllocWaterBoxList(struct PlayState* play, DynaWaterBoxList* waterBoxList, s32 numWaterBoxes);
|
|
void DynaPoly_SetBgActorPrevTransform(struct PlayState* play, BgActor* bgActor);
|
|
s32 DynaPoly_IsBgIdBgActor(s32 bgId);
|
|
void DynaPoly_Init(struct PlayState* play, DynaCollisionContext* dyna);
|
|
void DynaPoly_Alloc(struct PlayState* play, DynaCollisionContext* dyna);
|
|
s32 DynaPoly_SetBgActor(struct PlayState* play, DynaCollisionContext* dyna, Actor* actor, CollisionHeader* colHeader);
|
|
DynaPolyActor* DynaPoly_GetActor(CollisionContext* colCtx, s32 bgId);
|
|
void DynaPoly_DisableCollision(struct PlayState* play, DynaCollisionContext* dyna, s32 bgId);
|
|
void DynaPoly_EnableCollision(struct PlayState* play, DynaCollisionContext* dyna, s32 bgId);
|
|
void DynaPoly_DisableCeilingCollision(struct PlayState* play, DynaCollisionContext* dyna, s32 bgId);
|
|
void DynaPoly_EnableCeilingCollision(struct PlayState* play, DynaCollisionContext* dyna, s32 bgId);
|
|
void DynaPoly_DisableFloorCollision(struct PlayState* play, DynaCollisionContext* dyna, s32 bgId);
|
|
void DynaPoly_EnableFloorCollision(struct PlayState* play, DynaCollisionContext* dyna, s32 bgId);
|
|
void DynaPoly_InvalidateLookup(struct PlayState* play, DynaCollisionContext* dyna);
|
|
void DynaPoly_DeleteBgActor(struct PlayState* play, DynaCollisionContext* dyna, s32 bgId);
|
|
void BgCheck_CalcWaterboxDimensions(Vec3f* minPos, Vec3f* maxXPos, Vec3f* maxZPos, Vec3s* minPosOut, s16* xLength, s16* zLength);
|
|
void DynaPoly_AddBgActorToLookup(struct PlayState* play, DynaCollisionContext* dyna, s32 bgId, s32* vtxStartIndex, s32* polyStartIndex, s32* waterBoxStartIndex);
|
|
void DynaPoly_UnsetAllInteractFlags(struct PlayState* play, DynaCollisionContext* dyna, Actor* actor);
|
|
void DynaPoly_UpdateContext(struct PlayState* play, DynaCollisionContext* dyna);
|
|
void func_800C756C(DynaCollisionContext* dyna, s32* numPolygons, s32* numVertices, s32* numWaterBoxes);
|
|
void DynaPoly_UpdateBgActorTransforms(struct PlayState* play, DynaCollisionContext* dyna);
|
|
void CollisionHeader_SegmentedToVirtual(CollisionHeader* colHeader);
|
|
void CollisionHeader_GetVirtual(CollisionHeader* colHeader, CollisionHeader** dest);
|
|
void BgCheck_InitCollisionHeaders(CollisionContext* colCtx, struct PlayState* play);
|
|
|
|
u32 SurfaceType_GetBgCamIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
u16 BgCheck_GetBgCamSettingImpl(CollisionContext* colCtx, u32 bgCamIndex, s32 bgId);
|
|
u16 BgCheck_GetBgCamSetting(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
u16 BgCheck_GetBgCamCountImpl(CollisionContext* colCtx, u32 bgCamIndex, s32 bgId);
|
|
u16 BgCheck_GetBgCamCount(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
Vec3s* BgCheck_GetBgCamFuncDataImpl(CollisionContext* colCtx, s32 bgCamIndex, s32 bgId);
|
|
Vec3s* BgCheck_GetBgCamFuncData(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
|
|
u32 SurfaceType_GetSceneExitIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
FloorType SurfaceType_GetFloorType(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
u32 func_800C99FC(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
s32 SurfaceType_GetWallFlags(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
s32 SurfaceType_CheckWallFlag0(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
s32 SurfaceType_CheckWallFlag1(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
s32 SurfaceType_CheckWallFlag2(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
FloorProperty SurfaceType_GetFloorProperty2(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
FloorProperty SurfaceType_GetFloorProperty(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
u32 SurfaceType_IsSoft(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
u32 SurfaceType_IsHorseBlocked(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
SurfaceMaterial SurfaceType_GetMaterial(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
u16 SurfaceType_GetSfxOffset(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
s32 SurfaceType_HasMaterialProperty(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId, s32 propertyType);
|
|
FloorEffect SurfaceType_GetFloorEffect(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
u32 SurfaceType_GetLightSettingIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
u32 SurfaceType_GetEcho(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
u32 SurfaceType_IsHookshotSurface(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
s32 SurfaceType_IsIgnoredByEntities(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
s32 SurfaceType_IsIgnoredByProjectiles(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
s32 SurfaceType_IsFloorConveyor(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
s32 func_800C9DDC(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
ConveyorSpeed SurfaceType_GetConveyorSpeed(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
u32 SurfaceType_GetConveyorDirection(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
u32 SurfaceType_IsWallDamage(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
|
|
s32 WaterBox_GetSurfaceImpl(struct PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox, s32* bgId);
|
|
s32 WaterBox_GetSurface1(struct PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox);
|
|
s32 WaterBox_GetSurface1_2(struct PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox);
|
|
s32 WaterBox_GetSurface2(struct PlayState* play, CollisionContext* colCtx, Vec3f* pos, f32 surfaceCheckDist, WaterBox** outWaterBox, s32* bgId);
|
|
f32 func_800CA568(CollisionContext* colCtx, s32 waterBoxId, s32 bgId);
|
|
u16 WaterBox_GetBgCamSetting(CollisionContext* colCtx, WaterBox* waterBox, s32 bgId);
|
|
void WaterBox_GetSceneBgCamSetting(CollisionContext* colCtx, WaterBox* waterBox);
|
|
u32 WaterBox_GetLightSettingIndex(CollisionContext* colCtx, WaterBox* waterBox);
|
|
s32 func_800CA6F0(struct PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox, s32* bgId);
|
|
s32 func_800CA9D0(struct PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox);
|
|
s32 func_800CAA14(CollisionPoly* polyA, CollisionPoly* polyB, Vec3f* pointA, Vec3f* pointB, Vec3f* closestPoint);
|
|
|
|
#endif
|