This commit is contained in:
Dragorn421 2025-07-15 01:53:14 -04:00 committed by GitHub
commit a7e56c004e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 30 additions and 28 deletions

View File

@ -848,8 +848,8 @@ typedef struct KeepOn3 {
typedef struct KeepOn4ReadOnlyData { typedef struct KeepOn4ReadOnlyData {
/* 0x00 */ f32 yOffset; /* 0x00 */ f32 yOffset;
/* 0x04 */ f32 eyeDist; /* 0x04 */ f32 eyeDist;
/* 0x08 */ f32 pitchTarget; // degrees /* 0x08 */ f32 pitchTarget; // degrees, usage varies with KEEPON4_FLAG_EYE_ flags
/* 0x0C */ f32 yawTarget; // degrees /* 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 /* 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 /* 0x14 */ f32 unk_14; // scale for stepping yaw and pitch of "at to eye" to target
/* 0x18 */ f32 fovTarget; /* 0x18 */ f32 fovTarget;
@ -889,13 +889,13 @@ typedef struct KeepOn4 {
/* 0x20 */ KeepOn4ReadWriteData rwData; /* 0x20 */ KeepOn4ReadWriteData rwData;
} KeepOn4; // size = 0x38 } KeepOn4; // size = 0x38
#define KEEPON4_FLAG_0 (1 << 0) #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_1 (1 << 1) #define KEEPON4_FLAG_EYE_YAW_REL_TO_PLAYER (1 << 1) // pitch: provided, yaw: offset from behind player
#define KEEPON4_FLAG_2 (1 << 2) #define KEEPON4_FLAG_EYE_ABS (1 << 2) // pitch: provided, yaw: provided. Unused
#define KEEPON4_FLAG_3 (1 << 3) #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_4 (1 << 4)
#define KEEPON4_FLAG_5 (1 << 5) #define KEEPON4_FLAG_NOOP (1 << 5) // No effect. Only set for CAM_ITEM_TYPE_11
#define KEEPON4_FLAG_6 (1 << 6) #define KEEPON4_FLAG_EYE_KEEP_YAW (1 << 6) // pitch: provided, yaw: retain current yaw
#define KEEPON4_FLAG_7 (1 << 7) #define KEEPON4_FLAG_7 (1 << 7)
#define CAM_FUNCDATA_KEEP4(yOffset, eyeDist, pitchTarget, yawTarget, atOffsetPlayerForwards, fov, interfaceField, unk_14, initTimer) \ #define CAM_FUNCDATA_KEEP4(yOffset, eyeDist, pitchTarget, yawTarget, atOffsetPlayerForwards, fov, interfaceField, unk_14, initTimer) \

View File

@ -3757,16 +3757,16 @@ s32 Camera_KeepOn4(Camera* camera) {
roData->eyeDist = playerHeight * 0.5f * yNormal; roData->eyeDist = playerHeight * 0.5f * yNormal;
roData->pitchTarget = -20.0f; roData->pitchTarget = -20.0f;
roData->yawTarget = 0.0f; roData->yawTarget = 0.0f;
roData->interfaceField = roData->interfaceField = CAM_INTERFACE_FIELD(
CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE, KEEPON4_FLAG_6); CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE, KEEPON4_FLAG_EYE_KEEP_YAW);
break; break;
case CAM_ITEM_TYPE_5: case CAM_ITEM_TYPE_5:
roData->yOffset = playerHeight * -0.4f * yNormal; roData->yOffset = playerHeight * -0.4f * yNormal;
roData->pitchTarget = -10.0f; roData->pitchTarget = -10.0f;
roData->yawTarget = 45.0f; roData->yawTarget = 45.0f;
roData->interfaceField = roData->interfaceField = CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_ALL,
CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_ALL, KEEPON4_FLAG_1); KEEPON4_FLAG_EYE_YAW_REL_TO_PLAYER);
break; break;
case CAM_ITEM_TYPE_10: case CAM_ITEM_TYPE_10:
@ -3775,8 +3775,8 @@ s32 Camera_KeepOn4(Camera* camera) {
roData->pitchTarget = -15.0f; roData->pitchTarget = -15.0f;
roData->yawTarget = 175.0f; roData->yawTarget = 175.0f;
roData->fovTarget = 70.0f; roData->fovTarget = 70.0f;
roData->interfaceField = roData->interfaceField = CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_NOTHING_ALT,
CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_NOTHING_ALT, KEEPON4_FLAG_1); KEEPON4_FLAG_EYE_YAW_REL_TO_PLAYER);
roData->initTimer = 0x3C; roData->initTimer = 0x3C;
break; break;
@ -3787,7 +3787,7 @@ s32 Camera_KeepOn4(Camera* camera) {
roData->yawTarget = 120.0f; roData->yawTarget = 120.0f;
roData->atOffsetPlayerForwards = player->stateFlags1 & PLAYER_STATE1_27 ? 0.0f : 20.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, 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->initTimer = 0x1E;
roData->fovTarget = 50.0f; roData->fovTarget = 50.0f;
break; break;
@ -3795,8 +3795,8 @@ s32 Camera_KeepOn4(Camera* camera) {
case CAM_ITEM_TYPE_90: case CAM_ITEM_TYPE_90:
roData->yOffset = playerHeight * -0.3f * yNormal; roData->yOffset = playerHeight * -0.3f * yNormal;
roData->fovTarget = 45.0f; roData->fovTarget = 45.0f;
roData->interfaceField = roData->interfaceField = CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_IGNORE,
CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_IGNORE, KEEPON4_FLAG_1); KEEPON4_FLAG_EYE_YAW_REL_TO_PLAYER);
break; break;
case CAM_ITEM_TYPE_91: case CAM_ITEM_TYPE_91:
@ -3806,7 +3806,7 @@ s32 Camera_KeepOn4(Camera* camera) {
roData->yawTarget = 10.0f; roData->yawTarget = 10.0f;
roData->fovTarget = 55.0f; roData->fovTarget = 55.0f;
roData->interfaceField = 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; break;
case CAM_ITEM_TYPE_81: case CAM_ITEM_TYPE_81:
@ -3826,8 +3826,9 @@ s32 Camera_KeepOn4(Camera* camera) {
roData->eyeDist = playerHeight * 0.7f * yNormal; roData->eyeDist = playerHeight * 0.7f * yNormal;
roData->yawTarget = 130.0f; roData->yawTarget = 130.0f;
roData->atOffsetPlayerForwards = 10.0f; roData->atOffsetPlayerForwards = 10.0f;
roData->interfaceField = CAM_INTERFACE_FIELD( roData->interfaceField =
CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE, KEEPON4_FLAG_5 | KEEPON4_FLAG_1); CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE,
KEEPON4_FLAG_NOOP | KEEPON4_FLAG_EYE_YAW_REL_TO_PLAYER);
break; break;
default: default:
@ -3860,15 +3861,15 @@ s32 Camera_KeepOn4(Camera* camera) {
camera->stateFlags &= ~(CAM_STATE_CHECK_WATER | CAM_STATE_CHECK_BG); camera->stateFlags &= ~(CAM_STATE_CHECK_WATER | CAM_STATE_CHECK_BG);
rwData->animTimer = roData->initTimer; rwData->animTimer = roData->initTimer;
rwData->unk_08 = playerPosRot->pos.y - camera->playerPosDelta.y; 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); atToEyeBasePitch = CAM_DEG_TO_BINANG(roData->pitchTarget);
atToEyeBaseYaw = (s16)((s16)(playerPosRot->rot.y - 0x7FFF) - atToEyeNextDir.yaw) > 0 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)
: (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); atToEyeBasePitch = CAM_DEG_TO_BINANG(roData->pitchTarget);
atToEyeBaseYaw = CAM_DEG_TO_BINANG(roData->yawTarget); 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; PosRot sp60;
sp60 = Actor_GetWorldPosShapeRot(camera->target); sp60 = Actor_GetWorldPosShapeRot(camera->target);
@ -3888,7 +3889,7 @@ s32 Camera_KeepOn4(Camera* camera) {
: sp9E - CAM_DEG_TO_BINANG(roData->yawTarget); : sp9E - CAM_DEG_TO_BINANG(roData->yawTarget);
lineOCCheckExclusions[1] = camera->target; lineOCCheckExclusions[1] = camera->target;
lineOCCheckNumExclusions++; lineOCCheckNumExclusions++;
} else if (roData->interfaceField & KEEPON4_FLAG_6) { } else if (roData->interfaceField & KEEPON4_FLAG_EYE_KEEP_YAW) {
atToEyeBasePitch = CAM_DEG_TO_BINANG(roData->pitchTarget); atToEyeBasePitch = CAM_DEG_TO_BINANG(roData->pitchTarget);
atToEyeBaseYaw = atToEyeNextDir.yaw; atToEyeBaseYaw = atToEyeNextDir.yaw;
} else { } else {
@ -3900,7 +3901,7 @@ s32 Camera_KeepOn4(Camera* camera) {
vecGeo.yaw = atToEyeBaseYaw; vecGeo.yaw = atToEyeBaseYaw;
vecGeo.r = roData->eyeDist; vecGeo.r = roData->eyeDist;
sEyeCandidate = Camera_AddVecGeoToVec3f(&sAtTarget, &vecGeo); sEyeCandidate = Camera_AddVecGeoToVec3f(&sAtTarget, &vecGeo);
if (!(roData->interfaceField & KEEPON4_FLAG_0)) { if (!(roData->interfaceField & KEEPON4_FLAG_NO_CHECK_COL)) {
angleCnt = ARRAY_COUNT(sCamCheckAroundOffsetsYaw); angleCnt = ARRAY_COUNT(sCamCheckAroundOffsetsYaw);
for (i = 0; i < angleCnt; i++) { for (i = 0; i < angleCnt; i++) {
if (!CollisionCheck_LineOCCheck(camera->play, &camera->play->colChkCtx, &sAtTarget, &sEyeCandidate, if (!CollisionCheck_LineOCCheck(camera->play, &camera->play->colChkCtx, &sAtTarget, &sEyeCandidate,

View File

@ -1264,9 +1264,10 @@ CameraModeValue sSetFireBirdsEyeModeWallClimbData[] = {
*/ */
CameraModeValue sSetTurnAroundModeNormalData[] = { CameraModeValue sSetTurnAroundModeNormalData[] = {
CAM_FUNCDATA_KEEP4( CAM_FUNCDATA_KEEP4(-30, 120, -10, 170, 0, 60,
-30, 120, -10, 170, 0, 60, CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE,
CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE, KEEPON4_FLAG_1), 25, 6), KEEPON4_FLAG_EYE_YAW_REL_TO_PLAYER),
25, 6),
}; };
/** /**