diff --git a/src/SB/Core/x/xCamera.h b/src/SB/Core/x/xCamera.h index cc609bce5..b7780fdb1 100644 --- a/src/SB/Core/x/xCamera.h +++ b/src/SB/Core/x/xCamera.h @@ -223,14 +223,18 @@ void xCameraEnd(xCamera* cam, F32 seconds, S32 update_scrn_fx); void xCameraShowRaster(xCamera* cam); F32 xCameraGetFOV(const xCamera* cam); void xCameraSetFOV(xCamera* cam, F32 fov); -void xCameraMove(xCamera* cam, U32 flags, F32 dgoal, F32 hgoal, F32 pgoal, - F32 tm, F32 tm_acc, F32 tm_dec); +void xCameraMove(xCamera* cam, U32 flags, F32 dgoal, F32 hgoal, F32 pgoal, F32 tm, F32 tm_acc, + F32 tm_dec); void xCameraMove(xCamera* cam, const xVec3& loc); +void xCameraMove(xCamera* cam, const xVec3& loc, F32 maxSpeed); +void xCameraFOV(xCamera* cam, F32 fov, F32 maxSpeed, F32 dt); void xCameraRotate(xCamera* cam, const xMat3x3& m, F32 time, F32 accel, F32 decl); +void xCameraLookYPR(xCamera* cam, U32 flags, F32 yaw, F32 pitch, F32 roll, F32 tm, F32 tm_acc, + F32 tm_dec); F32 xCameraGetFOV(const xCamera* cam); void xCameraDoCollisions(S32 do_collis, S32 owner); void xCameraSetTargetMatrix(xCamera* cam, xMat4x3* mat); -void xCameraFXShake(F32 maxTime, F32 magnitude, F32 cycleMax, F32 rotate_magnitude, - F32 radius, xVec3* epicenter, xVec3* player); +void xCameraFXShake(F32 maxTime, F32 magnitude, F32 cycleMax, F32 rotate_magnitude, F32 radius, + xVec3* epicenter, xVec3* player); #endif diff --git a/src/SB/Game/zCamera.cpp b/src/SB/Game/zCamera.cpp index a7b246b07..80e766758 100644 --- a/src/SB/Game/zCamera.cpp +++ b/src/SB/Game/zCamera.cpp @@ -427,7 +427,160 @@ void zCameraFlyStart(U32 assetID) } } -static void zCameraFlyRestoreBackup(xCamera* cam); +static void zCameraFlyRestoreBackup(xCamera* backup) +{ + globals.camera.mat = backup->mat; + globals.camera.omat = backup->omat; + globals.camera.mbasis = backup->mbasis; + globals.camera.bound = backup->bound; + globals.camera.focus = backup->focus; + + globals.camera.flags = backup->flags; + globals.camera.tmr = backup->tmr; + globals.camera.tm_acc = backup->tm_acc; + globals.camera.tm_dec = backup->tm_dec; + globals.camera.ltmr = backup->ltmr; + globals.camera.ltm_acc = backup->ltm_acc; + globals.camera.ltm_dec = backup->ltm_dec; + globals.camera.dmin = backup->dmin; + globals.camera.dmax = backup->dmax; + globals.camera.dcur = backup->dcur; + globals.camera.dgoal = backup->dgoal; + globals.camera.hmin = backup->hmin; + globals.camera.hmax = backup->hmax; + globals.camera.hcur = backup->hcur; + globals.camera.hgoal = backup->hgoal; + globals.camera.pmin = backup->pmin; + globals.camera.pmax = backup->pmax; + globals.camera.pcur = backup->pcur; + globals.camera.pgoal = backup->pgoal; + globals.camera.depv = backup->depv; + globals.camera.hepv = backup->hepv; + globals.camera.pepv = backup->pepv; + globals.camera.orn_epv = backup->orn_epv; + globals.camera.yaw_epv = backup->yaw_epv; + globals.camera.pitch_epv = backup->pitch_epv; + globals.camera.roll_epv = backup->roll_epv; + globals.camera.orn_cur = backup->orn_cur; + globals.camera.orn_goal = backup->orn_goal; + globals.camera.orn_diff = backup->orn_diff; + globals.camera.yaw_cur = backup->yaw_cur; + globals.camera.yaw_goal = backup->yaw_goal; + globals.camera.pitch_cur = backup->pitch_cur; + globals.camera.pitch_goal = backup->pitch_goal; + globals.camera.roll_cur = backup->roll_cur; + globals.camera.roll_goal = backup->roll_goal; + globals.camera.dct = backup->dct; + globals.camera.dcd = backup->dcd; + globals.camera.dccv = backup->dccv; + globals.camera.dcsv = backup->dcsv; + globals.camera.hct = backup->hct; + globals.camera.hcd = backup->hcd; + globals.camera.hccv = backup->hccv; + globals.camera.hcsv = backup->hcsv; + globals.camera.pct = backup->pct; + globals.camera.pcd = backup->pcd; + globals.camera.pccv = backup->pccv; + globals.camera.pcsv = backup->pcsv; + globals.camera.orn_ct = backup->orn_ct; + globals.camera.orn_cd = backup->orn_cd; + globals.camera.orn_ccv = backup->orn_ccv; + globals.camera.orn_csv = backup->orn_csv; + globals.camera.yaw_ct = backup->yaw_ct; + globals.camera.yaw_cd = backup->yaw_cd; + globals.camera.yaw_ccv = backup->yaw_ccv; + globals.camera.yaw_csv = backup->yaw_csv; + globals.camera.pitch_ct = backup->pitch_ct; + globals.camera.pitch_cd = backup->pitch_cd; + globals.camera.pitch_ccv = backup->pitch_ccv; + globals.camera.pitch_csv = backup->pitch_csv; + globals.camera.roll_ct = backup->roll_ct; + globals.camera.roll_cd = backup->roll_cd; + globals.camera.roll_ccv = backup->roll_ccv; + globals.camera.roll_csv = backup->roll_csv; +} + +static S32 zCameraRewardUpdate(xCamera* cam, F32 dt) +{ + xCameraUpdate(cam, dt); + + xVec3 v = { 0.0f, 0.0f, 0.0f }; + + xVec3Copy(&v, (xVec3*)&globals.player.ent.model->Mat->pos); + v.y -= 0.7f; + + if (zcam_near) + { + if (globals.player.s->pcType == ePlayer_SB) + { + rewardMove = 1.3f; + rewardMoveSpeed = 0.68f; + rewardZoomSpeed = 7.1f; + rewardZoomAmount = 108.0f; + rewardTiltTime = 1.5f; + rewardTiltAmount = -0.22f; + } + else if (globals.player.s->pcType == ePlayer_Patrick) + { + rewardMove = 1.6f; + rewardMoveSpeed = 0.68f; + rewardZoomSpeed = 7.1f; + rewardZoomAmount = 108.0f; + rewardTiltTime = 1.0f; + rewardTiltAmount = -0.25f; + } + else if (globals.player.s->pcType == ePlayer_Sandy) + { + rewardMove = 1.3f; + rewardMoveSpeed = 0.68f; + rewardZoomSpeed = 7.1f; + rewardZoomAmount = 108.0f; + rewardTiltTime = 1.5f; + rewardTiltAmount = -0.22f; + } + } + else + { + if (globals.player.s->pcType == ePlayer_SB) + { + rewardMove = 1.5f; + rewardMoveSpeed = 1.1f; + rewardZoomSpeed = 5.9f; + rewardZoomAmount = 100.0f; + rewardTiltTime = 1.5f; + rewardTiltAmount = -0.2f; + } + else if (globals.player.s->pcType == ePlayer_Patrick) + { + rewardMove = 1.5f; + rewardMoveSpeed = 1.1f; + rewardZoomSpeed = 5.9f; + rewardZoomAmount = 100.0f; + rewardTiltTime = 1.5f; + rewardTiltAmount = -0.2f; + } + else if (globals.player.s->pcType == ePlayer_Sandy) + { + rewardMove = 1.5f; + rewardMoveSpeed = 1.1f; + rewardZoomSpeed = 5.9f; + rewardZoomAmount = 100.0f; + rewardTiltTime = 1.5f; + rewardTiltAmount = -0.2f; + } + } + + if (xVec3Dist2((xVec3*)&globals.player.ent.model->Mat->pos, &globals.camera.mat.pos) > + SQR(rewardMove)) + { + xCameraMove(cam, v, rewardMoveSpeed * dt); + xCameraFOV(cam, rewardZoomAmount, rewardZoomSpeed, dt); + xCameraLookYPR(cam, 0x0, globals.camera.yaw_cur, rewardTiltAmount, globals.camera.roll_cur, + rewardTiltTime, 0.1f, 0.1f); + } + + return 1; +} void zCameraFreeLookSetGoals(xCamera* cam, F32 pitch_s, F32& dgoal, F32& hgoal, F32& pitch_goal, F32& lktm, F32 dt)