Files
mm/src/code/z_camera.c
T
engineer124 04dd8d7b62 Decompile/Document bgCam and actorCsCam (combination of Camera/BgCheck/Play) (#932)
* Document bgCam and actorCsCam

* index

* Small PR suggestions

* small suggestions

* player stateflags

* Fix bss

* Fix BSS

* Fix bss

* Fix bss
2022-07-23 15:51:14 -04:00

454 lines
16 KiB
C

#include "global.h"
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_fabsf.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_LengthVec3f.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB270.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Lerpf.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Lerps.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB42C.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_LerpVec3f.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB544.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB584.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB5DC.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB60C.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB674.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB6C8.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB700.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB780.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB7CC.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB7F8.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB828.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB854.s")
s32 Camera_IsSwimming(Camera* camera) {
Actor* focalActor = camera->focalActor;
if (focalActor == &GET_PLAYER(camera->play)->actor) {
if (((Player*)focalActor)->stateFlags3 & PLAYER_STATE3_8000) {
// Swimming as Zora
return 999;
} else {
// Swimming as Human or Fierce Deity
return ((Player*)focalActor)->stateFlags1 & PLAYER_STATE1_8000000;
}
} else {
// Camera not focused on player
return 0;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB8C8.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB8F4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB924.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CB950.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CBA08.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CBA34.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CBA7C.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CBAAC.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CBAD4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CBB58.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CBB88.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CBC00.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CBC30.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CBC84.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CBFA4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC000.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC128.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC1C4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC260.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC488.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC56C.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC5C8.s")
#define CAM_DATA_IS_BG (1 << 12) // if not set, then cam data is for actor cutscenes
/**
* Returns the CameraSettingType of the camera from either the bgCam or the actorCsCam at index `camDataId`
*/
s16 Camera_GetBgCamOrActorCsCamSetting(Camera* camera, u32 camDataId) {
if (camDataId & CAM_DATA_IS_BG) {
return BgCheck_GetBgCamSettingImpl(&camera->play->colCtx, camDataId & ~CAM_DATA_IS_BG, BGCHECK_SCENE);
} else {
return Play_GetActorCsCamSetting(camera->play, camDataId);
}
}
/**
* Returns either the bgCam data or the actorCsCam data at index `camDataId`
*/
Vec3s* Camera_GetBgCamOrActorCsCamFuncData(Camera* camera, u32 camDataId) {
if (camDataId & CAM_DATA_IS_BG) {
return BgCheck_GetBgCamFuncDataImpl(&camera->play->colCtx, camDataId & ~CAM_DATA_IS_BG, BGCHECK_SCENE);
} else {
return Play_GetActorCsCamFuncData(camera->play, camDataId);
}
}
/**
* Gets the bgCam index for the poly `poly`, returns -1 if
* there is no camera data for that poly.
*/
s32 Camera_GetBgCamIndex(Camera* camera, s32* bgId, CollisionPoly* poly) {
s32 bgCamIndex = SurfaceType_GetBgCamIndex(&camera->play->colCtx, poly, *bgId);
s32 ret;
if (BgCheck_GetBgCamSettingImpl(&camera->play->colCtx, bgCamIndex, *bgId) == CAM_SET_NONE) {
ret = -1;
} else {
ret = bgCamIndex;
}
return ret;
}
/**
* Gets the Camera setting for the water box the player is in.
* Returns -1 if the player is not in a water box, or does not have a swimming state.
* Returns -2 if there is no bgCam index for the water box.
* Returns the camera setting otherwise.
*/
s32 Camera_GetWaterBoxBgCamSetting(Camera* camera, f32* waterY) {
PosRot playerPosShape;
WaterBox* waterBox;
s32 camSetting;
s32 bgId;
Actor_GetWorldPosShapeRot(&playerPosShape, camera->focalActor);
*waterY = playerPosShape.pos.y;
if (!WaterBox_GetSurfaceImpl(camera->play, &camera->play->colCtx, playerPosShape.pos.x, playerPosShape.pos.z,
waterY, &waterBox, &bgId)) {
// player's position is not in a waterbox
*waterY = playerPosShape.pos.y;
return -1;
}
if (!Camera_IsSwimming(camera)) {
return -1;
}
camSetting = WaterBox_GetBgCamSetting(&camera->play->colCtx, waterBox, bgId);
// -2: no bgCam index
return (camSetting == CAM_SET_NONE) ? -2 : camSetting;
}
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC938.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC958.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CC9C0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CCCEC.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD04C.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD288.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD2E0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD2F0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD3E4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD44C.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD634.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD6CC.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD6F8.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CD834.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CDA14.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CDB6C.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CDE6C.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CE2B8.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CE5E0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CE79C.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CE930.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CEAD8.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CEC38.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800CED90.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeNop.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeNORM1.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeNORM2.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeNORM3.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeNORM4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeNORM0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModePARA1.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModePARA2.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModePARA3.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModePARA4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModePARA0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeJUMP1.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeJUMP2.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeJUMP3.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeJUMP4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeJUMP0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeBATT1.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeBATT2.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeBATT3.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeBATT4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeBATT0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeKEEP1.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeKEEP2.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeKEEP3.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeKEEP4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeKEEP0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeFIXD1.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeFIXD2.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeFIXD3.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeFIXD4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeFIXD0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeSUBJ1.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeSUBJ2.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeSUBJ3.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeSUBJ4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeSUBJ0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeDATA0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeDATA1.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeDATA2.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeDATA3.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeDATA4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeUNIQ1.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeUNIQ2.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeUNIQ3.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeUNIQ4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeUNIQ5.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeUNIQ0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeUNIQ6.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeUNIQ7.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeUNIQ8.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeUNIQ9.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeDEMO1.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeDEMO2.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeDEMO3.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeDEMO4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeDEMO5.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeDEMO6.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeDEMO7.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeDEMO8.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeDEMO9.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeDEMO0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeSPEC0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeSPEC1.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeSPEC2.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeSPEC3.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeSPEC4.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeSPEC5.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeSPEC6.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeSPEC7.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeSPEC8.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ModeSPEC9.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Alloc.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Free.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Init.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DDFE0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE0E0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE0EC.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE308.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE324.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE62C.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE840.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE890.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DE954.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_Update.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DF498.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_SetMode.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeMode.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DF86C.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DF8EC.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeSetting.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeDataIdx.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFC1C.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFC40.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetInputDirYaw.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetCamDir.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetCamDirPitch.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetCamDirYaw.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_AddQuake.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFD78.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFEF0.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFF18.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFF34.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800DFF44.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_SetFlags.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ClearFlags.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeDoorCam.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E007C.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E01AC.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetQuakeOffset.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E01DC.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E0228.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E0238.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_SetToTrackActor.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_SetTargetActor.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_GetWaterYPos.s")
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800E0348.s")