diff --git a/include/camera.h b/include/camera.h index c56e2b8f8f..fa74b2a2e3 100644 --- a/include/camera.h +++ b/include/camera.h @@ -848,8 +848,8 @@ typedef struct KeepOn3 { typedef struct KeepOn4ReadOnlyData { /* 0x00 */ f32 yOffset; /* 0x04 */ f32 eyeDist; - /* 0x08 */ f32 pitchTarget; // degrees - /* 0x0C */ f32 yawTarget; // degrees + /* 0x08 */ f32 pitchTarget; // degrees, usage varies with KEEPON4_FLAG_EYE_ flags + /* 0x0C */ f32 yawTarget; // degrees, usage varies with KEEPON4_FLAG_EYE_ flags /* 0x10 */ f32 atOffsetPlayerForwards; // distance to offset `at` by, in the player's forwards direction /* 0x14 */ f32 unk_14; // scale for stepping yaw and pitch of "at to eye" to target /* 0x18 */ f32 fovTarget; @@ -889,13 +889,13 @@ typedef struct KeepOn4 { /* 0x20 */ KeepOn4ReadWriteData rwData; } KeepOn4; // size = 0x38 -#define KEEPON4_FLAG_0 (1 << 0) -#define KEEPON4_FLAG_1 (1 << 1) -#define KEEPON4_FLAG_2 (1 << 2) -#define KEEPON4_FLAG_3 (1 << 3) +#define KEEPON4_FLAG_NO_CHECK_COL (1 << 0) // If set, disables checking for colliders and collision to place the camera eye. Unused +#define KEEPON4_FLAG_EYE_YAW_REL_TO_PLAYER (1 << 1) // pitch: provided, yaw: offset from behind player +#define KEEPON4_FLAG_EYE_ABS (1 << 2) // pitch: provided, yaw: provided. Unused +#define KEEPON4_FLAG_EYE_FROM_TARGET (1 << 3) // pitch and yaw: depends on x/y rotations of the camera `target`, plus offsets #define KEEPON4_FLAG_4 (1 << 4) -#define KEEPON4_FLAG_5 (1 << 5) -#define KEEPON4_FLAG_6 (1 << 6) +#define KEEPON4_FLAG_NOOP (1 << 5) // No effect. Only set for CAM_ITEM_TYPE_11 +#define KEEPON4_FLAG_EYE_KEEP_YAW (1 << 6) // pitch: provided, yaw: retain current yaw #define KEEPON4_FLAG_7 (1 << 7) #define CAM_FUNCDATA_KEEP4(yOffset, eyeDist, pitchTarget, yawTarget, atOffsetPlayerForwards, fov, interfaceField, unk_14, initTimer) \ diff --git a/src/code/z_camera.c b/src/code/z_camera.c index 803a89400f..c2662b52e4 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -3757,16 +3757,16 @@ s32 Camera_KeepOn4(Camera* camera) { roData->eyeDist = playerHeight * 0.5f * yNormal; roData->pitchTarget = -20.0f; roData->yawTarget = 0.0f; - roData->interfaceField = - CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE, KEEPON4_FLAG_6); + roData->interfaceField = CAM_INTERFACE_FIELD( + CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE, KEEPON4_FLAG_EYE_KEEP_YAW); break; case CAM_ITEM_TYPE_5: roData->yOffset = playerHeight * -0.4f * yNormal; roData->pitchTarget = -10.0f; roData->yawTarget = 45.0f; - roData->interfaceField = - CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_ALL, KEEPON4_FLAG_1); + roData->interfaceField = CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_ALL, + KEEPON4_FLAG_EYE_YAW_REL_TO_PLAYER); break; case CAM_ITEM_TYPE_10: @@ -3775,8 +3775,8 @@ s32 Camera_KeepOn4(Camera* camera) { roData->pitchTarget = -15.0f; roData->yawTarget = 175.0f; roData->fovTarget = 70.0f; - roData->interfaceField = - CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_NOTHING_ALT, KEEPON4_FLAG_1); + roData->interfaceField = CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_NOTHING_ALT, + KEEPON4_FLAG_EYE_YAW_REL_TO_PLAYER); roData->initTimer = 0x3C; break; @@ -3787,7 +3787,7 @@ s32 Camera_KeepOn4(Camera* camera) { roData->yawTarget = 120.0f; roData->atOffsetPlayerForwards = player->stateFlags1 & PLAYER_STATE1_27 ? 0.0f : 20.0f; roData->interfaceField = CAM_INTERFACE_FIELD(CAM_LETTERBOX_LARGE, CAM_HUD_VISIBILITY_NOTHING_ALT, - KEEPON4_FLAG_4 | KEEPON4_FLAG_1); + KEEPON4_FLAG_4 | KEEPON4_FLAG_EYE_YAW_REL_TO_PLAYER); roData->initTimer = 0x1E; roData->fovTarget = 50.0f; break; @@ -3795,8 +3795,8 @@ s32 Camera_KeepOn4(Camera* camera) { case CAM_ITEM_TYPE_90: roData->yOffset = playerHeight * -0.3f * yNormal; roData->fovTarget = 45.0f; - roData->interfaceField = - CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_IGNORE, KEEPON4_FLAG_1); + roData->interfaceField = CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_IGNORE, + KEEPON4_FLAG_EYE_YAW_REL_TO_PLAYER); break; case CAM_ITEM_TYPE_91: @@ -3806,7 +3806,7 @@ s32 Camera_KeepOn4(Camera* camera) { roData->yawTarget = 10.0f; roData->fovTarget = 55.0f; roData->interfaceField = - CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_IGNORE, KEEPON4_FLAG_3); + CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_IGNORE, KEEPON4_FLAG_EYE_FROM_TARGET); break; case CAM_ITEM_TYPE_81: @@ -3826,8 +3826,9 @@ s32 Camera_KeepOn4(Camera* camera) { roData->eyeDist = playerHeight * 0.7f * yNormal; roData->yawTarget = 130.0f; roData->atOffsetPlayerForwards = 10.0f; - roData->interfaceField = CAM_INTERFACE_FIELD( - CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE, KEEPON4_FLAG_5 | KEEPON4_FLAG_1); + roData->interfaceField = + CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE, + KEEPON4_FLAG_NOOP | KEEPON4_FLAG_EYE_YAW_REL_TO_PLAYER); break; default: @@ -3860,15 +3861,15 @@ s32 Camera_KeepOn4(Camera* camera) { camera->stateFlags &= ~(CAM_STATE_CHECK_WATER | CAM_STATE_CHECK_BG); rwData->animTimer = roData->initTimer; rwData->unk_08 = playerPosRot->pos.y - camera->playerPosDelta.y; - if (roData->interfaceField & KEEPON4_FLAG_1) { + if (roData->interfaceField & KEEPON4_FLAG_EYE_YAW_REL_TO_PLAYER) { atToEyeBasePitch = CAM_DEG_TO_BINANG(roData->pitchTarget); atToEyeBaseYaw = (s16)((s16)(playerPosRot->rot.y - 0x7FFF) - atToEyeNextDir.yaw) > 0 ? (s16)(playerPosRot->rot.y - 0x7FFF) + CAM_DEG_TO_BINANG(roData->yawTarget) : (s16)(playerPosRot->rot.y - 0x7FFF) - CAM_DEG_TO_BINANG(roData->yawTarget); - } else if (roData->interfaceField & KEEPON4_FLAG_2) { + } else if (roData->interfaceField & KEEPON4_FLAG_EYE_ABS) { atToEyeBasePitch = CAM_DEG_TO_BINANG(roData->pitchTarget); atToEyeBaseYaw = CAM_DEG_TO_BINANG(roData->yawTarget); - } else if ((roData->interfaceField & KEEPON4_FLAG_3) && camera->target != NULL) { + } else if ((roData->interfaceField & KEEPON4_FLAG_EYE_FROM_TARGET) && camera->target != NULL) { PosRot sp60; sp60 = Actor_GetWorldPosShapeRot(camera->target); @@ -3888,7 +3889,7 @@ s32 Camera_KeepOn4(Camera* camera) { : sp9E - CAM_DEG_TO_BINANG(roData->yawTarget); lineOCCheckExclusions[1] = camera->target; lineOCCheckNumExclusions++; - } else if (roData->interfaceField & KEEPON4_FLAG_6) { + } else if (roData->interfaceField & KEEPON4_FLAG_EYE_KEEP_YAW) { atToEyeBasePitch = CAM_DEG_TO_BINANG(roData->pitchTarget); atToEyeBaseYaw = atToEyeNextDir.yaw; } else { @@ -3900,7 +3901,7 @@ s32 Camera_KeepOn4(Camera* camera) { vecGeo.yaw = atToEyeBaseYaw; vecGeo.r = roData->eyeDist; sEyeCandidate = Camera_AddVecGeoToVec3f(&sAtTarget, &vecGeo); - if (!(roData->interfaceField & KEEPON4_FLAG_0)) { + if (!(roData->interfaceField & KEEPON4_FLAG_NO_CHECK_COL)) { angleCnt = ARRAY_COUNT(sCamCheckAroundOffsetsYaw); for (i = 0; i < angleCnt; i++) { if (!CollisionCheck_LineOCCheck(camera->play, &camera->play->colChkCtx, &sAtTarget, &sEyeCandidate, diff --git a/src/code/z_camera_data.inc.c b/src/code/z_camera_data.inc.c index 82d1dd619a..1e607429de 100644 --- a/src/code/z_camera_data.inc.c +++ b/src/code/z_camera_data.inc.c @@ -1264,9 +1264,10 @@ CameraModeValue sSetFireBirdsEyeModeWallClimbData[] = { */ CameraModeValue sSetTurnAroundModeNormalData[] = { - CAM_FUNCDATA_KEEP4( - -30, 120, -10, 170, 0, 60, - CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE, KEEPON4_FLAG_1), 25, 6), + CAM_FUNCDATA_KEEP4(-30, 120, -10, 170, 0, 60, + CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE, + KEEPON4_FLAG_EYE_YAW_REL_TO_PLAYER), + 25, 6), }; /**