1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-07-04 23:14:37 +00:00

Camera_KeepOn4 docs 2: RO and RW data (#2632)

* `Camera_KeepOn4` docs 2: RO and RW data

* fix unk_14 rename

* CAM_DATA_UNK_22 -> CAM_DATA_INIT_TIMER
This commit is contained in:
Dragorn421 2025-06-26 20:11:38 +01:00 committed by GitHub
parent b7935dad12
commit d44c341c2d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 113 additions and 113 deletions

View file

@ -334,7 +334,7 @@ typedef enum CameraDataType {
/* 0x13 */ CAM_DATA_AT_OFFSET_X, /* 0x13 */ CAM_DATA_AT_OFFSET_X,
/* 0x14 */ CAM_DATA_AT_OFFSET_Y, /* 0x14 */ CAM_DATA_AT_OFFSET_Y,
/* 0x15 */ CAM_DATA_AT_OFFSET_Z, /* 0x15 */ CAM_DATA_AT_OFFSET_Z,
/* 0x16 */ CAM_DATA_UNK_22, /* 0x16 */ CAM_DATA_INIT_TIMER,
/* 0x17 */ CAM_DATA_UNK_23, /* 0x17 */ CAM_DATA_UNK_23,
/* 0x18 */ CAM_DATA_FOV_SCALE, /* 0x18 */ CAM_DATA_FOV_SCALE,
/* 0x19 */ CAM_DATA_YAW_SCALE, /* 0x19 */ CAM_DATA_YAW_SCALE,
@ -846,15 +846,15 @@ typedef struct KeepOn3 {
{ interfaceField, CAM_DATA_INTERFACE_FIELD } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct KeepOn4ReadOnlyData { typedef struct KeepOn4ReadOnlyData {
/* 0x00 */ f32 unk_00; /* 0x00 */ f32 yOffset;
/* 0x04 */ f32 unk_04; /* 0x04 */ f32 eyeDist;
/* 0x08 */ f32 unk_08; /* 0x08 */ f32 pitchTarget; // degrees
/* 0x0C */ f32 unk_0C; /* 0x0C */ f32 yawTarget; // degrees
/* 0x10 */ f32 unk_10; /* 0x10 */ f32 atOffsetPlayerForwards; // distance to offset `at` by, in the player's forwards direction
/* 0x14 */ f32 unk_14; /* 0x14 */ f32 unk_14; // scale for stepping yaw and pitch of "at to eye" to target
/* 0x18 */ f32 unk_18; /* 0x18 */ f32 fovTarget;
/* 0x1C */ s16 interfaceField; /* 0x1C */ s16 interfaceField;
/* 0x1E */ s16 unk_1E; /* 0x1E */ s16 initTimer;
} KeepOn4ReadOnlyData; // size = 0x20 } KeepOn4ReadOnlyData; // size = 0x20
typedef enum CameraItemType { typedef enum CameraItemType {
@ -874,14 +874,14 @@ typedef enum CameraItemType {
} CameraItemType; } CameraItemType;
typedef struct KeepOn4ReadWriteData { typedef struct KeepOn4ReadWriteData {
/* 0x00 */ f32 unk_00; /* 0x00 */ f32 atToEyeTargetStepYaw; // binang
/* 0x04 */ f32 unk_04; /* 0x04 */ f32 atToEyeTargetStepPitch; // binang
/* 0x08 */ f32 unk_08; /* 0x08 */ f32 unk_08; // set but unused
/* 0x0C */ s16 unk_0C; /* 0x0C */ s16 atToEyeTargetYaw;
/* 0x0E */ s16 unk_0E; /* 0x0E */ s16 atToEyeTargetPitch;
/* 0x10 */ s16 unk_10; /* 0x10 */ s16 animTimer;
/* 0x12 */ s16 unk_12; /* 0x12 */ s16 unk_12; // set but unused
/* 0x14 */ s16 unk_14; /* 0x14 */ s16 itemType;
} KeepOn4ReadWriteData; // size = 0x18 } KeepOn4ReadWriteData; // size = 0x18
typedef struct KeepOn4 { typedef struct KeepOn4 {
@ -898,16 +898,16 @@ typedef struct KeepOn4 {
#define KEEPON4_FLAG_6 (1 << 6) #define KEEPON4_FLAG_6 (1 << 6)
#define KEEPON4_FLAG_7 (1 << 7) #define KEEPON4_FLAG_7 (1 << 7)
#define CAM_FUNCDATA_KEEP4(yOffset, eyeDist, pitchTarget, yawTarget, atOffsetZ, fov, interfaceField, yawUpdateRateTarget, unk_22) \ #define CAM_FUNCDATA_KEEP4(yOffset, eyeDist, pitchTarget, yawTarget, atOffsetPlayerForwards, fov, interfaceField, unk_14, initTimer) \
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ pitchTarget, CAM_DATA_PITCH_TARGET }, \ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ yawTarget, CAM_DATA_YAW_TARGET }, \ { yawTarget, CAM_DATA_YAW_TARGET }, \
{ atOffsetZ, CAM_DATA_AT_OFFSET_Z }, \ { atOffsetPlayerForwards, CAM_DATA_AT_OFFSET_Z }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ interfaceField, CAM_DATA_INTERFACE_FIELD }, \ { interfaceField, CAM_DATA_INTERFACE_FIELD }, \
{ yawUpdateRateTarget, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \ { unk_14, CAM_DATA_YAW_UPDATE_RATE_TARGET }, \
{ unk_22, CAM_DATA_UNK_22 } { initTimer, CAM_DATA_INIT_TIMER }
typedef struct KeepOn0ReadOnlyData { typedef struct KeepOn0ReadOnlyData {
/* 0x00 */ f32 fovScale; /* 0x00 */ f32 fovScale;
@ -1463,7 +1463,7 @@ typedef struct Special5 {
{ yOffset, CAM_DATA_Y_OFFSET }, \ { yOffset, CAM_DATA_Y_OFFSET }, \
{ eyeDist, CAM_DATA_EYE_DIST }, \ { eyeDist, CAM_DATA_EYE_DIST }, \
{ eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \ { eyeDistNext, CAM_DATA_EYE_DIST_NEXT }, \
{ unk_22, CAM_DATA_UNK_22 }, \ { unk_22, CAM_DATA_INIT_TIMER }, \
{ pitchTarget, CAM_DATA_PITCH_TARGET }, \ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
@ -1477,7 +1477,7 @@ typedef struct Special5 {
{ pitchTarget, CAM_DATA_PITCH_TARGET }, \ { pitchTarget, CAM_DATA_PITCH_TARGET }, \
{ fov, CAM_DATA_FOV }, \ { fov, CAM_DATA_FOV }, \
{ atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \ { atLerpStepScale, CAM_DATA_AT_LERP_STEP_SCALE }, \
{ unk_22, CAM_DATA_UNK_22 }, \ { unk_22, CAM_DATA_INIT_TIMER }, \
{ interfaceField, CAM_DATA_INTERFACE_FIELD } { interfaceField, CAM_DATA_INTERFACE_FIELD }
typedef struct Special7ReadWriteData { typedef struct Special7ReadWriteData {

View file

@ -3698,12 +3698,12 @@ s32 Camera_KeepOn4(Camera* camera) {
camera->play->view.unk_124 = camera->camId | 0x50; camera->play->view.unk_124 = camera->camId | 0x50;
return 1; return 1;
} }
rwData->unk_14 = *itemType; rwData->itemType = *itemType;
camera->stateFlags &= ~CAM_STATE_LOCK_MODE; camera->stateFlags &= ~CAM_STATE_LOCK_MODE;
} }
if (rwData->unk_14 != *itemType) { if (rwData->itemType != *itemType) {
PRINTF(VT_COL(YELLOW, BLACK) "camera: item: item type changed %d -> %d\n" VT_RST, rwData->unk_14, *itemType); PRINTF(VT_COL(YELLOW, BLACK) "camera: item: item type changed %d -> %d\n" VT_RST, rwData->itemType, *itemType);
camera->animState = 20; camera->animState = 20;
camera->stateFlags |= CAM_STATE_LOCK_MODE; camera->stateFlags |= CAM_STATE_LOCK_MODE;
camera->stateFlags &= ~(CAM_STATE_CHECK_WATER | CAM_STATE_CHECK_BG); camera->stateFlags &= ~(CAM_STATE_CHECK_WATER | CAM_STATE_CHECK_BG);
@ -3717,115 +3717,115 @@ s32 Camera_KeepOn4(Camera* camera) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values; CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
f32 yNormal = 1.0f + t - (68.0f / playerHeight * t); f32 yNormal = 1.0f + t - (68.0f / playerHeight * t);
roData->unk_00 = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal; roData->yOffset = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
roData->unk_04 = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal; roData->eyeDist = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
roData->unk_08 = GET_NEXT_RO_DATA(values); roData->pitchTarget = GET_NEXT_RO_DATA(values);
roData->unk_0C = GET_NEXT_RO_DATA(values); roData->yawTarget = GET_NEXT_RO_DATA(values);
roData->unk_10 = GET_NEXT_RO_DATA(values); roData->atOffsetPlayerForwards = GET_NEXT_RO_DATA(values);
roData->unk_18 = GET_NEXT_RO_DATA(values); roData->fovTarget = GET_NEXT_RO_DATA(values);
roData->interfaceField = GET_NEXT_RO_DATA(values); roData->interfaceField = GET_NEXT_RO_DATA(values);
roData->unk_14 = GET_NEXT_SCALED_RO_DATA(values); roData->unk_14 = GET_NEXT_SCALED_RO_DATA(values);
roData->unk_1E = GET_NEXT_RO_DATA(values); roData->initTimer = GET_NEXT_RO_DATA(values);
PRINTF("camera: item: type %d\n", *itemType); PRINTF("camera: item: type %d\n", *itemType);
switch (*itemType) { switch (*itemType) {
case CAM_ITEM_TYPE_1: case CAM_ITEM_TYPE_1:
roData->unk_00 = playerHeight * -0.6f * yNormal; roData->yOffset = playerHeight * -0.6f * yNormal;
roData->unk_04 = playerHeight * 2.0f * yNormal; roData->eyeDist = playerHeight * 2.0f * yNormal;
roData->unk_08 = 10.0f; roData->pitchTarget = 10.0f;
break; break;
case CAM_ITEM_TYPE_2: case CAM_ITEM_TYPE_2:
case CAM_ITEM_TYPE_3: case CAM_ITEM_TYPE_3:
roData->unk_08 = -20.0f; roData->pitchTarget = -20.0f;
roData->unk_18 = 80.0f; roData->fovTarget = 80.0f;
break; break;
case CAM_ITEM_TYPE_4: case CAM_ITEM_TYPE_4:
roData->unk_00 = playerHeight * -0.2f * yNormal; roData->yOffset = playerHeight * -0.2f * yNormal;
roData->unk_08 = 25.0f; roData->pitchTarget = 25.0f;
break; break;
case CAM_ITEM_TYPE_8: case CAM_ITEM_TYPE_8:
roData->unk_00 = playerHeight * -0.2f * yNormal; roData->yOffset = playerHeight * -0.2f * yNormal;
roData->unk_04 = playerHeight * 0.8f * yNormal; roData->eyeDist = playerHeight * 0.8f * yNormal;
roData->unk_08 = 50.0f; roData->pitchTarget = 50.0f;
roData->unk_18 = 70.0f; roData->fovTarget = 70.0f;
break; break;
case CAM_ITEM_TYPE_9: case CAM_ITEM_TYPE_9:
roData->unk_00 = playerHeight * 0.1f * yNormal; roData->yOffset = playerHeight * 0.1f * yNormal;
roData->unk_04 = playerHeight * 0.5f * yNormal; roData->eyeDist = playerHeight * 0.5f * yNormal;
roData->unk_08 = -20.0f; roData->pitchTarget = -20.0f;
roData->unk_0C = 0.0f; roData->yawTarget = 0.0f;
roData->interfaceField = roData->interfaceField =
CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE, KEEPON4_FLAG_6); CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE, KEEPON4_FLAG_6);
break; break;
case CAM_ITEM_TYPE_5: case CAM_ITEM_TYPE_5:
roData->unk_00 = playerHeight * -0.4f * yNormal; roData->yOffset = playerHeight * -0.4f * yNormal;
roData->unk_08 = -10.0f; roData->pitchTarget = -10.0f;
roData->unk_0C = 45.0f; roData->yawTarget = 45.0f;
roData->interfaceField = roData->interfaceField =
CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_ALL, KEEPON4_FLAG_1); CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_ALL, KEEPON4_FLAG_1);
break; break;
case CAM_ITEM_TYPE_10: case CAM_ITEM_TYPE_10:
roData->unk_00 = playerHeight * -0.5f * yNormal; roData->yOffset = playerHeight * -0.5f * yNormal;
roData->unk_04 = playerHeight * 1.5f * yNormal; roData->eyeDist = playerHeight * 1.5f * yNormal;
roData->unk_08 = -15.0f; roData->pitchTarget = -15.0f;
roData->unk_0C = 175.0f; roData->yawTarget = 175.0f;
roData->unk_18 = 70.0f; roData->fovTarget = 70.0f;
roData->interfaceField = roData->interfaceField =
CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_NOTHING_ALT, KEEPON4_FLAG_1); CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_NOTHING_ALT, KEEPON4_FLAG_1);
roData->unk_1E = 0x3C; roData->initTimer = 0x3C;
break; break;
case CAM_ITEM_TYPE_12: case CAM_ITEM_TYPE_12:
roData->unk_00 = playerHeight * -0.6f * yNormal; roData->yOffset = playerHeight * -0.6f * yNormal;
roData->unk_04 = playerHeight * 1.6f * yNormal; roData->eyeDist = playerHeight * 1.6f * yNormal;
roData->unk_08 = -2.0f; roData->pitchTarget = -2.0f;
roData->unk_0C = 120.0f; roData->yawTarget = 120.0f;
roData->unk_10 = 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_1);
roData->unk_1E = 0x1E; roData->initTimer = 0x1E;
roData->unk_18 = 50.0f; roData->fovTarget = 50.0f;
break; break;
case CAM_ITEM_TYPE_90: case CAM_ITEM_TYPE_90:
roData->unk_00 = playerHeight * -0.3f * yNormal; roData->yOffset = playerHeight * -0.3f * yNormal;
roData->unk_18 = 45.0f; roData->fovTarget = 45.0f;
roData->interfaceField = roData->interfaceField =
CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_IGNORE, KEEPON4_FLAG_1); CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_IGNORE, KEEPON4_FLAG_1);
break; break;
case CAM_ITEM_TYPE_91: case CAM_ITEM_TYPE_91:
roData->unk_00 = playerHeight * -0.1f * yNormal; roData->yOffset = playerHeight * -0.1f * yNormal;
roData->unk_04 = playerHeight * 1.5f * yNormal; roData->eyeDist = playerHeight * 1.5f * yNormal;
roData->unk_08 = -3.0f; roData->pitchTarget = -3.0f;
roData->unk_0C = 10.0f; roData->yawTarget = 10.0f;
roData->unk_18 = 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_3);
break; break;
case CAM_ITEM_TYPE_81: case CAM_ITEM_TYPE_81:
roData->unk_00 = playerHeight * -0.3f * yNormal; roData->yOffset = playerHeight * -0.3f * yNormal;
roData->unk_04 = playerHeight * 1.5f * yNormal; roData->eyeDist = playerHeight * 1.5f * yNormal;
roData->unk_08 = 2.0f; roData->pitchTarget = 2.0f;
roData->unk_18 = 45.0f; roData->fovTarget = 45.0f;
roData->unk_0C = 20.0f; roData->yawTarget = 20.0f;
roData->unk_10 = 20.0f; roData->atOffsetPlayerForwards = 20.0f;
roData->interfaceField = roData->interfaceField =
CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_NOTHING_ALT, KEEPON4_FLAG_7); CAM_INTERFACE_FIELD(CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_NOTHING_ALT, KEEPON4_FLAG_7);
roData->unk_1E = 0x1E; roData->initTimer = 0x1E;
break; break;
case CAM_ITEM_TYPE_11: case CAM_ITEM_TYPE_11:
roData->unk_00 = playerHeight * -0.19f * yNormal; roData->yOffset = playerHeight * -0.19f * yNormal;
roData->unk_04 = playerHeight * 0.7f * yNormal; roData->eyeDist = playerHeight * 0.7f * yNormal;
roData->unk_0C = 130.0f; roData->yawTarget = 130.0f;
roData->unk_10 = 10.0f; roData->atOffsetPlayerForwards = 10.0f;
roData->interfaceField = CAM_INTERFACE_FIELD( roData->interfaceField = CAM_INTERFACE_FIELD(
CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE, KEEPON4_FLAG_5 | KEEPON4_FLAG_1); CAM_LETTERBOX_MEDIUM, CAM_HUD_VISIBILITY_A_HEARTS_MAGIC_FORCE, KEEPON4_FLAG_5 | KEEPON4_FLAG_1);
break; break;
@ -3844,10 +3844,10 @@ s32 Camera_KeepOn4(Camera* camera) {
sAtTarget = playerPosRot->pos; sAtTarget = playerPosRot->pos;
sAtTarget.y += playerHeight; sAtTarget.y += playerHeight;
temp_f0_2 = BgCheck_CameraRaycastDown2(&camera->play->colCtx, &spC0, &i, &sAtTarget); temp_f0_2 = BgCheck_CameraRaycastDown2(&camera->play->colCtx, &spC0, &i, &sAtTarget);
if (temp_f0_2 > (roData->unk_00 + sAtTarget.y)) { if (temp_f0_2 > (roData->yOffset + sAtTarget.y)) {
sAtTarget.y = temp_f0_2 + 10.0f; sAtTarget.y = temp_f0_2 + 10.0f;
} else { } else {
sAtTarget.y += roData->unk_00; sAtTarget.y += roData->yOffset;
} }
lineOCCheckNumExclusions = 0; lineOCCheckNumExclusions = 0;
@ -3858,38 +3858,38 @@ s32 Camera_KeepOn4(Camera* camera) {
lineOCCheckNumExclusions++; lineOCCheckNumExclusions++;
func_80043ABC(camera); func_80043ABC(camera);
camera->stateFlags &= ~(CAM_STATE_CHECK_WATER | CAM_STATE_CHECK_BG); camera->stateFlags &= ~(CAM_STATE_CHECK_WATER | CAM_STATE_CHECK_BG);
rwData->unk_10 = roData->unk_1E; 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_1) {
atToEyeBasePitch = CAM_DEG_TO_BINANG(roData->unk_08); 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->unk_0C) ? (s16)(playerPosRot->rot.y - 0x7FFF) + CAM_DEG_TO_BINANG(roData->yawTarget)
: (s16)(playerPosRot->rot.y - 0x7FFF) - CAM_DEG_TO_BINANG(roData->unk_0C); : (s16)(playerPosRot->rot.y - 0x7FFF) - CAM_DEG_TO_BINANG(roData->yawTarget);
} else if (roData->interfaceField & KEEPON4_FLAG_2) { } else if (roData->interfaceField & KEEPON4_FLAG_2) {
atToEyeBasePitch = CAM_DEG_TO_BINANG(roData->unk_08); atToEyeBasePitch = CAM_DEG_TO_BINANG(roData->pitchTarget);
atToEyeBaseYaw = CAM_DEG_TO_BINANG(roData->unk_0C); atToEyeBaseYaw = CAM_DEG_TO_BINANG(roData->yawTarget);
} else if ((roData->interfaceField & KEEPON4_FLAG_3) && camera->target != NULL) { } else if ((roData->interfaceField & KEEPON4_FLAG_3) && camera->target != NULL) {
PosRot sp60; PosRot sp60;
sp60 = Actor_GetWorldPosShapeRot(camera->target); sp60 = Actor_GetWorldPosShapeRot(camera->target);
atToEyeBasePitch = CAM_DEG_TO_BINANG(roData->unk_08) - sp60.rot.x; atToEyeBasePitch = CAM_DEG_TO_BINANG(roData->pitchTarget) - sp60.rot.x;
atToEyeBaseYaw = (s16)((s16)(sp60.rot.y - 0x7FFF) - atToEyeNextDir.yaw) > 0 atToEyeBaseYaw = (s16)((s16)(sp60.rot.y - 0x7FFF) - atToEyeNextDir.yaw) > 0
? (s16)(sp60.rot.y - 0x7FFF) + CAM_DEG_TO_BINANG(roData->unk_0C) ? (s16)(sp60.rot.y - 0x7FFF) + CAM_DEG_TO_BINANG(roData->yawTarget)
: (s16)(sp60.rot.y - 0x7FFF) - CAM_DEG_TO_BINANG(roData->unk_0C); : (s16)(sp60.rot.y - 0x7FFF) - CAM_DEG_TO_BINANG(roData->yawTarget);
lineOCCheckExclusions[1] = camera->target; lineOCCheckExclusions[1] = camera->target;
lineOCCheckNumExclusions++; lineOCCheckNumExclusions++;
} else if ((roData->interfaceField & KEEPON4_FLAG_7) && camera->target != NULL) { } else if ((roData->interfaceField & KEEPON4_FLAG_7) && camera->target != NULL) {
PosRot sp4C; PosRot sp4C;
sp4C = Actor_GetWorld(camera->target); sp4C = Actor_GetWorld(camera->target);
atToEyeBasePitch = CAM_DEG_TO_BINANG(roData->unk_08); atToEyeBasePitch = CAM_DEG_TO_BINANG(roData->pitchTarget);
sp9E = Camera_XZAngle(&sp4C.pos, &playerPosRot->pos); sp9E = Camera_XZAngle(&sp4C.pos, &playerPosRot->pos);
atToEyeBaseYaw = ((s16)(sp9E - atToEyeNextDir.yaw) > 0) ? sp9E + CAM_DEG_TO_BINANG(roData->unk_0C) atToEyeBaseYaw = ((s16)(sp9E - atToEyeNextDir.yaw) > 0) ? sp9E + CAM_DEG_TO_BINANG(roData->yawTarget)
: sp9E - CAM_DEG_TO_BINANG(roData->unk_0C); : 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_6) {
atToEyeBasePitch = CAM_DEG_TO_BINANG(roData->unk_08); atToEyeBasePitch = CAM_DEG_TO_BINANG(roData->pitchTarget);
atToEyeBaseYaw = atToEyeNextDir.yaw; atToEyeBaseYaw = atToEyeNextDir.yaw;
} else { } else {
atToEyeBasePitch = atToEyeNextDir.pitch; atToEyeBasePitch = atToEyeNextDir.pitch;
@ -3898,7 +3898,7 @@ s32 Camera_KeepOn4(Camera* camera) {
vecGeo.pitch = atToEyeBasePitch; vecGeo.pitch = atToEyeBasePitch;
vecGeo.yaw = atToEyeBaseYaw; vecGeo.yaw = atToEyeBaseYaw;
vecGeo.r = roData->unk_04; 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_0)) {
angleCnt = ARRAY_COUNT(sCamCheckAroundOffsetsYaw); angleCnt = ARRAY_COUNT(sCamCheckAroundOffsetsYaw);
@ -3916,10 +3916,10 @@ s32 Camera_KeepOn4(Camera* camera) {
PRINTF("camera: item: BG&collision check %d time(s)\n", i); PRINTF("camera: item: BG&collision check %d time(s)\n", i);
#endif #endif
} }
rwData->unk_04 = (s16)(vecGeo.pitch - atToEyeNextDir.pitch) / (f32)rwData->unk_10; rwData->atToEyeTargetStepPitch = (s16)(vecGeo.pitch - atToEyeNextDir.pitch) / (f32)rwData->animTimer;
rwData->unk_00 = (s16)(vecGeo.yaw - atToEyeNextDir.yaw) / (f32)rwData->unk_10; rwData->atToEyeTargetStepYaw = (s16)(vecGeo.yaw - atToEyeNextDir.yaw) / (f32)rwData->animTimer;
rwData->unk_0C = atToEyeNextDir.yaw; rwData->atToEyeTargetYaw = atToEyeNextDir.yaw;
rwData->unk_0E = atToEyeNextDir.pitch; rwData->atToEyeTargetPitch = atToEyeNextDir.pitch;
camera->animState++; camera->animState++;
rwData->unk_12 = 1; rwData->unk_12 = 1;
break; break;
@ -3932,20 +3932,20 @@ s32 Camera_KeepOn4(Camera* camera) {
camera->yOffsetUpdateRate = 0.25f; camera->yOffsetUpdateRate = 0.25f;
camera->atLERPStepScale = 0.75f; camera->atLERPStepScale = 0.75f;
Camera_LERPCeilVec3f(&sAtTarget, at, 0.5f, 0.5f, 0.2f); Camera_LERPCeilVec3f(&sAtTarget, at, 0.5f, 0.5f, 0.2f);
if (roData->unk_10 != 0.0f) { if (roData->atOffsetPlayerForwards != 0.0f) {
vecGeo.r = roData->unk_10; vecGeo.r = roData->atOffsetPlayerForwards;
vecGeo.pitch = 0; vecGeo.pitch = 0;
vecGeo.yaw = playerPosRot->rot.y; vecGeo.yaw = playerPosRot->rot.y;
*at = Camera_AddVecGeoToVec3f(at, &vecGeo); *at = Camera_AddVecGeoToVec3f(at, &vecGeo);
} }
camera->atLERPStepScale = 0.0f; camera->atLERPStepScale = 0.0f;
camera->dist = Camera_LERPCeilF(roData->unk_04, camera->dist, 0.25f, 2.0f); camera->dist = Camera_LERPCeilF(roData->eyeDist, camera->dist, 0.25f, 2.0f);
vecGeo.r = camera->dist; vecGeo.r = camera->dist;
if (rwData->unk_10 != 0) { if (rwData->animTimer != 0) {
camera->stateFlags |= CAM_STATE_LOCK_MODE; camera->stateFlags |= CAM_STATE_LOCK_MODE;
rwData->unk_0C += (s16)rwData->unk_00; rwData->atToEyeTargetYaw += (s16)rwData->atToEyeTargetStepYaw;
rwData->unk_0E += (s16)rwData->unk_04; rwData->atToEyeTargetPitch += (s16)rwData->atToEyeTargetStepPitch;
rwData->unk_10--; rwData->animTimer--;
} else if (roData->interfaceField & KEEPON4_FLAG_4) { } else if (roData->interfaceField & KEEPON4_FLAG_4) {
camera->stateFlags |= (CAM_STATE_CAM_FUNC_FINISH | CAM_STATE_BLOCK_BG); camera->stateFlags |= (CAM_STATE_CAM_FUNC_FINISH | CAM_STATE_BLOCK_BG);
camera->stateFlags |= (CAM_STATE_CHECK_WATER | CAM_STATE_CHECK_BG); camera->stateFlags |= (CAM_STATE_CHECK_WATER | CAM_STATE_CHECK_BG);
@ -3967,12 +3967,12 @@ s32 Camera_KeepOn4(Camera* camera) {
} }
} }
} }
vecGeo.yaw = Camera_LERPCeilS(rwData->unk_0C, atToEyeNextDir.yaw, roData->unk_14, 4); vecGeo.yaw = Camera_LERPCeilS(rwData->atToEyeTargetYaw, atToEyeNextDir.yaw, roData->unk_14, 4);
vecGeo.pitch = Camera_LERPCeilS(rwData->unk_0E, atToEyeNextDir.pitch, roData->unk_14, 4); vecGeo.pitch = Camera_LERPCeilS(rwData->atToEyeTargetPitch, atToEyeNextDir.pitch, roData->unk_14, 4);
*eyeNext = Camera_AddVecGeoToVec3f(at, &vecGeo); *eyeNext = Camera_AddVecGeoToVec3f(at, &vecGeo);
*eye = *eyeNext; *eye = *eyeNext;
Camera_BGCheck(camera, at, eye); Camera_BGCheck(camera, at, eye);
camera->fov = Camera_LERPCeilF(roData->unk_18, camera->fov, camera->fovUpdateRate, 1.0f); camera->fov = Camera_LERPCeilF(roData->fovTarget, camera->fov, camera->fovUpdateRate, 1.0f);
camera->roll = Camera_LERPCeilS(0, camera->roll, 0.5f, 0xA); camera->roll = Camera_LERPCeilS(0, camera->roll, 0.5f, 0xA);
//! @bug Missing return, but the return value is not used. //! @bug Missing return, but the return value is not used.
} }

View file

@ -110,7 +110,7 @@ s16 sCamDataRegsInit[CAM_DATA_MAX] = {
0, // CAM_DATA_AT_OFFSET_X 0, // CAM_DATA_AT_OFFSET_X
0, // CAM_DATA_AT_OFFSET_Y 0, // CAM_DATA_AT_OFFSET_Y
0, // CAM_DATA_AT_OFFSET_Z 0, // CAM_DATA_AT_OFFSET_Z
6, // CAM_DATA_UNK_22 6, // CAM_DATA_INIT_TIMER
60, // CAM_DATA_UNK_23 60, // CAM_DATA_UNK_23
30, // CAM_DATA_FOV_SCALE 30, // CAM_DATA_FOV_SCALE
0, // CAM_DATA_YAW_SCALE 0, // CAM_DATA_YAW_SCALE