diff --git a/include/functions.h b/include/functions.h index 9128e963fb..c12db921b1 100644 --- a/include/functions.h +++ b/include/functions.h @@ -1114,15 +1114,15 @@ u32 Camera_SetMode(Camera* camera, s16 mode, s8 param_3); s32 Camera_ChangeMode(Camera* camera, s16 mode); // void func_800DF86C(void); // void func_800DF8EC(void); -s32 func_800DFAC8(Camera* camera, s16 param_2); +s32 Camera_ChangeSetting(Camera* camera, s16 setting); u32 Camera_ChangeDataIdx(Camera* camera, u32 camDataIdx); // void func_800DFC1C(void); // void func_800DFC40(void); s32 Camera_GetInputDirYaw(Camera* camera); -void func_800DFC90(Vec3s* arg0, Camera* camera); +void Camera_GetCamDir(Vec3s* dst, Camera* camera); s16 Camera_GetCamDirPitch(Camera* camera); s16 Camera_GetCamDirYaw(Camera* camera); -void func_800DFD04(Camera* camera, s32 arg1, s32 arg2, s32 arg3); +void Camera_AddQuake(Camera* camera, s32 arg1, s16 y, s32 countdown); void func_800DFD78(Camera* camera, s32 paramFlag, void* value); // UNK_TYPE4 func_800DFEF0(s32 param_1, u16 param_2); // UNK_TYPE4 func_800DFF18(Camera* iParm1, UNK_TYPE2 uParm2); @@ -1130,7 +1130,7 @@ void func_800DFD78(Camera* camera, s32 paramFlag, void* value); // UNK_TYPE4 func_800DFF44(void); s16 Camera_SetFlags(Camera* iParm1, s16 flags); s16 Camera_ClearFlags(Camera* camera, s16 flags); -s32 func_800DFFAC(Camera* camera, Actor* doorActor, s16 bgCamDataId, f32 arg3, s16 timer1, s16 timer2, s16 timer3); +s32 Camera_ChangeDoorCam(Camera* camera, Actor* doorActor, s16 bgCamDataId, f32 arg3, s16 timer1, s16 timer2, s16 timer3); // UNK_TYPE4 func_800E007C(Camera* param_1, Camera* param_2); // UNK_TYPE4 func_800E01AC(void); Vec3f* Camera_GetQuakeOffset(Vec3f* dst, Camera* camera); @@ -2734,9 +2734,9 @@ void Game_UpdateFramerateVariables(s32 divisor); void Game_SetFramerateDivisor(GameState* gameState, s32 divisor); void GameState_SetFBFilter(Gfx** gfx, u32 arg1); void Game_Nop80173534(GameState* gameState); -void GameState_Draw(GameState* gameState, GraphicsContext* gCtxt); -void GameState_SetFrameBuffer(GraphicsContext* gCtxt); -void func_801736DC(GraphicsContext* gCtxt); +void GameState_Draw(GameState* gameState, GraphicsContext* gfxCtx); +void GameState_SetFrameBuffer(GraphicsContext* gfxCtx); +void func_801736DC(GraphicsContext* gfxCtx); void Game_UpdateInput(GameState* gameState); void Game_Update(GameState* gameState); void Game_IncrementFrameCount(GameState* gameState); diff --git a/include/macros.h b/include/macros.h index f252eabb9c..ec9d214bc6 100644 --- a/include/macros.h +++ b/include/macros.h @@ -19,8 +19,7 @@ #define VIRTUAL_TO_PHYSICAL(addr) (uintptr_t)((u8*)(addr) - RDRAM_CACHED) #define SEGMENTED_TO_VIRTUAL(addr) (void*)(PHYSICAL_TO_VIRTUAL(gSegments[SEGMENT_NUMBER(addr)]) + SEGMENT_OFFSET(addr)) -#define GET_ACTIVE_CAM(play) ((play)->cameraPtrs[(play)->activeCamera]) -#define CAM_ID_MAIN 0 +#define GET_ACTIVE_CAM(play) ((play)->cameraPtrs[(play)->activeCamId]) #define SET_NEXT_GAMESTATE(curState, newInit, newStruct) \ (curState)->nextGameStateInit = (GameStateFunc)newInit; \ diff --git a/include/variables.h b/include/variables.h index 9f4ba2353c..ae65131590 100644 --- a/include/variables.h +++ b/include/variables.h @@ -815,10 +815,10 @@ extern BgSpecialSceneMaxObjects sCustomDynapolyMem[]; // extern UNK_TYPE1 D_801B969C; // extern UNK_TYPE1 D_801B976C; // extern UNK_TYPE1 D_801B979C; -extern CameraStateParams cameraStates[91]; +// extern CameraStateParams cameraStates[91]; // extern UNK_TYPE1 D_801B9CE2; -extern UNK_PTR D_801B9CE4; -extern camera_update_func cameraUpdateFuncs[71]; +// extern UNK_PTR D_801B9CE4; +// extern camera_update_func cameraUpdateFuncs[71]; // extern UNK_TYPE2 D_801B9E04; // extern UNK_TYPE4 D_801B9E08; // extern UNK_TYPE4 D_801B9E0C; diff --git a/include/z64.h b/include/z64.h index 31837e561d..fafd8a40d4 100644 --- a/include/z64.h +++ b/include/z64.h @@ -29,6 +29,7 @@ #include "z64animation.h" #include "z64audio.h" #include "z64bgcheck.h" +#include "z64camera.h" #include "z64collision_check.h" #include "z64curve.h" #include "z64cutscene.h" @@ -443,7 +444,7 @@ typedef struct { /* 0x150 */ Vec3f curDistortionScale; /* 0x15C */ u16 normal; /* 0x160 */ u32 flags; // bit 3: Render to an orthographic perspective - /* 0x164 */ UNK_TYPE4 unk164; + /* 0x164 */ s32 unk164; } View; // size = 0x168 typedef void(*fault_update_input_func)(Input* input); @@ -1004,73 +1005,6 @@ typedef struct { /* 0x20 */ u32 unk20; } s801BB170; // size = 0x24 -typedef struct Camera { - /* 0x000 */ char paramData[0x50]; - /* 0x050 */ Vec3f at; - /* 0x05C */ Vec3f eye; - /* 0x068 */ Vec3f up; - /* 0x074 */ Vec3f eyeNext; - /* 0x080 */ Vec3f skyboxOffset; - /* 0x08C */ struct PlayState* play; - /* 0x090 */ struct Player* player; - /* 0x094 */ PosRot playerPosRot; - /* 0x0A8 */ struct Actor* target; - /* 0x0AC */ PosRot targetPosRot; - /* 0x0C0 */ f32 rUpdateRateInv; - /* 0x0C4 */ f32 pitchUpdateRateInv; - /* 0x0C8 */ f32 yawUpdateRateInv; - /* 0x0CC */ f32 yOffsetUpdateRate; - /* 0x0D0 */ f32 xzOffsetUpdateRate; - /* 0x0D4 */ f32 fovUpdateRate; - /* 0x0D8 */ f32 xzSpeed; - /* 0x0DC */ f32 dist; - /* 0x0E0 */ f32 speedRatio; - /* 0x0E4 */ Vec3f posOffset; - /* 0x0F0 */ Vec3f playerPosDelta; - /* 0x0FC */ f32 fov; - /* 0x100 */ f32 atLERPStepScale; - /* 0x104 */ f32 playerGroundY; - /* 0x108 */ Vec3f floorNorm; - /* 0x114 */ f32 waterYPos; - /* 0x118 */ s32 waterPrevCamIdx; - /* 0x11C */ s32 waterPrevCamSetting; - /* 0x120 */ s16 waterQuakeId; - /* 0x122 */ s16 unk122; - /* 0x124 */ void* data0; - /* 0x128 */ void* data1; - /* 0x12C */ s16 data2; - /* 0x12E */ s16 data3; - /* 0x130 */ s16 uid; - /* 0x132 */ UNK_TYPE1 pad132[2]; - /* 0x134 */ Vec3s inputDir; - /* 0x13A */ Vec3s camDir; - /* 0x140 */ s16 status; - /* 0x142 */ s16 setting; - /* 0x144 */ s16 mode; - /* 0x146 */ s16 bgCheckId; - /* 0x148 */ s16 camDataIdx; - /* 0x14A */ s16 flags1; - /* 0x14C */ s16 flags2; - /* 0x14E */ s16 childCamIdx; - /* 0x150 */ s16 unk150; - /* 0x152 */ s16 unk152; - /* 0x154 */ s16 prevSetting; - /* 0x156 */ s16 nextCamDataIdx; - /* 0x158 */ s16 nextBGCheckId; - /* 0x15A */ s16 roll; - /* 0x15C */ s16 paramFlags; - /* 0x15E */ s16 animState; - /* 0x160 */ s16 unk160; - /* 0x162 */ s16 timer; - /* 0x164 */ s16 camId; - /* 0x166 */ s16 prevCamDataIdx; - /* 0x168 */ s16 unk168; - /* 0x16A */ s16 unk16A; - /* 0x16C */ Vec3f meshActorPos; -} Camera; // size = 0x178 - -typedef s32(*camera_update_func)(Camera* camera); - typedef struct { /* 0x00 */ Vec3f atOffset; /* 0x0C */ Vec3f eyeOffset; @@ -1266,9 +1200,9 @@ struct PlayState { /* 0x000B4 */ char unk_B4[0x4]; /* 0x000B8 */ View view; /* 0x00220 */ Camera mainCamera; - /* 0x00398 */ Camera subCameras[3]; - /* 0x00800 */ Camera* cameraPtrs[4]; - /* 0x00810 */ s16 activeCamera; + /* 0x00398 */ Camera subCameras[NUM_CAMS - CAM_ID_SUB_FIRST]; + /* 0x00800 */ Camera* cameraPtrs[NUM_CAMS]; + /* 0x00810 */ s16 activeCamId; /* 0x00812 */ s16 nextCamera; /* 0x00814 */ SoundContext soundCtx; /* 0x00818 */ LightContext lightCtx; diff --git a/include/z64camera.h b/include/z64camera.h new file mode 100644 index 0000000000..e3b3a44838 --- /dev/null +++ b/include/z64camera.h @@ -0,0 +1,387 @@ +#ifndef Z64CAMERA_H +#define Z64CAMERA_H + +#include "ultra64.h" + +// these two angle conversion macros are slightly inaccurate +#define CAM_DEG_TO_BINANG(degrees) (s16)((degrees) * ((f32)0xFFFF / 360) + .5f) +#define CAM_BINANG_TO_DEG(binang) ((f32)(binang) * (360.0001525f / 0xFFFF)) + +#define NUM_CAMS 4 + +// Camera IDs are indices into `cameraPtrs` +#define CAM_ID_MAIN 0 // The index of the main camera +#define CAM_ID_SUB_FIRST 1 // The index sub cameras start at +#define CAM_ID_NONE -1 // Used to indicate no camera. Can be used to default to the active camera in some scenarios + +#define SUB_CAM_ID_DONE 0 // Used in some actors for variables holding sub camera IDs to indicate "subcam is finished" + +// 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) +#define CAM_BEHAVIOR_SETTING_USE_PRIORITY (1 << 0) // Use settings priority system +#define CAM_BEHAVIOR_SETTING_2 (1 << 4) +// Mode (0x2, 0x20) +#define CAM_BEHAVIOR_MODE_1 (1 << 1) +#define CAM_BEHAVIOR_MODE_2 (1 << 5) +// bgCam (0x4, 0x40) +#define CAM_BEHAVIOR_BGCAM_1 (1 << 2) +#define CAM_BEHAVIOR_BGCAM_2 (1 << 6) + +// Camera stateFlags. Variety of generic flags +#define CAM_STATE_0 (1 << 0) // Must be set for the camera from changing settings based on the bg surface +#define CAM_STATE_1 (1 << 1) +#define CAM_STATE_2 (1 << 2) +#define CAM_STATE_3 (1 << 3) +#define CAM_STATE_4 (1 << 4) +#define CAM_STATE_5 (1 << 5) +#define CAM_STATE_6 (1 << 6) +#define CAM_STATE_7 (1 << 7) +#define CAM_STATE_UNDERWATER (1 << 8) +#define CAM_STATE_9 (1 << 9) +#define CAM_STATE_10 (1 << 10) // Surpresses the camera from changing settings based on the bg surface +#define CAM_STATE_11 (1 << 11) +#define CAM_STATE_12 (1 << 12) +#define CAM_STATE_13 (1 << 13) +#define CAM_STATE_14 (1 << 14) +#define CAM_STATE_15 ((s16)(1 << 15)) + +// Camera viewFlags. Set params related to view +#define CAM_VIEW_AT (1 << 0) // camera->at +#define CAM_VIEW_EYE (1 << 1) // camera->eye and camera->eyeNext +#define CAM_VIEW_UP (1 << 2) // camera->up +#define CAM_VIEW_TARGET (1 << 3) // camera->target +#define CAM_VIEW_TARGET_POS (1 << 4) // camera->targetPosRot.pos +#define CAM_VIEW_FOV (1 << 5) // camera->fov +#define CAM_VIEW_ROLL (1 << 6) // camera->roll + +/** + * Camera Status type + * Determines how much the camera is updated each frame + * Higher values represents higher levels of activity + */ +// Camera is on +#define CAM_STATUS_CUT 0 // The camera is not updated at all +#define CAM_STATUS_WAIT 1 // There is minimally/partially updated, action function is not run +#define CAM_STATUS_UNK3 3 // The camera is mostly updated including running its action function, but data is not set to view +#define CAM_STATUS_ACTIVE 7 // The camera is fully updated, info is sent to view +// Camera is off +#define CAM_STATUS_INACTIVE 0x100 + +typedef enum { + /* 0x00 */ CAM_SET_NONE, + /* 0x01 */ CAM_SET_NORMAL0, // Generic camera 0, used in various places "NORMAL0" + /* 0x02 */ CAM_SET_NORMAL3, // Generic camera 3, used in various places "NORMAL3" + /* 0x03 */ CAM_SET_PIVOT_DIVING, // Player diving from the surface of the water to underwater not as zora "CIRCLE5" + /* 0x04 */ CAM_SET_HORSE, // Reiding a horse "HORSE0" + /* 0x05 */ CAM_SET_ZORA_DIVING, // Parallel's Pivot Diving, but as Zora. However, Zora does not dive like a human. So this setting appears to not be used "ZORA0" + /* 0x06 */ CAM_SET_PREREND_FIXED, // Unused remnant of OoT: camera is fixed in position and rotation "PREREND0" + /* 0x07 */ CAM_SET_PREREND_PIVOT, // Unused remnant of OoT: Camera is fixed in position with fixed pitch, but is free to rotate in the yaw direction 360 degrees "PREREND1" + /* 0x08 */ CAM_SET_DOORC, // Generic room door transitions, camera moves and follows player as the door is open and closed "DOORC" + /* 0x09 */ CAM_SET_DEMO0, // Unknown, possibly related to treasure chest game as goron? "DEMO0" + /* 0x0A */ CAM_SET_FREE0, // Free Camera, manual control is given, no auto-updating eye or at "FREE0" + /* 0x0B */ CAM_SET_BIRDS_EYE_VIEW_0, // Appears unused. Camera is a top-down view "FUKAN0" + /* 0x0C */ CAM_SET_NORMAL1, // Generic camera 1, used in various places "NORMAL1" + /* 0x0D */ CAM_SET_NANAME, // Unknown, slanted or tilted. Behaves identical to Normal0 except with added roll "NANAME" + /* 0x0E */ CAM_SET_CIRCLE0, // Used in Curiosity Shop, Pirates Fortress, Mayor's Residence "CIRCLE0" + /* 0x0F */ CAM_SET_FIXED0, // Used in Sakon's Hideout puzzle rooms, milk bar stage "FIXED0" + /* 0x10 */ CAM_SET_SPIRAL_DOOR, // Exiting a Spiral Staircase "SPIRAL" + /* 0x11 */ CAM_SET_DUNGEON0, // Generic dungeon camera 0, used in various places "DUNGEON0" + /* 0x12 */ CAM_SET_ITEM0, // Getting an item and holding it above Player's head (from small chest, freestanding, npc, ...) "ITEM0" + /* 0x13 */ CAM_SET_ITEM1, // Looking at player while playing the ocarina "ITEM1" + /* 0x14 */ CAM_SET_ITEM2, // Bottles: drinking, releasing fairy, dropping fish "ITEM2" + /* 0x15 */ CAM_SET_ITEM3, // Bottles: catching fish or bugs, showing an item "ITEM3" + /* 0x16 */ CAM_SET_NAVI, // Song of Soaring, variations of playing Song of Time "NAVI" + /* 0x17 */ CAM_SET_WARP_PAD_MOON, // Warp circles from Goron Trial on the moon "WARP0" + /* 0x18 */ CAM_SET_DEATH, // Player death animation when health goes to 0 "DEATH" + /* 0x19 */ CAM_SET_REBIRTH, // Unknown set with camDataId = -9 (it's not being revived by a fairy) "REBIRTH" + /* 0x1A */ CAM_SET_LONG_CHEST_OPENING, // Long cutscene when opening a big chest with a major item "TREASURE" + /* 0x1B */ CAM_SET_MASK_TRANSFORMATION, // Putting on a transformation mask "TRANSFORM" + /* 0x1C */ CAM_SET_ATTENTION, // Unknown, set with camDataId = -15 "ATTENTION" + /* 0x1D */ CAM_SET_WARP_PAD_ENTRANCE, // Warp pad from start of a dungeon to the boss-room "WARP1" + /* 0x1E */ CAM_SET_DUNGEON1, // Generic dungeon camera 1, used in various places "DUNGEON1" + /* 0x1F */ CAM_SET_FIXED1, // Fixes camera in place, used in various places eg. entering Stock Pot Inn, hiting a switch, giving witch a red potion, shop browsing "FIXED1" + /* 0x20 */ CAM_SET_FIXED2, // Used in Pinnacle Rock after defeating Sea Monsters, and by Tatl in Fortress "FIXED2" + /* 0x21 */ CAM_SET_MAZE, // Unused. Set to use Camera_Parallel2(), which is only Camera_Noop() "MAZE" + /* 0x22 */ CAM_SET_REMOTEBOMB, // Unused. Set to use Camera_Parallel2(), which is only Camera_Noop(). But also related to Play_ChangeCameraSetting? "REMOTEBOMB" + /* 0x23 */ CAM_SET_CIRCLE1, // Unknown "CIRCLE1" + /* 0x24 */ CAM_SET_CIRCLE2, // Looking at far-away NPCs eg. Garo in Road to Ikana, Hungry Goron, Tingle "CIRCLE2" + /* 0x25 */ CAM_SET_CIRCLE3, // Used in curiosity shop, goron racetrack, final room in Sakon's hideout, other places "CIRCLE3" + /* 0x26 */ CAM_SET_CIRCLE4, // Used during the races on the doggy racetrack "CIRCLE4" + /* 0x27 */ CAM_SET_FIXED3, // Used in Stock Pot Inn Toilet and Tatl cutscene after woodfall "FIXED3" + /* 0x28 */ CAM_SET_TOWER_ASCENT, // Various climbing structures (Snowhead climb to the temple entrance) "TOWER0" + /* 0x29 */ CAM_SET_PARALLEL0, // Unknown "PARALLEL0" + /* 0x2A */ CAM_SET_NORMALD, // Unknown, set with camDataId = -20 "NORMALD" + /* 0x2B */ CAM_SET_SUBJECTD, // Unknown, set with camDataId = -21 "SUBJECTD" + /* 0x2C */ CAM_SET_START0, // Entering a room, either Dawn of a New Day reload, or entering a door where the camera is fixed on the other end "START0" + /* 0x2D */ CAM_SET_START2, // Entering a scene, camera is put at a low angle eg. Grottos, Deku Palace, Stock Pot Inn "START2" + /* 0x2E */ CAM_SET_STOP0, // Called in z_play "STOP0" + /* 0x2F */ CAM_SET_BOAT_CRUISE, // Koume's boat cruise "JCRUISING" + /* 0x30 */ CAM_SET_VERTICAL_CLIMB, // Large vertical climbs, such as Mountain Village wall or Pirates Fortress ladder. "CLIMBMAZE" + /* 0x31 */ CAM_SET_SIDED, // Unknown, set with camDataId = -24 "SIDED" + /* 0x32 */ CAM_SET_DUNGEON2, // Generic dungeon camera 2, used in various places "DUNGEON2" + /* 0x33 */ CAM_SET_BOSS_ODOLWA, // Odolwa's Lair, also used in GBT entrance: "BOSS_SHIGE" + /* 0x34 */ CAM_SET_KEEPBACK, // Unknown. Possibly related to climbing something? "KEEPBACK" + /* 0x35 */ CAM_SET_CIRCLE6, // Used in select regions from Ikana "CIRCLE6" + /* 0x36 */ CAM_SET_CIRCLE7, // Unknown "CIRCLE7" + /* 0x37 */ CAM_SET_MINI_BOSS, // Used during the various minibosses of the "CHUBOSS" + /* 0x38 */ CAM_SET_RFIXED1, // Talking to Koume stuck on the floor in woods of mystery "RFIXED1" + /* 0x39 */ CAM_SET_TREASURE_CHEST_MINIGAME, // Treasure Chest Shop in East Clock Town, minigame location "TRESURE1" + /* 0x3A */ CAM_SET_HONEY_AND_DARLING_1, // Honey and Darling Minigames "BOMBBASKET" + /* 0x3B */ CAM_SET_CIRCLE8, // Used by Stone Tower moving platforms, Falling eggs in Marine Lab, Bugs into soilpatch cutscene "CIRCLE8" + /* 0x3C */ CAM_SET_BIRDS_EYE_VIEW_1, // Camera is a top-down view. Used in Fisherman's minigame and Deku Palace "FUKAN1" + /* 0x3D */ CAM_SET_DUNGEON3, // Generic dungeon camera 3, used in various places "DUNGEON3" + /* 0x3E */ CAM_SET_TELESCOPE, // Observatory telescope and Curiosity Shop Peep-Hole "TELESCOPE" + /* 0x3F */ CAM_SET_ROOM0, // Certain rooms eg. inside the clock tower "ROOM0" + /* 0x40 */ CAM_SET_RCIRC0, // Used by a few NPC cutscenes, focus close on the NPC "RCIRC0" + /* 0x41 */ CAM_SET_CIRCLE9, // Used by Sakon Hideout entrance and Deku Palace Maze "CIRCLE9" + /* 0x42 */ CAM_SET_ONTHEPOLE, // Somewhere in Snowhead Temple and Woodfall Temple "ONTHEPOLE" + /* 0x43 */ CAM_SET_INBUSH, // Various bush environments eg. grottos, Swamp Spider House, Termina Field grass bushes, Deku Palace near bean "INBUSH" + /* 0x44 */ CAM_SET_BOSS_MAJORA, // Majora's Lair: "BOSS_LAST" + /* 0x45 */ CAM_SET_BOSS_TWINMOLD, // Twinmold's Lair: "BOSS_INI" + /* 0x46 */ CAM_SET_BOSS_GOHT, // Goht's Lair: "BOSS_HAK" + /* 0x47 */ CAM_SET_BOSS_GYORG, // Gyorg's Lair: "BOSS_KON" + /* 0x48 */ CAM_SET_CONNECT0, // Smoothly and gradually return camera to Player after a cutscene "CONNECT0" + /* 0x49 */ CAM_SET_PINNACLE_ROCK, // Pinnacle Rock pit "MORAY" + /* 0x4A */ CAM_SET_NORMAL2, // Generic camera 2, used in various places "NORMAL2" + /* 0x4B */ CAM_SET_HONEY_AND_DARLING_2, // "BOMBBOWL" + /* 0x4C */ CAM_SET_CIRCLEA, // Unknown, Circle 10 "CIRCLEA" + /* 0x4D */ CAM_SET_WHIRLPOOL, // Great Bay Temple Central Room Whirlpool "WHIRLPOOL" + /* 0x4E */ CAM_SET_CUCCO_SHACK, // "KOKKOGAME" + /* 0x4F */ CAM_SET_GIANT, // Giants Mask in Twinmold's Lair "GIANT" + /* 0x50 */ CAM_SET_SCENE0, // Entering doors to a new scene "SCENE0" + /* 0x51 */ CAM_SET_ROOM1, // Certain rooms eg. some rooms in Stock Pot Inn "ROOM1" + /* 0x52 */ CAM_SET_WATER2, // Swimming as Zora in Great Bay Temple "WATER2" + /* 0x53 */ CAM_SET_WOODFALL_SWAMP, // Woodfall inside the swamp, but not on the platforms, "SOKONASI" + /* 0x54 */ CAM_SET_FORCEKEEP, // Unknown "FORCEKEEP" + /* 0x55 */ CAM_SET_PARALLEL1, // Unknown "PARALLEL1" + /* 0x56 */ CAM_SET_START1, // Used when entering the lens cave "START1" + /* 0x57 */ CAM_SET_ROOM2, // Certain rooms eg. Deku King's Chamber, Ocean Spider House "ROOM2" + /* 0x58 */ CAM_SET_NORMAL4, // Generic camera 4, used in Ikana Graveyard "NORMAL4" + /* 0x59 */ CAM_SET_ELEGY_SHELL, // cutscene after playing elegy of emptyness and spawning a shell "SHELL" + /* 0x5A */ CAM_SET_DUNGEON4, // Used in Pirates Fortress Interior, hidden room near hookshot "DUNGEON4" + /* 0x5B */ CAM_SET_MAX +} CameraSettingType; + +typedef enum { + /* 0x00 */ CAM_MODE_NORMAL, // "NORMAL" + /* 0x01 */ CAM_MODE_JUMP, // "JUMP" + /* 0x02 */ CAM_MODE_GORONDASH, // "GORONDASH" + /* 0x03 */ CAM_MODE_DEKUSHOOT, // "NUTSSHOT" + /* 0x04 */ CAM_MODE_BOWARROWZ, // "BOWARROWZ" + /* 0x05 */ CAM_MODE_DEKUFLY, // "NUTSFLY" + /* 0x06 */ CAM_MODE_FIRSTPERSON, // "SUBJECT" + /* 0x07 */ CAM_MODE_FOLLOWBOOMERANG, // "BOOKEEPON" + /* 0x08 */ CAM_MODE_ZORAFIN, // "ZORAFIN" + /* 0x09 */ CAM_MODE_FOLLOWTARGET, // "KEEPON" + /* 0x0A */ CAM_MODE_TARGET, // "PARALLEL" + /* 0x0B */ CAM_MODE_TALK, // "TALK" + /* 0x0C */ CAM_MODE_SLINGSHOT, // "PACHINCO" + /* 0x0D */ CAM_MODE_BOWARROW, // "BOWARROW" + /* 0x0E */ CAM_MODE_BATTLE, // "BATTLE" + /* 0x0F */ CAM_MODE_DEKUHIDE, // "NUTSHIDE" + /* 0x10 */ CAM_MODE_STILL, // "STILL" + /* 0x11 */ CAM_MODE_CHARGE, // "CHARGE" + /* 0x12 */ CAM_MODE_CLIMB, // "CLIMB" + /* 0x13 */ CAM_MODE_CLIMBZ, // "CLIMBZ" + /* 0x14 */ CAM_MODE_HOOKSHOT, // "FOOKSHOT" + /* 0x15 */ CAM_MODE_FREEFALL, // "FREEFALL" + /* 0x16 */ CAM_MODE_HANG, // "HANG" + /* 0x17 */ CAM_MODE_HANGZ, // "HANGZ + /* 0x18 */ CAM_MODE_PUSHPULL, // "PUSHPULL" + /* 0x19 */ CAM_MODE_DEKUFLYZ, // "CNUTSFLYZ" + /* 0x1A */ CAM_MODE_GORONJUMP, // "GORONJUMP" + /* 0x1B */ CAM_MODE_BOOMERANG, // "BOOMERANG" + /* 0x1C */ CAM_MODE_CHARGEZ, // "CHARGEZ" + /* 0x1D */ CAM_MODE_ZORAFINZ, // "ZORAFINZ" + /* 0x1E */ CAM_MODE_MAX +} CameraModeType; + +typedef enum { + /* 0x00 */ CAM_FUNC_NONE, + /* 0x01 */ CAM_FUNC_NORMAL0, + /* 0x02 */ CAM_FUNC_NORMAL1, + /* 0x03 */ CAM_FUNC_NORMAL2, + /* 0x04 */ CAM_FUNC_NORMAL3, + /* 0x05 */ CAM_FUNC_NORMAL4, + /* 0x06 */ CAM_FUNC_PARALLEL0, + /* 0x07 */ CAM_FUNC_PARALLEL1, + /* 0x08 */ CAM_FUNC_PARALLEL2, + /* 0x09 */ CAM_FUNC_PARALLEL3, + /* 0x0A */ CAM_FUNC_PARALLEL4, + /* 0x0B */ CAM_FUNC_KEEPON0, + /* 0x0C */ CAM_FUNC_KEEPON1, + /* 0x0D */ CAM_FUNC_KEEPON2, + /* 0x0E */ CAM_FUNC_KEEPON3, + /* 0x0F */ CAM_FUNC_KEEPON4, + /* 0x10 */ CAM_FUNC_SUBJECT0, + /* 0x11 */ CAM_FUNC_SUBJECT1, + /* 0x12 */ CAM_FUNC_SUBJECT2, + /* 0x13 */ CAM_FUNC_SUBJECT3, + /* 0x14 */ CAM_FUNC_SUBJECT4, + /* 0x15 */ CAM_FUNC_JUMP0, + /* 0x16 */ CAM_FUNC_JUMP1, + /* 0x17 */ CAM_FUNC_JUMP2, + /* 0x18 */ CAM_FUNC_JUMP3, + /* 0x19 */ CAM_FUNC_JUMP4, + /* 0x1A */ CAM_FUNC_BATTLE0, + /* 0x1B */ CAM_FUNC_BATTLE1, + /* 0x1C */ CAM_FUNC_BATTLE2, + /* 0x1D */ CAM_FUNC_BATTLE3, + /* 0x1E */ CAM_FUNC_BATTLE4, + /* 0x1F */ CAM_FUNC_FIXED0, + /* 0x20 */ CAM_FUNC_FIXED1, + /* 0x21 */ CAM_FUNC_FIXED2, + /* 0x22 */ CAM_FUNC_FIXED3, + /* 0x23 */ CAM_FUNC_FIXED4, + /* 0x24 */ CAM_FUNC_DATA0, + /* 0x25 */ CAM_FUNC_DATA1, + /* 0x26 */ CAM_FUNC_DATA2, + /* 0x27 */ CAM_FUNC_DATA3, + /* 0x28 */ CAM_FUNC_DATA4, + /* 0x29 */ CAM_FUNC_UNIQUE0, + /* 0x2A */ CAM_FUNC_UNIQUE1, + /* 0x2B */ CAM_FUNC_UNIQUE2, + /* 0x2C */ CAM_FUNC_UNIQUE3, + /* 0x2D */ CAM_FUNC_UNIQUE4, + /* 0x2E */ CAM_FUNC_UNIQUE5, + /* 0x2F */ CAM_FUNC_UNIQUE6, + /* 0x30 */ CAM_FUNC_UNIQUE7, + /* 0x31 */ CAM_FUNC_UNIQUE8, + /* 0x32 */ CAM_FUNC_UNIQUE9, + /* 0x33 */ CAM_FUNC_DEMO0, + /* 0x34 */ CAM_FUNC_DEMO1, + /* 0x35 */ CAM_FUNC_DEMO2, + /* 0x36 */ CAM_FUNC_DEMO3, + /* 0x37 */ CAM_FUNC_DEMO4, + /* 0x38 */ CAM_FUNC_DEMO5, + /* 0x39 */ CAM_FUNC_DEMO6, + /* 0x3A */ CAM_FUNC_DEMO7, + /* 0x3B */ CAM_FUNC_DEMO8, + /* 0x3C */ CAM_FUNC_DEMO9, + /* 0x3D */ CAM_FUNC_SPECIAL0, + /* 0x3E */ CAM_FUNC_SPECIAL1, + /* 0x3F */ CAM_FUNC_SPECIAL2, + /* 0x40 */ CAM_FUNC_SPECIAL3, + /* 0x41 */ CAM_FUNC_SPECIAL4, + /* 0x42 */ CAM_FUNC_SPECIAL5, + /* 0x43 */ CAM_FUNC_SPECIAL6, + /* 0x44 */ CAM_FUNC_SPECIAL7, + /* 0x45 */ CAM_FUNC_SPECIAL8, + /* 0x46 */ CAM_FUNC_SPECIAL9, + /* 0x47 */ CAM_FUNC_MAX +} CameraFuncType; + +typedef enum { + /* 0x00 */ CAM_DATA_00, + /* 0x01 */ CAM_DATA_01, + /* 0x02 */ CAM_DATA_02, + /* 0x03 */ CAM_DATA_03, + /* 0x04 */ CAM_DATA_04, + /* 0x05 */ CAM_DATA_05, + /* 0x06 */ CAM_DATA_06, + /* 0x07 */ CAM_DATA_07, + /* 0x08 */ CAM_DATA_08, + /* 0x09 */ CAM_DATA_09, + /* 0x0A */ CAM_DATA_10, + /* 0x0B */ CAM_DATA_11, + /* 0x0C */ CAM_DATA_12, + /* 0x0D */ CAM_DATA_13, + /* 0x0E */ CAM_DATA_14, + /* 0x0F */ CAM_DATA_15, + /* 0x10 */ CAM_DATA_16, + /* 0x11 */ CAM_DATA_17, + /* 0x12 */ CAM_DATA_18, + /* 0x13 */ CAM_DATA_19, + /* 0x14 */ CAM_DATA_20, + /* 0x15 */ CAM_DATA_21, +} CameraDataType; + +typedef struct { + /* 0x0 */ s16 val; + /* 0x2 */ s16 param; +} CameraModeValue; // size = 0x4 + +typedef struct { + /* 0x0 */ s16 funcId; + /* 0x2 */ s16 numValues; + /* 0x4 */ CameraModeValue* values; +} CameraMode; // size = 0x8 + +/** + * 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 + */ +typedef struct { + /* 0x0 */ u32 validModes; + /* 0x4 */ u32 flags; + /* 0x8 */ CameraMode* cameraModes; +} CameraSetting; // size = 0xC + +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 + /* 0x050 */ Vec3f at; + /* 0x05C */ Vec3f eye; + /* 0x068 */ Vec3f up; + /* 0x074 */ Vec3f eyeNext; + /* 0x080 */ Vec3f quakeOffset; + /* 0x08C */ struct PlayState* play; + /* 0x090 */ Actor* focalActor; // the actor the camera is focused on. Most often Player, but can be any actor + /* 0x094 */ PosRot focalActorPosRot; + /* 0x0A8 */ Actor* target; // the actor that is being z-targeted + /* 0x0AC */ PosRot targetPosRot; + /* 0x0C0 */ f32 rUpdateRateInv; + /* 0x0C4 */ f32 pitchUpdateRateInv; + /* 0x0C8 */ f32 yawUpdateRateInv; + /* 0x0CC */ f32 yOffsetUpdateRate; + /* 0x0D0 */ f32 xzOffsetUpdateRate; + /* 0x0D4 */ f32 fovUpdateRate; + /* 0x0D8 */ f32 xzSpeed; + /* 0x0DC */ f32 dist; + /* 0x0E0 */ f32 speedRatio; + /* 0x0E4 */ Vec3f atActorOffset; + /* 0x0F0 */ Vec3f focalActorOffset; + /* 0x0FC */ f32 fov; + /* 0x100 */ f32 atLerpStepScale; + /* 0x104 */ f32 playerFloorHeight; + /* 0x108 */ Vec3f floorNorm; + /* 0x114 */ f32 waterYPos; + /* 0x118 */ s32 waterPrevBgCamDataId; + /* 0x11C */ s32 waterPrevCamSetting; + /* 0x120 */ s16 waterQuakeId; + /* 0x122 */ s16 unk122; + /* 0x124 */ void* data0; + /* 0x128 */ void* data1; + /* 0x12C */ s16 data2; + /* 0x12E */ s16 data3; + /* 0x130 */ s16 uid; + /* 0x132 */ UNK_TYPE1 unk_132[2]; + /* 0x134 */ Vec3s inputDir; + /* 0x13A */ Vec3s camDir; + /* 0x140 */ s16 status; + /* 0x142 */ s16 setting; + /* 0x144 */ s16 mode; + /* 0x146 */ s16 bgId; + /* 0x148 */ s16 bgCamDataId; + /* 0x14A */ s16 behaviorFlags; + /* 0x14C */ s16 stateFlags; + /* 0x14E */ s16 childCamId; + /* 0x150 */ s16 doorTimer1; // a door timer used when door cam is indexed from bgCamDataId + /* 0x152 */ s16 unk152; + /* 0x154 */ s16 prevSetting; + /* 0x156 */ s16 nextCamSceneDataId; + /* 0x158 */ s16 nextBgId; + /* 0x15A */ s16 roll; + /* 0x15C */ s16 viewFlags; + /* 0x15E */ s16 animState; // Determines the current state of the current camera behavior function + /* 0x160 */ s16 unk160; + /* 0x162 */ s16 doorTimer2; // a door timer used when door cam is indexed from bgCamDataId + /* 0x164 */ s16 camId; + /* 0x166 */ s16 prevBgCamDataId; + /* 0x168 */ s16 unk168; + /* 0x16C */ Vec3f meshActorPos; +} Camera; // size = 0x178 + +#endif diff --git a/include/z64math.h b/include/z64math.h index 0095e12abd..3732222ccf 100644 --- a/include/z64math.h +++ b/include/z64math.h @@ -111,11 +111,9 @@ typedef struct { // Angle conversion macros #define DEG_TO_BINANG(degrees) (s16)((degrees) * (0x8000 / 180.0f)) -#define DEGF_TO_BINANG(degreesf) (s16)((degreesf) * 182.04167f + .5f) #define RADF_TO_BINANG(radf) (s16)((radf) * (0x8000 / M_PI)) #define RADF_TO_DEGF(radf) ((radf) * (180.0f / M_PI)) #define DEGF_TO_RADF(degf) ((degf) * (M_PI / 180.0f)) -#define BINANG_TO_DEGF(binang) ((f32)binang * (360.0001525f / 65535.0f)) #define BINANG_TO_RAD(binang) (((f32)binang / 0x8000) * M_PI) // Angle arithmetic macros diff --git a/src/code/z_actor.c b/src/code/z_actor.c index 34d32736fd..f97d8ea1d0 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -1343,7 +1343,7 @@ void Actor_SetCameraHorseSetting(PlayState* play, Player* player) { EnHorse* rideActor = (EnHorse*)player->rideActor; if ((rideActor != NULL) && !(rideActor->unk_1EC & 0x10)) { - func_800DFAC8(Play_GetCamera(play, CAM_ID_MAIN), 4); + Camera_ChangeSetting(Play_GetCamera(play, CAM_ID_MAIN), CAM_SET_HORSE); } } } @@ -2508,10 +2508,10 @@ void Actor_Draw(PlayState* play, Actor* actor) { Lights_Draw(light, play->state.gfxCtx); if (actor->flags & ACTOR_FLAG_1000) { - Matrix_SetTranslateRotateYXZ(actor->world.pos.x + play->mainCamera.skyboxOffset.x, + Matrix_SetTranslateRotateYXZ(actor->world.pos.x + play->mainCamera.quakeOffset.x, actor->world.pos.y + - ((actor->shape.yOffset * actor->scale.y) + play->mainCamera.skyboxOffset.y), - actor->world.pos.z + play->mainCamera.skyboxOffset.z, &actor->shape.rot); + ((actor->shape.yOffset * actor->scale.y) + play->mainCamera.quakeOffset.y), + actor->world.pos.z + play->mainCamera.quakeOffset.z, &actor->shape.rot); } else { Matrix_SetTranslateRotateYXZ(actor->world.pos.x, actor->world.pos.y + (actor->shape.yOffset * actor->scale.y), actor->world.pos.z, &actor->shape.rot); diff --git a/src/code/z_camera.c b/src/code/z_camera.c index d3f1f92033..aaf68c7598 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -318,7 +318,7 @@ #pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DF8EC.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFAC8.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeSetting.s") #pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeDataIdx.s") @@ -328,13 +328,13 @@ #pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetInputDirYaw.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFC90.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetCamDir.s") #pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetCamDirPitch.s") #pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetCamDirYaw.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFD04.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_AddQuake.s") #pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFD78.s") @@ -350,7 +350,7 @@ #pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ClearFlags.s") -#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFFAC.s") +#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeDoorCam.s") #pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E007C.s") diff --git a/src/code/z_olib.c b/src/code/z_olib.c index 6f1cdbc552..2b6b8d1391 100644 --- a/src/code/z_olib.c +++ b/src/code/z_olib.c @@ -123,14 +123,14 @@ VecSph* OLib_Vec3fToVecSph(VecSph* dest, Vec3f* vec) { if ((dist == 0.0f) && (vec->y == 0.0f)) { sph.pitch = 0; } else { - sph.pitch = DEGF_TO_BINANG(RADF_TO_DEGF(func_80086B30(dist, vec->y))); + sph.pitch = CAM_DEG_TO_BINANG(RADF_TO_DEGF(func_80086B30(dist, vec->y))); } sph.r = sqrtf(SQ(vec->y) + distSquared); if ((vec->x == 0.0f) && (vec->z == 0.0f)) { sph.yaw = 0; } else { - sph.yaw = DEGF_TO_BINANG(RADF_TO_DEGF(func_80086B30(vec->x, vec->z))); + sph.yaw = CAM_DEG_TO_BINANG(RADF_TO_DEGF(func_80086B30(vec->x, vec->z))); } *dest = sph; @@ -238,8 +238,8 @@ Vec3s* OLib_Vec3fDiffBinAng(Vec3s* dest, Vec3f* a, Vec3f* b) { OLib_Vec3fDiffRad(&anglesRad, a, b); - anglesBinAng.x = DEGF_TO_BINANG(RADF_TO_DEGF(anglesRad.x)); - anglesBinAng.y = DEGF_TO_BINANG(RADF_TO_DEGF(anglesRad.y)); + anglesBinAng.x = CAM_DEG_TO_BINANG(RADF_TO_DEGF(anglesRad.x)); + anglesBinAng.y = CAM_DEG_TO_BINANG(RADF_TO_DEGF(anglesRad.y)); anglesBinAng.z = 0.0f; *dest = anglesBinAng; diff --git a/src/code/z_quake.c b/src/code/z_quake.c index 2ada2ba789..7caa0f4261 100644 --- a/src/code/z_quake.c +++ b/src/code/z_quake.c @@ -756,8 +756,8 @@ void Distortion_Update(void) { return; } - depthPhase += DEGF_TO_BINANG(depthPhaseStep); - screenPlanePhase += DEGF_TO_BINANG(screenPlanePhaseStep); + depthPhase += CAM_DEG_TO_BINANG(depthPhaseStep); + screenPlanePhase += CAM_DEG_TO_BINANG(screenPlanePhaseStep); View_SetDistortionDirRot(&sDistortionContext.play->view, Math_CosS(depthPhase) * (DEGF_TO_RADF(rotX) * xyScaleFactor), diff --git a/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.c b/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.c index a064823f4a..2ca48b346e 100644 --- a/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.c +++ b/src/overlays/actors/ovl_Bg_Ctower_Rot/z_bg_ctower_rot.c @@ -85,7 +85,7 @@ void BgCtowerRot_CorridorRotate(BgCtowerRot* this, PlayState* play) { Actor_OffsetOfPointInActorCoords(&this->dyna.actor, &offset, &player->actor.world.pos); rotZ = CLAMP(1100.0f - offset.z, 0.0f, 1000.0f); - func_800DFAC8(play->cameraPtrs[CAM_ID_MAIN], 17); + Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_DUNGEON0); this->dyna.actor.shape.rot.z = rotZ * 16.384f; if (play->csCtx.frames == 132) { diff --git a/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c b/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c index 8db63aaf91..e619aa7e0c 100644 --- a/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c +++ b/src/overlays/actors/ovl_Bg_Ikana_Dharma/z_bg_ikana_dharma.c @@ -226,7 +226,7 @@ void BgIkanaDharma_Update(Actor* thisx, PlayState* play) { Actor_MoveWithGravity(&this->dyna.actor); Actor_UpdateBgCheckInfo(play, &this->dyna.actor, 0.0f, 0.0f, 0.0f, 4); if (this->dyna.actor.bgCheckFlags & 2) { - s16 quake = Quake_Add(play->cameraPtrs[play->activeCamera], 3); + s16 quake = Quake_Add(GET_ACTIVE_CAM(play), 3); Quake_SetSpeed(quake, 21536); Quake_SetQuakeValues(quake, 4, 0, 0, 0); diff --git a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c index 34e0eb4849..fb799fa5c6 100644 --- a/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c +++ b/src/overlays/actors/ovl_Bg_Ingate/z_bg_ingate.c @@ -130,14 +130,14 @@ s32 func_80953DA8(BgIngate* this, PlayState* play) { } else { gSaveContext.eventInf[4] |= 2; } - func_800DFAC8(camera, 47); + Camera_ChangeSetting(camera, CAM_SET_BOAT_CRUISE); play->unk_1887C = 0x63; return false; } void func_80953E38(PlayState* play) { - func_800DFAC8(Play_GetCamera(play, CAM_ID_MAIN), 1); + Camera_ChangeSetting(Play_GetCamera(play, CAM_ID_MAIN), CAM_SET_NORMAL0); if (!(gSaveContext.eventInf[3] & 0x20)) { gSaveContext.eventInf[4] &= (u8)~2; @@ -214,11 +214,11 @@ void func_80953F9C(BgIngate* this, PlayState* play) { } if (ActorCutscene_GetCurrentIndex() != this->unk16E) { if (ActorCutscene_GetCurrentIndex() != -1) { - func_800DFAC8(camera, 1); + Camera_ChangeSetting(camera, CAM_SET_NORMAL0); player->stateFlags1 |= 0x20; play->actorCtx.unk5 &= ~0x4; } else { - func_800DFAC8(camera, 47); + Camera_ChangeSetting(camera, CAM_SET_BOAT_CRUISE); player->stateFlags1 &= ~0x20; } } diff --git a/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.c b/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.c index ebcfc1f830..b54e7a5832 100644 --- a/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.c +++ b/src/overlays/actors/ovl_Bg_Open_Shutter/z_bg_open_shutter.c @@ -111,7 +111,7 @@ void func_80ACAD88(BgOpenShutter* this, PlayState* play) { Player* player = GET_PLAYER(play); Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_SLIDE_DOOR_OPEN); - func_800DFFAC(play->cameraPtrs[0], &this->dyna.actor, player->unk_3BA, 0.0f, 12, 15, 10); + Camera_ChangeDoorCam(play->cameraPtrs[CAM_ID_MAIN], &this->dyna.actor, player->unk_3BA, 0.0f, 12, 15, 10); this->unk_164 = 0; this->actionFunc = func_80ACAE5C; this->dyna.actor.velocity.y = 0.0f; diff --git a/src/overlays/actors/ovl_Boss_02/z_boss_02.c b/src/overlays/actors/ovl_Boss_02/z_boss_02.c index d960f68193..c5b1d1208f 100644 --- a/src/overlays/actors/ovl_Boss_02/z_boss_02.c +++ b/src/overlays/actors/ovl_Boss_02/z_boss_02.c @@ -1633,8 +1633,8 @@ void func_809DD934(Boss02* this, PlayState* play) { if (player->stateFlags1 & 0x100) { Cutscene_Start(play, &play->csCtx); this->unk_1D22 = Play_CreateSubCamera(play); - Play_CameraChangeStatus(play, CAM_ID_MAIN, 1); - Play_CameraChangeStatus(play, this->unk_1D22, 7); + Play_CameraChangeStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); + Play_CameraChangeStatus(play, this->unk_1D22, CAM_STATUS_ACTIVE); func_8016566C(150); this->unk_1D14 = 0; this->unk_1D5C = 0.0f; @@ -2059,8 +2059,8 @@ void func_809DEAC4(Boss02* this, PlayState* play) { } Cutscene_Start(play, &play->csCtx); this->unk_1D22 = Play_CreateSubCamera(play); - Play_CameraChangeStatus(play, CAM_ID_MAIN, 1); - Play_CameraChangeStatus(play, this->unk_1D22, 7); + Play_CameraChangeStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); + Play_CameraChangeStatus(play, this->unk_1D22, CAM_STATUS_ACTIVE); this->unk_1D20 = 2; this->unk_1D1C = 0; @@ -2156,8 +2156,8 @@ void func_809DEAC4(Boss02* this, PlayState* play) { if (ActorCutscene_GetCurrentIndex() == -1) { Cutscene_Start(play, &play->csCtx); this->unk_1D22 = Play_CreateSubCamera(play); - Play_CameraChangeStatus(play, CAM_ID_MAIN, 1); - Play_CameraChangeStatus(play, this->unk_1D22, 7); + Play_CameraChangeStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); + Play_CameraChangeStatus(play, this->unk_1D22, CAM_STATUS_ACTIVE); this->unk_1D20 = 101; this->unk_1D1C = 0; this->unk_1D5C = 1.0f; diff --git a/src/overlays/actors/ovl_Boss_03/z_boss_03.c b/src/overlays/actors/ovl_Boss_03/z_boss_03.c index 045ff53b5b..37a584f535 100644 --- a/src/overlays/actors/ovl_Boss_03/z_boss_03.c +++ b/src/overlays/actors/ovl_Boss_03/z_boss_03.c @@ -1151,8 +1151,8 @@ void Boss03_IntroCutscene(Boss03* this, PlayState* play) { Cutscene_Start(play, &play->csCtx); func_800B7298(play, &this->actor, 7); this->csCamId = Play_CreateSubCamera(play); - Play_CameraChangeStatus(play, CAM_ID_MAIN, 1); - Play_CameraChangeStatus(play, this->csCamId, 7); + Play_CameraChangeStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); + Play_CameraChangeStatus(play, this->csCamId, CAM_STATUS_ACTIVE); this->actor.world.rot.y = -0x7B30; this->prevPlayerPos.y = 1850.0f; @@ -1451,8 +1451,8 @@ void Boss03_DeathCutscene(Boss03* this, PlayState* play) { Cutscene_Start(play, &play->csCtx); func_800B7298(play, &this->actor, 1); this->csCamId = Play_CreateSubCamera(play); - Play_CameraChangeStatus(play, CAM_ID_MAIN, 1); - Play_CameraChangeStatus(play, this->csCamId, 7); + Play_CameraChangeStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); + Play_CameraChangeStatus(play, this->csCamId, CAM_STATUS_ACTIVE); this->unk_2BE = Math_FAtan2F(this->actor.world.pos.z, this->actor.world.pos.x); // Player is above water && Player is standing on ground @@ -1665,8 +1665,8 @@ void Boss03_SpawnSmallFishesCutscene(Boss03* this, PlayState* play) { Cutscene_Start(play, &play->csCtx); func_800B7298(play, &this->actor, 1); this->csCamId = Play_CreateSubCamera(play); - Play_CameraChangeStatus(play, CAM_ID_MAIN, 1); - Play_CameraChangeStatus(play, this->csCamId, 7); + Play_CameraChangeStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); + Play_CameraChangeStatus(play, this->csCamId, CAM_STATUS_ACTIVE); this->csState = 1; this->unk_2BE = 0xBB8; @@ -2441,8 +2441,7 @@ void Boss03_DrawEffects(PlayState* play) { Matrix_Translate(eff->pos.x, eff->pos.y, eff->pos.z, MTXMODE_NEW); if (eff->type == GYORG_EFFECT_DROPLET) { - Matrix_RotateYF(Camera_GetInputDirYaw(play->cameraPtrs[play->activeCamera]) * (M_PI / 0x8000), - MTXMODE_APPLY); + Matrix_RotateYF(Camera_GetInputDirYaw(GET_ACTIVE_CAM(play)) * (M_PI / 0x8000), MTXMODE_APPLY); } else { // GYORG_EFFECT_SPLASH Matrix_ReplaceRotation(&play->billboardMtxF); } diff --git a/src/overlays/actors/ovl_Boss_04/z_boss_04.c b/src/overlays/actors/ovl_Boss_04/z_boss_04.c index 8d6bf58795..a04e459a2a 100644 --- a/src/overlays/actors/ovl_Boss_04/z_boss_04.c +++ b/src/overlays/actors/ovl_Boss_04/z_boss_04.c @@ -260,8 +260,8 @@ void func_809EC568(Boss04* this, PlayState* play) { this->unk_704 = 0; Cutscene_Start(play, &play->csCtx); this->unk_70A = Play_CreateSubCamera(play); - Play_CameraChangeStatus(play, CAM_ID_MAIN, 1); - Play_CameraChangeStatus(play, this->unk_70A, 7); + Play_CameraChangeStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); + Play_CameraChangeStatus(play, this->unk_70A, CAM_STATUS_ACTIVE); func_800B7298(play, &this->actor, 7); player->actor.world.pos.x = this->unk_6E8; player->actor.world.pos.z = this->unk_6F0 + 410.0f; diff --git a/src/overlays/actors/ovl_Boss_06/z_boss_06.c b/src/overlays/actors/ovl_Boss_06/z_boss_06.c index 4467a5658b..c07406760c 100644 --- a/src/overlays/actors/ovl_Boss_06/z_boss_06.c +++ b/src/overlays/actors/ovl_Boss_06/z_boss_06.c @@ -201,8 +201,8 @@ void func_809F24C8(Boss06* this, PlayState* play) { Cutscene_Start(play, &play->csCtx); func_800B7298(play, &this->actor, 7); this->unk_A00 = Play_CreateSubCamera(play); - Play_CameraChangeStatus(play, CAM_ID_MAIN, 1); - Play_CameraChangeStatus(play, this->unk_A00, 7); + Play_CameraChangeStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); + Play_CameraChangeStatus(play, this->unk_A00, CAM_STATUS_ACTIVE); D_809F4970->unk_151 = 1; this->unk_1C9 = 1; this->unk_1C8 = 1; diff --git a/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c index 57347e4e22..8aba01fc05 100644 --- a/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c +++ b/src/overlays/actors/ovl_Demo_Kankyo/z_demo_kankyo.c @@ -502,7 +502,7 @@ void DemoKakyo_DrawLostWoodsSparkle(Actor* thisx, PlayState* play2) { Vec3f screenPos; // if not underwater - if (!(play->cameraPtrs[CAM_ID_MAIN]->flags2 & 0x100)) { + if (!(play->cameraPtrs[CAM_ID_MAIN]->stateFlags & CAM_STATE_UNDERWATER)) { OPEN_DISPS(play->state.gfxCtx); POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 20); diff --git a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c index c64205aa27..8595dbde0c 100644 --- a/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c +++ b/src/overlays/actors/ovl_Door_Shutter/z_door_shutter.c @@ -405,7 +405,7 @@ void func_808A1288(DoorShutter* this, PlayState* play) { this->unk_164 = sp38; this->unk_168 = 0.0f; - func_800DFFAC(play->cameraPtrs[CAM_ID_MAIN], &this->actor, player->unk_3BA, this->unk_168, 12, sp34, 10); + Camera_ChangeDoorCam(play->cameraPtrs[CAM_ID_MAIN], &this->actor, player->unk_3BA, this->unk_168, 12, sp34, 10); } } diff --git a/src/overlays/actors/ovl_Eff_Zoraband/z_eff_zoraband.c b/src/overlays/actors/ovl_Eff_Zoraband/z_eff_zoraband.c index be8289743e..b566e5c622 100644 --- a/src/overlays/actors/ovl_Eff_Zoraband/z_eff_zoraband.c +++ b/src/overlays/actors/ovl_Eff_Zoraband/z_eff_zoraband.c @@ -80,7 +80,7 @@ void EffZoraband_Draw(Actor* thisx, PlayState* play2) { OPEN_DISPS(play->state.gfxCtx); func_8012C2DC(play->state.gfxCtx); - Matrix_RotateYS((Camera_GetCamDirYaw(play->cameraPtrs[play->activeCamera]) + 0x8000), MTXMODE_APPLY); + Matrix_RotateYS((Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000), MTXMODE_APPLY); AnimatedMat_DrawXlu(play, Lib_SegmentedToVirtual(object_zoraband_Matanimheader_000F38)); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); if (this->actor.home.rot.z != 0) { diff --git a/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c b/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c index 2dc6f934bf..5d39059148 100644 --- a/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c +++ b/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c @@ -123,7 +123,7 @@ void func_8092E284(ElfMsg* this, PlayState* play) { } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) { this->actor.home.rot.x = 0; ActorCutscene_Start(this->actor.cutscene, &this->actor); - func_800E0348(play->cameraPtrs[0]); + func_800E0348(play->cameraPtrs[CAM_ID_MAIN]); } else { ActorCutscene_SetIntentToPlay(this->actor.cutscene); } diff --git a/src/overlays/actors/ovl_Elf_Msg3/z_elf_msg3.c b/src/overlays/actors/ovl_Elf_Msg3/z_elf_msg3.c index a45d939718..a62a22ad0a 100644 --- a/src/overlays/actors/ovl_Elf_Msg3/z_elf_msg3.c +++ b/src/overlays/actors/ovl_Elf_Msg3/z_elf_msg3.c @@ -121,7 +121,7 @@ void func_80A2CF7C(ElfMsg3* this, PlayState* play) { ActorCutscene_SetIntentToPlay(this->actor.cutscene); } else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) { ActorCutscene_Start(this->actor.cutscene, &this->actor); - func_800E0348(play->cameraPtrs[0]); + func_800E0348(play->cameraPtrs[CAM_ID_MAIN]); } else { ActorCutscene_SetIntentToPlay(this->actor.cutscene); } diff --git a/src/overlays/actors/ovl_Elf_Msg4/z_elf_msg4.c b/src/overlays/actors/ovl_Elf_Msg4/z_elf_msg4.c index cc7ca2e25a..4c6f143ff9 100644 --- a/src/overlays/actors/ovl_Elf_Msg4/z_elf_msg4.c +++ b/src/overlays/actors/ovl_Elf_Msg4/z_elf_msg4.c @@ -126,7 +126,7 @@ void func_80AFD668(ElfMsg4* this, PlayState* play) { ActorCutscene_SetIntentToPlay((s16)this->actor.cutscene); } else if (ActorCutscene_GetCanPlayNext((s16)this->actor.cutscene)) { ActorCutscene_Start(this->actor.cutscene, &this->actor); - func_800E0348(play->cameraPtrs[0]); + func_800E0348(play->cameraPtrs[CAM_ID_MAIN]); } else { ActorCutscene_SetIntentToPlay((s16)this->actor.cutscene); } diff --git a/src/overlays/actors/ovl_En_Ani/z_en_ani.c b/src/overlays/actors/ovl_En_Ani/z_en_ani.c index 3264bd95aa..3af30fbb37 100644 --- a/src/overlays/actors/ovl_En_Ani/z_en_ani.c +++ b/src/overlays/actors/ovl_En_Ani/z_en_ani.c @@ -219,7 +219,7 @@ void EnAni_FallToGround(EnAni* this, PlayState* play) { // the animation gets cut short, (first 16 frames only) only the landing part is seen Animation_Change(&this->skelAnime, &gAniLandingThenStandingUpAnim, 1.0f, 0.0f, 16.0f, ANIMMODE_ONCE, 0.0f); this->stateFlags |= ANI_STATE_WRITHING; - quakeValue = Quake_Add(play->cameraPtrs[0], 3); + quakeValue = Quake_Add(play->cameraPtrs[CAM_ID_MAIN], 3); Quake_SetSpeed(quakeValue, 0x6978); Quake_SetQuakeValues(quakeValue, 7, 0, 0, 0); Quake_SetCountdown(quakeValue, 0x14); diff --git a/src/overlays/actors/ovl_En_Bb/z_en_bb.c b/src/overlays/actors/ovl_En_Bb/z_en_bb.c index 0be4ae957c..a9314b9fab 100644 --- a/src/overlays/actors/ovl_En_Bb/z_en_bb.c +++ b/src/overlays/actors/ovl_En_Bb/z_en_bb.c @@ -689,9 +689,8 @@ void EnBb_Draw(Actor* thisx, PlayState* play) { if (this->flameScaleX > 0.0f) { currentMatrixState = Matrix_GetCurrent(); func_8012C2DC(play->state.gfxCtx); - Matrix_RotateYS( - ((Camera_GetCamDirYaw(play->cameraPtrs[play->activeCamera]) - this->actor.shape.rot.y) + 0x8000), - MTXMODE_APPLY); + Matrix_RotateYS(((Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) - this->actor.shape.rot.y) + 0x8000), + MTXMODE_APPLY); Matrix_Scale(this->flameScaleX, this->flameScaleY, 1.0f, MTXMODE_APPLY); gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 255, 255); gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 255, 0); diff --git a/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c b/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c index e2deeb38a2..c489ba8068 100644 --- a/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c +++ b/src/overlays/actors/ovl_En_Bbfall/z_en_bbfall.c @@ -723,9 +723,8 @@ void EnBbfall_Draw(Actor* thisx, PlayState* play2) { if (this->flameOpacity > 0) { func_8012C2DC(play->state.gfxCtx); - Matrix_RotateYS( - ((Camera_GetCamDirYaw(play->cameraPtrs[play->activeCamera]) - this->actor.shape.rot.y) + 0x8000), - MTXMODE_APPLY); + Matrix_RotateYS(((Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) - this->actor.shape.rot.y) + 0x8000), + MTXMODE_APPLY); Matrix_Scale(this->flameScaleX, this->flameScaleY, 1.0f, MTXMODE_APPLY); gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 0); currentMatrixState = Matrix_GetCurrent(); diff --git a/src/overlays/actors/ovl_En_Bom/z_en_bom.c b/src/overlays/actors/ovl_En_Bom/z_en_bom.c index 1083b25689..3271d8bcbf 100644 --- a/src/overlays/actors/ovl_En_Bom/z_en_bom.c +++ b/src/overlays/actors/ovl_En_Bom/z_en_bom.c @@ -538,7 +538,7 @@ void EnBom_Update(Actor* thisx, PlayState* play) { play->envCtx.lightSettings.diffuseColor1[2] = 250; play->envCtx.lightSettings.ambientColor[0] = play->envCtx.lightSettings.ambientColor[1] = play->envCtx.lightSettings.ambientColor[2] = 250; - func_800DFD04(&play->mainCamera, 2, 11, 8); + Camera_AddQuake(&play->mainCamera, 2, 11, 8); thisx->params = ENBOM_1; this->timer = 10; thisx->flags |= (0x100000 | 0x20); diff --git a/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c b/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c index 103ce0824f..4a7ac1bafa 100644 --- a/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c +++ b/src/overlays/actors/ovl_En_Bombf/z_en_bombf.c @@ -414,7 +414,7 @@ void EnBombf_Update(Actor* thisx, PlayState* play) { play->envCtx.lightSettings.ambientColor[0] = play->envCtx.lightSettings.ambientColor[1] = play->envCtx.lightSettings.ambientColor[2] = 250; - func_800DFD04(&play->mainCamera, 2, 11, 8); + Camera_AddQuake(&play->mainCamera, 2, 11, 8); this->actor.params = ENBOMBF_1; this->timer = 10; diff --git a/src/overlays/actors/ovl_En_Butte/z_en_butte.c b/src/overlays/actors/ovl_En_Butte/z_en_butte.c index c9a09bf339..93bc677922 100644 --- a/src/overlays/actors/ovl_En_Butte/z_en_butte.c +++ b/src/overlays/actors/ovl_En_Butte/z_en_butte.c @@ -143,7 +143,7 @@ void func_8091C178(EnButte* this, PlayState* play) { sp48 = Math_SinS(D_8091D3A0) * 250.0f; sp48 = CLAMP(sp48, 0, 255); - func_800DFC90(&sp40, GET_ACTIVE_CAM(play)); + Camera_GetCamDir(&sp40, GET_ACTIVE_CAM(play)); Matrix_RotateYS(sp40.y, MTXMODE_NEW); Matrix_RotateXS(sp40.x, MTXMODE_APPLY); Matrix_RotateZS(sp40.z, MTXMODE_APPLY); diff --git a/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c b/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c index 65a1da5f01..ef520ce40e 100644 --- a/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c +++ b/src/overlays/actors/ovl_En_Clear_Tag/z_en_clear_tag.c @@ -558,8 +558,8 @@ void EnClearTag_UpdateCamera(EnClearTag* this, PlayState* play) { case 1: Cutscene_Start(play, &play->csCtx); this->subCamId = Play_CreateSubCamera(play); - Play_CameraChangeStatus(play, CAM_ID_MAIN, 1); - Play_CameraChangeStatus(play, this->subCamId, 7); + Play_CameraChangeStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); + Play_CameraChangeStatus(play, this->subCamId, CAM_STATUS_ACTIVE); func_800B7298(play, &this->actor, 4); mainCam = Play_GetCamera(play, CAM_ID_MAIN); this->subCamEye.x = mainCam->eye.x; diff --git a/src/overlays/actors/ovl_En_Famos/z_en_famos.c b/src/overlays/actors/ovl_En_Famos/z_en_famos.c index dd78c9ba0e..8cebddded9 100644 --- a/src/overlays/actors/ovl_En_Famos/z_en_famos.c +++ b/src/overlays/actors/ovl_En_Famos/z_en_famos.c @@ -549,7 +549,7 @@ void EnFamos_Attack(EnFamos* this, PlayState* play) { this->collider1.base.atFlags &= ~AT_ON; this->collider2.base.atFlags |= AT_ON; if (hitFloor) { - func_800DFD04(play->cameraPtrs[play->activeCamera], 2, 15, 10); // camera shake? + Camera_AddQuake(GET_ACTIVE_CAM(play), 2, 15, 10); Rumble_Request(this->actor.xyzDistToPlayerSq, 180, 20, 100); EnFamos_SetupAttackDebris(this); diff --git a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c index 9a3138fe0c..ea37f745fe 100644 --- a/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c +++ b/src/overlays/actors/ovl_En_Fishing/z_en_fishing.c @@ -4,7 +4,6 @@ * Description: Fishing Pond Elements (Owner, Fish, Props, Effects...) */ -#include "prevent_bss_reordering.h" #include "z_en_fishing.h" #include "z64rumble.h" #include "objects/object_fish/object_fish.h" @@ -5154,8 +5153,8 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) { case 1: sCameraId = Play_CreateSubCamera(play); - Play_CameraChangeStatus(play, CAM_ID_MAIN, 1); - Play_CameraChangeStatus(play, sCameraId, 7); + Play_CameraChangeStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); + Play_CameraChangeStatus(play, sCameraId, CAM_STATUS_ACTIVE); camera = Play_GetCamera(play, CAM_ID_MAIN); sCameraEye.x = camera->eye.x; sCameraEye.y = camera->eye.y; @@ -5282,8 +5281,8 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) { case 10: Cutscene_Start(play, &play->csCtx); sCameraId = Play_CreateSubCamera(play); - Play_CameraChangeStatus(play, CAM_ID_MAIN, 1); - Play_CameraChangeStatus(play, sCameraId, 7); + Play_CameraChangeStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); + Play_CameraChangeStatus(play, sCameraId, CAM_STATUS_ACTIVE); func_800B7298(play, &this->actor, 4); camera = Play_GetCamera(play, CAM_ID_MAIN); sCameraEye.x = camera->eye.x; @@ -5321,8 +5320,8 @@ void EnFishing_UpdateOwner(Actor* thisx, PlayState* play2) { case 20: Cutscene_Start(play, &play->csCtx); sCameraId = Play_CreateSubCamera(play); - Play_CameraChangeStatus(play, CAM_ID_MAIN, 1); - Play_CameraChangeStatus(play, sCameraId, 7); + Play_CameraChangeStatus(play, CAM_ID_MAIN, CAM_STATUS_WAIT); + Play_CameraChangeStatus(play, sCameraId, CAM_STATUS_ACTIVE); func_800B7298(play, &this->actor, 4); camera = Play_GetCamera(play, CAM_ID_MAIN); sCameraEye.x = camera->eye.x; diff --git a/src/overlays/actors/ovl_En_Fu/z_en_fu.c b/src/overlays/actors/ovl_En_Fu/z_en_fu.c index 476b098566..d9aaf9800e 100644 --- a/src/overlays/actors/ovl_En_Fu/z_en_fu.c +++ b/src/overlays/actors/ovl_En_Fu/z_en_fu.c @@ -1162,11 +1162,11 @@ void func_80963F44(EnFu* this, PlayState* play) { void func_80963F88(EnFu* this, PlayState* play) { if (this->unk_542 == 1) { - func_800DFAC8(play->cameraPtrs[CAM_ID_MAIN], 75); + Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_HONEY_AND_DARLING_2); play->unk_1887E = 0; } else if (this->unk_542 == 2) { play->unk_1887D = 0; - func_800DFAC8(play->cameraPtrs[CAM_ID_MAIN], 75); + Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_HONEY_AND_DARLING_2); } } diff --git a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c index 4217723020..5a46fd193e 100644 --- a/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c +++ b/src/overlays/actors/ovl_En_Horse_Game_Check/z_en_horse_game_check.c @@ -137,7 +137,7 @@ s32 func_808F8CCC(EnHorseGameCheck* this, PlayState* play2) { } this->unk_17C = -1; - func_800DFAC8(play->cameraPtrs[CAM_ID_MAIN], 10); + Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_FREE0); Play_CameraSetAtEye(play, 0, &sp40, &sp4C); Play_CameraSetFov(play, 0, 45.0f); func_800FE484(); @@ -228,7 +228,7 @@ s32 func_808F8FAC(EnHorseGameCheck* this, PlayState* play) { if ((this->unk_17C != -1) && ((this->unk_168 - this->unk_17C) > 10)) { this->unk_17C = -1; - func_800DFAC8(play->cameraPtrs[CAM_ID_MAIN], 4); + Camera_ChangeSetting(play->cameraPtrs[CAM_ID_MAIN], CAM_SET_HORSE); } this->unk_168++; diff --git a/src/overlays/actors/ovl_En_Test7/z_en_test7.c b/src/overlays/actors/ovl_En_Test7/z_en_test7.c index bafcfff11d..6386241d7f 100644 --- a/src/overlays/actors/ovl_En_Test7/z_en_test7.c +++ b/src/overlays/actors/ovl_En_Test7/z_en_test7.c @@ -586,7 +586,7 @@ void func_80AF2030(EnTest7* this, PlayState* play) { this->actor.world.pos.y += 100.0f; camera = Play_GetCamera(play, ActorCutscene_GetCurrentCamera(play->playerActorCsIds[8])); - camera->player = NULL; + camera->focalActor = NULL; camera->eye.x = ((camera->eye.x - this->unk_1E60.x) * sp1C) + this->unk_1E60.x; camera->eye.y = ((camera->eye.y - this->unk_1E60.y) * sp1C) + this->unk_1E60.y; @@ -682,7 +682,7 @@ void func_80AF24D8(EnTest7* this, PlayState* play, f32 arg2) { Camera* camera = Play_GetCamera(play, ActorCutscene_GetCurrentCamera(play->playerActorCsIds[8])); pos = &player->actor.world.pos; - camera->player = NULL; + camera->focalActor = NULL; sp3C.x = ((180.0f * Math_SinS(this->unk_1E8E)) * Math_CosS(0xFA0)) + pos->x; sp3C.y = (Math_SinS(0xFA0) * 180.0f) + pos->y; @@ -703,7 +703,7 @@ void func_80AF2654(EnTest7* this, PlayState* play, f32 arg2) { Vec3f sp30; camera = Play_GetCamera(play, ActorCutscene_GetCurrentCamera(play->playerActorCsIds[8])); - camera->player = NULL; + camera->focalActor = NULL; pos = &player->actor.world.pos; @@ -806,7 +806,7 @@ void func_80AF2BAC(EnTest7* this, PlayState* play, Vec3f* arg2, f32 arg3) { f32 z; Camera* camera = Play_GetCamera(play, ActorCutscene_GetCurrentCamera(play->playerActorCsIds[8])); - camera->player = NULL; + camera->focalActor = NULL; x = ((camera->at.x - arg2->x) * arg3) + arg2->x; y = ((camera->at.y - arg2->y) * arg3) + arg2->y; z = ((camera->at.z - arg2->z) * arg3) + arg2->z; diff --git a/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.c b/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.c index 262de706cf..7c73590405 100644 --- a/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.c +++ b/src/overlays/actors/ovl_Obj_Aqua/z_obj_aqua.c @@ -267,7 +267,7 @@ void ObjAqua_Draw(Actor* thisx, PlayState* play) { ObjAqua* this = THIS; s32 framesTemp; s32 pad; - s16 yaw = Camera_GetCamDirYaw(play->cameraPtrs[play->activeCamera]) + 0x8000; + s16 yaw = Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000; s32 actionFuncTemp = this->actionFunc == func_80ACBDFC; OPEN_DISPS(play->state.gfxCtx); diff --git a/src/overlays/actors/ovl_Obj_Demo/z_obj_demo.c b/src/overlays/actors/ovl_Obj_Demo/z_obj_demo.c index ec5796b5a7..5783118de0 100644 --- a/src/overlays/actors/ovl_Obj_Demo/z_obj_demo.c +++ b/src/overlays/actors/ovl_Obj_Demo/z_obj_demo.c @@ -84,7 +84,7 @@ void func_80983704(ObjDemo* this, PlayState* play) { if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) { if (this->unk_148 == 1) { ActorCutscene_Start(this->actor.cutscene, &this->actor); - func_800E0348(play->cameraPtrs[0]); + func_800E0348(play->cameraPtrs[CAM_ID_MAIN]); } else { ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor); } diff --git a/src/overlays/actors/ovl_Obj_Jgame_Light/z_obj_jgame_light.c b/src/overlays/actors/ovl_Obj_Jgame_Light/z_obj_jgame_light.c index dfea61857e..cc65a77301 100644 --- a/src/overlays/actors/ovl_Obj_Jgame_Light/z_obj_jgame_light.c +++ b/src/overlays/actors/ovl_Obj_Jgame_Light/z_obj_jgame_light.c @@ -200,9 +200,8 @@ void ObjJgameLight_Draw(Actor* thisx, PlayState* play) { gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 0, 255); gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 0); Matrix_Translate(0.0f, 52.0f, 0.0f, MTXMODE_APPLY); - Matrix_RotateYS( - ((Camera_GetCamDirYaw(play->cameraPtrs[play->activeCamera]) - this->actor.shape.rot.y) + 0x8000), - MTXMODE_APPLY); + Matrix_RotateYS(((Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) - this->actor.shape.rot.y) + 0x8000), + MTXMODE_APPLY); Matrix_Scale(scale, scale, scale, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_XLU_DISP++, gGameplayKeepDrawFlameDL); diff --git a/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c b/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c index 5c10fbd169..deb315bc42 100644 --- a/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c +++ b/src/overlays/actors/ovl_Obj_Kinoko/z_obj_kinoko.c @@ -64,7 +64,7 @@ void ObjKinoko_Update(Actor* thisx, PlayState* play) { } thisx->scale.y = thisx->scale.x; thisx->scale.z = thisx->scale.x; - thisx->shape.rot.y = Camera_GetCamDirYaw(play->cameraPtrs[play->activeCamera]) + 0x8000; + thisx->shape.rot.y = Camera_GetCamDirYaw(GET_ACTIVE_CAM(play)) + 0x8000; } } diff --git a/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c b/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c index 93a5ffc454..779ea2a5e8 100644 --- a/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c +++ b/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c @@ -507,7 +507,7 @@ void func_809289E4(ObjTsubo* this, PlayState* play) { s16 yawDiff = this->actor.yawTowardsPlayer - GET_PLAYER(play)->actor.world.rot.y; s32 absYawDiff = ABS_ALT(yawDiff); - if (absYawDiff > DEGF_TO_BINANG(120.0f)) { + if (absYawDiff > (0x10000 / 3)) { Actor_PickUp(&this->actor, play, 0, 36.0f, 30.0f); } } diff --git a/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c b/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c index 855723d10a..0b4e2014e7 100644 --- a/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c +++ b/src/overlays/actors/ovl_Object_Kankyo/z_object_kankyo.c @@ -512,7 +512,7 @@ void func_808DD3C8(Actor* thisx, PlayState* play2) { f32 temp_f2; f32 tempf; - if ((play->cameraPtrs[CAM_ID_MAIN]->flags2 & 0x100) || ((u8)play->envCtx.unk_E2 == 0)) { + if ((play->cameraPtrs[CAM_ID_MAIN]->stateFlags & CAM_STATE_UNDERWATER) || ((u8)play->envCtx.unk_E2 == 0)) { return; } @@ -599,7 +599,7 @@ void func_808DD970(Actor* thisx, PlayState* play2) { phi_f26 = CLAMP_MAX(phi_f26, 1.0f); - if (!(play->cameraPtrs[CAM_ID_MAIN]->flags2 & 0x100) || (phi_f26 == 0.0f)) { + if (!(play->cameraPtrs[CAM_ID_MAIN]->stateFlags & CAM_STATE_UNDERWATER) || (phi_f26 == 0.0f)) { return; } } diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 694fb27433..6ae5315116 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -1271,15 +1271,15 @@ 0x800DF840:("Camera_ChangeMode",), 0x800DF86C:("func_800DF86C",), 0x800DF8EC:("func_800DF8EC",), - 0x800DFAC8:("func_800DFAC8",), + 0x800DFAC8:("Camera_ChangeSetting",), 0x800DFB14:("Camera_ChangeDataIdx",), 0x800DFC1C:("func_800DFC1C",), 0x800DFC40:("func_800DFC40",), 0x800DFC68:("Camera_GetInputDirYaw",), - 0x800DFC90:("func_800DFC90",), + 0x800DFC90:("Camera_GetCamDir",), 0x800DFCB4:("Camera_GetCamDirPitch",), 0x800DFCDC:("Camera_GetCamDirYaw",), - 0x800DFD04:("func_800DFD04",), + 0x800DFD04:("Camera_AddQuake",), 0x800DFD78:("func_800DFD78",), 0x800DFEF0:("func_800DFEF0",), 0x800DFF18:("func_800DFF18",), @@ -1287,7 +1287,7 @@ 0x800DFF44:("func_800DFF44",), 0x800DFF60:("Camera_SetFlags",), 0x800DFF84:("Camera_ClearFlags",), - 0x800DFFAC:("func_800DFFAC",), + 0x800DFFAC:("Camera_ChangeDoorCam",), 0x800E007C:("func_800E007C",), 0x800E01AC:("func_800E01AC",), 0x800E01B8:("Camera_GetQuakeOffset",), diff --git a/tools/namefixer.py b/tools/namefixer.py index 15154f5264..6cae549c06 100755 --- a/tools/namefixer.py +++ b/tools/namefixer.py @@ -445,6 +445,10 @@ wordReplace = { "func_800E0308": "Camera_SetTargetActor", "func_800E031C": "Camera_GetWaterYPos", "func_800E02AC": "Camera_SetToTrackActor", + "func_800DFAC8": "Camera_ChangeSetting", + "func_800DFC90": "Camera_GetCamDir", + "func_800DFD04": "Camera_AddQuake", + "func_800DFFAC": "Camera_ChangeDoorCam", "func_801694DC": "Play_CreateSubCamera", "Play_GetActiveCameraIndex": "Play_GetActiveCamId", "func_80169590": "Play_CameraChangeStatus", diff --git a/tools/sizes/code_functions.csv b/tools/sizes/code_functions.csv index 87b35eb5d2..53cf3ccf3e 100644 --- a/tools/sizes/code_functions.csv +++ b/tools/sizes/code_functions.csv @@ -785,15 +785,15 @@ asm/non_matchings/code/z_camera/Camera_SetMode.s,Camera_SetMode,0x800DF4D0,0xDC asm/non_matchings/code/z_camera/Camera_ChangeMode.s,Camera_ChangeMode,0x800DF840,0xB asm/non_matchings/code/z_camera/func_800DF86C.s,func_800DF86C,0x800DF86C,0x20 asm/non_matchings/code/z_camera/func_800DF8EC.s,func_800DF8EC,0x800DF8EC,0x77 -asm/non_matchings/code/z_camera/func_800DFAC8.s,func_800DFAC8,0x800DFAC8,0x13 +asm/non_matchings/code/z_camera/Camera_ChangeSetting.s,Camera_ChangeSetting,0x800DFAC8,0x13 asm/non_matchings/code/z_camera/Camera_ChangeDataIdx.s,Camera_ChangeDataIdx,0x800DFB14,0x42 asm/non_matchings/code/z_camera/func_800DFC1C.s,func_800DFC1C,0x800DFC1C,0x9 asm/non_matchings/code/z_camera/func_800DFC40.s,func_800DFC40,0x800DFC40,0xA asm/non_matchings/code/z_camera/Camera_GetInputDirYaw.s,Camera_GetInputDirYaw,0x800DFC68,0xA -asm/non_matchings/code/z_camera/func_800DFC90.s,func_800DFC90,0x800DFC90,0x9 +asm/non_matchings/code/z_camera/Camera_GetCamDir.s,Camera_GetCamDir,0x800DFC90,0x9 asm/non_matchings/code/z_camera/Camera_GetCamDirPitch.s,Camera_GetCamDirPitch,0x800DFCB4,0xA asm/non_matchings/code/z_camera/Camera_GetCamDirYaw.s,Camera_GetCamDirYaw,0x800DFCDC,0xA -asm/non_matchings/code/z_camera/func_800DFD04.s,func_800DFD04,0x800DFD04,0x1D +asm/non_matchings/code/z_camera/Camera_AddQuake.s,Camera_AddQuake,0x800DFD04,0x1D asm/non_matchings/code/z_camera/func_800DFD78.s,func_800DFD78,0x800DFD78,0x5E asm/non_matchings/code/z_camera/func_800DFEF0.s,func_800DFEF0,0x800DFEF0,0xA asm/non_matchings/code/z_camera/func_800DFF18.s,func_800DFF18,0x800DFF18,0x7 @@ -801,7 +801,7 @@ asm/non_matchings/code/z_camera/func_800DFF34.s,func_800DFF34,0x800DFF34,0x4 asm/non_matchings/code/z_camera/func_800DFF44.s,func_800DFF44,0x800DFF44,0x7 asm/non_matchings/code/z_camera/Camera_SetFlags.s,Camera_SetFlags,0x800DFF60,0x9 asm/non_matchings/code/z_camera/Camera_ClearFlags.s,Camera_ClearFlags,0x800DFF84,0xA -asm/non_matchings/code/z_camera/func_800DFFAC.s,func_800DFFAC,0x800DFFAC,0x34 +asm/non_matchings/code/z_camera/Camera_ChangeDoorCam.s,Camera_ChangeDoorCam,0x800DFFAC,0x34 asm/non_matchings/code/z_camera/func_800E007C.s,func_800E007C,0x800E007C,0x4C asm/non_matchings/code/z_camera/func_800E01AC.s,func_800E01AC,0x800E01AC,0x3 asm/non_matchings/code/z_camera/Camera_GetQuakeOffset.s,Camera_GetQuakeOffset,0x800E01B8,0x9