Fix X Axis Inversion on Free Cam + Fix PlayerCamState in Custom Camera Modes (#958)

* Update bettercamera.inc.h

Fixes X axis inversion on free cam

* Use PlayerCamState for Free Cam

* Use PlayerCamState for ROM Hack Cam

* Use sMarioCamState to access PlayerCameraState

Probably should've just done this initially.
This commit is contained in:
Baconator2558 2025-10-21 12:02:06 -05:00 committed by GitHub
parent 4671f09f79
commit 3b5a1a3dcb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 33 additions and 33 deletions

View file

@ -101,7 +101,7 @@ inline static s16 newcam_adjust_value(f32 var, f32 val, f32 limit) {
inline static s32 newcam_ivrt(u8 axis) {
return (
axis == 0 ?
(gNewCamera.invertX ? 1 : -1) :
(gNewCamera.invertX ? -1 : 1) :
(gNewCamera.invertY ? -1 : 1)
);
}
@ -313,7 +313,7 @@ static void newcam_zoom_button(void) {
// When you press L, set the flag for centering the camera. Afterwards, start setting the yaw to the Player's yaw at the time.
if (gNewCamera.LCentering && (gPlayer1Controller->buttonDown & L_TRIG)) {
gNewCamera.yawTarget = -gMarioState->faceAngle[1] - 0x4000;
gNewCamera.yawTarget = -gMarioState->statusForCamera->faceAngle[1] - 0x4000;
gNewCamera.centering = true;
}
@ -346,24 +346,24 @@ static void newcam_update_values(void) {
if (gNewCamera.turnWait > 0 && gMarioState->vel[1] == 0) {
gNewCamera.turnWait--;
} else if (gMarioState->intendedMag > 0 && gMarioState->vel[1] == 0) {
gNewCamera.yaw = approach_s16_symmetric(gNewCamera.yaw, -gMarioState->faceAngle[1] - 0x4000, ((gNewCamera.aggression * (ABS(gPlayer1Controller->rawStickX / 10.f))) * (gMarioState->forwardVel / 32.f)));
gNewCamera.yaw = approach_s16_symmetric(gNewCamera.yaw, -gMarioState->statusForCamera->faceAngle[1] - 0x4000, ((gNewCamera.aggression * (ABS(gPlayer1Controller->rawStickX / 10.f))) * (gMarioState->forwardVel / 32.f)));
} else {
gNewCamera.turnWait = 10;
}
// During slide actions in slide levels, force centering
if (gNewCamera.isSlide && (
gMarioState->action == ACT_BUTT_SLIDE ||
gMarioState->action == ACT_STOMACH_SLIDE ||
gMarioState->action == ACT_HOLD_BUTT_SLIDE ||
gMarioState->action == ACT_HOLD_STOMACH_SLIDE)
gMarioState->statusForCamera->action == ACT_BUTT_SLIDE ||
gMarioState->statusForCamera->action == ACT_STOMACH_SLIDE ||
gMarioState->statusForCamera->action == ACT_HOLD_BUTT_SLIDE ||
gMarioState->statusForCamera->action == ACT_HOLD_STOMACH_SLIDE)
) {
centering = (gMarioState->forwardVel > 8);
ycentering = false;
}
// Force centering when flying
if ((gMarioState->action & ACT_FLAG_FLYING) == ACT_FLAG_FLYING) {
if ((gMarioState->statusForCamera->action & ACT_FLAG_FLYING) == ACT_FLAG_FLYING) {
centering = true;
}
@ -371,12 +371,12 @@ static void newcam_update_values(void) {
// Place the camera behind Mario during the ACT_SHOT_FROM_CANNON action
static u32 sLastAction = 0;
static bool sForceCentering = false;
if (sLastAction != gMarioState->action) {
sLastAction = gMarioState->action;
if (sLastAction != gMarioState->statusForCamera->action) {
sLastAction = gMarioState->statusForCamera->action;
sForceCentering = true;
switch (gMarioState->action) {
switch (gMarioState->statusForCamera->action) {
case ACT_SHOT_FROM_CANNON:
gNewCamera.yaw = -gMarioState->faceAngle[1] - 0x4000;
gNewCamera.yaw = -gMarioState->statusForCamera->faceAngle[1] - 0x4000;
break;
}
}
@ -392,14 +392,14 @@ static void newcam_update_values(void) {
}
// Force centering during non-still swimming actions
if (gMarioState->action & ACT_FLAG_SWIMMING && gMarioState->forwardVel > 2) {
if (gMarioState->statusForCamera->action & ACT_FLAG_SWIMMING && gMarioState->forwardVel > 2) {
centering = true;
}
if (centering) {
gNewCamera.yaw = approach_s16_symmetric(gNewCamera.yaw, -gMarioState->faceAngle[1] - 0x4000, gMarioState->forwardVel * 128);
gNewCamera.yaw = approach_s16_symmetric(gNewCamera.yaw, -gMarioState->statusForCamera->faceAngle[1] - 0x4000, gMarioState->forwardVel * 128);
if (gMarioState->forwardVel > 1 && ycentering) {
gNewCamera.tilt = approach_s16_symmetric(gNewCamera.tilt, (-gMarioState->faceAngle[0] * 0.8f) + NEWCAM_TILT_CENTERING, gMarioState->forwardVel * 32);
gNewCamera.tilt = approach_s16_symmetric(gNewCamera.tilt, (-gMarioState->statusForCamera->faceAngle[0] * 0.8f) + NEWCAM_TILT_CENTERING, gMarioState->forwardVel * 32);
} else {
gNewCamera.tilt = approach_s16_symmetric(gNewCamera.tilt, NEWCAM_TILT_CENTERING, 32);
}
@ -508,12 +508,12 @@ static void newcam_set_pan(void) {
}
// Apply panning values based on Mario's direction.
if (gMarioState->action != ACT_HOLDING_BOWSER &&
gMarioState->action != ACT_SLEEPING &&
gMarioState->action != ACT_START_SLEEPING
if (gMarioState->statusForCamera->action != ACT_HOLDING_BOWSER &&
gMarioState->statusForCamera->action != ACT_SLEEPING &&
gMarioState->statusForCamera->action != ACT_START_SLEEPING
) {
approach_f32_asymptotic_bool(&gNewCamera.panX, newcam_lengthdir_x((160.f * gNewCamera.panLevel) / 100.f, -gMarioState->faceAngle[1] - 0x4000), 0.05f);
approach_f32_asymptotic_bool(&gNewCamera.panZ, newcam_lengthdir_y((160.f * gNewCamera.panLevel) / 100.f, -gMarioState->faceAngle[1] - 0x4000), 0.05f);
approach_f32_asymptotic_bool(&gNewCamera.panX, newcam_lengthdir_x((160.f * gNewCamera.panLevel) / 100.f, -gMarioState->statusForCamera->faceAngle[1] - 0x4000), 0.05f);
approach_f32_asymptotic_bool(&gNewCamera.panZ, newcam_lengthdir_y((160.f * gNewCamera.panLevel) / 100.f, -gMarioState->statusForCamera->faceAngle[1] - 0x4000), 0.05f);
} else {
approach_f32_asymptotic_bool(&gNewCamera.panX, 0, 0.05f);
approach_f32_asymptotic_bool(&gNewCamera.panZ, 0, 0.05f);
@ -538,7 +538,7 @@ static void newcam_level_bounds(void) {
static void newcam_position_cam(void) {
f32 floorY = 0;
f32 floorY2 = 0;
if (!(gMarioState->action & ACT_FLAG_SWIMMING)) {
if (!(gMarioState->statusForCamera->action & ACT_FLAG_SWIMMING)) {
calc_y_to_curr_floor(&floorY, 1.f, 200.f, &floorY2, 0.9f, 200.f);
}
@ -549,9 +549,9 @@ static void newcam_position_cam(void) {
// Fetch Mario's current position.
// Not hardcoded just for the sake of flexibility, though this specific bit is temp,
// because it won't always want to be focusing on Mario.
gNewCamera.posTarget[0] = gMarioState->pos[0];
gNewCamera.posTarget[1] = gMarioState->pos[1] + NEWCAM_MARIO_HEIGHT;
gNewCamera.posTarget[2] = gMarioState->pos[2];
gNewCamera.posTarget[0] = gMarioState->statusForCamera->pos[0];
gNewCamera.posTarget[1] = gMarioState->statusForCamera->pos[1] + NEWCAM_MARIO_HEIGHT;
gNewCamera.posTarget[2] = gMarioState->statusForCamera->pos[2];
// These will set the position of the camera to where Mario is supposed to be,
// minus adjustments for where the camera should be, on top of.
@ -607,7 +607,7 @@ static void newcam_apply_values(struct Camera *c) {
// The ingame cutscene system is such a spaghetti mess I actually have to resort to something as stupid as this to cover every base.
static void newcam_update_camera_yaw(struct Camera *c, bool useMarioYaw) {
if (useMarioYaw) {
gNewCamera.yaw = -gMarioState->faceAngle[1] - 0x4000;
gNewCamera.yaw = -gMarioState->statusForCamera->faceAngle[1] - 0x4000;
} else {
gNewCamera.yaw = -c->yaw + 0x4000;
}

View file

@ -12249,7 +12249,7 @@ static u8 rom_hack_cam_can_see_mario(Vec3f desiredPos) {
f32 mDist;
s16 mPitch;
s16 mYaw;
vec3f_get_dist_and_angle(desiredPos, gMarioStates[0].pos, &mDist, &mPitch, &mYaw);
vec3f_get_dist_and_angle(desiredPos, sMarioCamState->pos, &mDist, &mPitch, &mYaw);
s16 degreeMult = sRomHackZoom ? 7 : 5;
@ -12379,7 +12379,7 @@ void mode_rom_hack_camera(struct Camera *c) {
// Thank you hackersm64
if (gRomhackCameraSettings.dpad) {
if (gMarioStates[0].controller->buttonPressed & U_JPAD) {
sRomHackYaw = DEGREES(180 + 90) - gMarioStates[0].faceAngle[1];
sRomHackYaw = DEGREES(180 + 90) - sMarioCamState->faceAngle[1];
} else if (gMarioStates[0].controller->buttonDown & L_JPAD) {
sRomHackYaw -= DEGREES(0.5) * (camera_config_is_x_inverted() ? 1 : -1);
} else if (gMarioStates[0].controller->buttonDown & R_JPAD) {
@ -12408,7 +12408,7 @@ void mode_rom_hack_camera(struct Camera *c) {
// figure out desired position
f32 desiredDist = sRomHackZoom ? gRomhackCameraSettings.zoomedInDist : gRomhackCameraSettings.zoomedOutDist;
f32 desiredHeight = sRomHackZoom ? gRomhackCameraSettings.zoomedInHeight : gRomhackCameraSettings.zoomedOutHeight;
f32* mPos = &gMarioStates[0].pos[0];
f32* mPos = &sMarioCamState->pos[0];
pos[0] = mPos[0] + coss(sRomHackYaw) * desiredDist;
pos[1] = mPos[1] + desiredHeight;
pos[2] = mPos[2] + sins(sRomHackYaw) * desiredDist;
@ -12443,9 +12443,9 @@ void mode_rom_hack_camera(struct Camera *c) {
vec3f_normalize(dir);
// start at mario
c->pos[0] = gMarioStates[0].pos[0];
c->pos[1] = gMarioStates[0].pos[1] + 150;
c->pos[2] = gMarioStates[0].pos[2];
c->pos[0] = sMarioCamState->pos[0];
c->pos[1] = sMarioCamState->pos[1] + 150;
c->pos[2] = sMarioCamState->pos[2];
rom_hack_cam_walk(c->pos, dir, desiredDist);
}
@ -12489,8 +12489,8 @@ s32 update_rom_hack_camera(struct Camera *c, Vec3f focus, Vec3f pos) {
// if rom hack camera was just set, figure out the yaw to use
if (!sRomHackIsUpdate) {
sRomHackYaw = DEGREES(90) - atan2s(
c->pos[2] - gMarioStates[0].pos[2],
c->pos[0] - gMarioStates[0].pos[0]);
c->pos[2] - sMarioCamState->pos[2],
c->pos[0] - sMarioCamState->pos[0]);
sRomHackYaw = (sRomHackYaw / DEGREES(45)) * DEGREES(45);
}