1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2024-12-28 15:56:51 +00:00

Document Camera BgCamData (#1232)

* Document bgCamData

* More changes and cleanup

* More docs

* Clarify comments

* PR Feedback, rename bgcheck functions

* remove fallthrough cleanup (other pr that deals with that)

* PR Suggestions

* bug report

* bgCamDataIndexBeforeUnderwater

* PR/Discord Discussions

* Missed some

* sync function header args

* Another suggestion

* cleanup

* Comments

* Change bgCamData to s16 for now

* PR suggestions

* the

* use "info"

* Missed a suggestion

* Discord Discussion

* Revert bgCamFuncData to Vec3s

* format
This commit is contained in:
engineer124 2022-06-17 11:25:42 -07:00 committed by GitHub
parent 08c8126ba5
commit 849fdbf9ea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 359 additions and 305 deletions

View file

@ -628,12 +628,12 @@ s32 BgCheck_SphVsFirstDynaPoly(CollisionContext* colCtx, u16 xpFlags, CollisionP
void CollisionHeader_GetVirtual(void* colHeader, CollisionHeader** dest); void CollisionHeader_GetVirtual(void* colHeader, CollisionHeader** dest);
void func_800418D0(CollisionContext* colCtx, PlayState* play); void func_800418D0(CollisionContext* colCtx, PlayState* play);
void BgCheck_ResetPolyCheckTbl(SSNodeList* nodeList, s32 numPolys); void BgCheck_ResetPolyCheckTbl(SSNodeList* nodeList, s32 numPolys);
u32 SurfaceType_GetCamDataIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId); u32 SurfaceType_GetBgCamIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
u16 func_80041A4C(CollisionContext* colCtx, u32 camId, s32 bgId); u16 BgCheck_GetBgCamSettingImpl(CollisionContext* colCtx, u32 bgCamIndex, s32 bgId);
u16 SurfaceType_GetCameraSType(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId); u16 BgCheck_GetBgCamSetting(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
u16 SurfaceType_GetNumCameras(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId); u16 BgCheck_GetBgCamCount(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
Vec3s* func_80041C10(CollisionContext* colCtx, s32 camId, s32 bgId); Vec3s* BgCheck_GetBgCamFuncDataImpl(CollisionContext* colCtx, s32 bgCamIndex, s32 bgId);
Vec3s* SurfaceType_GetCamPosData(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId); Vec3s* BgCheck_GetBgCamFuncData(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
u32 SurfaceType_GetSceneExitIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId); u32 SurfaceType_GetSceneExitIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
u32 func_80041D4C(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId); u32 func_80041D4C(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
u32 func_80041D70(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId); u32 func_80041D70(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
@ -662,8 +662,8 @@ s32 WaterBox_GetSurface2(PlayState* play, CollisionContext* colCtx, Vec3f* pos,
WaterBox** outWaterBox); WaterBox** outWaterBox);
s32 WaterBox_GetSurfaceImpl(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, s32 WaterBox_GetSurfaceImpl(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface,
WaterBox** outWaterBox); WaterBox** outWaterBox);
u32 WaterBox_GetCamDataIndex(CollisionContext* colCtx, WaterBox* waterBox); u32 WaterBox_GetBgCamIndex(CollisionContext* colCtx, WaterBox* waterBox);
u16 WaterBox_GetCameraSType(CollisionContext* colCtx, WaterBox* waterBox); u16 WaterBox_GetBgCamSetting(CollisionContext* colCtx, WaterBox* waterBox);
u32 WaterBox_GetLightSettingIndex(CollisionContext* colCtx, WaterBox* waterBox); u32 WaterBox_GetLightSettingIndex(CollisionContext* colCtx, WaterBox* waterBox);
s32 func_80042708(CollisionPoly* polyA, CollisionPoly* polyB, Vec3f* point, Vec3f* closestPoint); s32 func_80042708(CollisionPoly* polyA, CollisionPoly* polyB, Vec3f* point, Vec3f* closestPoint);
s32 func_800427B4(CollisionPoly* polyA, CollisionPoly* polyB, Vec3f* pointA, Vec3f* pointB, Vec3f* closestPoint); s32 func_800427B4(CollisionPoly* polyA, CollisionPoly* polyB, Vec3f* pointA, Vec3f* pointB, Vec3f* closestPoint);
@ -690,7 +690,7 @@ void Camera_Finish(Camera* camera);
s32 Camera_ChangeMode(Camera* camera, s16 mode); s32 Camera_ChangeMode(Camera* camera, s16 mode);
s32 Camera_CheckValidMode(Camera* camera, s16 mode); s32 Camera_CheckValidMode(Camera* camera, s16 mode);
s32 Camera_ChangeSetting(Camera* camera, s16 setting); s32 Camera_ChangeSetting(Camera* camera, s16 setting);
s32 Camera_ChangeDataIdx(Camera* camera, s32 camDataIdx); s32 Camera_ChangeBgCamIndex(Camera* camera, s32 bgCamIndex);
s16 Camera_GetInputDirYaw(Camera* camera); s16 Camera_GetInputDirYaw(Camera* camera);
Vec3s* Camera_GetCamDir(Vec3s* dst, Camera* camera); Vec3s* Camera_GetCamDir(Vec3s* dst, Camera* camera);
s16 Camera_GetCamDirPitch(Camera* camera); s16 Camera_GetCamDirPitch(Camera* camera);
@ -703,7 +703,7 @@ s16 func_8005AD1C(Camera* camera, s16 arg1);
s32 Camera_ResetAnim(Camera* camera); s32 Camera_ResetAnim(Camera* camera);
s32 Camera_SetCSParams(Camera* camera, CutsceneCameraPoint* atPoints, CutsceneCameraPoint* eyePoints, Player* player, s32 Camera_SetCSParams(Camera* camera, CutsceneCameraPoint* atPoints, CutsceneCameraPoint* eyePoints, Player* player,
s16 relativeToPlayer); s16 relativeToPlayer);
s32 Camera_ChangeDoorCam(Camera* camera, Actor* doorActor, s16 camDataIdx, f32 arg3, s16 timer1, s16 timer2, s32 Camera_ChangeDoorCam(Camera* camera, Actor* doorActor, s16 bgCamIndex, f32 arg3, s16 timer1, s16 timer2,
s16 timer3); s16 timer3);
s32 Camera_Copy(Camera* dstCamera, Camera* srcCamera); s32 Camera_Copy(Camera* dstCamera, Camera* srcCamera);
Vec3f* Camera_GetSkyboxOffset(Vec3f* dst, Camera* camera); Vec3f* Camera_GetSkyboxOffset(Vec3f* dst, Camera* camera);

View file

@ -52,10 +52,26 @@ typedef struct {
} CollisionPoly; // size = 0x10 } CollisionPoly; // size = 0x10
typedef struct { typedef struct {
/* 0x00 */ u16 cameraSType; /* 0x0 */ u16 setting; // camera setting described by CameraSettingType enum
/* 0x02 */ s16 numCameras; /* 0x2 */ s16 count; // only used when `bgCamFuncData` is a list of points used for crawlspaces
/* 0x04 */ Vec3s* camPosData; /* 0x4 */ Vec3s* bgCamFuncData; // s16 data grouped in threes (ex. Vec3s), is usually of type `BgCamFuncData`, but can be a list of points of type `Vec3s` for crawlspaces
} CamData; } BgCamInfo; // size = 0x8
typedef BgCamInfo CamData; // Todo: Zapd compatibility
// The structure used for all instances of s16 data from `BgCamInfo` with the exception of crawlspaces.
// See `Camera_Subj4` for Vec3s data usage in crawlspaces
typedef struct {
/* 0x00 */ Vec3s pos;
/* 0x06 */ Vec3s rot;
/* 0x0C */ s16 fov;
/* 0x0E */ union {
s16 jfifId;
s16 timer;
s16 flags;
};
/* 0x10 */ s16 unk_10; // unused
} BgCamFuncData; // size = 0x12
typedef struct { typedef struct {
/* 0x00 */ s16 xMin; /* 0x00 */ s16 xMin;
@ -68,7 +84,7 @@ typedef struct {
// 0x0008_0000 = ? // 0x0008_0000 = ?
// 0x0007_E000 = Room Index, 0x3F = all rooms // 0x0007_E000 = Room Index, 0x3F = all rooms
// 0x0000_1F00 = Lighting Settings Index // 0x0000_1F00 = Lighting Settings Index
// 0x0000_00FF = CamData index // 0x0000_00FF = BgCam Index
} WaterBox; // size = 0x10 } WaterBox; // size = 0x10
typedef struct { typedef struct {
@ -86,7 +102,7 @@ typedef struct {
/* 0x14 */ u16 numPolygons; /* 0x14 */ u16 numPolygons;
/* 0x18 */ CollisionPoly* polyList; /* 0x18 */ CollisionPoly* polyList;
/* 0x1C */ SurfaceType* surfaceTypeList; /* 0x1C */ SurfaceType* surfaceTypeList;
/* 0x20 */ CamData* cameraDataList; /* 0x20 */ BgCamInfo* bgCamList;
/* 0x24 */ u16 numWaterBoxes; /* 0x24 */ u16 numWaterBoxes;
/* 0x28 */ WaterBox* waterBoxes; /* 0x28 */ WaterBox* waterBoxes;
} CollisionHeader; // original name: BGDataInfo } CollisionHeader; // original name: BGDataInfo

View file

@ -906,7 +906,7 @@ typedef struct {
/* 0x00 */ PosRot eyePosRot; /* 0x00 */ PosRot eyePosRot;
/* 0x14 */ char unk_14[0x8]; /* 0x14 */ char unk_14[0x8];
/* 0x1C */ s16 fov; /* 0x1C */ s16 fov;
/* 0x1E */ s16 jfifId; /* 0x1E */ s16 flags;
} Data4ReadWriteData; // size = 0x20 } Data4ReadWriteData; // size = 0x20
typedef struct { typedef struct {
@ -976,7 +976,7 @@ typedef struct {
typedef struct { typedef struct {
/* 0x0 */ struct Actor* doorActor; /* 0x0 */ struct Actor* doorActor;
/* 0x4 */ s16 camDataIdx; /* 0x4 */ s16 bgCamIndex;
/* 0x6 */ s16 timer1; /* 0x6 */ s16 timer1;
/* 0x8 */ s16 timer2; /* 0x8 */ s16 timer2;
/* 0xA */ s16 timer3; /* 0xA */ s16 timer3;
@ -1010,7 +1010,7 @@ typedef struct {
typedef struct { typedef struct {
/* 0x00 */ Vec3f initalPos; /* 0x00 */ Vec3f initalPos;
/* 0x0C */ s16 animTimer; /* 0x0C */ s16 animTimer;
/* 0x10 */ InfiniteLine sceneCamPosPlayerLine; /* 0x10 */ InfiniteLine eyeAndDirection;
} Unique0ReadWriteData; // size = 0x28 } Unique0ReadWriteData; // size = 0x28
typedef struct { typedef struct {
@ -1363,8 +1363,8 @@ typedef struct {
/* 0x104 */ f32 playerGroundY; /* 0x104 */ f32 playerGroundY;
/* 0x108 */ Vec3f floorNorm; /* 0x108 */ Vec3f floorNorm;
/* 0x114 */ f32 waterYPos; /* 0x114 */ f32 waterYPos;
/* 0x118 */ s32 waterPrevCamIdx; /* 0x118 */ s32 bgCamIndexBeforeUnderwater;
/* 0x11C */ s32 waterPrevCamSetting; /* 0x11C */ s32 waterCamSetting;
/* 0x120 */ s32 waterQuakeId; /* 0x120 */ s32 waterQuakeId;
/* 0x124 */ void* data0; /* 0x124 */ void* data0;
/* 0x128 */ void* data1; /* 0x128 */ void* data1;
@ -1377,23 +1377,23 @@ typedef struct {
/* 0x140 */ s16 status; /* 0x140 */ s16 status;
/* 0x142 */ s16 setting; /* 0x142 */ s16 setting;
/* 0x144 */ s16 mode; /* 0x144 */ s16 mode;
/* 0x146 */ s16 bgCheckId; /* 0x146 */ s16 bgId; // bgId the camera is currently interacting with
/* 0x148 */ s16 camDataIdx; /* 0x148 */ s16 bgCamIndex;
/* 0x14A */ s16 unk_14A; /* 0x14A */ s16 unk_14A;
/* 0x14C */ s16 unk_14C; /* 0x14C */ s16 unk_14C;
/* 0x14E */ s16 childCamId; /* 0x14E */ s16 childCamId;
/* 0x150 */ s16 waterDistortionTimer; /* 0x150 */ s16 waterDistortionTimer;
/* 0x152 */ s16 distortionFlags; /* 0x152 */ s16 distortionFlags;
/* 0x154 */ s16 prevSetting; /* 0x154 */ s16 prevSetting;
/* 0x156 */ s16 nextCamDataIdx; /* 0x156 */ s16 nextBgCamIndex;
/* 0x158 */ s16 nextBGCheckId; /* 0x158 */ s16 nextBgId;
/* 0x15A */ s16 roll; /* 0x15A */ s16 roll;
/* 0x15C */ s16 paramFlags; /* 0x15C */ s16 paramFlags;
/* 0x15E */ s16 animState; /* 0x15E */ s16 animState;
/* 0x160 */ s16 timer; /* 0x160 */ s16 timer;
/* 0x162 */ s16 parentCamId; /* 0x162 */ s16 parentCamId;
/* 0x164 */ s16 camId; /* 0x164 */ s16 camId;
/* 0x166 */ s16 prevCamDataIdx; /* 0x166 */ s16 prevBgCamIndex;
/* 0x168 */ s16 csId; /* 0x168 */ s16 csId;
/* 0x16A */ s16 unk_16A; /* 0x16A */ s16 unk_16A;
} Camera; // size = 0x16C } Camera; // size = 0x16C

View file

@ -521,7 +521,7 @@ typedef struct Player {
/* 0x0450 */ Vec3f unk_450; /* 0x0450 */ Vec3f unk_450;
/* 0x045C */ Vec3f unk_45C; /* 0x045C */ Vec3f unk_45C;
/* 0x0468 */ char unk_468[0x002]; /* 0x0468 */ char unk_468[0x002];
/* 0x046A */ s16 unk_46A; /* 0x046A */ s16 doorBgCamIndex;
/* 0x046C */ s16 subCamId; /* 0x046C */ s16 subCamId;
/* 0x046E */ char unk_46E[0x02A]; /* 0x046E */ char unk_46E[0x02A];
/* 0x0498 */ ColliderCylinder cylinder; /* 0x0498 */ ColliderCylinder cylinder;

View file

@ -29,7 +29,7 @@ typedef struct {
typedef struct { typedef struct {
struct { struct {
s8 room; // Room to switch to s8 room; // Room to switch to
s8 effects; // How the camera reacts during the transition s8 bgCamIndex; // How the camera reacts during the transition. See `Camera_ChangeDoorCam`
} /* 0x00 */ sides[2]; // 0 = front, 1 = back } /* 0x00 */ sides[2]; // 0 = front, 1 = back
/* 0x04 */ s16 id; /* 0x04 */ s16 id;
/* 0x06 */ Vec3s pos; /* 0x06 */ Vec3s pos;

View file

@ -1032,7 +1032,7 @@ s32 func_8002DF38(PlayState* play, Actor* actor, u8 csMode) {
player->csMode = csMode; player->csMode = csMode;
player->unk_448 = actor; player->unk_448 = actor;
player->unk_46A = 0; player->doorBgCamIndex = 0;
return true; return true;
} }
@ -1041,7 +1041,7 @@ s32 func_8002DF54(PlayState* play, Actor* actor, u8 csMode) {
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
func_8002DF38(play, actor, csMode); func_8002DF38(play, actor, csMode);
player->unk_46A = 1; player->doorBgCamIndex = 1;
return true; return true;
} }

View file

@ -3770,7 +3770,7 @@ void CollisionHeader_SegmentedToVirtual(CollisionHeader* colHeader) {
colHeader->vtxList = SEGMENTED_TO_VIRTUAL(colHeader->vtxList); colHeader->vtxList = SEGMENTED_TO_VIRTUAL(colHeader->vtxList);
colHeader->polyList = SEGMENTED_TO_VIRTUAL(colHeader->polyList); colHeader->polyList = SEGMENTED_TO_VIRTUAL(colHeader->polyList);
colHeader->surfaceTypeList = SEGMENTED_TO_VIRTUAL(colHeader->surfaceTypeList); colHeader->surfaceTypeList = SEGMENTED_TO_VIRTUAL(colHeader->surfaceTypeList);
colHeader->cameraDataList = SEGMENTED_TO_VIRTUAL(colHeader->cameraDataList); colHeader->bgCamList = SEGMENTED_TO_VIRTUAL(colHeader->bgCamList);
colHeader->waterBoxes = SEGMENTED_TO_VIRTUAL(colHeader->waterBoxes); colHeader->waterBoxes = SEGMENTED_TO_VIRTUAL(colHeader->waterBoxes);
} }
@ -3821,137 +3821,152 @@ u32 SurfaceType_GetData(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId,
if (colHeader == NULL || poly == NULL) { if (colHeader == NULL || poly == NULL) {
return 0; return 0;
} }
surfaceTypes = colHeader->surfaceTypeList; surfaceTypes = colHeader->surfaceTypeList;
if (surfaceTypes == SEGMENTED_TO_VIRTUAL(NULL)) { if (surfaceTypes == SEGMENTED_TO_VIRTUAL(NULL)) {
return 0; return 0;
} }
return surfaceTypes[poly->type].data[dataIdx]; return surfaceTypes[poly->type].data[dataIdx];
} }
/** /**
* SurfaceType return CamData Index * SurfaceType get index of bgCam
*/ */
u32 SurfaceType_GetCamDataIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) { u32 SurfaceType_GetBgCamIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
return SurfaceType_GetData(colCtx, poly, bgId, 0) & 0xFF; return SurfaceType_GetData(colCtx, poly, bgId, 0) & 0xFF;
} }
/** /**
* CamData return cameraSType * BgCam get setting of bgCam
*/ */
u16 func_80041A4C(CollisionContext* colCtx, u32 camId, s32 bgId) { u16 BgCheck_GetBgCamSettingImpl(CollisionContext* colCtx, u32 bgCamIndex, s32 bgId) {
u16 result; u16 camSetting;
CollisionHeader* colHeader; CollisionHeader* colHeader;
CamData* camData; BgCamInfo* bgCamList;
colHeader = BgCheck_GetCollisionHeader(colCtx, bgId); colHeader = BgCheck_GetCollisionHeader(colCtx, bgId);
if (colHeader == NULL) { if (colHeader == NULL) {
return 0; return CAM_SET_NONE;
} }
camData = colHeader->cameraDataList;
result = camData[camId].cameraSType; bgCamList = colHeader->bgCamList;
return result; camSetting = bgCamList[bgCamIndex].setting;
return camSetting;
} }
/** /**
* SurfaceType return cameraSType * BgCam Get the camera setting of bgCam
*/ */
u16 SurfaceType_GetCameraSType(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) { u16 BgCheck_GetBgCamSetting(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId); CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId);
CamData* camData; BgCamInfo* bgCamList;
SurfaceType* surfaceTypes; SurfaceType* surfaceTypes;
if (colHeader == NULL) { if (colHeader == NULL) {
return 0; return CAM_SET_NONE;
} }
camData = colHeader->cameraDataList;
if (camData == SEGMENTED_TO_VIRTUAL(NULL)) { bgCamList = colHeader->bgCamList;
return 0; if (bgCamList == SEGMENTED_TO_VIRTUAL(NULL)) {
return CAM_SET_NONE;
} }
surfaceTypes = colHeader->surfaceTypeList; surfaceTypes = colHeader->surfaceTypeList;
if (surfaceTypes == SEGMENTED_TO_VIRTUAL(NULL)) { if (surfaceTypes == SEGMENTED_TO_VIRTUAL(NULL)) {
return 0; return CAM_SET_NONE;
} }
return func_80041A4C(colCtx, SurfaceType_GetCamDataIndex(colCtx, poly, bgId), bgId);
return BgCheck_GetBgCamSettingImpl(colCtx, SurfaceType_GetBgCamIndex(colCtx, poly, bgId), bgId);
} }
/** /**
* CamData Get number of cameras * BgCam Get the total count of Vec3s data from bgCamFuncData
*/ */
u16 func_80041B24(CollisionContext* colCtx, u32 camId, s32 bgId) { u16 BgCheck_GetBgCamCountImpl(CollisionContext* colCtx, u32 bgCamIndex, s32 bgId) {
CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId); CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId);
CamData* camData; BgCamInfo* bgCamList;
if (colHeader == NULL) { if (colHeader == NULL) {
return 0; return 0;
} }
camData = colHeader->cameraDataList; bgCamList = colHeader->bgCamList;
if (camData == SEGMENTED_TO_VIRTUAL(NULL)) { if (bgCamList == SEGMENTED_TO_VIRTUAL(NULL)) {
return 0; return 0;
} }
return camData[camId].numCameras;
return bgCamList[bgCamIndex].count;
} }
/** /**
* SurfaceType Get number of cameras * BgCam Get the total count of Vec3s data from bgCamFuncData
*/ */
u16 SurfaceType_GetNumCameras(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) { u16 BgCheck_GetBgCamCount(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId); CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId);
CamData* camData; BgCamInfo* bgCamList;
SurfaceType* surfaceTypes; SurfaceType* surfaceTypes;
if (colHeader == NULL) { if (colHeader == NULL) {
return 0; return 0;
} }
camData = colHeader->cameraDataList;
if (camData == SEGMENTED_TO_VIRTUAL(NULL)) { bgCamList = colHeader->bgCamList;
if (bgCamList == SEGMENTED_TO_VIRTUAL(NULL)) {
return 0; return 0;
} }
surfaceTypes = colHeader->surfaceTypeList; surfaceTypes = colHeader->surfaceTypeList;
if (surfaceTypes == SEGMENTED_TO_VIRTUAL(NULL)) { if (surfaceTypes == SEGMENTED_TO_VIRTUAL(NULL)) {
return 0; return 0;
} }
return func_80041B24(colCtx, SurfaceType_GetCamDataIndex(colCtx, poly, bgId), bgId);
return BgCheck_GetBgCamCountImpl(colCtx, SurfaceType_GetBgCamIndex(colCtx, poly, bgId), bgId);
} }
/** /**
* CamData Get camPosData * BgCam Get Vec3s data from bgCamFuncData
*/ */
Vec3s* func_80041C10(CollisionContext* colCtx, s32 camId, s32 bgId) { Vec3s* BgCheck_GetBgCamFuncDataImpl(CollisionContext* colCtx, s32 bgCamIndex, s32 bgId) {
CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId); CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId);
CamData* cameraDataList; BgCamInfo* bgCamList;
if (colHeader == NULL) { if (colHeader == NULL) {
return NULL; return NULL;
} }
cameraDataList = colHeader->cameraDataList;
if (cameraDataList == SEGMENTED_TO_VIRTUAL(NULL)) { bgCamList = colHeader->bgCamList;
if (bgCamList == SEGMENTED_TO_VIRTUAL(NULL)) {
return NULL; return NULL;
} }
return (Vec3s*)SEGMENTED_TO_VIRTUAL(cameraDataList[camId].camPosData);
return (Vec3s*)SEGMENTED_TO_VIRTUAL(bgCamList[bgCamIndex].bgCamFuncData);
} }
/** /**
* SurfaceType Get camPosData * BgCam Get Vec3s data from bgCamFuncData
*/ */
Vec3s* SurfaceType_GetCamPosData(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) { Vec3s* BgCheck_GetBgCamFuncData(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId); CollisionHeader* colHeader = BgCheck_GetCollisionHeader(colCtx, bgId);
CamData* camData; BgCamInfo* bgCamList;
SurfaceType* surfaceTypes; SurfaceType* surfaceTypes;
if (colHeader == NULL) { if (colHeader == NULL) {
return NULL; return NULL;
} }
camData = colHeader->cameraDataList;
if (camData == SEGMENTED_TO_VIRTUAL(NULL)) { bgCamList = colHeader->bgCamList;
if (bgCamList == SEGMENTED_TO_VIRTUAL(NULL)) {
return NULL; return NULL;
} }
surfaceTypes = colHeader->surfaceTypeList; surfaceTypes = colHeader->surfaceTypeList;
if (surfaceTypes == SEGMENTED_TO_VIRTUAL(NULL)) { if (surfaceTypes == SEGMENTED_TO_VIRTUAL(NULL)) {
return NULL; return NULL;
} }
return func_80041C10(colCtx, SurfaceType_GetCamDataIndex(colCtx, poly, bgId), bgId);
return BgCheck_GetBgCamFuncDataImpl(colCtx, SurfaceType_GetBgCamIndex(colCtx, poly, bgId), bgId);
} }
/** /**
@ -4263,26 +4278,26 @@ s32 WaterBox_GetSurface2(PlayState* play, CollisionContext* colCtx, Vec3f* pos,
} }
/** /**
* WaterBox get CamData index * WaterBox get BgCam index
*/ */
u32 WaterBox_GetCamDataIndex(CollisionContext* colCtx, WaterBox* waterBox) { u32 WaterBox_GetBgCamIndex(CollisionContext* colCtx, WaterBox* waterBox) {
u32 prop = waterBox->properties >> 0; u32 prop = waterBox->properties >> 0;
return prop & 0xFF; return prop & 0xFF;
} }
/** /**
* WaterBox get CamData cameraSType * WaterBox get BgCam setting
*/ */
u16 WaterBox_GetCameraSType(CollisionContext* colCtx, WaterBox* waterBox) { u16 WaterBox_GetBgCamSetting(CollisionContext* colCtx, WaterBox* waterBox) {
s32 camId = WaterBox_GetCamDataIndex(colCtx, waterBox); s32 bgCamIndex = WaterBox_GetBgCamIndex(colCtx, waterBox);
CamData* camData = colCtx->colHeader->cameraDataList; BgCamInfo* bgCamList = colCtx->colHeader->bgCamList;
if (camData == SEGMENTED_TO_VIRTUAL(NULL)) { if (bgCamList == SEGMENTED_TO_VIRTUAL(NULL)) {
return 0; return CAM_SET_NONE;
} }
return colCtx->colHeader->cameraDataList[camId].cameraSType; return colCtx->colHeader->bgCamList[bgCamIndex].setting;
} }
/** /**

View file

@ -24,11 +24,6 @@ s32 Camera_UpdateWater(Camera* camera);
// Load the next value and scale down from camera read-only data stored in CameraModeValue // Load the next value and scale down from camera read-only data stored in CameraModeValue
#define GET_NEXT_SCALED_RO_DATA(values) CAM_DATA_SCALED(GET_NEXT_RO_DATA(values)) #define GET_NEXT_SCALED_RO_DATA(values) CAM_DATA_SCALED(GET_NEXT_RO_DATA(values))
#define BGCAM_POS(v) ((v)[0])
#define BGCAM_ROT(v) ((v)[1])
#define BGCAM_FOV(v) ((v)[2].x)
#define BGCAM_JFIFID(v) ((v)[2].y)
#define FLG_ADJSLOPE (1 << 0) #define FLG_ADJSLOPE (1 << 0)
#define FLG_OFFGROUND (1 << 7) #define FLG_OFFGROUND (1 << 7)
@ -327,7 +322,7 @@ s32 func_80043F94(Camera* camera, Vec3f* from, CamColChk* to) {
// line is from->to is touching the poly the player is on. // line is from->to is touching the poly the player is on.
to->norm = playerFloorNormF; to->norm = playerFloorNormF;
to->poly = playerFloorPoly; to->poly = playerFloorPoly;
to->bgId = camera->bgCheckId; to->bgId = camera->bgId;
to->pos.x = to->norm.x + toNewPos.x; to->pos.x = to->norm.x + toNewPos.x;
to->pos.y = to->norm.y + toNewPos.y; to->pos.y = to->norm.y + toNewPos.y;
to->pos.z = to->norm.z + toNewPos.z; to->pos.z = to->norm.z + toNewPos.z;
@ -450,45 +445,45 @@ f32 Camera_GetFloorYLayer(Camera* camera, Vec3f* norm, Vec3f* pos, s32* bgId) {
} }
/** /**
* Returns the CameraSettingType of the camera at index `camDataIdx` * Returns the CameraSettingType of the camera at index `bgCamIndex`
*/ */
s16 Camera_GetCamDataSetting(Camera* camera, s32 camDataIdx) { s16 Camera_GetBgCamSetting(Camera* camera, s32 bgCamIndex) {
return func_80041A4C(&camera->play->colCtx, camDataIdx, BGCHECK_SCENE); return BgCheck_GetBgCamSettingImpl(&camera->play->colCtx, bgCamIndex, BGCHECK_SCENE);
} }
/** /**
* Returns the scene camera info for the current camera data index * Returns the bgCamFuncData using the current bgCam index
*/ */
Vec3s* Camera_GetCamBGData(Camera* camera) { Vec3s* Camera_GetBgCamFuncData(Camera* camera) {
return func_80041C10(&camera->play->colCtx, camera->camDataIdx, BGCHECK_SCENE); return BgCheck_GetBgCamFuncDataImpl(&camera->play->colCtx, camera->bgCamIndex, BGCHECK_SCENE);
} }
/** /**
* Gets the scene's camera index for the poly `poly`, returns -1 if * Gets the bgCam index for the poly `poly`, returns -1 if
* there is no camera data for that poly. * there is no camera data for that poly.
*/ */
s32 Camera_GetDataIdxForPoly(Camera* camera, s32* bgId, CollisionPoly* poly) { s32 Camera_GetBgCamIndex(Camera* camera, s32* bgId, CollisionPoly* poly) {
s32 camDataIdx; s32 bgCamIndex;
PosRot playerPosRot; PosRot playerPosRot;
s32 ret; s32 ret;
Actor_GetWorldPosShapeRot(&playerPosRot, &camera->player->actor); // unused. Actor_GetWorldPosShapeRot(&playerPosRot, &camera->player->actor); // unused.
camDataIdx = SurfaceType_GetCamDataIndex(&camera->play->colCtx, poly, *bgId); bgCamIndex = SurfaceType_GetBgCamIndex(&camera->play->colCtx, poly, *bgId);
if (func_80041A4C(&camera->play->colCtx, camDataIdx, *bgId) == CAM_SET_NONE) { if (BgCheck_GetBgCamSettingImpl(&camera->play->colCtx, bgCamIndex, *bgId) == CAM_SET_NONE) {
ret = -1; ret = -1;
} else { } else {
ret = camDataIdx; ret = bgCamIndex;
} }
return ret; return ret;
} }
/** /**
* Returns the scene camera info for the floor under the player. * Returns the bgCamFuncData for the floor under the player.
* If there is no floor then there is no camera data, returns the number of * Also returns the number of pieces of data there are in `bgCamCount`.
* pieces of data there are in `dataCnt` * If there is no floor, then return NULL
*/ */
Vec3s* Camera_GetCamBgDataUnderPlayer(Camera* camera, u16* dataCnt) { Vec3s* Camera_GetBgCamFuncDataUnderPlayer(Camera* camera, u16* bgCamCount) {
CollisionPoly* floorPoly; CollisionPoly* floorPoly;
s32 pad; s32 pad;
s32 bgId; s32 bgId;
@ -496,12 +491,14 @@ Vec3s* Camera_GetCamBgDataUnderPlayer(Camera* camera, u16* dataCnt) {
Actor_GetWorldPosShapeRot(&playerPosShape, &camera->player->actor); Actor_GetWorldPosShapeRot(&playerPosShape, &camera->player->actor);
playerPosShape.pos.y += Player_GetHeight(camera->player); playerPosShape.pos.y += Player_GetHeight(camera->player);
if (BgCheck_EntityRaycastFloor3(&camera->play->colCtx, &floorPoly, &bgId, &playerPosShape.pos) == BGCHECK_Y_MIN) { if (BgCheck_EntityRaycastFloor3(&camera->play->colCtx, &floorPoly, &bgId, &playerPosShape.pos) == BGCHECK_Y_MIN) {
// no floor // no floor
return NULL; return NULL;
} }
*dataCnt = SurfaceType_GetNumCameras(&camera->play->colCtx, floorPoly, bgId);
return SurfaceType_GetCamPosData(&camera->play->colCtx, floorPoly, bgId); *bgCamCount = BgCheck_GetBgCamCount(&camera->play->colCtx, floorPoly, bgId);
return BgCheck_GetBgCamFuncData(&camera->play->colCtx, floorPoly, bgId);
} }
/** /**
@ -510,10 +507,10 @@ Vec3s* Camera_GetCamBgDataUnderPlayer(Camera* camera, u16* dataCnt) {
* Returns -2 if there is no camera index for the water box. * Returns -2 if there is no camera index for the water box.
* Returns the camera data index otherwise. * Returns the camera data index otherwise.
*/ */
s32 Camera_GetWaterBoxDataIdx(Camera* camera, f32* waterY) { s32 Camera_GetWaterBoxBgCamIndex(Camera* camera, f32* waterY) {
PosRot playerPosShape; PosRot playerPosShape;
WaterBox* waterBox; WaterBox* waterBox;
s32 ret; s32 bgCamIndex;
Actor_GetWorldPosShapeRot(&playerPosShape, &camera->player->actor); Actor_GetWorldPosShapeRot(&playerPosShape, &camera->player->actor);
*waterY = playerPosShape.pos.y; *waterY = playerPosShape.pos.y;
@ -531,13 +528,15 @@ s32 Camera_GetWaterBoxDataIdx(Camera* camera, f32* waterY) {
return -1; return -1;
} }
ret = WaterBox_GetCamDataIndex(&camera->play->colCtx, waterBox); bgCamIndex = WaterBox_GetBgCamIndex(&camera->play->colCtx, waterBox);
if ((ret <= 0) || (WaterBox_GetCameraSType(&camera->play->colCtx, waterBox) <= 0)) {
//! @bug bgCamIndex = 0 is a valid index, should be (bgCamIndex < 0)
if ((bgCamIndex <= 0) || (WaterBox_GetBgCamSetting(&camera->play->colCtx, waterBox) <= CAM_SET_NONE)) {
// no camera data index, or no CameraSettingType // no camera data index, or no CameraSettingType
return -2; return -2;
} }
return ret; return bgCamIndex;
} }
/** /**
@ -1673,7 +1672,7 @@ s32 Camera_Normal2(Camera* camera) {
Normal2ReadOnlyData* roData = &camera->paramData.norm2.roData; Normal2ReadOnlyData* roData = &camera->paramData.norm2.roData;
Normal2ReadWriteData* rwData = &camera->paramData.norm2.rwData; Normal2ReadWriteData* rwData = &camera->paramData.norm2.rwData;
s32 pad; s32 pad;
Vec3s* bgData; BgCamFuncData* bgCamFuncData;
f32 playerHeight; f32 playerHeight;
f32 yNormal; f32 yNormal;
@ -1710,16 +1709,16 @@ s32 Camera_Normal2(Camera* camera) {
case 10: case 10:
case 20: case 20:
case 25: case 25:
bgData = Camera_GetCamBGData(camera); bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamFuncData(camera);
Camera_Vec3sToVec3f(&rwData->unk_00, &BGCAM_POS(bgData)); Camera_Vec3sToVec3f(&rwData->unk_00, &bgCamFuncData->pos);
rwData->unk_20 = BGCAM_ROT(bgData).x; rwData->unk_20 = bgCamFuncData->rot.x;
rwData->unk_22 = BGCAM_ROT(bgData).y; rwData->unk_22 = bgCamFuncData->rot.y;
rwData->unk_24 = playerPosRot->pos.y; rwData->unk_24 = playerPosRot->pos.y;
rwData->unk_1C = BGCAM_FOV(bgData) == -1 ? roData->unk_14 rwData->unk_1C = bgCamFuncData->fov == -1 ? roData->unk_14
: BGCAM_FOV(bgData) >= 0x169 ? CAM_DATA_SCALED(BGCAM_FOV(bgData)) : bgCamFuncData->fov > 360 ? CAM_DATA_SCALED(bgCamFuncData->fov)
: BGCAM_FOV(bgData); : bgCamFuncData->fov;
rwData->unk_28 = BGCAM_JFIFID(bgData) == -1 ? 0 : BGCAM_JFIFID(bgData); rwData->unk_28 = bgCamFuncData->flags == -1 ? 0 : bgCamFuncData->flags;
rwData->unk_18 = 0.0f; rwData->unk_18 = 0.0f;
@ -3770,11 +3769,11 @@ s32 Camera_KeepOn4(Camera* camera) {
sCameraInterfaceFlags = 0; sCameraInterfaceFlags = 0;
camera->unk_14C |= (0x4 | 0x2); camera->unk_14C |= (0x4 | 0x2);
camera->unk_14C &= ~8; camera->unk_14C &= ~8;
if (camera->prevCamDataIdx < 0) { if (camera->prevBgCamIndex < 0) {
Camera_ChangeSettingFlags(camera, camera->prevSetting, 2); Camera_ChangeSettingFlags(camera, camera->prevSetting, 2);
} else { } else {
Camera_ChangeDataIdx(camera, camera->prevCamDataIdx); Camera_ChangeBgCamIndex(camera, camera->prevBgCamIndex);
camera->prevCamDataIdx = -1; camera->prevBgCamIndex = -1;
} }
} }
} }
@ -3799,8 +3798,8 @@ s32 Camera_KeepOn0(Camera* camera) {
KeepOn0ReadOnlyData* roData = &camera->paramData.keep0.roData; KeepOn0ReadOnlyData* roData = &camera->paramData.keep0.roData;
KeepOn0ReadWriteData* rwData = &camera->paramData.keep0.rwData; KeepOn0ReadWriteData* rwData = &camera->paramData.keep0.rwData;
s32 pad; s32 pad;
Vec3s* sceneCamData; BgCamFuncData* bgCamFuncData;
UNUSED Vec3s sceneCamRot; UNUSED Vec3s bgCamRot;
s16 fov; s16 fov;
camera->unk_14C &= ~0x10; camera->unk_14C &= ~0x10;
@ -3816,13 +3815,14 @@ s32 Camera_KeepOn0(Camera* camera) {
if (R_RELOAD_CAM_PARAMS) { if (R_RELOAD_CAM_PARAMS) {
Camera_CopyPREGToModeValues(camera); Camera_CopyPREGToModeValues(camera);
} }
sceneCamData = Camera_GetCamBGData(camera);
Camera_Vec3sToVec3f(eyeNext, &BGCAM_POS(sceneCamData)); bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamFuncData(camera);
Camera_Vec3sToVec3f(eyeNext, &bgCamFuncData->pos);
*eye = *eyeNext; *eye = *eyeNext;
sceneCamRot = BGCAM_ROT(sceneCamData); bgCamRot = bgCamFuncData->rot;
fov = BGCAM_FOV(sceneCamData); fov = bgCamFuncData->fov;
if (fov == -1) { if (fov == -1) {
fov = 6000; fov = 6000;
} }
@ -3872,7 +3872,7 @@ s32 Camera_Fixed1(Camera* camera) {
VecSph eyeAtOffset; VecSph eyeAtOffset;
s32 pad2; s32 pad2;
Vec3f adjustedPos; Vec3f adjustedPos;
Vec3s* scenePosData; BgCamFuncData* bgCamFuncData;
Vec3f* eye = &camera->eye; Vec3f* eye = &camera->eye;
Vec3f* at = &camera->at; Vec3f* at = &camera->at;
PosRot* playerPosRot = &camera->playerPosRot; PosRot* playerPosRot = &camera->playerPosRot;
@ -3882,10 +3882,11 @@ s32 Camera_Fixed1(Camera* camera) {
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) { if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values; CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
scenePosData = Camera_GetCamBGData(camera); bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamFuncData(camera);
Camera_Vec3sToVec3f(&rwData->eyePosRotTarget.pos, &BGCAM_POS(scenePosData)); Camera_Vec3sToVec3f(&rwData->eyePosRotTarget.pos, &bgCamFuncData->pos);
rwData->eyePosRotTarget.rot = BGCAM_ROT(scenePosData); rwData->eyePosRotTarget.rot = bgCamFuncData->rot;
rwData->fov = BGCAM_FOV(scenePosData); rwData->fov = bgCamFuncData->fov;
roData->unk_00 = GET_NEXT_SCALED_RO_DATA(values) * playerHeight; roData->unk_00 = GET_NEXT_SCALED_RO_DATA(values) * playerHeight;
roData->lerpStep = GET_NEXT_SCALED_RO_DATA(values); roData->lerpStep = GET_NEXT_SCALED_RO_DATA(values);
roData->fov = GET_NEXT_RO_DATA(values); roData->fov = GET_NEXT_RO_DATA(values);
@ -3944,7 +3945,7 @@ s32 Camera_Fixed2(Camera* camera) {
Vec3f atTarget; Vec3f atTarget;
Vec3f posOffsetTarget; Vec3f posOffsetTarget;
PosRot* playerPosRot = &camera->playerPosRot; PosRot* playerPosRot = &camera->playerPosRot;
Vec3s* scenePosData; BgCamFuncData* bgCamFuncData;
Fixed2ReadOnlyData* roData = &camera->paramData.fixd2.roData; Fixed2ReadOnlyData* roData = &camera->paramData.fixd2.roData;
Fixed2ReadWriteData* rwData = &camera->paramData.fixd2.rwData; Fixed2ReadWriteData* rwData = &camera->paramData.fixd2.rwData;
s32 pad; s32 pad;
@ -3963,11 +3964,12 @@ s32 Camera_Fixed2(Camera* camera) {
roData->fov = GET_NEXT_RO_DATA(values); roData->fov = GET_NEXT_RO_DATA(values);
roData->interfaceFlags = GET_NEXT_RO_DATA(values); roData->interfaceFlags = GET_NEXT_RO_DATA(values);
rwData->fov = roData->fov * 100.0f; rwData->fov = roData->fov * 100.0f;
scenePosData = Camera_GetCamBGData(camera);
if (scenePosData != NULL) { bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamFuncData(camera);
Camera_Vec3sToVec3f(&rwData->eye, &BGCAM_POS(scenePosData)); if (bgCamFuncData != NULL) {
if (BGCAM_FOV(scenePosData) != -1) { Camera_Vec3sToVec3f(&rwData->eye, &bgCamFuncData->pos);
rwData->fov = BGCAM_FOV(scenePosData); if (bgCamFuncData->fov != -1) {
rwData->fov = bgCamFuncData->fov;
} }
} else { } else {
rwData->eye = *eye; rwData->eye = *eye;
@ -4023,13 +4025,13 @@ s32 Camera_Fixed3(Camera* camera) {
Vec3f* at = &camera->at; Vec3f* at = &camera->at;
Vec3f* eyeNext = &camera->eyeNext; Vec3f* eyeNext = &camera->eyeNext;
VecSph atSph; VecSph atSph;
Vec3s* sceneCamData; BgCamFuncData* bgCamFuncData;
VecSph eyeAtOffset; VecSph eyeAtOffset;
Fixed3ReadOnlyData* roData = &camera->paramData.fixd3.roData; Fixed3ReadOnlyData* roData = &camera->paramData.fixd3.roData;
Fixed3ReadWriteData* rwData = &camera->paramData.fixd3.rwData; Fixed3ReadWriteData* rwData = &camera->paramData.fixd3.rwData;
s32 pad; s32 pad;
sceneCamData = Camera_GetCamBGData(camera); bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamFuncData(camera);
OLib_Vec3fDiffToVecSphGeo(&eyeAtOffset, eye, at); OLib_Vec3fDiffToVecSphGeo(&eyeAtOffset, eye, at);
@ -4037,11 +4039,11 @@ s32 Camera_Fixed3(Camera* camera) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values; CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
roData->interfaceFlags = GET_NEXT_RO_DATA(values); roData->interfaceFlags = GET_NEXT_RO_DATA(values);
Camera_Vec3sToVec3f(eyeNext, &BGCAM_POS(sceneCamData)); Camera_Vec3sToVec3f(eyeNext, &bgCamFuncData->pos);
*eye = *eyeNext; *eye = *eyeNext;
rwData->rot = BGCAM_ROT(sceneCamData); rwData->rot = bgCamFuncData->rot;
rwData->fov = BGCAM_FOV(sceneCamData); rwData->fov = bgCamFuncData->fov;
rwData->jfifId = BGCAM_JFIFID(sceneCamData); rwData->jfifId = bgCamFuncData->jfifId;
if (rwData->fov == -1) { if (rwData->fov == -1) {
rwData->fov = 6000; rwData->fov = 6000;
} }
@ -4060,9 +4062,9 @@ s32 Camera_Fixed3(Camera* camera) {
camera->animState++; camera->animState++;
} }
if (BGCAM_JFIFID(sceneCamData) != rwData->jfifId) { if (bgCamFuncData->jfifId != rwData->jfifId) {
osSyncPrintf("camera: position change %d \n", rwData->jfifId); osSyncPrintf("camera: position change %d \n", rwData->jfifId);
rwData->jfifId = BGCAM_JFIFID(sceneCamData); rwData->jfifId = bgCamFuncData->jfifId;
rwData->updDirTimer = 5; rwData->updDirTimer = 5;
} }
@ -4100,13 +4102,14 @@ s32 Camera_Fixed4(Camera* camera) {
VecSph atEyeNextOffset; VecSph atEyeNextOffset;
VecSph atTargetEyeNextOffset; VecSph atTargetEyeNextOffset;
PosRot* playerPosRot = &camera->playerPosRot; PosRot* playerPosRot = &camera->playerPosRot;
Vec3s* camPosData; BgCamFuncData* bgCamFuncData;
Vec3f* posOffset = &camera->posOffset; Vec3f* posOffset = &camera->posOffset;
Fixed4ReadOnlyData* roData = &camera->paramData.fixd4.roData; Fixed4ReadOnlyData* roData = &camera->paramData.fixd4.roData;
Fixed4ReadWriteData* rwData = &camera->paramData.fixd4.rwData; Fixed4ReadWriteData* rwData = &camera->paramData.fixd4.rwData;
f32 playerYOffset; f32 playerYOffset;
playerYOffset = Player_GetHeight(camera->player); playerYOffset = Player_GetHeight(camera->player);
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) { if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values; CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
f32 yNormal = ((1.0f + CAM_DATA_SCALED(OREG(46))) - (CAM_DATA_SCALED(OREG(46)) * (68.0f / playerYOffset))); f32 yNormal = ((1.0f + CAM_DATA_SCALED(OREG(46))) - (CAM_DATA_SCALED(OREG(46)) * (68.0f / playerYOffset)));
@ -4116,9 +4119,10 @@ s32 Camera_Fixed4(Camera* camera) {
roData->followSpeed = GET_NEXT_SCALED_RO_DATA(values); roData->followSpeed = GET_NEXT_SCALED_RO_DATA(values);
roData->fov = GET_NEXT_RO_DATA(values); roData->fov = GET_NEXT_RO_DATA(values);
roData->interfaceFlags = GET_NEXT_RO_DATA(values); roData->interfaceFlags = GET_NEXT_RO_DATA(values);
camPosData = Camera_GetCamBGData(camera);
if (camPosData != NULL) { bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamFuncData(camera);
Camera_Vec3sToVec3f(&rwData->eyeTarget, &BGCAM_POS(camPosData)); if (bgCamFuncData != NULL) {
Camera_Vec3sToVec3f(&rwData->eyeTarget, &bgCamFuncData->pos);
} else { } else {
rwData->eyeTarget = *eye; rwData->eyeTarget = *eye;
} }
@ -4301,12 +4305,25 @@ s32 Camera_Subj3(Camera* camera) {
return 1; return 1;
} }
/**
* Crawlspaces
* Moves the camera from third person to first person when entering a crawlspace
* While in the crawlspace, link remains fixed in a single direction
* The camera is what swings up and down while crawling forward or backwards
*
* Note:
* Subject 4 uses bgCamFuncData.data differently than other functions:
* All Vec3s data are points along the crawlspace
* The second point represents the entrance, and the second to last point represents the exit
* All other points are unused
* All instances of crawlspaces have 6 points, except for the Testroom scene which has 9 points
*/
s32 Camera_Subj4(Camera* camera) { s32 Camera_Subj4(Camera* camera) {
Vec3f* eye = &camera->eye; Vec3f* eye = &camera->eye;
Vec3f* eyeNext = &camera->eyeNext; Vec3f* eyeNext = &camera->eyeNext;
Vec3f* at = &camera->at; Vec3f* at = &camera->at;
u16 spAA; u16 crawlspaceNumPoints;
Vec3s* spA4; Vec3s* crawlspacePoints;
Vec3f sp98; Vec3f sp98;
Vec3f sp8C; Vec3f sp8C;
f32 sp88; f32 sp88;
@ -4343,9 +4360,9 @@ s32 Camera_Subj4(Camera* camera) {
OLib_Vec3fDiffToVecSphGeo(&sp5C, at, eye); OLib_Vec3fDiffToVecSphGeo(&sp5C, at, eye);
sCameraInterfaceFlags = roData->interfaceFlags; sCameraInterfaceFlags = roData->interfaceFlags;
if (camera->animState == 0) { if (camera->animState == 0) {
spA4 = Camera_GetCamBgDataUnderPlayer(camera, &spAA); crawlspacePoints = (Vec3s*)Camera_GetBgCamFuncDataUnderPlayer(camera, &crawlspaceNumPoints);
Camera_Vec3sToVec3f(&rwData->unk_00.point, &spA4[1]); Camera_Vec3sToVec3f(&rwData->unk_00.point, &crawlspacePoints[1]);
Camera_Vec3sToVec3f(&sp98, &spA4[spAA - 2]); Camera_Vec3sToVec3f(&sp98, &crawlspacePoints[crawlspaceNumPoints - 2]);
sp64.r = 10.0f; sp64.r = 10.0f;
// 0x238C ~ 50 degrees // 0x238C ~ 50 degrees
@ -4458,7 +4475,7 @@ s32 Camera_Data4(Camera* camera) {
f32 yNormal; f32 yNormal;
s16 fov; s16 fov;
Vec3f* eyeNext = &camera->eyeNext; Vec3f* eyeNext = &camera->eyeNext;
Vec3s* sceneCamData; BgCamFuncData* bgCamFuncData;
Vec3f lookAt; Vec3f lookAt;
CameraModeValue* values; CameraModeValue* values;
Data4ReadWriteData* rwData = &camera->paramData.data4.rwData; Data4ReadWriteData* rwData = &camera->paramData.data4.rwData;
@ -4476,16 +4493,17 @@ s32 Camera_Data4(Camera* camera) {
roData->yOffset = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal; roData->yOffset = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
roData->fov = GET_NEXT_RO_DATA(values); roData->fov = GET_NEXT_RO_DATA(values);
roData->interfaceFlags = GET_NEXT_RO_DATA(values); roData->interfaceFlags = GET_NEXT_RO_DATA(values);
sceneCamData = Camera_GetCamBGData(camera);
Camera_Vec3sToVec3f(&rwData->eyePosRot.pos, &BGCAM_POS(sceneCamData)); bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamFuncData(camera);
rwData->eyePosRot.rot = BGCAM_ROT(sceneCamData); Camera_Vec3sToVec3f(&rwData->eyePosRot.pos, &bgCamFuncData->pos);
fov = BGCAM_FOV(sceneCamData); rwData->eyePosRot.rot = bgCamFuncData->rot;
fov = bgCamFuncData->fov;
rwData->fov = fov; rwData->fov = fov;
if (fov != -1) { if (fov != -1) {
roData->fov = rwData->fov <= 360 ? rwData->fov : CAM_DATA_SCALED(rwData->fov); roData->fov = rwData->fov <= 360 ? rwData->fov : CAM_DATA_SCALED(rwData->fov);
} }
rwData->jfifId = BGCAM_JFIFID(sceneCamData); rwData->flags = bgCamFuncData->flags;
*eye = rwData->eyePosRot.pos; *eye = rwData->eyePosRot.pos;
} }
@ -4505,10 +4523,9 @@ s32 Camera_Data4(Camera* camera) {
OLib_Vec3fDiffToVecSphGeo(&eyeAtOffset, eye, at); OLib_Vec3fDiffToVecSphGeo(&eyeAtOffset, eye, at);
atOffset.r = eyeAtOffset.r; atOffset.r = eyeAtOffset.r;
atOffset.yaw = atOffset.yaw = (rwData->flags & 1) ? (CAM_DEG_TO_BINANG(camera->data2) + rwData->eyePosRot.rot.y) : eyeAtOffset.yaw;
(rwData->jfifId & 1) ? (CAM_DEG_TO_BINANG(camera->data2) + rwData->eyePosRot.rot.y) : eyeAtOffset.yaw;
atOffset.pitch = atOffset.pitch =
(rwData->jfifId & 2) ? (CAM_DEG_TO_BINANG(camera->data3) + rwData->eyePosRot.rot.x) : eyeAtOffset.pitch; (rwData->flags & 2) ? (CAM_DEG_TO_BINANG(camera->data3) + rwData->eyePosRot.rot.x) : eyeAtOffset.pitch;
Camera_Vec3fVecSphGeoAdd(at, eye, &atOffset); Camera_Vec3fVecSphGeoAdd(at, eye, &atOffset);
@ -4706,8 +4723,8 @@ s32 Camera_Unique3(Camera* camera) {
VecSph sp60; VecSph sp60;
f32 playerHeight; f32 playerHeight;
DoorParams* doorParams = &camera->paramData.doorParams; DoorParams* doorParams = &camera->paramData.doorParams;
Vec3s* temp_v0_2; BgCamFuncData* bgCamFuncData;
Vec3s sp4C; Vec3s bgCamRot;
Unique3ReadWriteData* rwData = &camera->paramData.uniq3.rwData; Unique3ReadWriteData* rwData = &camera->paramData.uniq3.rwData;
Unique3ReadOnlyData* roData = &camera->paramData.uniq3.roData; Unique3ReadOnlyData* roData = &camera->paramData.uniq3.roData;
Vec3f* at = &camera->at; Vec3f* at = &camera->at;
@ -4740,13 +4757,16 @@ s32 Camera_Unique3(Camera* camera) {
if (doorParams->timer1-- > 0) { if (doorParams->timer1-- > 0) {
break; break;
} }
temp_v0_2 = Camera_GetCamBGData(camera);
Camera_Vec3sToVec3f(&camera->eyeNext, &BGCAM_POS(temp_v0_2)); bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamFuncData(camera);
Camera_Vec3sToVec3f(&camera->eyeNext, &bgCamFuncData->pos);
camera->eye = camera->eyeNext; camera->eye = camera->eyeNext;
sp4C = BGCAM_ROT(temp_v0_2); bgCamRot = bgCamFuncData->rot;
sp60.r = 100.0f; sp60.r = 100.0f;
sp60.yaw = sp4C.y; sp60.yaw = bgCamRot.y;
sp60.pitch = -sp4C.x; sp60.pitch = -bgCamRot.x;
Camera_Vec3fVecSphGeoAdd(at, &camera->eye, &sp60); Camera_Vec3fVecSphGeoAdd(at, &camera->eye, &sp60);
camera->animState++; camera->animState++;
FALLTHROUGH; FALLTHROUGH;
@ -4825,8 +4845,8 @@ s32 Camera_Unique0(Camera* camera) {
Player* player; Player* player;
Vec3f playerPosWithOffset; Vec3f playerPosWithOffset;
VecSph atPlayerOffset; VecSph atPlayerOffset;
Vec3s* sceneCamData; BgCamFuncData* bgCamFuncData;
Vec3s sceneCamRot; Vec3s bgCamRot;
PosRot* playerPosRot = &camera->playerPosRot; PosRot* playerPosRot = &camera->playerPosRot;
DoorParams* doorParams = &camera->paramData.doorParams; DoorParams* doorParams = &camera->paramData.doorParams;
Unique0ReadOnlyData* roData = &camera->paramData.uniq0.roData; Unique0ReadOnlyData* roData = &camera->paramData.uniq0.roData;
@ -4854,24 +4874,25 @@ s32 Camera_Unique0(Camera* camera) {
if (camera->animState == 0) { if (camera->animState == 0) {
func_80043B60(camera); func_80043B60(camera);
camera->unk_14C &= ~4; camera->unk_14C &= ~4;
sceneCamData = Camera_GetCamBGData(camera);
Camera_Vec3sToVec3f(&rwData->sceneCamPosPlayerLine.point, &BGCAM_POS(sceneCamData));
*eye = camera->eyeNext = rwData->sceneCamPosPlayerLine.point; bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamFuncData(camera);
sceneCamRot = BGCAM_ROT(sceneCamData); Camera_Vec3sToVec3f(&rwData->eyeAndDirection.point, &bgCamFuncData->pos);
fov = BGCAM_FOV(sceneCamData);
*eye = camera->eyeNext = rwData->eyeAndDirection.point;
bgCamRot = bgCamFuncData->rot;
fov = bgCamFuncData->fov;
if (fov != -1) { if (fov != -1) {
camera->fov = fov <= 360 ? fov : CAM_DATA_SCALED(fov); camera->fov = fov <= 360 ? fov : CAM_DATA_SCALED(fov);
} }
rwData->animTimer = BGCAM_JFIFID(sceneCamData); rwData->animTimer = bgCamFuncData->timer;
if (rwData->animTimer == -1) { if (rwData->animTimer == -1) {
rwData->animTimer = doorParams->timer1 + doorParams->timer2; rwData->animTimer = doorParams->timer1 + doorParams->timer2;
} }
atPlayerOffset.r = OLib_Vec3fDist(&playerPosWithOffset, eye); atPlayerOffset.r = OLib_Vec3fDist(&playerPosWithOffset, eye);
atPlayerOffset.yaw = sceneCamRot.y; atPlayerOffset.yaw = bgCamRot.y;
atPlayerOffset.pitch = -sceneCamRot.x; atPlayerOffset.pitch = -bgCamRot.x;
OLib_VecSphGeoToVec3f(&rwData->sceneCamPosPlayerLine.dir, &atPlayerOffset); OLib_VecSphGeoToVec3f(&rwData->eyeAndDirection.dir, &atPlayerOffset);
Math3D_LineClosestToPoint(&rwData->sceneCamPosPlayerLine, &playerPosRot->pos, &camera->at); Math3D_LineClosestToPoint(&rwData->eyeAndDirection, &playerPosRot->pos, &camera->at);
rwData->initalPos = playerPosRot->pos; rwData->initalPos = playerPosRot->pos;
camera->animState++; camera->animState++;
} }
@ -5000,8 +5021,8 @@ s32 Camera_Unique7(Camera* camera) {
CameraModeValue* values; CameraModeValue* values;
VecSph playerPosEyeOffset; VecSph playerPosEyeOffset;
s16 fov; s16 fov;
Vec3s* sceneCamData; BgCamFuncData* bgCamFuncData;
UNUSED Vec3s sceneCamRot; UNUSED Vec3s bgCamRot;
Vec3f* at = &camera->at; Vec3f* at = &camera->at;
PosRot* playerPosRot = &camera->playerPosRot; PosRot* playerPosRot = &camera->playerPosRot;
Vec3f* eye = &camera->eye; Vec3f* eye = &camera->eye;
@ -5017,16 +5038,16 @@ s32 Camera_Unique7(Camera* camera) {
Camera_CopyPREGToModeValues(camera); Camera_CopyPREGToModeValues(camera);
} }
sceneCamData = Camera_GetCamBGData(camera); bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamFuncData(camera);
Camera_Vec3sToVec3f(eyeNext, &BGCAM_POS(sceneCamData)); Camera_Vec3sToVec3f(eyeNext, &bgCamFuncData->pos);
*eye = *eyeNext; *eye = *eyeNext;
sceneCamRot = BGCAM_ROT(sceneCamData); bgCamRot = bgCamFuncData->rot;
OLib_Vec3fDiffToVecSphGeo(&playerPosEyeOffset, eye, &playerPosRot->pos); OLib_Vec3fDiffToVecSphGeo(&playerPosEyeOffset, eye, &playerPosRot->pos);
// fov actually goes unused since it's hard set later on. // fov actually goes unused since it's hard set later on.
fov = BGCAM_FOV(sceneCamData); fov = bgCamFuncData->fov;
if (fov == -1) { if (fov == -1) {
fov = roData->fov * 100.0f; fov = roData->fov * 100.0f;
} }
@ -5049,8 +5070,7 @@ s32 Camera_Unique7(Camera* camera) {
// 0x7D0 ~ 10.98 degres. // 0x7D0 ~ 10.98 degres.
rwData->unk_00.x = Camera_LERPFloorS(playerPosEyeOffset.yaw, rwData->unk_00.x, 0.4f, 0x7D0); rwData->unk_00.x = Camera_LERPFloorS(playerPosEyeOffset.yaw, rwData->unk_00.x, 0.4f, 0x7D0);
playerPosEyeOffset.pitch = playerPosEyeOffset.pitch = -bgCamFuncData->rot.x * Math_CosS(playerPosEyeOffset.yaw - bgCamFuncData->rot.y);
-BGCAM_ROT(sceneCamData).x * Math_CosS(playerPosEyeOffset.yaw - BGCAM_ROT(sceneCamData).y);
Camera_Vec3fVecSphGeoAdd(at, eye, &playerPosEyeOffset); Camera_Vec3fVecSphGeoAdd(at, eye, &playerPosEyeOffset);
camera->unk_14C |= 0x400; camera->unk_14C |= 0x400;
return true; return true;
@ -5825,11 +5845,11 @@ s32 Camera_Demo3(Camera* camera) {
default: default:
camera->unk_14C |= 0x14; camera->unk_14C |= 0x14;
camera->unk_14C &= ~8; camera->unk_14C &= ~8;
if (camera->prevCamDataIdx < 0) { if (camera->prevBgCamIndex < 0) {
Camera_ChangeSettingFlags(camera, camera->prevSetting, 2); Camera_ChangeSettingFlags(camera, camera->prevSetting, 2);
} else { } else {
Camera_ChangeDataIdx(camera, camera->prevCamDataIdx); Camera_ChangeBgCamIndex(camera, camera->prevBgCamIndex);
camera->prevCamDataIdx = -1; camera->prevBgCamIndex = -1;
} }
sCameraInterfaceFlags = 0; sCameraInterfaceFlags = 0;
skipeyeUpdate: skipeyeUpdate:
@ -6594,14 +6614,14 @@ s32 Camera_Special6(Camera* camera) {
Vec3f* at = &camera->at; Vec3f* at = &camera->at;
Vec3f* eyeNext = &camera->eyeNext; Vec3f* eyeNext = &camera->eyeNext;
VecSph atOffset; VecSph atOffset;
Vec3f sceneCamPos; Vec3f bgCamPos;
Vec3f eyePosCalc; Vec3f eyePosCalc;
Vec3f eyeAnim; Vec3f eyeAnim;
Vec3f atAnim; Vec3f atAnim;
VecSph eyeAtOffset; VecSph eyeAtOffset;
PosRot* playerPosRot = &camera->playerPosRot; PosRot* playerPosRot = &camera->playerPosRot;
Vec3s* sceneCamData; BgCamFuncData* bgCamFuncData;
Vec3s sceneCamRot; Vec3s bgCamRot;
s16 fov; s16 fov;
f32 sp54; f32 sp54;
f32 timerF; f32 timerF;
@ -6622,10 +6642,10 @@ s32 Camera_Special6(Camera* camera) {
OLib_Vec3fDiffToVecSphGeo(&eyeAtOffset, eye, at); OLib_Vec3fDiffToVecSphGeo(&eyeAtOffset, eye, at);
sceneCamData = Camera_GetCamBGData(camera); bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamFuncData(camera);
Camera_Vec3sToVec3f(&sceneCamPos, &BGCAM_POS(sceneCamData)); Camera_Vec3sToVec3f(&bgCamPos, &bgCamFuncData->pos);
sceneCamRot = BGCAM_ROT(sceneCamData); bgCamRot = bgCamFuncData->rot;
fov = BGCAM_FOV(sceneCamData); fov = bgCamFuncData->fov;
if (fov == -1) { if (fov == -1) {
fov = 6000; fov = 6000;
} }
@ -6636,15 +6656,14 @@ s32 Camera_Special6(Camera* camera) {
sCameraInterfaceFlags = roData->interfaceFlags; sCameraInterfaceFlags = roData->interfaceFlags;
if (eyeNext->x != sceneCamPos.x || eyeNext->y != sceneCamPos.y || eyeNext->z != sceneCamPos.z || if (eyeNext->x != bgCamPos.x || eyeNext->y != bgCamPos.y || eyeNext->z != bgCamPos.z || camera->animState == 0) {
camera->animState == 0) {
// A change in the current scene's camera positon has been detected, // A change in the current scene's camera positon has been detected,
// Change "screens" // Change "screens"
camera->player->actor.freezeTimer = 12; camera->player->actor.freezeTimer = 12;
sCameraInterfaceFlags = (sCameraInterfaceFlags & 0xF0FF) | 0x300; sCameraInterfaceFlags = (sCameraInterfaceFlags & 0xF0FF) | 0x300;
rwData->initalPlayerY = playerPosRot->pos.y; rwData->initalPlayerY = playerPosRot->pos.y;
rwData->animTimer = 12; rwData->animTimer = 12;
*eyeNext = sceneCamPos; *eyeNext = bgCamPos;
if (camera->animState == 0) { if (camera->animState == 0) {
camera->animState++; camera->animState++;
} }
@ -6662,8 +6681,8 @@ s32 Camera_Special6(Camera* camera) {
// set the at point to be 100 units from the eye looking at the // set the at point to be 100 units from the eye looking at the
// direction specified in the scene's camera data. // direction specified in the scene's camera data.
atOffset.r = 100.0f; atOffset.r = 100.0f;
atOffset.yaw = sceneCamRot.y; atOffset.yaw = bgCamRot.y;
atOffset.pitch = -sceneCamRot.x; atOffset.pitch = -bgCamRot.x;
Camera_Vec3fVecSphGeoAdd(&atAnim, &eyeAnim, &atOffset); Camera_Vec3fVecSphGeoAdd(&atAnim, &eyeAnim, &atOffset);
timerDivisor = 1.0f / timerF; timerDivisor = 1.0f / timerF;
eye->x += (eyeAnim.x - eye->x) * timerDivisor; eye->x += (eyeAnim.x - eye->x) * timerDivisor;
@ -6686,8 +6705,8 @@ s32 Camera_Special6(Camera* camera) {
// set the at point to be 100 units from the eye looking at the // set the at point to be 100 units from the eye looking at the
// direction specified in the scene's camera data. // direction specified in the scene's camera data.
atOffset.r = 100.0f; atOffset.r = 100.0f;
atOffset.yaw = sceneCamRot.y; atOffset.yaw = bgCamRot.y;
atOffset.pitch = -sceneCamRot.x; atOffset.pitch = -bgCamRot.x;
Camera_Vec3fVecSphGeoAdd(at, eye, &atOffset); Camera_Vec3fVecSphGeoAdd(at, eye, &atOffset);
} }
return true; return true;
@ -6714,7 +6733,7 @@ s32 Camera_Special9(Camera* camera) {
Special9ReadOnlyData* roData = &camera->paramData.spec9.roData; Special9ReadOnlyData* roData = &camera->paramData.spec9.roData;
Special9ReadWriteData* rwData = &camera->paramData.spec9.rwData; Special9ReadWriteData* rwData = &camera->paramData.spec9.rwData;
s32 pad4; s32 pad4;
Vec3s* camPosData; BgCamFuncData* bgCamFuncData;
playerYOffset = Player_GetHeight(camera->player); playerYOffset = Player_GetHeight(camera->player);
camera->unk_14C &= ~0x10; camera->unk_14C &= ~0x10;
@ -6760,8 +6779,8 @@ s32 Camera_Special9(Camera* camera) {
if (doorParams->timer1 <= 0) { if (doorParams->timer1 <= 0) {
camera->animState++; camera->animState++;
if (roData->interfaceFlags & 1) { if (roData->interfaceFlags & 1) {
camPosData = Camera_GetCamBGData(camera); bgCamFuncData = (BgCamFuncData*)Camera_GetBgCamFuncData(camera);
Camera_Vec3sToVec3f(eyeNext, &BGCAM_POS(camPosData)); Camera_Vec3sToVec3f(eyeNext, &bgCamFuncData->pos);
spAC = *eye = *eyeNext; spAC = *eye = *eyeNext;
} else { } else {
s16 yaw; s16 yaw;
@ -6927,9 +6946,9 @@ void Camera_Init(Camera* camera, View* view, CollisionContext* colCtx, PlayState
sCameraInterfaceAlpha = 0; sCameraInterfaceAlpha = 0;
camera->unk_14C = 0; camera->unk_14C = 0;
camera->setting = camera->prevSetting = CAM_SET_FREE0; camera->setting = camera->prevSetting = CAM_SET_FREE0;
camera->camDataIdx = camera->prevCamDataIdx = -1; camera->bgCamIndex = camera->prevBgCamIndex = -1;
camera->mode = 0; camera->mode = 0;
camera->bgCheckId = BGCHECK_SCENE; camera->bgId = BGCHECK_SCENE;
camera->csId = 0x7FFF; camera->csId = 0x7FFF;
camera->timer = -1; camera->timer = -1;
camera->unk_14C |= 0x4000; camera->unk_14C |= 0x4000;
@ -7016,11 +7035,11 @@ void Camera_InitPlayerSettings(Camera* camera, Player* player) {
camera->up.x = upXZ; camera->up.x = upXZ;
if (Camera_GetFloorYNorm(camera, &floorPos, at, &bgId) != BGCHECK_Y_MIN) { if (Camera_GetFloorYNorm(camera, &floorPos, at, &bgId) != BGCHECK_Y_MIN) {
camera->bgCheckId = bgId; camera->bgId = bgId;
} }
camera->waterPrevCamIdx = -1; camera->bgCamIndexBeforeUnderwater = -1;
camera->waterPrevCamSetting = -1; camera->waterCamSetting = -1;
camera->unk_14C |= 4; camera->unk_14C |= 4;
if (camera == &camera->play->mainCamera) { if (camera == &camera->play->mainCamera) {
@ -7032,7 +7051,7 @@ void Camera_InitPlayerSettings(Camera* camera, Player* player) {
func_80057FC4(camera); func_80057FC4(camera);
camera->unk_14A = 0; camera->unk_14A = 0;
camera->paramFlags = 0; camera->paramFlags = 0;
camera->nextCamDataIdx = -1; camera->nextBgCamIndex = -1;
camera->atLERPStepScale = 1.0f; camera->atLERPStepScale = 1.0f;
Camera_CopyDataToRegs(camera, camera->mode); Camera_CopyDataToRegs(camera, camera->mode);
Camera_QRegInit(); Camera_QRegInit();
@ -7121,17 +7140,17 @@ void Camera_PrintSettings(Camera* camera) {
sCameraFunctionNames[sCameraSettings[camera->setting].cameraModes[camera->mode].funcIdx]); sCameraFunctionNames[sCameraSettings[camera->setting].cameraModes[camera->mode].funcIdx]);
i = 0; i = 0;
if (camera->camDataIdx < 0) { if (camera->bgCamIndex < 0) {
sp50[i++] = '-'; sp50[i++] = '-';
} }
//! @bug: this code was clearly meaning to print `abs(camera->camDataIdx)` as a //! @bug: this code was clearly meaning to print `abs(camera->bgCamIndex)` as a
//! one-or-two-digit number, instead of `i`. //! one-or-two-digit number, instead of `i`.
// "sp50[i++] = ..." matches here, but is undefined behavior due to conflicting // "sp50[i++] = ..." matches here, but is undefined behavior due to conflicting
// reads/writes between sequence points, triggering warnings. Work around by // reads/writes between sequence points, triggering warnings. Work around by
// putting i++ afterwards while on the same line. // putting i++ afterwards while on the same line.
// clang-format off // clang-format off
if (camera->camDataIdx / 10 != 0) { if (camera->bgCamIndex / 10 != 0) {
sp50[i] = i / 10 + '0'; i++; sp50[i] = i / 10 + '0'; i++;
} }
sp50[i] = i % 10 + '0'; i++; sp50[i] = i % 10 + '0'; i++;
@ -7151,8 +7170,8 @@ s32 Camera_UpdateWater(Camera* camera) {
f32 waterY; f32 waterY;
s16 newQuakeId; s16 newQuakeId;
s32 waterLightsIndex; s32 waterLightsIndex;
s32* waterPrevCamSetting = &camera->waterPrevCamSetting; s32* waterCamSetting = &camera->waterCamSetting;
s16 waterCamIdx; s16 waterBgCamIndex;
s16* quakeId = (s16*)&camera->waterQuakeId; s16* quakeId = (s16*)&camera->waterQuakeId;
Player* player = camera->player; Player* player = camera->player;
s16 prevBgId; s16 prevBgId;
@ -7166,55 +7185,55 @@ s32 Camera_UpdateWater(Camera* camera) {
Camera_ChangeSettingFlags(camera, CAM_SET_PIVOT_WATER_SURFACE, 6); Camera_ChangeSettingFlags(camera, CAM_SET_PIVOT_WATER_SURFACE, 6);
camera->unk_14C |= (s16)0x8000; camera->unk_14C |= (s16)0x8000;
} else if (camera->unk_14C & (s16)0x8000) { } else if (camera->unk_14C & (s16)0x8000) {
Camera_ChangeSettingFlags(camera, *waterPrevCamSetting, 6); Camera_ChangeSettingFlags(camera, *waterCamSetting, 6);
camera->unk_14C &= ~((s16)0x8000); camera->unk_14C &= ~((s16)0x8000);
} }
} }
if (!(camera->unk_14C & (s16)0x8000)) { if (!(camera->unk_14C & (s16)0x8000)) {
if (waterCamIdx = Camera_GetWaterBoxDataIdx(camera, &waterY), waterCamIdx == -2) { if (waterBgCamIndex = Camera_GetWaterBoxBgCamIndex(camera, &waterY), waterBgCamIndex == -2) {
// No camera data index // No camera data index
if (!(camera->unk_14C & 0x200)) { if (!(camera->unk_14C & 0x200)) {
camera->unk_14C |= 0x200; camera->unk_14C |= 0x200;
camera->waterYPos = waterY; camera->waterYPos = waterY;
camera->waterPrevCamIdx = camera->camDataIdx; camera->bgCamIndexBeforeUnderwater = camera->bgCamIndex;
*quakeId = -1; *quakeId = -1;
} }
if (camera->playerGroundY != camera->playerPosRot.pos.y) { if (camera->playerGroundY != camera->playerPosRot.pos.y) {
prevBgId = camera->bgCheckId; prevBgId = camera->bgId;
camera->bgCheckId = BGCHECK_SCENE; camera->bgId = BGCHECK_SCENE;
Camera_ChangeSettingFlags(camera, CAM_SET_NORMAL3, 2); Camera_ChangeSettingFlags(camera, CAM_SET_NORMAL3, 2);
*waterPrevCamSetting = camera->setting; *waterCamSetting = camera->setting;
camera->bgCheckId = prevBgId; camera->bgId = prevBgId;
camera->camDataIdx = -2; camera->bgCamIndex = -2;
} }
} else if (waterCamIdx != -1) { } else if (waterBgCamIndex != -1) {
// player is in a water box // player is in a water box
if (!(camera->unk_14C & 0x200)) { if (!(camera->unk_14C & 0x200)) {
camera->unk_14C |= 0x200; camera->unk_14C |= 0x200;
camera->waterYPos = waterY; camera->waterYPos = waterY;
camera->waterPrevCamIdx = camera->camDataIdx; camera->bgCamIndexBeforeUnderwater = camera->bgCamIndex;
*quakeId = -1; *quakeId = -1;
} }
if (camera->playerGroundY != camera->playerPosRot.pos.y) { if (camera->playerGroundY != camera->playerPosRot.pos.y) {
prevBgId = camera->bgCheckId; prevBgId = camera->bgId;
camera->bgCheckId = BGCHECK_SCENE; camera->bgId = BGCHECK_SCENE;
Camera_ChangeDataIdx(camera, waterCamIdx); Camera_ChangeBgCamIndex(camera, waterBgCamIndex);
*waterPrevCamSetting = camera->setting; *waterCamSetting = camera->setting;
camera->bgCheckId = prevBgId; camera->bgId = prevBgId;
} }
} else if (camera->unk_14C & 0x200) { } else if (camera->unk_14C & 0x200) {
// player is out of a water box. // player is out of a water box.
osSyncPrintf("camera: water: off\n"); osSyncPrintf("camera: water: off\n");
camera->unk_14C &= ~0x200; camera->unk_14C &= ~0x200;
prevBgId = camera->bgCheckId; prevBgId = camera->bgId;
camera->bgCheckId = BGCHECK_SCENE; camera->bgId = BGCHECK_SCENE;
if (camera->waterPrevCamIdx < 0) { if (camera->bgCamIndexBeforeUnderwater < 0) {
func_80057FC4(camera); func_80057FC4(camera);
camera->camDataIdx = -1; camera->bgCamIndex = -1;
} else { } else {
Camera_ChangeDataIdx(camera, camera->waterPrevCamIdx); Camera_ChangeBgCamIndex(camera, camera->bgCamIndexBeforeUnderwater);
} }
camera->bgCheckId = prevBgId; camera->bgId = prevBgId;
} }
} }
@ -7401,7 +7420,7 @@ Vec3s Camera_Update(Camera* camera) {
f32 playerGroundY; f32 playerGroundY;
f32 playerXZSpeed; f32 playerXZSpeed;
VecSph eyeAtAngle; VecSph eyeAtAngle;
s16 camDataIdx; s16 bgCamIndex;
PosRot curPlayerPosRot; PosRot curPlayerPosRot;
QuakeCamCalc quake; QuakeCamCalc quake;
Player* player; Player* player;
@ -7441,7 +7460,7 @@ Vec3s Camera_Update(Camera* camera) {
camera->floorNorm.x = COLPOLY_GET_NORMAL(playerFloorPoly->normal.x); camera->floorNorm.x = COLPOLY_GET_NORMAL(playerFloorPoly->normal.x);
camera->floorNorm.y = COLPOLY_GET_NORMAL(playerFloorPoly->normal.y); camera->floorNorm.y = COLPOLY_GET_NORMAL(playerFloorPoly->normal.y);
camera->floorNorm.z = COLPOLY_GET_NORMAL(playerFloorPoly->normal.z); camera->floorNorm.z = COLPOLY_GET_NORMAL(playerFloorPoly->normal.z);
camera->bgCheckId = bgId; camera->bgId = bgId;
camera->playerGroundY = playerGroundY; camera->playerGroundY = playerGroundY;
} else { } else {
// player is not above ground. // player is not above ground.
@ -7460,26 +7479,26 @@ Vec3s Camera_Update(Camera* camera) {
} }
if (!(camera->unk_14C & 4)) { if (!(camera->unk_14C & 4)) {
camera->nextCamDataIdx = -1; camera->nextBgCamIndex = -1;
} }
if ((camera->unk_14C & 1) && (camera->unk_14C & 4) && !(camera->unk_14C & 0x400) && if ((camera->unk_14C & 1) && (camera->unk_14C & 4) && !(camera->unk_14C & 0x400) &&
(!(camera->unk_14C & 0x200) || (player->currentBoots == PLAYER_BOOTS_IRON)) && (!(camera->unk_14C & 0x200) || (player->currentBoots == PLAYER_BOOTS_IRON)) &&
(!(camera->unk_14C & (s16)0x8000)) && (playerGroundY != BGCHECK_Y_MIN)) { (!(camera->unk_14C & (s16)0x8000)) && (playerGroundY != BGCHECK_Y_MIN)) {
camDataIdx = Camera_GetDataIdxForPoly(camera, &bgId, playerFloorPoly); bgCamIndex = Camera_GetBgCamIndex(camera, &bgId, playerFloorPoly);
if (camDataIdx != -1) { if (bgCamIndex != -1) {
camera->nextBGCheckId = bgId; camera->nextBgId = bgId;
if (bgId == BGCHECK_SCENE) { if (bgId == BGCHECK_SCENE) {
camera->nextCamDataIdx = camDataIdx; camera->nextBgCamIndex = bgCamIndex;
} }
} }
} }
if (camera->nextCamDataIdx != -1 && (fabsf(curPlayerPosRot.pos.y - playerGroundY) < 2.0f) && if (camera->nextBgCamIndex != -1 && (fabsf(curPlayerPosRot.pos.y - playerGroundY) < 2.0f) &&
(!(camera->unk_14C & 0x200) || (player->currentBoots == PLAYER_BOOTS_IRON))) { (!(camera->unk_14C & 0x200) || (player->currentBoots == PLAYER_BOOTS_IRON))) {
camera->bgCheckId = camera->nextBGCheckId; camera->bgId = camera->nextBgId;
Camera_ChangeDataIdx(camera, camera->nextCamDataIdx); Camera_ChangeBgCamIndex(camera, camera->nextBgCamIndex);
camera->nextCamDataIdx = -1; camera->nextBgCamIndex = -1;
} }
} }
} }
@ -7566,7 +7585,7 @@ Vec3s Camera_Update(Camera* camera) {
return camera->inputDir; return camera->inputDir;
} }
// setting bgCheckId to the ret of Quake_Calc, and checking that // setting bgId to the ret of Quake_Calc, and checking that
// is required, it doesn't make too much sense though. // is required, it doesn't make too much sense though.
if ((bgId = Quake_Calc(camera, &quake), bgId != 0) && (camera->setting != CAM_SET_TURN_AROUND)) { if ((bgId = Quake_Calc(camera, &quake), bgId != 0) && (camera->setting != CAM_SET_TURN_AROUND)) {
viewAt.x = camera->at.x + quake.atOffset.x; viewAt.x = camera->at.x + quake.atOffset.x;
@ -7874,13 +7893,13 @@ s16 Camera_ChangeSettingFlags(Camera* camera, s16 setting, s16 flags) {
if (flags & 8) { if (flags & 8) {
if (1) {} if (1) {}
camera->camDataIdx = camera->prevCamDataIdx; camera->bgCamIndex = camera->prevBgCamIndex;
camera->prevCamDataIdx = -1; camera->prevBgCamIndex = -1;
} else if (!(flags & 4)) { } else if (!(flags & 4)) {
if (!(sCameraSettings[camera->setting].unk_00 & 0x40000000)) { if (!(sCameraSettings[camera->setting].unk_00 & 0x40000000)) {
camera->prevCamDataIdx = camera->camDataIdx; camera->prevBgCamIndex = camera->bgCamIndex;
} }
camera->camDataIdx = -1; camera->bgCamIndex = -1;
} }
camera->setting = setting; camera->setting = setting;
@ -7899,30 +7918,30 @@ s32 Camera_ChangeSetting(Camera* camera, s16 setting) {
return Camera_ChangeSettingFlags(camera, setting, 0); return Camera_ChangeSettingFlags(camera, setting, 0);
} }
s32 Camera_ChangeDataIdx(Camera* camera, s32 camDataIdx) { s32 Camera_ChangeBgCamIndex(Camera* camera, s32 bgCamIndex) {
s16 newCameraSetting; s16 newCameraSetting;
s16 settingChangeSuccessful; s16 settingChangeSuccessful;
if (camDataIdx == -1 || camDataIdx == camera->camDataIdx) { if (bgCamIndex == -1 || bgCamIndex == camera->bgCamIndex) {
camera->unk_14A |= 0x40; camera->unk_14A |= 0x40;
return -1; return -1;
} }
if (!(camera->unk_14A & 0x40)) { if (!(camera->unk_14A & 0x40)) {
newCameraSetting = Camera_GetCamDataSetting(camera, camDataIdx); newCameraSetting = Camera_GetBgCamSetting(camera, bgCamIndex);
camera->unk_14A |= 0x40; camera->unk_14A |= 0x40;
settingChangeSuccessful = Camera_ChangeSettingFlags(camera, newCameraSetting, 5) >= 0; settingChangeSuccessful = Camera_ChangeSettingFlags(camera, newCameraSetting, 5) >= 0;
if (settingChangeSuccessful || sCameraSettings[camera->setting].unk_00 & 0x80000000) { if (settingChangeSuccessful || sCameraSettings[camera->setting].unk_00 & 0x80000000) {
camera->camDataIdx = camDataIdx; camera->bgCamIndex = bgCamIndex;
camera->unk_14A |= 4; camera->unk_14A |= 4;
Camera_CopyDataToRegs(camera, camera->mode); Camera_CopyDataToRegs(camera, camera->mode);
} else if (settingChangeSuccessful < -1) { } else if (settingChangeSuccessful < -1) {
//! @bug: This is likely checking the wrong value. The actual return of Camera_ChangeSettingFlags or //! @bug: This is likely checking the wrong value. The actual return of Camera_ChangeSettingFlags or
// camDataIdx would make more sense. // bgCamIndex would make more sense.
osSyncPrintf(VT_COL(RED, WHITE) "camera: error: illegal camera ID (%d) !! (%d|%d|%d)\n" VT_RST, camDataIdx, osSyncPrintf(VT_COL(RED, WHITE) "camera: error: illegal camera ID (%d) !! (%d|%d|%d)\n" VT_RST, bgCamIndex,
camera->camId, 0x32, newCameraSetting); camera->camId, BGCHECK_SCENE, newCameraSetting);
} }
return 0x80000000 | camDataIdx; return 0x80000000 | bgCamIndex;
} }
} }
@ -8057,7 +8076,7 @@ s32 Camera_SetCSParams(Camera* camera, CutsceneCameraPoint* atPoints, CutsceneCa
Actor_GetWorldPosShapeRot(&playerPosRot, &player->actor); Actor_GetWorldPosShapeRot(&playerPosRot, &player->actor);
camera->playerPosRot = playerPosRot; camera->playerPosRot = playerPosRot;
camera->nextCamDataIdx = -1; camera->nextBgCamIndex = -1;
camera->xzSpeed = 0.0f; camera->xzSpeed = 0.0f;
camera->speedRatio = 0.0f; camera->speedRatio = 0.0f;
} }
@ -8075,7 +8094,12 @@ s16 func_8005AD1C(Camera* camera, s16 arg1) {
return camera->unk_14C; return camera->unk_14C;
} }
s32 Camera_ChangeDoorCam(Camera* camera, Actor* doorActor, s16 camDataIdx, f32 arg3, s16 timer1, s16 timer2, /**
* A bgCamIndex of -99 will save the door params without changing the camera setting
* A bgCamIndex of -1 uses the default door camera setting (CAM_SET_DOORC)
* Otherwise, change the door camera setting by reading the bgCam indexed at bgCamIndex
*/
s32 Camera_ChangeDoorCam(Camera* camera, Actor* doorActor, s16 bgCamIndex, f32 arg3, s16 timer1, s16 timer2,
s16 timer3) { s16 timer3) {
DoorParams* doorParams = &camera->paramData.doorParams; DoorParams* doorParams = &camera->paramData.doorParams;
@ -8087,27 +8111,27 @@ s32 Camera_ChangeDoorCam(Camera* camera, Actor* doorActor, s16 camDataIdx, f32 a
doorParams->timer1 = timer1; doorParams->timer1 = timer1;
doorParams->timer2 = timer2; doorParams->timer2 = timer2;
doorParams->timer3 = timer3; doorParams->timer3 = timer3;
doorParams->camDataIdx = camDataIdx; doorParams->bgCamIndex = bgCamIndex;
if (camDataIdx == -99) { if (bgCamIndex == -99) {
Camera_CopyDataToRegs(camera, camera->mode); Camera_CopyDataToRegs(camera, camera->mode);
return -99; return -99;
} }
if (camDataIdx == -1) { if (bgCamIndex == -1) {
Camera_ChangeSetting(camera, CAM_SET_DOORC); Camera_ChangeSetting(camera, CAM_SET_DOORC);
osSyncPrintf(".... change default door camera (set %d)\n", CAM_SET_DOORC); osSyncPrintf(".... change default door camera (set %d)\n", CAM_SET_DOORC);
} else { } else {
s32 setting = Camera_GetCamDataSetting(camera, camDataIdx); s32 setting = Camera_GetBgCamSetting(camera, bgCamIndex);
camera->unk_14A |= 0x40; camera->unk_14A |= 0x40;
if (Camera_ChangeSetting(camera, setting) >= 0) { if (Camera_ChangeSetting(camera, setting) >= 0) {
camera->camDataIdx = camDataIdx; camera->bgCamIndex = bgCamIndex;
camera->unk_14A |= 4; camera->unk_14A |= 4;
} }
osSyncPrintf("....change door camera ID %d (set %d)\n", camera->camDataIdx, camera->setting); osSyncPrintf("....change door camera ID %d (set %d)\n", camera->bgCamIndex, camera->setting);
} }
Camera_CopyDataToRegs(camera, camera->mode); Camera_CopyDataToRegs(camera, camera->mode);

View file

@ -16,7 +16,7 @@ u64 D_801614D0[0xA00];
void Play_SpawnScene(PlayState* this, s32 sceneNum, s32 spawn); void Play_SpawnScene(PlayState* this, s32 sceneNum, s32 spawn);
void func_800BC450(PlayState* this) { void func_800BC450(PlayState* this) {
Camera_ChangeDataIdx(GET_ACTIVE_CAM(this), this->unk_1242B - 1); Camera_ChangeBgCamIndex(GET_ACTIVE_CAM(this), this->unk_1242B - 1);
} }
void func_800BC490(PlayState* this, s16 point) { void func_800BC490(PlayState* this, s16 point) {
@ -201,7 +201,7 @@ void Play_Init(GameState* thisx) {
u32 zAllocAligned; u32 zAllocAligned;
size_t zAllocSize; size_t zAllocSize;
Player* player; Player* player;
s32 playerStartCamId; s32 playerStartBgCamIndex;
s32 i; s32 i;
u8 tempSetupIndex; u8 tempSetupIndex;
s32 pad[2]; s32 pad[2];
@ -388,10 +388,10 @@ void Play_Init(GameState* thisx) {
Camera_InitPlayerSettings(&this->mainCamera, player); Camera_InitPlayerSettings(&this->mainCamera, player);
Camera_ChangeMode(&this->mainCamera, CAM_MODE_NORMAL); Camera_ChangeMode(&this->mainCamera, CAM_MODE_NORMAL);
playerStartCamId = player->actor.params & 0xFF; playerStartBgCamIndex = player->actor.params & 0xFF;
if (playerStartCamId != 0xFF) { if (playerStartBgCamIndex != 0xFF) {
osSyncPrintf("player has start camera ID (" VT_FGCOL(BLUE) "%d" VT_RST ")\n", playerStartCamId); osSyncPrintf("player has start camera ID (" VT_FGCOL(BLUE) "%d" VT_RST ")\n", playerStartBgCamIndex);
Camera_ChangeDataIdx(&this->mainCamera, playerStartCamId); Camera_ChangeBgCamIndex(&this->mainCamera, playerStartBgCamIndex);
} }
if (YREG(15) == 32) { if (YREG(15) == 32) {

View file

@ -362,32 +362,30 @@ void Room_Draw1Single(PlayState* play, Room* room, u32 flags) {
BgImage* func_80096A74(MeshHeader1Multi* meshHeader1Multi, PlayState* play) { BgImage* func_80096A74(MeshHeader1Multi* meshHeader1Multi, PlayState* play) {
Camera* activeCam = GET_ACTIVE_CAM(play); Camera* activeCam = GET_ACTIVE_CAM(play);
s32 camDataIdx; s32 bgCamIndex = activeCam->bgCamIndex;
s16 camDataIdx2; s16 jfifId;
Player* player; Player* player;
BgImage* bgImage; BgImage* bgImage;
s32 i; s32 i;
camDataIdx = activeCam->camDataIdx; jfifId = ((BgCamFuncData*)BgCheck_GetBgCamFuncDataImpl(&play->colCtx, bgCamIndex, BGCHECK_SCENE))->jfifId;
// jfifid if (jfifId >= 0) {
camDataIdx2 = func_80041C10(&play->colCtx, camDataIdx, BGCHECK_SCENE)[2].y; bgCamIndex = jfifId;
if (camDataIdx2 >= 0) {
camDataIdx = camDataIdx2;
} }
player = GET_PLAYER(play); player = GET_PLAYER(play);
player->actor.params = (player->actor.params & 0xFF00) | camDataIdx; player->actor.params = (player->actor.params & 0xFF00) | bgCamIndex;
bgImage = SEGMENTED_TO_VIRTUAL(meshHeader1Multi->list); bgImage = SEGMENTED_TO_VIRTUAL(meshHeader1Multi->list);
for (i = 0; i < meshHeader1Multi->count; i++) { for (i = 0; i < meshHeader1Multi->count; i++) {
if (bgImage->id == camDataIdx) { if (bgImage->id == bgCamIndex) {
return bgImage; return bgImage;
} }
bgImage++; bgImage++;
} }
// "z_room.c: Data consistent with camera id does not exist camid=%d" // "z_room.c: Data consistent with camera id does not exist camid=%d"
osSyncPrintf(VT_COL(RED, WHITE) "z_room.c:カメラIDに一致するデータが存在しません camid=%d\n" VT_RST, camDataIdx); osSyncPrintf(VT_COL(RED, WHITE) "z_room.c:カメラIDに一致するデータが存在しません camid=%d\n" VT_RST, bgCamIndex);
LogUtils_HungupThread("../z_room.c", 726); LogUtils_HungupThread("../z_room.c", 726);
return NULL; return NULL;

View file

@ -210,7 +210,7 @@ void Scene_CommandCollisionHeader(PlayState* play, SceneCmd* cmd) {
colHeader->vtxList = SEGMENTED_TO_VIRTUAL(colHeader->vtxList); colHeader->vtxList = SEGMENTED_TO_VIRTUAL(colHeader->vtxList);
colHeader->polyList = SEGMENTED_TO_VIRTUAL(colHeader->polyList); colHeader->polyList = SEGMENTED_TO_VIRTUAL(colHeader->polyList);
colHeader->surfaceTypeList = SEGMENTED_TO_VIRTUAL(colHeader->surfaceTypeList); colHeader->surfaceTypeList = SEGMENTED_TO_VIRTUAL(colHeader->surfaceTypeList);
colHeader->cameraDataList = SEGMENTED_TO_VIRTUAL(colHeader->cameraDataList); colHeader->bgCamList = SEGMENTED_TO_VIRTUAL(colHeader->bgCamList);
colHeader->waterBoxes = SEGMENTED_TO_VIRTUAL(colHeader->waterBoxes); colHeader->waterBoxes = SEGMENTED_TO_VIRTUAL(colHeader->waterBoxes);
BgCheck_Allocate(&play->colCtx, play, colHeader); BgCheck_Allocate(&play->colCtx, play, colHeader);

View file

@ -416,7 +416,8 @@ void func_80996C60(DoorShutter* this, PlayState* play) {
DoorShutter_SetupAction(this, func_80997004); DoorShutter_SetupAction(this, func_80997004);
this->unk_16C = sp38; this->unk_16C = sp38;
this->unk_170 = 0.0f; this->unk_170 = 0.0f;
Camera_ChangeDoorCam(play->cameraPtrs[CAM_ID_MAIN], &this->dyna.actor, player->unk_46A, 0.0f, 12, sp34, 10); Camera_ChangeDoorCam(play->cameraPtrs[CAM_ID_MAIN], &this->dyna.actor, player->doorBgCamIndex, 0.0f, 12, sp34,
10);
} }
} }

View file

@ -57,7 +57,7 @@ static Vec3f sRupeePositions[] = {
{ 0.0f, 0.0f, -30.0f }, { 55.0f, 0.0f, -30.0f }, { 55.0f, 0.0f, 30.0f }, { 55.0f, 0.0f, 90.0f }, { 0.0f, 0.0f, -30.0f }, { 55.0f, 0.0f, -30.0f }, { 55.0f, 0.0f, 30.0f }, { 55.0f, 0.0f, 90.0f },
}; };
static s32 sCamDataIdxs[] = { static s32 sBgCamIndices[] = {
7, 7, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 4, 4, 5, 6, 7, 7, 2, 2, 2, 2, 3, 3, 4, 4, 5, 6, 4, 4, 5, 6,
}; };
@ -410,7 +410,7 @@ void EnHeishi1_Update(Actor* thisx, PlayState* play) {
if (this->type != 5) { if (this->type != 5) {
path = this->path * 2; path = this->path * 2;
if ((sCamDataIdxs[path] == activeCam->camDataIdx) || (sCamDataIdxs[path + 1] == activeCam->camDataIdx)) { if ((sBgCamIndices[path] == activeCam->bgCamIndex) || (sBgCamIndices[path + 1] == activeCam->bgCamIndex)) {
if (!sPlayerIsCaught) { if (!sPlayerIsCaught) {
if ((this->actionFunc == EnHeishi1_Walk) || (this->actionFunc == EnHeishi1_Wait)) { if ((this->actionFunc == EnHeishi1_Walk) || (this->actionFunc == EnHeishi1_Wait)) {
Vec3f searchBallVel; Vec3f searchBallVel;

View file

@ -564,7 +564,7 @@ void EnTorch2_Update(Actor* thisx, PlayState* play2) {
if ((this->actor.colChkInfo.health == 0) && sDeathFlag) { if ((this->actor.colChkInfo.health == 0) && sDeathFlag) {
this->csMode = 0x18; this->csMode = 0x18;
this->unk_448 = &player->actor; this->unk_448 = &player->actor;
this->unk_46A = 1; this->doorBgCamIndex = 1;
sDeathFlag = false; sDeathFlag = false;
} }
if ((this->invincibilityTimer == 0) && (this->actor.colChkInfo.health != 0) && if ((this->invincibilityTimer == 0) && (this->actor.colChkInfo.health != 0) &&

View file

@ -4372,9 +4372,9 @@ s32 func_80839800(Player* this, PlayState* play) {
} }
if (doorShutter->dyna.actor.category == ACTORCAT_DOOR) { if (doorShutter->dyna.actor.category == ACTORCAT_DOOR) {
this->unk_46A = play->transiActorCtx.list[(u16)doorShutter->dyna.actor.params >> 10] this->doorBgCamIndex = play->transiActorCtx.list[(u16)doorShutter->dyna.actor.params >> 10]
.sides[(doorDirection > 0) ? 0 : 1] .sides[(doorDirection > 0) ? 0 : 1]
.effects; .bgCamIndex;
Actor_DisableLens(play); Actor_DisableLens(play);
} }
@ -4446,7 +4446,7 @@ s32 func_80839800(Player* this, PlayState* play) {
Camera_ChangeDoorCam(Play_GetCamera(play, CAM_ID_MAIN), doorActor, Camera_ChangeDoorCam(Play_GetCamera(play, CAM_ID_MAIN), doorActor,
play->transiActorCtx.list[(u16)doorActor->params >> 10] play->transiActorCtx.list[(u16)doorActor->params >> 10]
.sides[(doorDirection > 0) ? 0 : 1] .sides[(doorDirection > 0) ? 0 : 1]
.effects, .bgCamIndex,
0, 38.0f * D_808535EC, 26.0f * D_808535EC, 10.0f * D_808535EC); 0, 38.0f * D_808535EC, 26.0f * D_808535EC, 10.0f * D_808535EC);
} }
} }
@ -4837,7 +4837,7 @@ s32 func_8083AD4C(PlayState* play, Player* this) {
s32 func_8083ADD4(PlayState* play, Player* this) { s32 func_8083ADD4(PlayState* play, Player* this) {
if (this->unk_6AD == 3) { if (this->unk_6AD == 3) {
func_80835C58(play, this, func_80852E14, 0); func_80835C58(play, this, func_80852E14, 0);
if (this->unk_46A != 0) { if (this->doorBgCamIndex != 0) {
this->stateFlags1 |= PLAYER_STATE1_29; this->stateFlags1 |= PLAYER_STATE1_29;
} }
func_80832318(this); func_80832318(this);