Player: Implement CollidedShapeResult (#406)

This commit is contained in:
MonsterDruide1 2025-03-06 16:32:21 +01:00 committed by GitHub
parent a077fe767f
commit cff7a46c67
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 181 additions and 43 deletions

View file

@ -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.

View file

@ -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

View file

@ -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

View 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);
}

View 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);

View file

@ -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):