Library/Collision: Implement Sphere[Pose]Interpolator (#37)

This commit is contained in:
MonsterDruide1 2024-05-16 15:46:46 +02:00 committed by GitHub
parent 58a45737a1
commit 70278f6d6c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 200 additions and 14 deletions

View File

@ -52462,20 +52462,20 @@ Address,Quality,Size,Name
0x0000007100856e30,U,000052,_ZNK2al16KCollisionServer19calcAreaBlockOffsetERKN4sead7Vector3IjEEPKNS_13KCPrismHeaderE
0x0000007100856e64,U,000040,_ZN2al16KCollisionServer20calcChildBlockOffsetERKN4sead7Vector3IjEEi
0x0000007100856e8c,U,000008,_ZN2al16KCollisionServer12getBlockDataEPKjj
0x0000007100856e94,U,000196,_ZN2al18SphereInterpolator11startInterpERKN4sead7Vector3IfEES5_fff
0x0000007100856f58,U,000036,_ZN2al18SphereInterpolator8nextStepEv
0x0000007100856f7c,U,000068,_ZNK2al18SphereInterpolator13calcInterpPosEPN4sead7Vector3IfEE
0x0000007100856fc0,U,000144,_ZNK2al18SphereInterpolator10calcInterpEPN4sead7Vector3IfEEPfS4_
0x0000007100857050,U,000056,_ZNK2al18SphereInterpolator20calcRemainMoveVectorEPN4sead7Vector3IfEE
0x0000007100857088,U,000044,_ZN2al18SphereInterpolator13getMoveVectorEPN4sead7Vector3IfEE
0x00000071008570b4,U,000048,_ZNK2al18SphereInterpolator18calcStepMoveVectorEPN4sead7Vector3IfEE
0x00000071008570e4,U,000268,_ZN2al22SpherePoseInterpolator11startInterpERKN4sead7Vector3IfEES5_ffRKNS1_4QuatIfEES9_f
0x00000071008571f0,U,000036,_ZN2al22SpherePoseInterpolator8nextStepEv
0x0000007100857214,U,000068,_ZNK2al22SpherePoseInterpolator13calcInterpPosEPN4sead7Vector3IfEE
0x0000007100857258,U,000308,_ZNK2al22SpherePoseInterpolator10calcInterpEPN4sead7Vector3IfEEPfPNS1_4QuatIfEES4_
0x000000710085738c,U,000056,_ZNK2al22SpherePoseInterpolator20calcRemainMoveVectorEPN4sead7Vector3IfEE
0x00000071008573c4,U,000012,_ZNK2al22SpherePoseInterpolator19calcRadiusBaseScaleEf
0x00000071008573d0,U,000044,_ZN2al22SpherePoseInterpolator13getMoveVectorEPN4sead7Vector3IfEE
0x0000007100856e94,O,000196,_ZN2al18SphereInterpolator11startInterpERKN4sead7Vector3IfEES5_fff
0x0000007100856f58,O,000036,_ZN2al18SphereInterpolator8nextStepEv
0x0000007100856f7c,O,000068,_ZNK2al18SphereInterpolator13calcInterpPosEPN4sead7Vector3IfEE
0x0000007100856fc0,O,000144,_ZNK2al18SphereInterpolator10calcInterpEPN4sead7Vector3IfEEPfS4_
0x0000007100857050,O,000056,_ZNK2al18SphereInterpolator20calcRemainMoveVectorEPN4sead7Vector3IfEE
0x0000007100857088,O,000044,_ZN2al18SphereInterpolator13getMoveVectorEPN4sead7Vector3IfEE
0x00000071008570b4,O,000048,_ZNK2al18SphereInterpolator18calcStepMoveVectorEPN4sead7Vector3IfEE
0x00000071008570e4,O,000268,_ZN2al22SpherePoseInterpolator11startInterpERKN4sead7Vector3IfEES5_ffRKNS1_4QuatIfEES9_f
0x00000071008571f0,O,000036,_ZN2al22SpherePoseInterpolator8nextStepEv
0x0000007100857214,O,000068,_ZNK2al22SpherePoseInterpolator13calcInterpPosEPN4sead7Vector3IfEE
0x0000007100857258,O,000308,_ZNK2al22SpherePoseInterpolator10calcInterpEPN4sead7Vector3IfEEPfPNS1_4QuatIfEES4_
0x000000710085738c,O,000056,_ZNK2al22SpherePoseInterpolator20calcRemainMoveVectorEPN4sead7Vector3IfEE
0x00000071008573c4,O,000012,_ZNK2al22SpherePoseInterpolator19calcRadiusBaseScaleEf
0x00000071008573d0,O,000044,_ZN2al22SpherePoseInterpolator13getMoveVectorEPN4sead7Vector3IfEE
0x00000071008573fc,U,000040,_ZNK2al26TriangleFilterIgnoreGround17isInvalidTriangleERKNS_8TriangleE
0x0000007100857424,U,000052,_ZNK2al24TriangleFilterGroundOnly17isInvalidTriangleERKNS_8TriangleE
0x0000007100857458,U,000052,_ZNK2al22TriangleFilterWallOnly17isInvalidTriangleERKNS_8TriangleE

Can't render this file because it is too large.

View File

@ -0,0 +1,56 @@
#pragma once
#include <math/seadQuat.h>
#include <math/seadVector.h>
namespace al {
class SphereInterpolator {
public:
SphereInterpolator() {}
void startInterp(const sead::Vector3f& posStart, const sead::Vector3f& posEnd, f32 sizeStart,
f32 sizeEnd, f32 steps);
void nextStep();
void calcInterpPos(sead::Vector3f* pos) const;
void calcInterp(sead::Vector3f* pos, f32* size, sead::Vector3f* remainMoveVec) const;
void calcRemainMoveVector(sead::Vector3f* remainMoveVec) const;
void getMoveVector(sead::Vector3f* moveVec);
void calcStepMoveVector(sead::Vector3f* moveVec) const;
private:
sead::Vector3f mPos;
sead::Vector3f mMove;
f32 mSizeStart;
f32 mSizeEnd;
f32 mStepSize;
f32 mCurrentStep;
f32 mPrevStep;
};
class SpherePoseInterpolator {
public:
SpherePoseInterpolator() {}
void startInterp(const sead::Vector3f& posStart, const sead::Vector3f& posEnd, f32 sizeStart,
f32 sizeEnd, const sead::Quatf& quatStart, const sead::Quatf& quatEnd,
f32 steps);
void nextStep();
void calcInterpPos(sead::Vector3f* pos) const;
void calcInterp(sead::Vector3f* pos, f32* size, sead::Quatf* quat,
sead::Vector3f* remainMoveVec) const;
void calcRemainMoveVector(sead::Vector3f* remainMoveVec) const;
f32 calcRadiusBaseScale(f32 unk) const;
void getMoveVector(sead::Vector3f* moveVec);
private:
sead::Vector3f mPos;
sead::Vector3f mMove;
f32 mSizeStart;
f32 mSizeEnd;
sead::Quatf mQuatStart;
sead::Quatf mQuatEnd;
f32 mStepSize;
f32 mCurrentStep;
f32 mPrevStep;
};
} // namespace al

View File

@ -54,4 +54,8 @@ void lerpVec(sead::Vector3f*, const sead::Vector3f&, const sead::Vector3f&, f32)
void lerpVecHV(sead::Vector3f*, const sead::Vector3f&, const sead::Vector3f&, const sead::Vector3f&,
f32, f32);
f32 calcRate01(f32, f32, f32);
f32 slerpQuat(sead::Quatf*, const sead::Quatf&, const sead::Quatf&, f32);
} // namespace al

