mirror of
https://github.com/pmret/papermario.git
synced 2024-11-18 08:52:40 +01:00
91 lines
3.9 KiB
C
91 lines
3.9 KiB
C
#include "common.h"
|
|
|
|
// implements CAM_UPDATE_NO_INTERP
|
|
// this camera uses a set of control parameters to calculate its lookAt_obj and lookAt_eye positions,
|
|
// which are only updated if skipRecalc = FALSE
|
|
// the ultimate target is given by lookAt_obj_target, with an offset given by targetPos (?!)
|
|
// in practice, this is used for CAM_BATTLE and CAM_TATTLE, with skipRecalc almost always set to FALSE
|
|
//
|
|
// control parameters:
|
|
// dist -- length of the camera boom arm
|
|
// pitch -- rising angle of the boom arm, up toward the y-axis
|
|
// yaw -- yaw angle for the boom arm in the xz-plane
|
|
// offsetY -- offset of the base of the boom arm above the target point
|
|
// fovScale -- adjusts vertical fov, with 100 being normal (=25). scales as 1/x so larger values mean smaller vfov.
|
|
// skipRecalc -- do not calculate lookAt_obj and lookAt_eye from params
|
|
void update_camera_no_interp(Camera* camera) {
|
|
f32 sinBoom;
|
|
f32 cosBoom;
|
|
f32 deltaX;
|
|
f32 deltaY;
|
|
f32 deltaZ;
|
|
f32 deltaX2;
|
|
f32 deltaY2;
|
|
f32 deltaZ2;
|
|
f32 boomYaw;
|
|
f32 new_var;
|
|
f32 planarDist;
|
|
|
|
if (camera->needsInit || camera->needsReinit) {
|
|
camera->needsInit = FALSE;
|
|
camera->needsReinit = FALSE;
|
|
camera->params.basic.skipRecalc = FALSE;
|
|
camera->params.basic.dist = 100;
|
|
camera->params.basic.fovScale = 100;
|
|
camera->params.basic.pitch = 0;
|
|
camera->params.basic.yaw = 0;
|
|
camera->params.basic.offsetY = 0;
|
|
camera->targetPos.x = 0.0f;
|
|
camera->targetPos.y = 0.0f;
|
|
camera->targetPos.z = 0.0f;
|
|
camera->lookAt_obj.x = camera->lookAt_obj_target.x;
|
|
camera->lookAt_obj.y = camera->lookAt_obj_target.y;
|
|
camera->lookAt_obj.z = camera->lookAt_obj_target.z;
|
|
}
|
|
|
|
if (!camera->params.basic.skipRecalc) {
|
|
camera->lookAt_obj.x = camera->lookAt_obj_target.x + camera->targetPos.x;
|
|
camera->lookAt_obj.y = camera->lookAt_obj_target.y + camera->targetPos.y + camera->params.basic.offsetY / 256.0;
|
|
camera->lookAt_obj.z = camera->lookAt_obj_target.z + camera->targetPos.z;
|
|
camera->curBoomYaw = camera->params.basic.yaw;
|
|
camera->curBoomPitch = camera->params.basic.pitch;
|
|
camera->curBoomLength = camera->params.basic.dist;
|
|
camera->vfov = (10000 / camera->params.basic.fovScale) / 4;
|
|
boomYaw = DEG_TO_RAD(camera->curBoomPitch);
|
|
sinBoom = sin_rad(boomYaw);
|
|
cosBoom = cos_rad(boomYaw);
|
|
deltaX = 0.0f;
|
|
deltaY = 0.0f;
|
|
deltaZ = camera->curBoomLength;
|
|
deltaX2 = 0.0f;
|
|
deltaY2 = 0.0f;
|
|
boomYaw = deltaX = -deltaY2;
|
|
deltaZ2 = camera->curBoomLength;
|
|
new_var = boomYaw;
|
|
deltaX = deltaX2;
|
|
deltaY = cosBoom * deltaY2 + deltaZ2 * sinBoom;
|
|
deltaZ = sinBoom * new_var + deltaZ2 * cosBoom;
|
|
boomYaw = DEG_TO_RAD(camera->curBoomYaw);
|
|
sinBoom = sin_rad(boomYaw);
|
|
cosBoom = cos_rad(boomYaw);
|
|
deltaZ2 = cosBoom * deltaX - deltaZ * sinBoom;
|
|
deltaX2 = cosBoom * deltaX - deltaZ * sinBoom;
|
|
deltaY2 = deltaY;
|
|
deltaZ2 = sinBoom * deltaX + deltaZ * cosBoom;
|
|
camera->lookAt_eye.x = camera->lookAt_obj.x + deltaX2;
|
|
camera->lookAt_eye.y = camera->lookAt_obj.y + deltaY2;
|
|
camera->lookAt_eye.z = camera->lookAt_obj.z + deltaZ2;
|
|
}
|
|
|
|
camera->curYaw = atan2(camera->lookAt_eye.x, camera->lookAt_eye.z, camera->lookAt_obj.x, camera->lookAt_obj.z);
|
|
deltaX = camera->lookAt_obj.x - camera->lookAt_eye.x;
|
|
deltaY = camera->lookAt_obj.y - camera->lookAt_eye.y;
|
|
deltaZ = camera->lookAt_obj.z - camera->lookAt_eye.z;
|
|
camera->lookAt_yaw = -atan2(0.0f, 0.0f, deltaX, deltaZ);
|
|
planarDist = sqrtf(SQ(deltaX) + SQ(deltaZ));
|
|
camera->lookAt_pitch = atan2(0.0f, 0.0f, deltaY, -planarDist);
|
|
gBattleStatus.camLookatObjPos.x = camera->lookAt_obj.x;
|
|
gBattleStatus.camLookatObjPos.y = camera->lookAt_obj.y;
|
|
gBattleStatus.camLookatObjPos.z = camera->lookAt_obj.z;
|
|
}
|