mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-23 09:04:21 +00:00
Player: Implement CollidedShapeResult (#406)
This commit is contained in:
parent
a077fe767f
commit
cff7a46c67
|
|
@ -25476,19 +25476,19 @@ Address,Quality,Size,Name
|
|||
0x00000071003f5984,U,001016,_ZNK13CapTargetInfo13makeLockOnMtxEPN4sead8Matrix34IfEE
|
||||
0x00000071003f5d7c,U,000520,_ZNK13CapTargetInfo27calcLockOnFollowTargetScaleEPN4sead7Vector3IfEE
|
||||
0x00000071003f5f84,U,001004,_ZN21CapTargetInfoFunction21initIterCapTargetInfoEP13CapTargetInfoP19IUsePlayerCollisionPKN2al9LiveActorEPKc
|
||||
0x00000071003f6370,U,000124,_ZN19CollidedShapeResultC1EPK22CollisionShapeInfoBase
|
||||
0x00000071003f63ec,U,000284,_ZN19CollidedShapeResult15setArrowHitInfoERKN2al12ArrowHitInfoE
|
||||
0x00000071003f6508,U,000284,_ZN19CollidedShapeResult16setSphereHitInfoERKN2al13SphereHitInfoE
|
||||
0x00000071003f6624,U,000284,_ZN19CollidedShapeResult14setDiskHitInfoERKN2al11DiskHitInfoE
|
||||
0x00000071003f6740,U,000008,_ZNK19CollidedShapeResult7isArrowEv
|
||||
0x00000071003f6748,U,000008,_ZNK19CollidedShapeResult8isSphereEv
|
||||
0x00000071003f6750,U,000008,_ZNK19CollidedShapeResult6isDiskEv
|
||||
0x00000071003f6758,U,000008,_ZNK19CollidedShapeResult15getArrowHitInfoEv
|
||||
0x00000071003f6760,U,000008,_ZNK19CollidedShapeResult16getSphereHitInfoEv
|
||||
0x00000071003f6768,U,000008,_ZNK19CollidedShapeResult14getDiskHitInfoEv
|
||||
0x00000071003f6770,U,000008,_ZNK19CollidedShapeResult17getShapeInfoArrowEv
|
||||
0x00000071003f6778,U,000008,_ZNK19CollidedShapeResult18getShapeInfoSphereEv
|
||||
0x00000071003f6780,U,000008,_ZNK19CollidedShapeResult16getShapeInfoDiskEv
|
||||
0x00000071003f6370,O,000124,_ZN19CollidedShapeResultC1EPK22CollisionShapeInfoBase
|
||||
0x00000071003f63ec,O,000284,_ZN19CollidedShapeResult15setArrowHitInfoERKN2al12ArrowHitInfoE
|
||||
0x00000071003f6508,O,000284,_ZN19CollidedShapeResult16setSphereHitInfoERKN2al13SphereHitInfoE
|
||||
0x00000071003f6624,O,000284,_ZN19CollidedShapeResult14setDiskHitInfoERKN2al11DiskHitInfoE
|
||||
0x00000071003f6740,O,000008,_ZNK19CollidedShapeResult7isArrowEv
|
||||
0x00000071003f6748,O,000008,_ZNK19CollidedShapeResult8isSphereEv
|
||||
0x00000071003f6750,O,000008,_ZNK19CollidedShapeResult6isDiskEv
|
||||
0x00000071003f6758,O,000008,_ZNK19CollidedShapeResult15getArrowHitInfoEv
|
||||
0x00000071003f6760,O,000008,_ZNK19CollidedShapeResult16getSphereHitInfoEv
|
||||
0x00000071003f6768,O,000008,_ZNK19CollidedShapeResult14getDiskHitInfoEv
|
||||
0x00000071003f6770,O,000008,_ZNK19CollidedShapeResult17getShapeInfoArrowEv
|
||||
0x00000071003f6778,O,000008,_ZNK19CollidedShapeResult18getShapeInfoSphereEv
|
||||
0x00000071003f6780,O,000008,_ZNK19CollidedShapeResult16getShapeInfoDiskEv
|
||||
0x00000071003f6788,U,000076,_ZN19CollisionMultiShapeC1EPKN2al13IUseCollisionEi
|
||||
0x00000071003f67d4,U,000344,_ZN19CollisionMultiShape5checkEP20CollisionShapeKeeperPKN4sead8Matrix34IfEEfRKNS2_7Vector3IfEEPKN2al24CollisionPartsFilterBaseE
|
||||
0x00000071003f692c,U,001484,_ZN19CollisionMultiShape17callbackFromPartsEPN2al14CollisionPartsE
|
||||
|
|
@ -25553,7 +25553,7 @@ Address,Quality,Size,Name
|
|||
0x00000071003f900c,U,000096,_ZN20CollisionShapeKeeper18calcWorldShapeInfoERKN4sead8Matrix34IfEEf
|
||||
0x00000071003f906c,U,000080,_ZN20CollisionShapeKeeper21calcRelativeShapeInfoERKN4sead8Matrix34IfEE
|
||||
0x00000071003f90bc,U,000076,_ZN20CollisionShapeKeeper21registerCollideResultERK19CollidedShapeResult
|
||||
0x00000071003f9108,U,000852,_ZN19CollidedShapeResultaSERKS_
|
||||
0x00000071003f9108,O,000852,_ZN19CollidedShapeResultaSERKS_
|
||||
0x00000071003f945c,U,000076,_ZN20CollisionShapeKeeper28registerCollideSupportResultERK19CollidedShapeResult
|
||||
0x00000071003f94a8,U,000020,_ZNK20CollisionShapeKeeper20isCollidedResultFullEv
|
||||
0x00000071003f94bc,U,000020,_ZNK20CollisionShapeKeeper27isCollidedSupportResultFullEv
|
||||
|
|
|
|||
|
Can't render this file because it is too large.
|
|
|
@ -239,21 +239,21 @@ const sead::Vector3f& HitInfo::tryGetHitEdgeNormal() const {
|
|||
|
||||
void SphereHitInfo::calcFixVector(sead::Vector3f* a1, sead::Vector3f* a2) const {
|
||||
// TODO add proper names here, once the missing names for _70 and _80 in HitInfo are found
|
||||
if (isCollisionAtFace()) {
|
||||
if (mHitInfo->isCollisionAtFace()) {
|
||||
calcFixVectorNormal(a1, a2);
|
||||
return;
|
||||
}
|
||||
|
||||
sead::Vector3f v20;
|
||||
v20.x = _80.x - mCollisionHitPos.x;
|
||||
v20.y = _80.y - mCollisionHitPos.y;
|
||||
v20.z = _80.z - mCollisionHitPos.z;
|
||||
v20.x = mHitInfo->_80.x - mHitInfo->mCollisionHitPos.x;
|
||||
v20.y = mHitInfo->_80.y - mHitInfo->mCollisionHitPos.y;
|
||||
v20.z = mHitInfo->_80.z - mHitInfo->mCollisionHitPos.z;
|
||||
tryNormalizeOrZero(&v20);
|
||||
|
||||
sead::Vector3f scaled_a1;
|
||||
sead::Vector3f scaled_a2;
|
||||
f32 v13 = v20.dot(mTriangle.getFaceNormal() * _70);
|
||||
f32 v12 = v20.dot(mTriangle.getFaceNormal());
|
||||
f32 v13 = v20.dot(mHitInfo->mTriangle.getFaceNormal() * mHitInfo->_70);
|
||||
f32 v12 = v20.dot(mHitInfo->mTriangle.getFaceNormal());
|
||||
sead::Vector3CalcCommon<f32>::multScalar(scaled_a1, v20, v13);
|
||||
sead::Vector3CalcCommon<f32>::multScalar(scaled_a2, v20, v12);
|
||||
*a1 = scaled_a1;
|
||||
|
|
@ -261,31 +261,31 @@ void SphereHitInfo::calcFixVector(sead::Vector3f* a1, sead::Vector3f* a2) const
|
|||
}
|
||||
|
||||
void SphereHitInfo::calcFixVectorNormal(sead::Vector3f* a1, sead::Vector3f* a2) const {
|
||||
f32 unk = _70;
|
||||
a1->x = mTriangle.getFaceNormal().x * unk;
|
||||
a1->y = mTriangle.getFaceNormal().y * unk;
|
||||
a1->z = mTriangle.getFaceNormal().z * unk;
|
||||
f32 unk = mHitInfo->_70;
|
||||
a1->x = mHitInfo->mTriangle.getFaceNormal().x * unk;
|
||||
a1->y = mHitInfo->mTriangle.getFaceNormal().y * unk;
|
||||
a1->z = mHitInfo->mTriangle.getFaceNormal().z * unk;
|
||||
if (a2)
|
||||
a2->set(mTriangle.getFaceNormal());
|
||||
a2->set(mHitInfo->mTriangle.getFaceNormal());
|
||||
}
|
||||
|
||||
void DiskHitInfo::calcFixVector(sead::Vector3f* a1, sead::Vector3f* a2) const {
|
||||
// TODO add proper names here, once the missing names for _70 and _80 in HitInfo are found
|
||||
if (isCollisionAtFace()) {
|
||||
if (mHitInfo->isCollisionAtFace()) {
|
||||
calcFixVectorNormal(a1, a2);
|
||||
return;
|
||||
}
|
||||
|
||||
sead::Vector3f v20;
|
||||
v20.x = _80.x - mCollisionHitPos.x;
|
||||
v20.y = _80.y - mCollisionHitPos.y;
|
||||
v20.z = _80.z - mCollisionHitPos.z;
|
||||
v20.x = mHitInfo->_80.x - mHitInfo->mCollisionHitPos.x;
|
||||
v20.y = mHitInfo->_80.y - mHitInfo->mCollisionHitPos.y;
|
||||
v20.z = mHitInfo->_80.z - mHitInfo->mCollisionHitPos.z;
|
||||
tryNormalizeOrZero(&v20);
|
||||
|
||||
sead::Vector3f scaled_a1;
|
||||
sead::Vector3f scaled_a2;
|
||||
f32 v13 = v20.dot(mTriangle.getFaceNormal() * _70);
|
||||
f32 v12 = v20.dot(mTriangle.getFaceNormal());
|
||||
f32 v13 = v20.dot(mHitInfo->mTriangle.getFaceNormal() * mHitInfo->_70);
|
||||
f32 v12 = v20.dot(mHitInfo->mTriangle.getFaceNormal());
|
||||
sead::Vector3CalcCommon<f32>::multScalar(scaled_a1, v20, v13);
|
||||
sead::Vector3CalcCommon<f32>::multScalar(scaled_a2, v20, v12);
|
||||
*a1 = scaled_a1;
|
||||
|
|
@ -293,12 +293,12 @@ void DiskHitInfo::calcFixVector(sead::Vector3f* a1, sead::Vector3f* a2) const {
|
|||
}
|
||||
|
||||
void DiskHitInfo::calcFixVectorNormal(sead::Vector3f* a1, sead::Vector3f* a2) const {
|
||||
f32 unk = _70;
|
||||
a1->x = mTriangle.getFaceNormal().x * unk;
|
||||
a1->y = mTriangle.getFaceNormal().y * unk;
|
||||
a1->z = mTriangle.getFaceNormal().z * unk;
|
||||
f32 unk = mHitInfo->_70;
|
||||
a1->x = mHitInfo->mTriangle.getFaceNormal().x * unk;
|
||||
a1->y = mHitInfo->mTriangle.getFaceNormal().y * unk;
|
||||
a1->z = mHitInfo->mTriangle.getFaceNormal().z * unk;
|
||||
if (a2)
|
||||
a2->set(mTriangle.getFaceNormal());
|
||||
a2->set(mHitInfo->mTriangle.getFaceNormal());
|
||||
}
|
||||
|
||||
} // namespace al
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <math/seadMatrix.h>
|
||||
#include <math/seadVector.h>
|
||||
#include <prim/seadStorageFor.h>
|
||||
|
||||
namespace al {
|
||||
class Triangle;
|
||||
|
|
@ -81,6 +82,10 @@ public:
|
|||
bool isCollisionAtCorner() const;
|
||||
const sead::Vector3f& tryGetHitEdgeNormal() const;
|
||||
|
||||
friend class ArrowHitInfo;
|
||||
friend class SphereHitInfo;
|
||||
friend class DiskHitInfo;
|
||||
|
||||
protected:
|
||||
Triangle mTriangle;
|
||||
f32 _70 = 0.0f;
|
||||
|
|
@ -90,18 +95,49 @@ protected:
|
|||
CollisionLocation mCollisionLocation = CollisionLocation::None;
|
||||
};
|
||||
|
||||
class ArrowHitInfo : public HitInfo {};
|
||||
|
||||
class SphereHitInfo : public HitInfo {
|
||||
class ArrowHitInfo {
|
||||
public:
|
||||
void calcFixVector(sead::Vector3f* a1, sead::Vector3f* a2) const;
|
||||
void calcFixVectorNormal(sead::Vector3f* a1, sead::Vector3f* a2) const;
|
||||
HitInfo* operator*() { return mHitInfo.data(); }
|
||||
|
||||
const HitInfo* operator*() const { return mHitInfo.data(); }
|
||||
|
||||
HitInfo& operator->() { return *mHitInfo; }
|
||||
|
||||
const HitInfo& operator->() const { return *mHitInfo; }
|
||||
|
||||
sead::StorageFor<HitInfo> mHitInfo{sead::ZeroInitializeTag{}};
|
||||
};
|
||||
|
||||
class DiskHitInfo : public HitInfo {
|
||||
class SphereHitInfo {
|
||||
public:
|
||||
void calcFixVector(sead::Vector3f* a1, sead::Vector3f* a2) const;
|
||||
void calcFixVectorNormal(sead::Vector3f* a1, sead::Vector3f* a2) const;
|
||||
|
||||
HitInfo* operator*() { return mHitInfo.data(); }
|
||||
|
||||
const HitInfo* operator*() const { return mHitInfo.data(); }
|
||||
|
||||
HitInfo& operator->() { return *mHitInfo; }
|
||||
|
||||
const HitInfo& operator->() const { return *mHitInfo; }
|
||||
|
||||
sead::StorageFor<HitInfo> mHitInfo{sead::ZeroInitializeTag{}};
|
||||
};
|
||||
|
||||
class DiskHitInfo {
|
||||
public:
|
||||
void calcFixVector(sead::Vector3f* a1, sead::Vector3f* a2) const;
|
||||
void calcFixVectorNormal(sead::Vector3f* a1, sead::Vector3f* a2) const;
|
||||
|
||||
HitInfo* operator*() { return mHitInfo.data(); }
|
||||
|
||||
const HitInfo* operator*() const { return mHitInfo.data(); }
|
||||
|
||||
HitInfo& operator->() { return *mHitInfo; }
|
||||
|
||||
const HitInfo& operator->() const { return *mHitInfo; }
|
||||
|
||||
sead::StorageFor<HitInfo> mHitInfo{sead::ZeroInitializeTag{}};
|
||||
};
|
||||
|
||||
} // namespace al
|
||||
|
|
|
|||
61
src/Player/CollidedShapeResult.cpp
Normal file
61
src/Player/CollidedShapeResult.cpp
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
#include "Player/CollidedShapeResult.h"
|
||||
|
||||
#include "Util/CollisionShapeFunction.h"
|
||||
|
||||
CollidedShapeResult::CollidedShapeResult(const CollisionShapeInfoBase* shapeInfo)
|
||||
: mShapeInfo(shapeInfo) {}
|
||||
|
||||
void CollidedShapeResult::setArrowHitInfo(const al::ArrowHitInfo& arrowHitInfo) {
|
||||
*mArrowHitInfo.mHitInfo = *arrowHitInfo.mHitInfo;
|
||||
}
|
||||
|
||||
void CollidedShapeResult::setSphereHitInfo(const al::SphereHitInfo& sphereHitInfo) {
|
||||
*mSphereHitInfo.mHitInfo = *sphereHitInfo.mHitInfo;
|
||||
}
|
||||
|
||||
void CollidedShapeResult::setDiskHitInfo(const al::DiskHitInfo& diskHitInfo) {
|
||||
*mDiskHitInfo.mHitInfo = *diskHitInfo.mHitInfo;
|
||||
}
|
||||
|
||||
bool CollidedShapeResult::isArrow() const {
|
||||
return CollisionShapeFunction::isShapeArrow(mShapeInfo);
|
||||
}
|
||||
|
||||
bool CollidedShapeResult::isSphere() const {
|
||||
return CollisionShapeFunction::isShapeSphere(mShapeInfo);
|
||||
}
|
||||
|
||||
bool CollidedShapeResult::isDisk() const {
|
||||
return CollisionShapeFunction::isShapeDisk(mShapeInfo);
|
||||
}
|
||||
|
||||
const al::ArrowHitInfo& CollidedShapeResult::getArrowHitInfo() const {
|
||||
return mArrowHitInfo;
|
||||
}
|
||||
|
||||
const al::SphereHitInfo& CollidedShapeResult::getSphereHitInfo() const {
|
||||
return mSphereHitInfo;
|
||||
}
|
||||
|
||||
const al::DiskHitInfo& CollidedShapeResult::getDiskHitInfo() const {
|
||||
return mDiskHitInfo;
|
||||
}
|
||||
|
||||
const CollisionShapeInfoArrow* CollidedShapeResult::getShapeInfoArrow() const {
|
||||
return CollisionShapeFunction::getShapeInfoArrow(mShapeInfo);
|
||||
}
|
||||
|
||||
const CollisionShapeInfoSphere* CollidedShapeResult::getShapeInfoSphere() const {
|
||||
return CollisionShapeFunction::getShapeInfoSphere(mShapeInfo);
|
||||
}
|
||||
|
||||
const CollisionShapeInfoDisk* CollidedShapeResult::getShapeInfoDisk() const {
|
||||
return CollisionShapeFunction::getShapeInfoDisk(mShapeInfo);
|
||||
}
|
||||
|
||||
void CollidedShapeResult::operator=(const CollidedShapeResult& other) {
|
||||
mShapeInfo = other.mShapeInfo;
|
||||
setArrowHitInfo(other.mArrowHitInfo);
|
||||
setSphereHitInfo(other.mSphereHitInfo);
|
||||
setDiskHitInfo(other.mDiskHitInfo);
|
||||
}
|
||||
41
src/Player/CollidedShapeResult.h
Normal file
41
src/Player/CollidedShapeResult.h
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
#pragma once
|
||||
|
||||
#include <prim/seadStorageFor.h>
|
||||
|
||||
#include "Library/Collision/CollisionPartsTriangle.h"
|
||||
|
||||
class CollisionShapeInfoBase;
|
||||
class CollisionShapeInfoArrow;
|
||||
class CollisionShapeInfoSphere;
|
||||
class CollisionShapeInfoDisk;
|
||||
|
||||
class CollidedShapeResult {
|
||||
public:
|
||||
CollidedShapeResult(const CollisionShapeInfoBase* shapeInfo);
|
||||
|
||||
void setArrowHitInfo(const al::ArrowHitInfo& arrowHitInfo);
|
||||
void setSphereHitInfo(const al::SphereHitInfo& sphereHitInfo);
|
||||
void setDiskHitInfo(const al::DiskHitInfo& diskHitInfo);
|
||||
|
||||
bool isArrow() const;
|
||||
bool isSphere() const;
|
||||
bool isDisk() const;
|
||||
|
||||
const al::ArrowHitInfo& getArrowHitInfo() const;
|
||||
const al::SphereHitInfo& getSphereHitInfo() const;
|
||||
const al::DiskHitInfo& getDiskHitInfo() const;
|
||||
|
||||
const CollisionShapeInfoArrow* getShapeInfoArrow() const;
|
||||
const CollisionShapeInfoSphere* getShapeInfoSphere() const;
|
||||
const CollisionShapeInfoDisk* getShapeInfoDisk() const;
|
||||
|
||||
void operator=(const CollidedShapeResult& other);
|
||||
|
||||
private:
|
||||
const CollisionShapeInfoBase* mShapeInfo;
|
||||
al::ArrowHitInfo mArrowHitInfo;
|
||||
al::SphereHitInfo mSphereHitInfo;
|
||||
al::DiskHitInfo mDiskHitInfo;
|
||||
};
|
||||
|
||||
static_assert(sizeof(CollidedShapeResult) == 0x1e8);
|
||||
|
|
@ -307,7 +307,7 @@ def common_string_finder(c, path):
|
|||
def common_const_reference(c, path):
|
||||
for line in c.splitlines():
|
||||
if "& " in line and line[line.find("& ") - 1] != "&" and line[line.find("& ") - 1] != " " and "CLASS&" not in line:
|
||||
if ("const" not in line or line.find("& ") < line.find("const ")) and ("for" not in line or " : " not in line):
|
||||
if ("const" not in line or line.find("& ") < line.find("const ")) and ("for" not in line or " : " not in line) and ("operator->" not in line):
|
||||
FAIL("References must be const!", line, path)
|
||||
|
||||
def common_self_other(c, path, is_header):
|
||||
|
|
|
|||
Loading…
Reference in a new issue