mirror of
https://github.com/CraftyBoss/SuperMarioOdysseyOnline.git
synced 2024-11-29 06:33:06 +00:00
135 lines
4.1 KiB
C++
135 lines
4.1 KiB
C++
|
#include "cameras/CameraPoserCustom.h"
|
||
|
#include <math.h>
|
||
|
#include "al/camera/CameraPoser.h"
|
||
|
#include "al/camera/alCameraPoserFunction.h"
|
||
|
#include "al/util.hpp"
|
||
|
#include "al/util/MathUtil.h"
|
||
|
#include "al/util/VectorUtil.h"
|
||
|
#include "logger.hpp"
|
||
|
#include "sead/gfx/seadCamera.h"
|
||
|
#include "sead/math/seadVector.h"
|
||
|
#include "sead/math/seadVectorCalcCommon.h"
|
||
|
|
||
|
namespace cc {
|
||
|
|
||
|
CameraPoserCustom::CameraPoserCustom(const char* poserName) : CameraPoser(poserName) {
|
||
|
|
||
|
this->initOrthoProjectionParam();
|
||
|
}
|
||
|
|
||
|
void CameraPoserCustom::init(void) {
|
||
|
alCameraPoserFunction::initSnapShotCameraCtrlZoomRollMove(
|
||
|
this); // this makes the snapshot camera have the abilities of the normal snapshot cam, but
|
||
|
// is locked rotationally
|
||
|
alCameraPoserFunction::initCameraVerticalAbsorber(this);
|
||
|
alCameraPoserFunction::initCameraAngleCtrl(this);
|
||
|
}
|
||
|
|
||
|
void CameraPoserCustom::loadParam(al::ByamlIter const& paramIter) {
|
||
|
al::tryGetByamlF32(&mOffsetY, paramIter, "OffsetY");
|
||
|
al::tryGetByamlF32(&mDist, paramIter, "Distance");
|
||
|
al::tryGetByamlF32(&mSnapSpeed, paramIter, "GravitySnapSpeed");
|
||
|
al::tryGetByamlBool(&mIsResetAngleIfSwitchTarget, paramIter, "IsResetAngleIfSwitchTarget");
|
||
|
}
|
||
|
|
||
|
void normalize2(sead::Vector3f &v, float inv) {
|
||
|
float len = sead::Vector3CalcCommon<float>::length(v);
|
||
|
|
||
|
if (len > 0)
|
||
|
{
|
||
|
float inv_len = inv / len;
|
||
|
v.x *= inv_len;
|
||
|
v.y *= inv_len;
|
||
|
v.z *= inv_len;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CameraPoserCustom::start(al::CameraStartInfo const&) {
|
||
|
|
||
|
sead::Vector3f faceDir;
|
||
|
sead::Vector3f targetFront;
|
||
|
|
||
|
if (alCameraPoserFunction::isSceneCameraFirstCalc(this)) {
|
||
|
alCameraPoserFunction::calcTargetTrans(&mTargetTrans, this);
|
||
|
mTargetTrans.y += mOffsetY;
|
||
|
targetFront = sead::Vector3f(0, 0, 0);
|
||
|
alCameraPoserFunction::calcTargetFront(&targetFront, this);
|
||
|
|
||
|
faceDir = mTargetTrans - (mDist * targetFront);
|
||
|
|
||
|
} else {
|
||
|
sead::LookAtCamera* curLookCam = alCameraPoserFunction::getLookAtCamera(this);
|
||
|
|
||
|
sead::Vector3f curPos = curLookCam->mPos;
|
||
|
|
||
|
sead::Vector3f curAt = curLookCam->mAt;
|
||
|
|
||
|
targetFront = sead::Vector3f(curPos.x - curAt.x, 0.0, curPos.z - curAt.z);
|
||
|
|
||
|
al::tryNormalizeOrDirZ(&targetFront);
|
||
|
|
||
|
faceDir = (mDist * targetFront) + mTargetTrans;
|
||
|
}
|
||
|
|
||
|
mPosition = faceDir;
|
||
|
}
|
||
|
|
||
|
void CameraPoserCustom::update(void) {
|
||
|
sead::Vector3f targetDir;
|
||
|
|
||
|
if (alCameraPoserFunction::isChangeSubTarget(this) && mIsResetAngleIfSwitchTarget) {
|
||
|
alCameraPoserFunction::calcTargetTrans(&mTargetTrans, this);
|
||
|
mTargetTrans.y += mOffsetY;
|
||
|
targetDir = sead::Vector3f(0,0,0);
|
||
|
alCameraPoserFunction::calcTargetFront(&targetDir, this);
|
||
|
|
||
|
mPosition = mTargetTrans - (mDist * targetDir);
|
||
|
}
|
||
|
|
||
|
sead::Vector3f targetGrav = sead::Vector3f::ey;
|
||
|
|
||
|
alCameraPoserFunction::calcTargetGravity(&targetGrav, this);
|
||
|
|
||
|
al::lerpVec(&mCameraUp, mCameraUp, -targetGrav, mSnapSpeed);
|
||
|
|
||
|
alCameraPoserFunction::calcTargetTrans(&mTargetTrans, this);
|
||
|
mTargetTrans += mCameraUp * mOffsetY;
|
||
|
|
||
|
targetDir = mPosition - mTargetTrans;
|
||
|
|
||
|
al::tryNormalizeOrDirZ(&targetDir);
|
||
|
|
||
|
sead::Vector2f playerInput(0, 0);
|
||
|
alCameraPoserFunction::calcCameraRotateStick(&playerInput, this);
|
||
|
|
||
|
sead::Vector3f rightAxis;
|
||
|
rightAxis.setCross(targetDir, mCameraUp);
|
||
|
|
||
|
float stickSpeed = alCameraPoserFunction::getStickSensitivityScale(this) *
|
||
|
alCameraPoserFunction::getStickSensitivityLevel(this);
|
||
|
|
||
|
sead::Vector3f preLook;
|
||
|
alCameraPoserFunction::calcPreLookDir(&preLook, this);
|
||
|
|
||
|
sead::Vector3f rotatedVec = targetDir;
|
||
|
|
||
|
|
||
|
// Horizontal Rotation
|
||
|
al::rotateVectorDegree(&rotatedVec, rotatedVec, mCameraUp, playerInput.x * -stickSpeed);
|
||
|
|
||
|
// Vertical Rotation
|
||
|
al::rotateVectorDegree(&rotatedVec, rotatedVec, rightAxis, playerInput.y * -stickSpeed);
|
||
|
|
||
|
mAngleH = al::calcAngleOnPlaneDegree(rotatedVec, mPrevTargetDir, mCameraUp);
|
||
|
mAngleV = al::calcAngleOnPlaneDegree(rotatedVec, mPrevTargetDir, rightAxis);
|
||
|
|
||
|
mPosition = mTargetTrans + (rotatedVec * mDist);
|
||
|
|
||
|
mPrevTargetDir = rotatedVec;
|
||
|
}
|
||
|
|
||
|
void CameraPoserCustom::movement() {
|
||
|
al::CameraPoser::movement();
|
||
|
}
|
||
|
|
||
|
}
|