mirror of
https://github.com/MonsterDruide1/OdysseyDecomp.git
synced 2025-02-23 06:30:37 +00:00
Library/Collision: Implement Sphere[Pose]Interpolator (#37)
This commit is contained in:
parent
58a45737a1
commit
70278f6d6c
@ -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.
|
56
lib/al/include/Library/Collision/KCollisionServer.h
Normal file
56
lib/al/include/Library/Collision/KCollisionServer.h
Normal 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
|
@ -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
|
||||
|
126
lib/al/src/Library/Collision/KCollisionServer.cpp
Normal file
126
lib/al/src/Library/Collision/KCollisionServer.cpp
Normal 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
|
Loading…
x
Reference in New Issue
Block a user