View File

@ -0,0 +1,126 @@
#include "Library/Collision/KCollisionServer.h"
#include "Library/Math/MathUtil.h"
namespace al {
void SphereInterpolator::startInterp(const sead::Vector3f& posStart, const sead::Vector3f& posEnd,
f32 sizeStart, f32 sizeEnd, f32 steps) {
mCurrentStep = 0.0f;
mPrevStep = 0.0f;
mPos = posStart;
mMove = posEnd - posStart;
mSizeStart = sizeStart;
mSizeEnd = sizeEnd;
f32 dist = mMove.length() + sizeEnd - sizeStart;
mStepSize = (dist <= 0.0f) ? 1.0f : steps / dist;
}
void SphereInterpolator::nextStep() {
// re-interpreting between f32/s32 required to match
s32 curStep = *(s32*)&mCurrentStep;
f32 stepAsFloat = *(f32*)&curStep;
f32 newStep = sead::Mathf::clampMax(stepAsFloat + mStepSize, 1.0f);
*(s32*)&mPrevStep = curStep;
mCurrentStep = newStep;
}
void SphereInterpolator::calcInterpPos(sead::Vector3f* pos) const {
f32 step = mCurrentStep;
pos->x = mMove.x * step + mPos.x;
pos->y = mMove.y * step + mPos.y;
pos->z = mMove.z * step + mPos.z;
}
void SphereInterpolator::calcInterp(sead::Vector3f* pos, f32* size,
sead::Vector3f* remainMoveVec) const {
calcInterpPos(pos);
*size = mSizeStart + (mSizeEnd - mSizeStart) * mCurrentStep;
calcRemainMoveVector(remainMoveVec);
}
void SphereInterpolator::calcRemainMoveVector(sead::Vector3f* remainMoveVec) const {
if (remainMoveVec) {
f32 remainStep = 1.0f - mCurrentStep;
remainMoveVec->x = mMove.x * remainStep;
remainMoveVec->y = mMove.y * remainStep;
remainMoveVec->z = mMove.z * remainStep;
}
}
void SphereInterpolator::getMoveVector(sead::Vector3f* moveVec) {
f32 step = mCurrentStep;
moveVec->x = mMove.x * step;
moveVec->y = mMove.y * step;
moveVec->z = mMove.z * step;
}
void SphereInterpolator::calcStepMoveVector(sead::Vector3f* moveVec) const {
f32 step = mCurrentStep - mPrevStep;
moveVec->x = mMove.x * step;
moveVec->y = mMove.y * step;
moveVec->z = mMove.z * step;
}
void SpherePoseInterpolator::startInterp(const sead::Vector3f& posStart,
const sead::Vector3f& posEnd, f32 sizeStart, f32 sizeEnd,
const sead::Quatf& quatStart, const sead::Quatf& quatEnd,
f32 steps) {
mCurrentStep = 0.0f;
mPrevStep = 0.0f;
mPos = posStart;
mMove = posEnd - posStart;
mQuatStart.x = quatStart.x;
mQuatStart.y = quatStart.y;
mQuatStart.z = quatStart.z;
mQuatStart.w = quatStart.w;
mQuatEnd.x = quatEnd.x;
mQuatEnd.y = quatEnd.y;
mQuatEnd.z = quatEnd.z;
mQuatEnd.w = quatEnd.w;
mSizeStart = sizeStart;
mSizeEnd = sizeEnd;
f32 dist = mMove.length() + sizeEnd - sizeStart;
mStepSize = (dist <= 0.0f) ? 1.0f : steps / dist;
}
void SpherePoseInterpolator::nextStep() {
// re-interpreting between f32/s32 required to match
s32 curStep = *(s32*)&mCurrentStep;
f32 stepAsFloat = *(f32*)&curStep;
f32 newStep = sead::Mathf::clampMax(stepAsFloat + mStepSize, 1.0f);
*(s32*)&mPrevStep = curStep;
mCurrentStep = newStep;
}
void SpherePoseInterpolator::calcInterpPos(sead::Vector3f* pos) const {
f32 step = mCurrentStep;
pos->x = mMove.x * step + mPos.x;
pos->y = mMove.y * step + mPos.y;
pos->z = mMove.z * step + mPos.z;
}
void SpherePoseInterpolator::calcInterp(sead::Vector3f* pos, f32* size, sead::Quatf* quat,
sead::Vector3f* remainMoveVec) const {
calcInterpPos(pos);
*size = mSizeStart + (mSizeEnd - mSizeStart) * mCurrentStep;
slerpQuat(quat, mQuatStart, mQuatEnd, mCurrentStep);
quat->normalize();
calcRemainMoveVector(remainMoveVec);
}
void SpherePoseInterpolator::calcRemainMoveVector(sead::Vector3f* remainMoveVec) const {
if (remainMoveVec) {
f32 remainStep = 1.0f - mCurrentStep;
remainMoveVec->x = mMove.x * remainStep;
remainMoveVec->y = mMove.y * remainStep;
remainMoveVec->z = mMove.z * remainStep;
}
}
f32 SpherePoseInterpolator::calcRadiusBaseScale(f32 unk) const {
return calcRate01(unk, 0.0f, mSizeEnd);
}
void SpherePoseInterpolator::getMoveVector(sead::Vector3f* moveVec) {
f32 step = mCurrentStep;
moveVec->x = mMove.x * step;
moveVec->y = mMove.y * step;
moveVec->z = mMove.z * step;
}
} // namespace al