Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions config/G2ME01/splits.txt
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,10 @@ MetroidPrime/Player/CPlayerOrbit.cpp:
.text start:0x8011C3A8 end:0x80123510
.ctors start:0x803A5524 end:0x803A5528

MetroidPrime/CGameCollision.cpp:
.text start:0x80123510 end:0x801285DC
.ctors start:0x803A5528 end:0x803A552C

MetroidPrime/CGroundMovement.cpp:
.text start:0x8012878C end:0x8012CA24
.sdata start:0x80418328 end:0x80418338
Expand Down
82 changes: 41 additions & 41 deletions config/G2ME01/symbols.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4953,57 +4953,57 @@ ValidateCurrentOrbitTargetId__7CPlayerFR13CStateManager = .text:0x80122E7C; // t
ValidateOrbitTargetIdAndPointer__7CPlayerCF9TUniqueIdRC13CStateManager = .text:0x801232E0; // type:function size:0x54
fn_80123334 = .text:0x80123334; // type:function size:0x68
fn_8012339C = .text:0x8012339C; // type:function size:0x174 align:4
fn_80123510 = .text:0x80123510; // type:function size:0x664 align:4
fn_80123B74 = .text:0x80123B74; // type:function size:0xD8
fn_80123C4C = .text:0x80123C4C; // type:function size:0x5A8
fn_801241F4 = .text:0x801241F4; // type:function size:0x5E0 align:4
PushActorAwayFromWalls__14CGameCollisionFR13CStateManagerR13CPhysicsActorffffif = .text:0x80123510; // type:function size:0x664 align:4
GetActorRelativeVelocities__14CGameCollisionFPC13CPhysicsActorPC13CPhysicsActor = .text:0x80123B74; // type:function size:0xD8
FindNonIntersectingVector__14CGameCollisionFRC13CStateManagerR13CPhysicsActorRC19CCollisionPrimitiveRCQ24rstl27optional_object<9CVector3f> = .text:0x80123C4C; // type:function size:0x5A8
CollisionFailsafe__14CGameCollisionFRC13CStateManagerR19CAreaCollisionCacheR13CPhysicsActorRC19CCollisionPrimitiveRCQ24rstl32reserved_vector<9TUniqueId,1024>fUif = .text:0x801241F4; // type:function size:0x5E0 align:4
fn_801247D4 = .text:0x801247D4; // type:function size:0x24
fn_801247F8 = .text:0x801247F8; // type:function size:0x138
MovePlayer__14CGameCollisionFR13CStateManagerR13CPhysicsActorfPCQ24rstl32reserved_vector<9TUniqueId,1024> = .text:0x801247F8; // type:function size:0x138
Move__14CGameCollisionFR13CStateManagerR13CPhysicsActorfPCQ24rstl32reserved_vector<9TUniqueId,1024> = .text:0x80124930; // type:function size:0x1F4
fn_80124B24 = .text:0x80124B24; // type:function size:0x1EC
fn_80124D10 = .text:0x80124D10; // type:function size:0x4A0
fn_801251B0 = .text:0x801251B0; // type:function size:0xD8
CollideWithStaticBodyNoRot__14CGameCollisionFR13CPhysicsActorRC13CMaterialListRC13CMaterialListRC13CUnitVector3ffb = .text:0x80124B24; // type:function size:0x1EC
CollideWithDynamicBodyNoRot__14CGameCollisionFR13CPhysicsActorR13CPhysicsActorRC14CCollisionInfofb = .text:0x80124D10; // type:function size:0x4A0
ResolveCollisions__14CGameCollisionFR13CPhysicsActorP13CPhysicsActorRC18CCollisionInfoList = .text:0x801251B0; // type:function size:0xD8
fn_80125288 = .text:0x80125288; // type:function size:0xC4
fn_8012534C = .text:0x8012534C; // type:function size:0x120
GetMinExtentForCollisionPrimitive__14CGameCollisionFRC19CCollisionPrimitive = .text:0x8012534C; // type:function size:0x120
CanBlock__14CGameCollisionFRC13CMaterialListRC9CVector3f = .text:0x8012546C; // type:function size:0xC0
IsFloor__14CGameCollisionFRC13CMaterialListRC9CVector3f = .text:0x8012552C; // type:function size:0x48
fn_80125574 = .text:0x80125574; // type:function size:0x18
fn_8012558C = .text:0x8012558C; // type:function size:0x24
fn_801255B0 = .text:0x801255B0; // type:function size:0x8
fn_801255B8 = .text:0x801255B8; // type:function size:0x4
fn_801255BC = .text:0x801255BC; // type:function size:0x60
fn_8012561C = .text:0x8012561C; // type:function size:0x2D0
CollisionImpulseFiniteVsInfinite__Ffff = .text:0x80125574; // type:function size:0x18
CollisionImpulseFiniteVsFinite__Fffff = .text:0x8012558C; // type:function size:0x24
GetCoefficientOfRestitution__14CGameCollisionFRC14CCollisionInfo = .text:0x801255B0; // type:function size:0x8
ShowCollisionResults__14CGameCollisionFR18CCollisionInfoListRC6CColor = .text:0x801255B8; // type:function size:0x4
SendMaterialMessage__14CGameCollisionFR13CStateManagerRC13CMaterialListR6CActor = .text:0x801255BC; // type:function size:0x60
SendScriptMessages__14CGameCollisionFR13CStateManagerR6CActorP6CActorRC18CCollisionInfoList = .text:0x8012561C; // type:function size:0x2D0
MakeCollisionCallbacks__14CGameCollisionFR13CStateManagerR13CPhysicsActorRC9TUniqueIdRC18CCollisionInfoList = .text:0x801258EC; // type:function size:0x104
fn_801259F0 = .text:0x801259F0; // type:function size:0x5E8
fn_80125FD8 = .text:0x80125FD8; // type:function size:0x2B4
fn_8012628C = .text:0x8012628C; // type:function size:0x32C
fn_801265B8 = .text:0x801265B8; // type:function size:0x2AC align:4
fn_80126864 = .text:0x80126864; // type:function size:0x318
fn_80126B7C = .text:0x80126B7C; // type:function size:0x88
fn_80126C04 = .text:0x80126C04; // type:function size:0xB8
fn_80126CBC = .text:0x80126CBC; // type:function size:0xD0
fn_80126D8C = .text:0x80126D8C; // type:function size:0x98
fn_80126E24 = .text:0x80126E24; // type:function size:0xC0
fn_80126EE4 = .text:0x80126EE4; // type:function size:0x1A4
fn_80127088 = .text:0x80127088; // type:function size:0xC8
fn_80127150 = .text:0x80127150; // type:function size:0xC8
DetectStaticCollision_Cached_Moving__14CGameCollisionFRC13CStateManagerR19CAreaCollisionCacheRC19CCollisionPrimitiveRC12CTransform4fRC15CMaterialFilterRC9CVector3fR14CCollisionInfoRd = .text:0x801259F0; // type:function size:0x5E8
DetectStaticCollisionBoolean__14CGameCollisionFRC13CStateManagerRC19CCollisionPrimitiveRC12CTransform4fRC15CMaterialFilter = .text:0x80125FD8; // type:function size:0x2B4
DetectStaticCollisionBoolean_Cached__14CGameCollisionFRC13CStateManagerR19CAreaCollisionCacheRC19CCollisionPrimitiveRC12CTransform4fRC15CMaterialFilter = .text:0x8012628C; // type:function size:0x32C
DetectStaticCollision__14CGameCollisionFRC13CStateManagerRC19CCollisionPrimitiveRC12CTransform4fRC15CMaterialFilterR18CCollisionInfoList = .text:0x801265B8; // type:function size:0x2AC align:4
DetectStaticCollision_Cached__14CGameCollisionFRC13CStateManagerR19CAreaCollisionCacheRC19CCollisionPrimitiveRC12CTransform4fRC15CMaterialFilterR18CCollisionInfoList = .text:0x80126864; // type:function size:0x318
CollideCachedAABox__FRC19CAreaCollisionCacheRC6CAABoxRC15CMaterialFilterR18CCollisionInfoListRC19CCollisionPrimitive = .text:0x80126B7C; // type:function size:0x88
DetectDynamicCollision__14CGameCollisionFRC19CCollisionPrimitiveRC12CTransform4fRCQ24rstl32reserved_vector<9TUniqueId,1024>R9TUniqueIdR18CCollisionInfoListRC13CStateManager = .text:0x80126C04; // type:function size:0xB8
DetectDynamicCollision__14CGameCollisionFRC19CCollisionPrimitiveRC12CTransform4fRC13CPhysicsActorR18CCollisionInfoList = .text:0x80126CBC; // type:function size:0xD0
DetectDynamicCollisionBoolean__14CGameCollisionFRC19CCollisionPrimitiveRC12CTransform4fRCQ24rstl32reserved_vector<9TUniqueId,1024>RC13CStateManager = .text:0x80126D8C; // type:function size:0x98
DetectDynamicCollisionBoolean__14CGameCollisionFRC19CCollisionPrimitiveRC12CTransform4fRC13CPhysicsActor = .text:0x80126E24; // type:function size:0xC0
DetectDynamicCollisionMoving__14CGameCollisionFRC19CCollisionPrimitiveRC12CTransform4fRCQ24rstl32reserved_vector<9TUniqueId,1024>RC9CVector3fR9TUniqueIdR14CCollisionInfoRdRC13CStateManager = .text:0x80126EE4; // type:function size:0x1A4
DetectDynamicCollisionMoving__14CGameCollisionFRC19CCollisionPrimitiveRC12CTransform4fRC13CPhysicsActorRC9CVector3fR14CCollisionInfoRd = .text:0x80127088; // type:function size:0xC8
DetectCollision_Cached_Moving__14CGameCollisionFRC13CStateManagerR19CAreaCollisionCacheRC19CCollisionPrimitiveRC12CTransform4fRC15CMaterialFilterRCQ24rstl32reserved_vector<9TUniqueId,1024>RC9CVector3fR9TUniqueIdR14CCollisionInfoRd = .text:0x80127150; // type:function size:0xC8
DetectCollision_Cached__14CGameCollisionFRC13CStateManagerR19CAreaCollisionCacheRC19CCollisionPrimitiveRC12CTransform4fRC15CMaterialFilterRCQ24rstl32reserved_vector<9TUniqueId,1024>R9TUniqueIdR18CCollisionInfoList = .text:0x80127218; // type:function size:0xC0 align:4
DetectCollisionBoolean_Cached__14CGameCollisionFRC13CStateManagerR19CAreaCollisionCacheRC19CCollisionPrimitiveRC12CTransform4fRC15CMaterialFilterRCQ24rstl32reserved_vector<9TUniqueId,1024> = .text:0x801272D8; // type:function size:0xB0
fn_80127388 = .text:0x80127388; // type:function size:0xB0
fn_80127438 = .text:0x80127438; // type:function size:0x104
DetectCollisionBoolean__14CGameCollisionFRC13CStateManagerRC19CCollisionPrimitiveRC12CTransform4fRC15CMaterialFilterRCQ24rstl32reserved_vector<9TUniqueId,1024> = .text:0x80127388; // type:function size:0xB0
BuildAreaCollisionCache__14CGameCollisionFRC13CStateManagerR19CAreaCollisionCache = .text:0x80127438; // type:function size:0x104
fn_8012753C = .text:0x8012753C; // type:function size:0x48
fn_80127584 = .text:0x80127584; // type:function size:0x288
fn_8012780C = .text:0x8012780C; // type:function size:0x118 align:4
fn_80127924 = .text:0x80127924; // type:function size:0x134
fn_80127A58 = .text:0x80127A58; // type:function size:0x15C
fn_80127BB4 = .text:0x80127BB4; // type:function size:0x1C4
fn_80127D78 = .text:0x80127D78; // type:function size:0x104
fn_80127E7C = .text:0x80127E7C; // type:function size:0x8 align:4
fn_80127E84 = .text:0x80127E84; // type:function size:0x8 align:4
fn_80127E8C = .text:0x80127E8C; // type:function size:0x8 align:4
fn_80127E94 = .text:0x80127E94; // type:function size:0x16C
RayStaticIntersection__14CGameCollisionFRC13CStateManagerRC9CVector3fRC9CVector3ffRC15CMaterialFilter = .text:0x80127584; // type:function size:0x288
RayStaticLineOfSightTest__14CGameCollisionFRC9CGameAreaRC9CVector3fRC9CVector3ffRC15CMaterialFilter = .text:0x8012780C; // type:function size:0x118 align:4
RayStaticLineOfSightTest__14CGameCollisionFRC13CStateManagerRC9CVector3fRC9CVector3ffRC15CMaterialFilter = .text:0x80127924; // type:function size:0x134
RayDynamicLineOfSightTest__14CGameCollisionFRC13CStateManagerRC9CVector3fRC9CVector3ffRC15CMaterialFilterRCQ24rstl32reserved_vector<9TUniqueId,1024>PC6CActor = .text:0x80127A58; // type:function size:0x15C
RayDynamicIntersection__14CGameCollisionFRC13CStateManagerR9TUniqueIdRC9CVector3fRC9CVector3ffRC15CMaterialFilterRCQ24rstl32reserved_vector<9TUniqueId,1024> = .text:0x80127BB4; // type:function size:0x1C4
RayWorldIntersection__14CGameCollisionFRC13CStateManagerR9TUniqueIdRC9CVector3fRC9CVector3ffRC15CMaterialFilterRCQ24rstl32reserved_vector<9TUniqueId,1024> = .text:0x80127D78; // type:function size:0x104
NullBooleanCollider__14CGameCollisionFRC27CInternalCollisionStructure = .text:0x80127E7C; // type:function size:0x8 align:4
NullMovingCollider__14CGameCollisionFRC27CInternalCollisionStructureRC9CVector3fRdR14CCollisionInfo = .text:0x80127E84; // type:function size:0x8 align:4
NullCollisionCollider__14CGameCollisionFRC27CInternalCollisionStructureR18CCollisionInfoList = .text:0x80127E8C; // type:function size:0x8 align:4
UninitializeCollision__14CGameCollisionFv = .text:0x80127E94; // type:function size:0x16C
fn_80128000 = .text:0x80128000; // type:function size:0xC8
fn_801280C8 = .text:0x801280C8; // type:function size:0x418
InitCollision__14CGameCollisionFP13CStateManager = .text:0x801280C8; // type:function size:0x418
fn_801284E0 = .text:0x801284E0; // type:function size:0xFC align:4
fn_801285DC = .text:0x801285DC; // type:function size:0x28 align:4
fn_80128604 = .text:0x80128604; // type:function size:0x28 align:4
Expand Down
1 change: 1 addition & 0 deletions configure.py
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,7 @@ def MatchingFor(*versions):
Object(NonMatching, "MetroidPrime/CModelData.cpp"),
Object(NonMatching, "MetroidPrime/CActorLights.cpp"),
Object(NonMatching, "MetroidPrime/CGroundMovement.cpp"),
Object(NonMatching, "MetroidPrime/CGameCollision.cpp"),
Object(NonMatching, "MetroidPrime/Enemies/CAi.cpp"),
Object(NonMatching, "MetroidPrime/Enemies/CKnockBackMgr.cpp"),
Object(NonMatching, "MetroidPrime/Enemies/CPatterned.cpp"),
Expand Down
1 change: 1 addition & 0 deletions include/Collision/CCollidableAABox.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class CCollidableAABox : public CCollisionPrimitive {
CAABox CalculateAABox(const CTransform4f&) const;
CAABox CalculateLocalAABox() const;
CAABox Transform(const CTransform4f& xf) const;
const CAABox& GetBox() const { return mAabb; }
FourCC GetPrimType() const;
CRayCastResult CastRayInternal(const CInternalRayCastStructure&) const;

Expand Down
19 changes: 19 additions & 0 deletions include/Collision/CCollidableAABoxSphere.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#ifndef _CCOLLIDABLEAABOXSPHERE
#define _CCOLLIDABLEAABOXSPHERE

#include "Collision/CCollidableAABox.hpp"
#include "Collision/CCollidableSphere.hpp"

// Guessed name, correlated with Prime's ABSH compound primitive.
class CCollidableAABoxSphere : public CCollisionPrimitive {
public:
const CCollidableAABox& GetCollidableAABox() const { return mAabb; }
const CCollidableSphere& GetCollidableSphere() const { return mSphere; }

private:
CCollidableAABox mAabb;
CCollidableSphere mSphere;
};
CHECK_SIZEOF(CCollidableAABoxSphere, 0x58)

#endif // _CCOLLIDABLEAABOXSPHERE
10 changes: 10 additions & 0 deletions include/Collision/CCollisionPrimitive.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include "types.h"

#include "Collision/CMaterialList.hpp"
#include "Collision/CInternalCollisionStructure.hpp"

#include "Kyoto/IObjectStore.hpp"
#include "Kyoto/Math/CAABox.hpp"
Expand Down Expand Up @@ -55,6 +56,15 @@ class CCollisionPrimitive {
static void InitEndTypes();
static void Uninitialize();

static bool Collide(const CInternalCollisionStructure::CPrimDesc& left,
const CInternalCollisionStructure::CPrimDesc& right,
CCollisionInfoList& collisions);
static bool CollideBoolean(const CInternalCollisionStructure::CPrimDesc& left,
const CInternalCollisionStructure::CPrimDesc& right);
static bool CollideMoving(const CInternalCollisionStructure::CPrimDesc& left,
const CInternalCollisionStructure::CPrimDesc& right,
const CVector3f& direction, double& distance, CCollisionInfo& collision);

private:
static int sNumTypes;
static bool sInitComplete;
Expand Down
40 changes: 40 additions & 0 deletions include/Collision/CInternalCollisionStructure.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#ifndef _CINTERNALCOLLISIONSTRUCTURE
#define _CINTERNALCOLLISIONSTRUCTURE

#include "Kyoto/Math/CTransform4f.hpp"

class CCollisionPrimitive;
class CMaterialFilter;

class CInternalCollisionStructure {
public:
class CPrimDesc {
public:
CPrimDesc(const CCollisionPrimitive& primitive, const CMaterialFilter& filter,
const CTransform4f& transform)
: mPrimitive(primitive), mFilter(filter), mTransform(transform) {}

const CCollisionPrimitive& GetPrim() const { return mPrimitive; }
const CMaterialFilter& GetFilter() const { return mFilter; }
const CTransform4f& GetTransform() const { return mTransform; }

private:
const CCollisionPrimitive& mPrimitive;
const CMaterialFilter& mFilter;
CTransform4f mTransform;
};

CInternalCollisionStructure(const CPrimDesc& left, const CPrimDesc& right)
: mLeft(left), mRight(right) {}

const CPrimDesc& GetLeft() const { return mLeft; }
const CPrimDesc& GetRight() const { return mRight; }

private:
CPrimDesc mLeft;
CPrimDesc mRight;
};
NESTED_CHECK_SIZEOF(CInternalCollisionStructure, CPrimDesc, 0x38)
CHECK_SIZEOF(CInternalCollisionStructure, 0x70)

#endif // _CINTERNALCOLLISIONSTRUCTURE
4 changes: 4 additions & 0 deletions include/Collision/CInternalRayCastStructure.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ class CMaterialFilter;

class CInternalRayCastStructure {
public:
CInternalRayCastStructure(const CVector3f& start, const CVector3f& direction, float length,
const CTransform4f& transform, const CMaterialFilter& filter)
: mRay(start, direction, length), mMaxTime(length), mTransform(transform), mFilter(filter) {}

const CMRay& GetRay() const { return mRay; }
float GetMaxTime() const { return mMaxTime; }
const CTransform4f& GetTransform() const { return mTransform; }
Expand Down
27 changes: 27 additions & 0 deletions include/Collision/CMaterialFilter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ class CMaterialFilter {
kFT_Include,
kFT_Exclude,
kFT_IncludeExclude,
kFT_Never, // Guessed name.
};

CMaterialFilter() : include(0x00000000FFFFFFFF), exclude(0), type(kFT_Always) {}
Expand All @@ -36,6 +37,32 @@ class CMaterialFilter {
bool Passes(const CMaterialList& other) const;
const CMaterialList& GetIncludeList() const { return include; }
const CMaterialList& GetExcludeList() const { return exclude; }
EFilterType GetType() const { return type; }

// Guessed name; simplify the filter for geometry carrying these fixed materials.
CMaterialFilter WithImplicitMaterials(const CMaterialList& materials) const {
switch (type) {
case kFT_Always:
case kFT_Never:
return *this;
case kFT_Include:
return include.SharesMaterials(materials) ? GetPassEverything() : *this;
case kFT_Exclude:
if (exclude.SharesMaterials(materials)) {
return CMaterialFilter(CMaterialList(), CMaterialList(0x00000000FFFFFFFF), kFT_Never);
}
return *this;
case kFT_IncludeExclude:
if (include.SharesMaterials(materials)) {
return CMaterialFilter(CMaterialList(0x00000000FFFFFFFF), exclude, kFT_Exclude);
}
if (exclude.SharesMaterials(materials)) {
return CMaterialFilter(CMaterialList(), CMaterialList(0x00000000FFFFFFFF), kFT_Never);
}
return *this;
}
return GetPassEverything();
}

private:
CMaterialList include;
Expand Down
Loading
Loading