diff options
| author | engineer124 <47598039+engineer124@users.noreply.github.com> | 2022-10-12 23:26:35 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-13 04:26:35 +0100 |
| commit | 868029b213128eaa24d0b80f854f71704cfafe8c (patch) | |
| tree | a848b3acdfdbcc7ffbbc7bef79a4dae081624873 /include/z64camera.h | |
| parent | 09cf394d988e80a75ca24a23103c8f976a9dc396 (diff) | |
Import Camera Data (#1097)
* import camera data
* cleanup
* easier-to-read cam-hud-visibility
* PR Suggestions
* fix camflag macros
* fix bss
* camera data summary
* small cleanup
* cleanup camera data
* cam data mode enums
Diffstat (limited to 'include/z64camera.h')
| -rw-r--r-- | include/z64camera.h | 1262 |
1 files changed, 1243 insertions, 19 deletions
diff --git a/include/z64camera.h b/include/z64camera.h index e3b3a4483..9c101bf73 100644 --- a/include/z64camera.h +++ b/include/z64camera.h @@ -2,6 +2,7 @@ #define Z64CAMERA_H #include "ultra64.h" +#include "z64save.h" // these two angle conversion macros are slightly inaccurate #define CAM_DEG_TO_BINANG(degrees) (s16)((degrees) * ((f32)0xFFFF / 360) + .5f) @@ -16,6 +17,72 @@ #define SUB_CAM_ID_DONE 0 // Used in some actors for variables holding sub camera IDs to indicate "subcam is finished" +#define CAM_HUD_VISIBILITY_SHIFT 8 +#define CAM_HUD_VISIBILITY_MASK (0x0F00) +#define CAM_HUD_VISIBILITY(hudVisibility) (((hudVisibility) & 0xF) << CAM_HUD_VISIBILITY_SHIFT) + +#define CAM_HUD_VISIBILITY_ALL \ + CAM_HUD_VISIBILITY(0) // HUD_VISIBILITY_ALL +#define CAM_HUD_VISIBILITY_NONE \ + CAM_HUD_VISIBILITY(HUD_VISIBILITY_NONE) +#define CAM_HUD_VISIBILITY_NONE_ALT \ + CAM_HUD_VISIBILITY(HUD_VISIBILITY_NONE_ALT) +#define CAM_HUD_VISIBILITY_HEARTS_WITH_OVERWRITE \ + CAM_HUD_VISIBILITY(HUD_VISIBILITY_HEARTS_WITH_OVERWRITE) +#define CAM_HUD_VISIBILITY_A \ + CAM_HUD_VISIBILITY(HUD_VISIBILITY_A) +#define CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_WITH_OVERWRITE \ + CAM_HUD_VISIBILITY(HUD_VISIBILITY_A_HEARTS_MAGIC_WITH_OVERWRITE) +#define CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_MINIMAP_WITH_OVERWRITE \ + CAM_HUD_VISIBILITY(HUD_VISIBILITY_A_HEARTS_MAGIC_MINIMAP_WITH_OVERWRITE) +#define CAM_HUD_VISIBILITY_ALL_NO_MINIMAP_W_DISABLED \ + CAM_HUD_VISIBILITY(HUD_VISIBILITY_ALL_NO_MINIMAP_W_DISABLED) +#define CAM_HUD_VISIBILITY_B \ + CAM_HUD_VISIBILITY(HUD_VISIBILITY_B) +#define CAM_HUD_VISIBILITY_HEARTS_MAGIC \ + CAM_HUD_VISIBILITY(HUD_VISIBILITY_HEARTS_MAGIC) +#define CAM_HUD_VISIBILITY_B_ALT \ + CAM_HUD_VISIBILITY(HUD_VISIBILITY_B_ALT) +#define CAM_HUD_VISIBILITY_HEARTS \ + CAM_HUD_VISIBILITY(HUD_VISIBILITY_HEARTS) +#define CAM_HUD_VISIBILITY_A_B_MINIMAP \ + CAM_HUD_VISIBILITY(HUD_VISIBILITY_A_B_MINIMAP) +#define CAM_HUD_VISIBILITY_HEARTS_MAGIC_WITH_OVERWRITE \ + CAM_HUD_VISIBILITY(HUD_VISIBILITY_HEARTS_MAGIC_WITH_OVERWRITE) +#define CAM_HUD_VISIBILITY_HEARTS_MAGIC_C \ + CAM_HUD_VISIBILITY(HUD_VISIBILITY_HEARTS_MAGIC_C) +// HUD_VISIBILITY_ALL_NO_MINIMAP and above can not be set using `CAM_HUD_VISIBILITY` +#define CAM_HUD_VISIBILITY_IGNORE \ + CAM_HUD_VISIBILITY(0xF) + +/** + * letterboxFlag: determines the size of the letter-box window. See CAM_LETTERBOX_* enums. + * Can also add on the flag ( | CAM_LETTERBOX_INSTANT) to make the size change immediately + * hudVisibility: hides certain hud icons + * - A value of 0 in camera is translated to a hudVisibility of 50, + * which is the value to restore all hud icons to the screen (CAM_HUD_VISIBILITY_ALL) + * - A value of 0xF in camera results in no change in the hudVisibility (CAM_HUD_VISIBILITY_IGNORE) + * funcFlags: Custom flags for functions + */ +#define CAM_INTERFACE_FLAGS(letterboxFlag, hudVisibility, funcFlags) \ + (((letterboxFlag) & CAM_LETTERBOX_MASK) | (hudVisibility) | ((funcFlags) & 0xFF)) + +// Shrinking the window from the top and bottom with black borders (letterboxing) +#define CAM_LETTERBOX_MASK 0xF000 + +#define CAM_LETTERBOX_SIZE_MASK 0x7000 +#define CAM_LETTERBOX_NONE 0x0000 +// small/medium/large black borders +#define CAM_LETTERBOX_SMALL 0x1000 +#define CAM_LETTERBOX_MEDIUM 0x2000 +#define CAM_LETTERBOX_LARGE 0x3000 +#define CAM_LETTERBOX_NONE_4 0x4000 + +#define CAM_LETTERBOX_INSTANT 0x8000 // Bit to determine whether to set the current value directly (on), or to set the size target (off) + +#define CAM_LETTERBOX_IGNORE 0xF000 // No change in letterbox size, keep the previous size + + // Camera behaviorFlags. Flags specifically for settings, modes, and bgCam // Used to store current state, only CAM_BEHAVIOR_SETTING_1 and CAM_BEHAVIOR_BG_2 are read from and used in logic // Setting (0x1, 0x10) @@ -280,9 +347,9 @@ typedef enum { /* 0x04 */ CAM_DATA_04, /* 0x05 */ CAM_DATA_05, /* 0x06 */ CAM_DATA_06, - /* 0x07 */ CAM_DATA_07, + /* 0x07 */ CAM_DATA_FOV, /* 0x08 */ CAM_DATA_08, - /* 0x09 */ CAM_DATA_09, + /* 0x09 */ CAM_DATA_INTERFACE_FLAGS, /* 0x0A */ CAM_DATA_10, /* 0x0B */ CAM_DATA_11, /* 0x0C */ CAM_DATA_12, @@ -297,31 +364,1188 @@ typedef enum { /* 0x15 */ CAM_DATA_21, } CameraDataType; +/*================================ + * MISC DATA + *================================ + */ + +// Camera Collision Check typedef struct { - /* 0x0 */ s16 val; - /* 0x2 */ s16 param; -} CameraModeValue; // size = 0x4 + /* 0x00 */ Vec3f pos; + /* 0x0C */ Vec3f norm; + /* 0x18 */ CollisionPoly* poly; + /* 0x1C */ VecSph sphNorm; + /* 0x24 */ s32 bgId; +} CameraCollision; // size = 0x28 typedef struct { - /* 0x0 */ s16 funcId; - /* 0x2 */ s16 numValues; - /* 0x4 */ CameraModeValue* values; -} CameraMode; // size = 0x8 + /* 0x00 */ Vec3f collisionClosePoint; + /* 0x0C */ CameraCollision atEyeColChk; + /* 0x34 */ CameraCollision eyeAtColChk; + /* 0x5C */ f32 swingUpdateRate; + /* 0x60 */ s16 pitch; + /* 0x62 */ s16 yaw; + /* 0x64 */ s16 unk_64; + /* 0x66 */ s16 timer; // startSwingTimer +} SwingAnimation; // size = 0x68 -/** - * Flags: - * (flags & 0xF): Priority (lower value has higher priority) - * (flags & 0x40000000): Store previous setting and bgCamData, also ignores water checks - * (flags & 0x80000000): Set camera setting based on bg/scene data and reset action function state + +/*================================ + * Camera Update-Function Data + *================================ + */ + +#define CAM_FUNCDATA_INTERFACE_FLAGS(interfaceFlags) \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + + +/*================================ + * Camera_Normal1() Data + *================================ */ + +#define CAM_FUNCDATA_NORM1(yOffset, data01, data02, pitchTarget, eyeStepScale, posStepScale, yawDiffRange, fov, data08, interfaceFlags) \ + { yOffset, CAM_DATA_00 }, \ + { data01, CAM_DATA_01 }, \ + { data02, CAM_DATA_02 }, \ + { pitchTarget, CAM_DATA_03 }, \ + { eyeStepScale, CAM_DATA_04 }, \ + { posStepScale, CAM_DATA_05 }, \ + { yawDiffRange, CAM_DATA_06 }, \ + { fov, CAM_DATA_FOV }, \ + { data08, CAM_DATA_08 }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + +typedef struct { + /* 0x00 */ f32 unk_00; // yOffset + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ f32 unk_0C; + /* 0x10 */ f32 unk_10; + /* 0x14 */ f32 unk_14; // attenuationYawDiffRange + /* 0x18 */ f32 unk_18; // fovTarget + /* 0x1C */ f32 unk_1C; + /* 0x20 */ s16 unk_20; // pitchTarget + /* 0x22 */ s16 interfaceFlags; +} Normal1ReadOnlyData; // size = 0x24 + +typedef struct { + /* 0x00 */ f32 unk_00; // yPos + /* 0x04 */ f32 unk_04; // xzSpeed + /* 0x08 */ s16 unk_08; + /* 0x0A */ s16 unk_0A; // angle + /* 0x0C */ s16 unk_0C; // flags (May be s32) + /* 0x0E */ s16 unk_0E; + /* 0x10 */ f32 unk_10; // set to float +} Normal1ReadWriteData; // size = 0x14 + +typedef struct { + /* 0x00 */ Normal1ReadOnlyData roData; + /* 0x24 */ Normal1ReadWriteData rwData; +} Normal1; // size = 0x38 + +#define NORMAL1_FLAG_0 (1 << 0) +#define NORMAL1_FLAG_1 (1 << 1) +#define NORMAL1_FLAG_2 (1 << 2) +#define NORMAL1_FLAG_3 (1 << 3) +#define NORMAL1_FLAG_4 (1 << 4) +#define NORMAL1_FLAG_5 (1 << 5) +#define NORMAL1_FLAG_6 (1 << 6) +#define NORMAL1_FLAG_7 (1 << 7) + + +/*================================ + * Camera_Normal2() Data + *================================ + */ + +// Unused Camera RemoteBomb Setting + +#define CAM_FUNCDATA_NORM2(yOffset, data01, data02, pitchTarget, data04, fov, data08, interfaceFlags) \ + { yOffset, CAM_DATA_00 }, \ + { data01, CAM_DATA_01 }, \ + { data02, CAM_DATA_02 }, \ + { pitchTarget, CAM_DATA_03 }, \ + { data04, CAM_DATA_04 }, \ + { fov, CAM_DATA_FOV }, \ + { data08, CAM_DATA_08 }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + +#define NORMAL2_FLAG_1 (1 << 1) + + +/*================================ + * Camera_Normal3() Data + *================================ + */ + +#define CAM_FUNCDATA_NORM3(yOffset, data01, data02, pitchTarget, eyeStepScale, posStepScale, fov, data08, interfaceFlags) \ + { yOffset, CAM_DATA_00 }, \ + { data01, CAM_DATA_01 }, \ + { data02, CAM_DATA_02 }, \ + { pitchTarget, CAM_DATA_03 }, \ + { eyeStepScale, CAM_DATA_04 }, \ + { posStepScale, CAM_DATA_05 }, \ + { fov, CAM_DATA_FOV }, \ + { data08, CAM_DATA_08 }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + +typedef struct { + /* 0x00 */ f32 yOffset; + /* 0x04 */ f32 distMin; + /* 0x08 */ f32 distMax; + /* 0x0C */ f32 yawUpdateRateInv; + /* 0x10 */ f32 pitchUpdateRateInv; + /* 0x14 */ f32 fovTarget; + /* 0x18 */ f32 maxAtLERPScale; + /* 0x1C */ s16 pitchTarget; + /* 0x1E */ s16 interfaceFlags; +} Normal3ReadOnlyData; // size = 0x20 + +typedef struct { + /* 0x00 */ f32 isZero; // set but unused + /* 0x04 */ f32 yPosOffset; + /* 0x08 */ s16 curPitch; + /* 0x0A */ s16 yawUpdateRate; + /* 0x0C */ s16 yawTimer; + /* 0x0E */ s16 distTimer; + /* 0x10 */ s16 flag; + /* 0x12 */ s16 is1200; // set but unused +} Normal3ReadWriteData; // size = 0x14 + +typedef struct { + /* 0x00 */ Normal3ReadOnlyData roData; + /* 0x20 */ Normal3ReadWriteData rwData; +} Normal3; // size = 0x34 + +#define NORMAL3_FLAG_1 (1 << 1) +#define NORMAL3_FLAG_5 (1 << 5) +#define NORMAL3_FLAG_6 (1 << 6) +#define NORMAL3_FLAG_7 (1 << 7) + + +/*================================ + * Camera_Normal0() Data + *================================ + */ + +#define CAM_FUNCDATA_NORM0(yOffset, data01, data02, data21, data04, yawDiffRange, fov, data08, interfaceFlags) \ + { yOffset, CAM_DATA_00 }, \ + { data01, CAM_DATA_01 }, \ + { data02, CAM_DATA_02 }, \ + { data21, CAM_DATA_21 }, \ + { data04, CAM_DATA_04 }, \ + { yawDiffRange, CAM_DATA_06 }, \ + { fov, CAM_DATA_FOV }, \ + { data08, CAM_DATA_08 }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ f32 unk_0C; + /* 0x10 */ f32 unk_10; + /* 0x14 */ f32 unk_14; + /* 0x18 */ f32 unk_18; + /* 0x1C */ s16 unk_1C; + /* 0x1E */ s16 interfaceFlags; +} Normal0ReadOnlyData; // size = 0x20 + +typedef struct { + /* 0x00 */ Vec3f unk_00; + /* 0x0C */ Vec3f unk_0C; + /* 0x18 */ f32 unk_18; + /* 0x1C */ f32 unk_1C; + /* 0x20 */ s16 unk_20; + /* 0x22 */ s16 unk_22; + /* 0x24 */ f32 unk_24; + /* 0x28 */ f32 unk_28; + /* 0x2C */ s16 unk_2C; +} Normal0ReadWriteData; // size = 0x30 + +typedef struct { + /* 0x00 */ Normal0ReadOnlyData roData; + /* 0x20 */ Normal0ReadWriteData rwData; +} Normal0; // size = 0x50 + +#define NORMAL0_FLAG_0 (1 << 0) +#define NORMAL0_FLAG_2 (1 << 2) +#define NORMAL0_FLAG_4 (1 << 4) +#define NORMAL0_FLAG_7 (1 << 7) + + +/*================================ + * Camera_Parallel1() Data + *================================ + */ + +#define CAM_FUNCDATA_PARA1(yOffset, data01, data02, pitchTarget, data10, data04, data05, fov, data08, interfaceFlags, data11, data12) \ + { yOffset, CAM_DATA_00 }, \ + { data01, CAM_DATA_01 }, \ + { data02, CAM_DATA_02 }, \ + { pitchTarget, CAM_DATA_03 }, \ + { data10, CAM_DATA_10 }, \ + { data04, CAM_DATA_04 }, \ + { data05, CAM_DATA_05 }, \ + { fov, CAM_DATA_FOV }, \ + { data08, CAM_DATA_08 }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS }, \ + { data11, CAM_DATA_11 }, \ + { data12, CAM_DATA_12 } + +// Same as above but with extra unused entry +#define CAM_FUNCDATA_PARA1_ALT(yOffset, data01, data02, pitchTarget, data10, data04, data05, fov, data08, interfaceFlags, data11, data12, data18) \ + { yOffset, CAM_DATA_00 }, \ + { data01, CAM_DATA_01 }, \ + { data02, CAM_DATA_02 }, \ + { pitchTarget, CAM_DATA_03 }, \ + { data10, CAM_DATA_10 }, \ + { data04, CAM_DATA_04 }, \ + { data05, CAM_DATA_05 }, \ + { fov, CAM_DATA_FOV }, \ + { data08, CAM_DATA_08 }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS }, \ + { data11, CAM_DATA_11 }, \ + { data12, CAM_DATA_12 }, \ + { data18, CAM_DATA_18 } + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ f32 unk_0C; + /* 0x10 */ f32 unk_10; + /* 0x14 */ f32 unk_14; + /* 0x18 */ f32 unk_18; + /* 0x1C */ f32 unk_1C; + /* 0x20 */ s16 unk_20; + /* 0x22 */ s16 unk_22; + /* 0x24 */ s16 unk_24; + /* 0x26 */ s16 interfaceFlags; +} Parallel1ReadOnlyData; // size = 0x28 + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ f32 timer1; + /* 0x10 */ Vec3f unk_10; + /* 0x1C */ s16 unk_1C; + /* 0x1E */ s16 unk_1E; + /* 0x20 */ s16 unk_20; + /* 0x22 */ s16 timer2; + /* 0x24 */ s16 timer3; + /* 0x26 */ s16 unk_26; +} Parallel1ReadWriteData; // size = 0x28 + +typedef struct { + /* 0x00 */ Parallel1ReadOnlyData roData; + /* 0x28 */ Parallel1ReadWriteData rwData; +} Parallel1; // size = 0x50 + +#define PARALLEL1_FLAG_0 (1 << 0) +#define PARALLEL1_FLAG_1 (1 << 1) +#define PARALLEL1_FLAG_2 (1 << 2) +#define PARALLEL1_FLAG_3 (1 << 3) +#define PARALLEL1_FLAG_4 (1 << 4) +#define PARALLEL1_FLAG_5 (1 << 5) +#define PARALLEL1_FLAG_6 (1 << 6) +#define PARALLEL1_FLAG_7 (1 << 7) + + +/*================================ + * Camera_Parallel2() Data + *================================ + */ + +// Unused Camera Maze Setting + +#define CAM_FUNCDATA_PARA2(yOffset, data02, data01, pitchTarget, data04, fov, data08, interfaceFlags) \ + { yOffset, CAM_DATA_00 }, \ + { data02, CAM_DATA_02 }, \ + { data01, CAM_DATA_01 }, \ + { pitchTarget, CAM_DATA_03 }, \ + { data04, CAM_DATA_04 }, \ + { fov, CAM_DATA_FOV }, \ + { data08, CAM_DATA_08 }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + +#define PARALLEL2_FLAG_1 (1 << 1) + + +/*================================ + * Camera_Jump2() Data + *================================ + */ + +#define CAM_FUNCDATA_JUMP2(yOffset, data01, data02, data20, data04, data05, fov, data08, interfaceFlags) \ + { yOffset, CAM_DATA_00 }, \ + { data01, CAM_DATA_01 }, \ + { data02, CAM_DATA_02 }, \ + { data20, CAM_DATA_20 }, \ + { data04, CAM_DATA_04 }, \ + { data05, CAM_DATA_05 }, \ + { fov, CAM_DATA_FOV }, \ + { data08, CAM_DATA_08 }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + typedef struct { - /* 0x0 */ u32 validModes; - /* 0x4 */ u32 flags; - /* 0x8 */ CameraMode* cameraModes; -} CameraSetting; // size = 0xC + /* 0x00 */ f32 unk_00; + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ f32 unk_0C; + /* 0x10 */ f32 unk_10; + /* 0x14 */ f32 unk_14; + /* 0x18 */ f32 unk_18; + /* 0x1C */ f32 unk_1C; + /* 0x20 */ s16 interfaceFlags; +} Jump2ReadOnlyData; // size = 0x24 + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ s16 unk_04; + /* 0x06 */ s16 unk_06; + /* 0x08 */ s16 unk_08; + /* 0x0A */ s16 unk_0A; + /* 0x0C */ s16 timer; + /* 0x0E */ s16 unk_0E; + /* 0x10 */ s32 unk_10; // unused? + /* 0x1C */ s16 unk_1C; +} Jump2ReadWriteData; // size = 0x20 + +typedef struct { + /* 0x00 */ Jump2ReadOnlyData roData; + /* 0x24 */ Jump2ReadWriteData rwData; +} Jump2; // size = 0x44 + +#define JUMP2_FLAG_1 (1 << 1) +#define JUMP2_FLAG_2 (1 << 2) + + +/*================================ + * Camera_Jump3() Data + *================================ + */ + +#define CAM_FUNCDATA_JUMP3(yOffset, data01, data02, pitchTarget, data04, data05, yawDiffRange, fov, data08, interfaceFlags) \ + { yOffset, CAM_DATA_00 }, \ + { data01, CAM_DATA_01 }, \ + { data02, CAM_DATA_02 }, \ + { pitchTarget, CAM_DATA_03 }, \ + { data04, CAM_DATA_04 }, \ + { data05, CAM_DATA_05 }, \ + { yawDiffRange, CAM_DATA_06 }, \ + { fov, CAM_DATA_FOV }, \ + { data08, CAM_DATA_08 }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + +typedef struct { + /* 0x00 */ f32 unk_00; // yOffset + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ f32 unk_0C; + /* 0x10 */ f32 unk_10; + /* 0x14 */ f32 unk_14; // attenuationYawDiffRange + /* 0x18 */ f32 unk_18; // fovTarget + /* 0x1C */ f32 unk_1C; + /* 0x20 */ s16 unk_20; + /* 0x22 */ s16 interfaceFlags; +} Jump3ReadOnlyData; // size = 0x24 + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ s16 unk_04; + /* 0x06 */ s16 unk_06; + /* 0x08 */ s16 timer1; + /* 0x0A */ s16 unk_0A; + /* 0x0C */ s32 timer2; + /* 0x10 */ s16 unk_10; + /* 0x12 */ s16 unk_12; + /* 0x1C */ s16 unk_1C; +} Jump3ReadWriteData; // size = 0x20 + +typedef struct { + /* 0x00 */ Jump3ReadOnlyData roData; // yOffset + /* 0x24 */ Jump3ReadWriteData rwData; +} Jump3; // size = 0x44 + +#define JUMP3_FLAG_0 (1 << 0) +#define JUMP3_FLAG_2 (1 << 2) +#define JUMP3_FLAG_3 (1 << 3) +#define JUMP3_FLAG_4 (1 << 4) +#define JUMP3_FLAG_5 (1 << 5) +#define JUMP3_FLAG_6 (1 << 6) +#define JUMP3_FLAG_7 (1 << 7) + + +/*================================ + * Camera_Battle1() Data + *================================ + */ + +#define CAM_FUNCDATA_BATT1(yOffset, data01, data02, data13, data14, data15, data16, data17, fov, data08, interfaceFlags, data11, data18) \ + { yOffset, CAM_DATA_00 }, \ + { data01, CAM_DATA_01 }, \ + { data02, CAM_DATA_02 }, \ + { data13, CAM_DATA_13 }, \ + { data14, CAM_DATA_14 }, \ + { data15, CAM_DATA_15 }, \ + { data16, CAM_DATA_16 }, \ + { data17, CAM_DATA_17 }, \ + { fov, CAM_DATA_FOV }, \ + { data08, CAM_DATA_08 }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS }, \ + { data11, CAM_DATA_11 }, \ + { data18, CAM_DATA_18 } + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ f32 unk_0C; + /* 0x10 */ f32 unk_10; + /* 0x14 */ f32 unk_14; + /* 0x18 */ f32 unk_18; + /* 0x1C */ f32 unk_1C; + /* 0x20 */ f32 unk_20; + /* 0x24 */ f32 unk_24; + /* 0x28 */ f32 unk_28; + /* 0x2C */ f32 unk_2C; + /* 0x30 */ s16 interfaceFlags; +} Battle1ReadOnlyData; // size = 0x34 + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ f32 unk_04; + /* 0x08 */ Actor* unk_08; // targe3t + /* 0x0C */ s32 unk_0C; // unused? + /* 0x10 */ s16 unk_10; + /* 0x12 */ s16 unk_12; + /* 0x14 */ s16 unk_14; + /* 0x16 */ s16 unk_16; + /* 0x18 */ s16 unk_18; + /* 0x1A */ s16 unk_1A; +} Battle1ReadWriteData; // size = 0x1C + +typedef struct { + /* 0x00 */ Battle1ReadOnlyData roData; + /* 0x24 */ Battle1ReadWriteData rwData; +} Battle1; // size = 0x50 + +#define BATTLE1_FLAG_0 (1 << 0) +#define BATTLE1_FLAG_1 (1 << 1) +#define BATTLE1_FLAG_4 (1 << 4) +#define BATTLE1_FLAG_7 (1 << 7) + + +/*================================ + * Camera_KeepOn1() Data + *================================ + */ + +#define CAM_FUNCDATA_KEEP1(yOffset, data01, data02, data13, data14, data15, data16, data17, fov, data08, interfaceFlags, data11) \ + { yOffset, CAM_DATA_00 }, \ + { data01, CAM_DATA_01 }, \ + { data02, CAM_DATA_02 }, \ + { data13, CAM_DATA_13 }, \ + { data14, CAM_DATA_14 }, \ + { data15, CAM_DATA_15 }, \ + { data16, CAM_DATA_16 }, \ + { data17, CAM_DATA_17 }, \ + { fov, CAM_DATA_FOV }, \ + { data08, CAM_DATA_08 }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS }, \ + { data11, CAM_DATA_11 } + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ f32 unk_0C; + /* 0x10 */ f32 unk_10; + /* 0x14 */ f32 unk_14; + /* 0x18 */ f32 unk_18; + /* 0x1C */ f32 unk_1C; + /* 0x20 */ f32 unk_20; + /* 0x24 */ f32 unk_24; + /* 0x28 */ f32 unk_28; + /* 0x2C */ s16 interfaceFlags; +} KeepOn1ReadOnlyData; // size = 0x30 + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ Actor* unk_0C; + /* 0x10 */ s16 unk_10; + /* 0x12 */ s16 unk_12; + /* 0x14 */ s16 unk_14; + /* 0x16 */ s16 unk_16; + /* 0x18 */ s16 unk_18; +} KeepOn1ReadWriteData; // size = 0x1C + +typedef struct { + /* 0x00 */ KeepOn1ReadOnlyData roData; + /* 0x30 */ KeepOn1ReadWriteData rwData; +} KeepOn1; // size = 0x4C + +#define KEEPON1_FLAG_0 (1 << 0) +#define KEEPON1_FLAG_1 (1 << 1) +#define KEEPON1_FLAG_4 (1 << 4) +#define KEEPON1_FLAG_7 (1 << 7) + + +/*================================ + * Camera_KeepOn3() Data + *================================ + */ + +#define CAM_FUNCDATA_KEEP3(yOffset, data01, data02, data13, data14, data15, data16, data17, fov, data08, timer, interfaceFlags, data18) \ + { yOffset, CAM_DATA_00 }, \ + { data01, CAM_DATA_01 }, \ + { data02, CAM_DATA_02 }, \ + { data13, CAM_DATA_13 }, \ + { data14, CAM_DATA_14 }, \ + { data15, CAM_DATA_15 }, \ + { data16, CAM_DATA_16 }, \ + { data17, CAM_DATA_17 }, \ + { fov, CAM_DATA_FOV }, \ + { data08, CAM_DATA_08 }, \ + { timer, CAM_DATA_04 }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS }, \ + { data18, CAM_DATA_18 } + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ f32 unk_0C; + /* 0x10 */ f32 unk_10; + /* 0x14 */ f32 unk_14; + /* 0x18 */ f32 unk_18; + /* 0x1C */ f32 unk_1C; + /* 0x20 */ f32 unk_20; + /* 0x24 */ f32 unk_24; + /* 0x28 */ f32 unk_28; + /* 0x2C */ s16 timer; // initial timer, stored at twice the value used in code + /* 0x2E */ s16 interfaceFlags; +} KeepOn3ReadOnlyData; // size = 0x30 + +typedef struct { + /* 0x00 */ f32 unk_00; // Vec3f? + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ Actor* unk_0C; + /* 0x10 */ Vec3f unk_10; + /* 0x1C */ s16 timer; +} KeepOn3ReadWriteData; // size = 0x20 + +typedef struct { + /* 0x00 */ KeepOn3ReadOnlyData roData; + /* 0x30 */ KeepOn3ReadWriteData rwData; +} KeepOn3; // size = 0x50 + +#define KEEPON3_FLAG_5 (1 << 5) +#define KEEPON3_FLAG_6 (1 << 6) +#define KEEPON3_FLAG_7 (1 << 7) + + +/*================================ + * Camera_KeepOn4() Data + *================================ + */ + +#define CAM_FUNCDATA_KEEP4(yOffset, data01, pitchTarget, data10, data18, fov, interfaceFlags, data04, timer) \ + { yOffset, CAM_DATA_00 }, \ + { data01, CAM_DATA_01 }, \ + { pitchTarget, CAM_DATA_03 }, \ + { data10, CAM_DATA_10 }, \ + { data18, CAM_DATA_18 }, \ + { fov, CAM_DATA_FOV }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS }, \ + { data04, CAM_DATA_04 }, \ + { timer, CAM_DATA_12 } + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ f32 unk_0C; + /* 0x10 */ f32 unk_10; + /* 0x14 */ f32 unk_14; + /* 0x18 */ f32 unk_18; + /* 0x1C */ s16 interfaceFlags; + /* 0x1E */ s16 timer; +} KeepOn4ReadOnlyData; // size = 0x20 + +typedef struct { + /* 0x00 */ f32 unk_00; // Vec3f? + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ Actor* unk_0C; + /* 0x10 */ s16 unk_10; + /* 0x12 */ s16 unk_12; + /* 0x14 */ s16 timer; + /* 0x16 */ s16 unk_16; + /* 0x18 */ s16 unk_18; +} KeepOn4ReadWriteData; // size = 0x1C + +typedef struct { + /* 0x00 */ KeepOn4ReadOnlyData roData; + /* 0x20 */ KeepOn4ReadWriteData rwData; +} KeepOn4; // size = 0x3C + +#define KEEPON4_FLAG_1 (1 << 1) +#define KEEPON4_FLAG_2 (1 << 2) +#define KEEPON4_FLAG_3 (1 << 3) +#define KEEPON4_FLAG_6 (1 << 6) + + +/*================================ + * Camera_Fixed1() Data + *================================ + */ + +#define CAM_FUNCDATA_FIXD1(yOffset, data04, fov, interfaceFlags) \ + { yOffset, CAM_DATA_00 }, \ + { data04, CAM_DATA_04 }, \ + { fov, CAM_DATA_FOV }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 fov; + /* 0x0C */ s16 interfaceFlags; +} Fixed1ReadOnlyData; // size = 0x10 + +typedef struct { + /* 0x00 */ PosRot eyePosRotTarget; + /* 0x14 */ s16 fov; + /* 0x18 */ Actor* focalActor; +} Fixed1ReadWriteData; // size = 0x1C + +typedef struct { + /* 0x00 */ Fixed1ReadOnlyData roData; + /* 0x10 */ Fixed1ReadWriteData rwData; +} Fixed1; // size = 0x2C + +#define FIXED1_FLAG_4 (1 << 4) + + +/*================================ + * Camera_Fixed2() Data + *================================ + */ + +#define CAM_FUNCDATA_FIXD2(yOffset, data01, data02, data04, data05, fov, interfaceFlags) \ + { yOffset, CAM_DATA_00 }, \ + { data01, CAM_DATA_01 }, \ + { data02, CAM_DATA_02 }, \ + { data04, CAM_DATA_04 }, \ + { data05, CAM_DATA_05 }, \ + { fov, CAM_DATA_FOV }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ f32 unk_0C; + /* 0x10 */ f32 unk_10; + /* 0x14 */ f32 unk_14; + /* 0x18 */ s16 interfaceFlags; +} Fixed2ReadOnlyData; // size = 0x1C + +typedef struct { + /* 0x00 */ Vec3f unk_00; + /* 0x0C */ f32 unk_0C; + /* 0x10 */ f32 unk_10; + /* 0x14 */ f32 unk_14; + /* 0x18 */ f32 unk_18; + /* 0x1C */ s16 unk_1C; +} Fixed2ReadWriteData; // size = 0x20 + +typedef struct { + /* 0x00 */ Fixed2ReadOnlyData roData; + /* 0x1C */ Fixed2ReadWriteData rwData; +} Fixed2; // size = 0x3C + +#define FIXED2_FLAG_0 (1 << 0) +#define FIXED2_FLAG_1 (1 << 1) +#define FIXED2_FLAG_2 (1 << 2) +#define FIXED2_FLAG_3 (1 << 3) +#define FIXED2_FLAG_4 (1 << 4) +#define FIXED2_FLAG_5 (1 << 5) +#define FIXED2_FLAG_6 (1 << 6) +#define FIXED2_FLAG_7 (1 << 7) + + +/*================================ + * Camera_Fixed3() Data + *================================ + */ + +#define CAM_FUNCDATA_FIXD3(interfaceFlags) \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + + +/*================================ + * Camera_Subject1() Data + *================================ + */ + +#define CAM_FUNCDATA_SUBJ1(yOffset, data01, data02, data04, data19, data17, data18, fov, interfaceFlags) \ + { yOffset, CAM_DATA_00 }, \ + { data01, CAM_DATA_01 }, \ + { data02, CAM_DATA_02 }, \ + { data04, CAM_DATA_04 }, \ + { data19, CAM_DATA_19 }, \ + { data17, CAM_DATA_17 }, \ + { data18, CAM_DATA_18 }, \ + { fov, CAM_DATA_FOV }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ f32 unk_0C; + /* 0x10 */ f32 unk_10; + /* 0x14 */ f32 unk_14; + /* 0x18 */ f32 unk_18; + /* 0x1C */ f32 unk_1C; + /* 0x20 */ s16 interfaceFlags; +} Subject1ReadOnlyData; // size = 0x24 + +typedef struct { + /* 0x0 */ f32 unk_00; + /* 0x4 */ s16 unk_04; // yaw + /* 0x6 */ s16 unk_06; // pitch + /* 0x8 */ s16 timer; +} Subject1ReadWriteData; // size = 0xC + +typedef struct { + /* 0x00 */ Subject1ReadOnlyData roData; + /* 0x24 */ Subject1ReadWriteData rwData; +} Subject1; // size = 0x30 + +#define SUBJECT1_FLAG_4 (1 << 4) + + +/*================================ + * Camera_Unique2() Data + *================================ + */ + +#define CAM_FUNCDATA_UNIQ2(yOffset, data01, fov, interfaceFlags) \ + { yOffset, CAM_DATA_00 }, \ + { data01, CAM_DATA_01 }, \ + { fov, CAM_DATA_FOV }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ f32 unk_0C; + /* 0x10 */ s16 interfaceFlags; +} Unique2ReadOnlyData; // size = 0x14 + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ s16 unk_04; +} Unique2ReadWriteData; // size = 0x8 + +typedef struct { + /* 0x00 */ Unique2ReadOnlyData roData; + /* 0x14 */ Unique2ReadWriteData rwData; +} Unique2; // size = 0x1C + +#define UNIQUE2_FLAG_0 (1 << 0) +#define UNIQUE2_FLAG_1 (1 << 1) +#define UNIQUE2_FLAG_4 (1 << 4) +#define UNIQUE2_FLAG_5 (1 << 5) + + +/*================================ + * Camera_Unique0() Data + *================================ + */ + +#define CAM_FUNCDATA_UNIQ0(yOffset, data04, interfaceFlags) \ + { yOffset, CAM_DATA_00 }, \ + { data04, CAM_DATA_04 }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + +typedef struct { + /* 0x0 */ f32 unk_00; + /* 0x4 */ f32 unk_04; + /* 0x8 */ s16 interfaceFlags; +} Unique0ReadOnlyData; // size = 0xC + +typedef struct { + /* 0x00 */ Vec3f unk_00; + /* 0x0C */ Vec3f unk_0C; + /* 0x18 */ f32 unk_18; + /* 0x1C */ Vec3f unk_1C; + /* 0x28 */ Vec3f unk_28; + /* 0x34 */ Vec3s unk_34; + /* 0x3A */ s16 unk_3A; + /* 0x3C */ s16 timer; + /* 0x3E */ s16 unk_3E; +} Unique0ReadWriteData; // size = 0x40 + +typedef struct { + /* 0x00 */ Unique0ReadOnlyData roData; + /* 0x0C */ Unique0ReadWriteData rwData; +} Unique0; // size = 0x4C + +#define UNIQUE0_FLAG_0 (1 << 0) +#define UNIQUE0_FLAG_1 (1 << 1) +#define UNIQUE0_FLAG_4 (1 << 4) + + +/*================================ + * Camera_Unique6() Data + *================================ + */ + +typedef struct { + /* 0x00 */ s16 interfaceFlags; +} Unique6ReadOnlyData; // size = 0x4 + +typedef struct { + /* 0x00 */ Unique6ReadOnlyData roData; +} Unique6; // size = 0x4 + +#define UNIQUE6_FLAG_0 (1 << 0) + + +/*================================ + * Camera_Unique7() Data + *================================ + */ + +#define CAM_FUNCDATA_UNIQ7(fov, interfaceFlags) \ + { fov, CAM_DATA_FOV }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + + +/*================================ + * Camera_Demo1() Data + *================================ + */ + +typedef struct { + /* 0x00 */ s16 interfaceFlags; +} Demo1ReadOnlyData; // size = 0x4 + +typedef struct { + /* 0x00 */ Vec3f unk_00; + /* 0x0C */ VecSph unk_0C; + /* 0x14 */ VecSph unk_14; + /* 0x1C */ s16 unk_1C; +} Demo1ReadWriteData; // size = 0x20 + +typedef struct { + /* 0x00 */ Demo1ReadOnlyData roData; + /* 0x04 */ Demo1ReadWriteData rwData; +} Demo1; // size = 0x24 + + +/*================================ + * Camera_Demo2() Data + *================================ + */ + +#define CAM_FUNCDATA_DEMO2(fov, data08, interfaceFlags) \ + { fov, CAM_DATA_FOV }, \ + { data08, CAM_DATA_08 }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + +typedef struct { + /* 0x00 */ f32 fov; + /* 0x04 */ f32 unk_04; // unused + /* 0x08 */ s16 interfaceFlags; +} Demo2ReadOnlyData; // size = 0xC + +typedef struct { + /* 0x00 */ Vec3f initialAt; + /* 0x0C */ f32 unk_0C; + /* 0x10 */ s16 animFrame; + /* 0x12 */ s16 yawDir; +} Demo2ReadWriteData; // size = 0x14 + +typedef struct { + /* 0x08 */ Demo2ReadOnlyData roData; + /* 0x0C */ Demo2ReadWriteData rwData; +} Demo2; // size = 0x20 + + +/*================================ + * Camera_Demo3() Data + *================================ + */ + +typedef struct { + /* 0x00 */ s16 interfaceFlags; +} Demo3ReadOnlyData; // size = 0x4 + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ s16 unk_04; + /* 0x06 */ s16 timer; +} Demo3ReadWriteData; // size = 0x8 + +typedef struct { + /* 0x00 */ Demo3ReadOnlyData roData; + /* 0x04 */ Demo3ReadWriteData rwData; +} Demo3; // size = 0xC + + +/*================================ + * Camera_Demo4() Data + *================================ + */ + +typedef struct { + /* 0x00 */ s16 interfaceFlags; +} Demo4ReadOnlyData; // size = 0x4 + +typedef struct { + /* 0x00 */ Vec3f unk_00; + /* 0x0C */ f32 unk_0C; + /* 0x10 */ f32 unk_10; + /* 0x14 */ f32 unk_14; + /* 0x18 */ VecSph unk_18; // sp18-1C-20--24-26-28 // CutsceneCameraPoint? + /* 0x20 */ s16 unk_20; + /* 0x22 */ s16 timer; +} Demo4ReadWriteData; // size = 0x24 + +typedef struct { + /* 0x00 */ Demo4ReadOnlyData roData; + /* 0x04 */ Demo4ReadWriteData rwData; +} Demo4; // size = 0x28 + + +/*================================ + * Camera_Demo5() Data + *================================ + */ + +typedef struct { + /* 0x00 */ s16 interfaceFlags; +} Demo5ReadOnlyData; // size = 0x4 + +typedef struct { + /* 0x00 */ Vec3f unk_00; + /* 0x0C */ f32 unk_0C; + /* 0x10 */ f32 unk_10; + /* 0x14 */ f32 unk_14; + /* 0x18 */ f32 unk_18; + /* 0x1C */ VecSph unk_1C; + /* 0x24 */ s16 unk_24; + /* 0x26 */ s16 timer; +} Demo5ReadWriteData; // size = 0x28 + +typedef struct { + /* 0x00 */ Demo5ReadOnlyData roData; + /* 0x04 */ Demo5ReadWriteData rwData; +} Demo5; // size = 0x2C + + +/*================================ + * Camera_Demo0() Data + *================================ + */ + +typedef struct { + /* 0x00 */ s16 interfaceFlags; +} Demo0ReadOnlyData; // size = 0x4 + +typedef struct { + /* 0x00 */ f32 unk_00; + /* 0x04 */ VecSph subAtToEye; + /* 0x0C */ VecSph atToEye; + /* 0x14 */ s16 unk_14; + /* 0x16 */ s16 unk_16; + /* 0x18 */ s16 unk_18; + /* 0x1A */ s16 timer; +} Demo0ReadWriteData; // size = 0x1C + +typedef struct { + /* 0x00 */ Demo0ReadOnlyData roData; + /* 0x04 */ Demo0ReadWriteData rwData; +} Demo0; // size = 0x20 + + +/*================================ + * Camera_Special5() Data + *================================ + */ + +#define CAM_FUNCDATA_SPEC5(yOffset, eyeDist, minDistForRot, fov, atMaxLERPScale, timerInit, pitch, interfaceFlags) \ + { yOffset, CAM_DATA_00 }, \ + { eyeDist, CAM_DATA_01 }, \ + { minDistForRot, CAM_DATA_02 }, \ + { fov, CAM_DATA_03 }, \ + { atMaxLERPScale, CAM_DATA_FOV }, \ + { timerInit, CAM_DATA_08 }, \ + { pitch, CAM_DATA_12 }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + +typedef struct { + /* 0x00 */ f32 yOffset; + /* 0x04 */ f32 eyeDist; + /* 0x08 */ f32 minDistForRot; + /* 0x0C */ f32 fovTarget; + /* 0x10 */ f32 atMaxLERPScale; + /* 0x14 */ s16 timerInit; + /* 0x16 */ s16 pitch; + /* 0x18 */ s16 interfaceFlags; +} Special5ReadOnlyData; // size = 0x1C + +typedef struct { + /* 0x00 */ s16 animTimer; +} Special5ReadWriteData; // size = 0x4 + +typedef struct { + /* 0x00 */ Special5ReadOnlyData roData; + /* 0x1C */ Special5ReadWriteData rwData; +} Special5; // size = 0x20 + + +/*================================ + * DOOR Data + *================================ + */ + +// For functions that deal with doors, an extra struct is added to the paramData + +typedef struct { + /* 0x00 */ Actor* doorActor; + /* 0x04 */ s16 bgCamIndex; + /* 0x06 */ union { + Vec3s eye; // position of the camera while exiting a spiral staircase + struct { + s16 timer1; // timer while camera is fixed in front of the door + s16 timer2; // timer while camera is behind the door looking at player + s16 timer3; // timer while camera turns around to face forward + }; + }; +} DoorParams; // size = 0xC + +#define CAM_GET_DOOR_PARAMS(type) &((type*)camera->paramData)->doorParams + + +/*================================ + * Camera_Special8() Data + *================================ + */ + +#define CAM_FUNCDATA_SPEC8(yOffset, eyeStepScale, posStepScale, fov, spiralDoorCsLength, interfaceFlags) \ + { yOffset, CAM_DATA_00 }, \ + { eyeStepScale, CAM_DATA_04 }, \ + { posStepScale, CAM_DATA_05 }, \ + { fov, CAM_DATA_FOV }, \ + { spiralDoorCsLength, CAM_DATA_12 }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + +typedef struct { + /* 0x00 */ f32 yOffset; + /* 0x04 */ f32 eyeStepScale; + /* 0x08 */ f32 posStepScale; + /* 0x0C */ f32 fov; + /* 0x10 */ s16 spiralDoorCsLength; + /* 0x12 */ s16 interfaceFlags; +} Special8ReadOnlyData; // size = 0x14 + +typedef struct { + /* 0x00 */ Vec3f eye; + /* 0x0C */ s16 spiralDoorCsFrame; // 1/5th of the length of the cutscene + /* 0x0E */ s16 fov; +} Special8ReadWriteData; // size = 0x10 + +typedef struct { + /* 0x00 */ Special8ReadOnlyData roData; + /* 0x14 */ Special8ReadWriteData rwData; +} Special8; // size = 0x24 + +#define SPECIAL8_FLAG_0 (1 << 0) +#define SPECIAL8_FLAG_3 (1 << 3) + + +/*================================ + * Camera_Special9() Data + *================================ + */ + +#define CAM_FUNCDATA_SPEC9(yOffset, fov, interfaceFlags) \ + { yOffset, CAM_DATA_00 }, \ + { fov, CAM_DATA_FOV }, \ + { interfaceFlags, CAM_DATA_INTERFACE_FLAGS } + +typedef struct { + /* 0x00 */ f32 yOffset; + /* 0x04 */ f32 fov; + /* 0x08 */ s16 interfaceFlags; +} Special9ReadOnlyData; // size = 0xC + +typedef struct { + /* 0x00 */ s16 unk_00; +} Special9ReadWriteData; // size = 0x4 + +typedef struct { + /* 0x00 */ Special9ReadOnlyData roData; + /* 0x0C */ Special9ReadWriteData rwData; +} Special9; // size = 0x10 + +#define SPECIAL9_FLAG_0 (1 << 0) +#define SPECIAL9_FLAG_1 (1 << 1) +#define SPECIAL9_FLAG_3 (1 << 3) + +typedef union { + Normal1 norm1; + Normal3 norm3; + Normal0 norm0; + Parallel1 para1; + Jump2 jump2; + Jump3 jump3; + Battle1 batt1; + KeepOn1 keep1; + KeepOn3 keep3; + KeepOn4 keep4; + Fixed1 fixd1; + Fixed2 fixd2; + Subject1 subj1; + Unique2 uniq2; + Unique0 uniq0; + Unique6 uniq6; + Demo1 demo1; + Demo2 demo2; + Demo3 demo3; + Demo4 demo4; + Demo5 demo5; + Demo0 demo0; + Special5 spec5; + struct { + /* 0x0 */ DoorParams doorParams; + /* 0xC */ union { + Special8 spec8; + Special9 spec9; + }; + }; +} CamParamData; // size = 0x50 + +/*================================ + * MAIN CAMERA STRUCT + *================================ + */ typedef struct Camera { - /* 0x000 */ u8 paramData[0x50]; // function Data, acts like a heap that's reset every time a new action function is switched to + /* 0x000 */ CamParamData paramData; // update function data that's reset every time a new update function is switched to /* 0x050 */ Vec3f at; /* 0x05C */ Vec3f eye; /* 0x068 */ Vec3f up; |
