Match and link InternalColliders

Former-commit-id: 9a6b212fb1
This commit is contained in:
Phillip Stephens 2023-10-19 21:15:38 -07:00
parent 12e5a2c300
commit 3cb651ad95
14 changed files with 149 additions and 22 deletions

View File

@ -11749,9 +11749,9 @@ reserve__Q24rstl42vector<6CAABox,Q24rstl17rmemory_allocator>Fi = .text:0x802AE2C
GetEntityIdByIndex__11CPVSAreaSetCFUi = .text:0x802AE3E4; // type:function size:0x10 scope:global
GetLightSet__11CPVSAreaSetCFi = .text:0x802AE3F4; // type:function size:0x90 scope:global
GetVisOctree__11CPVSAreaSetCFUi = .text:0x802AE484; // type:function size:0x8 scope:global
__ct__11CPVSAreaSetFPCci = .text:0x802AE48C; // type:function size:0x11C scope:global
__ct__Q211CPVSAreaSet14CPVSAreaHolderFiiiiiiii = .text:0x802AE5A8; // type:function size:0x88 scope:global
__ct__13CPVSVisOctreeFR13CPVSVisOctree = .text:0x802AE630; // type:function size:0x94 scope:global
MakeAreaSet__11CPVSAreaSetFPCci = .text:0x802AE48C; // type:function size:0x11C scope:global
__ct__11CPVSAreaSetFiiiiiiPCcPCcPCc = .text:0x802AE5A8; // type:function size:0x88 scope:global
__ct__13CPVSVisOctreeFRC13CPVSVisOctree = .text:0x802AE630; // type:function size:0x94 scope:global
TestBit__13CCubeRendererFPCUii = .text:0x802AE6C4; // type:function size:0x2C scope:global
RecursiveBuildOverlaps__18CAreaRenderOctTreeFPUiRC18CAreaRenderOctTreeRC6CAABoxRC6CAABox = .text:0x802AE6F0; // type:function size:0x128 scope:global
FindOverlappingModels__18CAreaRenderOctTreeFPUiRC6CAABox = .text:0x802AE818; // type:function size:0x3C scope:global
@ -14708,10 +14708,10 @@ SetIconAddr__8CARDStatFi = .text:0x8034E538; // type:function size:0x8 scope:glo
SetIconSpeed__8CARDStatFii = .text:0x8034E540; // type:function size:0x24 scope:global
SetIconFormat__8CARDStatFii = .text:0x8034E564; // type:function size:0x24 scope:global
SetBannerFormat__8CARDStatFi = .text:0x8034E588; // type:function size:0x14 scope:global
GetCommentAddr__8CardStatCFv = .text:0x8034E59C; // type:function size:0x8 scope:global
GetCommentAddr__8CARDStatCFv = .text:0x8034E59C; // type:function size:0x8 scope:global
GetIconFormat__8CARDStatFi = .text:0x8034E5A4; // type:function size:0x14 scope:global
GetBannerFormat__8CARDStatFv = .text:0x8034E5B8; // type:function size:0xC scope:global
GetTime__8CardStatCFv = .text:0x8034E5C4; // type:function size:0x8 scope:global
GetTime__8CARDStatCFv = .text:0x8034E5C4; // type:function size:0x8 scope:global
GetFileLength__8CARDStatFv = .text:0x8034E5CC; // type:function size:0x8 scope:global
CalculateBannerDataSize__13CCardFileInfoFv = .text:0x8034E5D4; // type:function size:0x84 scope:global
CalculateTotalDataSize__13CCardFileInfoFv = .text:0x8034E658; // type:function size:0x38 scope:global

View File

@ -11762,9 +11762,9 @@ reserve__Q24rstl42vector<6CAABox,Q24rstl17rmemory_allocator>Fi = .text:0x802AE37
GetEntityIdByIndex__11CPVSAreaSetCFUi = .text:0x802AE490; // type:function size:0x10 scope:global
GetLightSet__11CPVSAreaSetCFi = .text:0x802AE4A0; // type:function size:0x90 scope:global
GetVisOctree__11CPVSAreaSetCFUi = .text:0x802AE530; // type:function size:0x8 scope:global
__ct__11CPVSAreaSetFPCci = .text:0x802AE538; // type:function size:0x11C scope:global
MakeAreaSet__11CPVSAreaSetFPCci = .text:0x802AE538; // type:function size:0x11C scope:global
__ct__Q211CPVSAreaSet14CPVSAreaHolderFiiiiiiii = .text:0x802AE654; // type:function size:0x88 scope:global
__ct__13CPVSVisOctreeFR13CPVSVisOctree = .text:0x802AE6DC; // type:function size:0x94 scope:global
__ct__11CPVSAreaSetFiiiiiiPCcPCcPCc = .text:0x802AE6DC; // type:function size:0x94 scope:global
TestBit__13CCubeRendererFPCUii = .text:0x802AE770; // type:function size:0x2C scope:global
RecursiveBuildOverlaps__18CAreaRenderOctTreeFPUiRC18CAreaRenderOctTreeRC6CAABoxRC6CAABox = .text:0x802AE79C; // type:function size:0x128 scope:global
FindOverlappingModels__18CAreaRenderOctTreeFPUiRC6CAABox = .text:0x802AE8C4; // type:function size:0x3C scope:global

View File

@ -727,7 +727,7 @@ config.libs = [
Object(NonMatching, "Collision/CCollidableAABox.cpp"),
Object(Matching, "Collision/CCollidableCollisionSurface.cpp"),
Object(Matching, "Collision/CCollisionInfo.cpp"),
Object(NonMatching, "Collision/InternalColliders.cpp"),
Object(Matching, "Collision/InternalColliders.cpp"),
Object(NonMatching, "Collision/CCollisionPrimitive.cpp"),
Object(Matching, "Collision/CMaterialList.cpp"),
Object(NonMatching, "Collision/CollisionUtil.cpp"),

View File

@ -11,10 +11,10 @@ public:
CCollidableAABox(const CAABox& box, const CMaterialList& matList)
: CCollisionPrimitive(matList), x10_aabb(box) {}
bool CollideMovingAABox(const CInternalCollisionStructure& collision, const CVector3f& dir,
double& dOut, CCollisionInfo& infoOut);
bool CollideMovingSphere(const CInternalCollisionStructure& collision, const CVector3f& dir,
double& dOut, CCollisionInfo& infoOut);
static bool CollideMovingAABox(const CInternalCollisionStructure& collision, const CVector3f& dir,
double& dOut, CCollisionInfo& infoOut);
static bool CollideMovingSphere(const CInternalCollisionStructure& collision,
const CVector3f& dir, double& dOut, CCollisionInfo& infoOut);
uint GetTableIndex() const;
CAABox CalculateAABox(const CTransform4f&) const;
@ -36,5 +36,6 @@ CHECK_SIZEOF(CCollidableAABox, 0x28)
namespace Collide {
bool AABox_AABox_Bool(const CInternalCollisionStructure&);
bool AABox_AABox(const CInternalCollisionStructure& collision, CCollisionInfoList& list);
bool Sphere_AABox(const CInternalCollisionStructure& collision, CCollisionInfoList& list);
} // namespace Collide
#endif // _CCOLLIDABLEAABOX

View File

@ -11,6 +11,11 @@ class CCollidableSphere : public CCollisionPrimitive {
public:
CCollidableSphere(const CSphere& sphere, const CMaterialList& material)
: CCollisionPrimitive(material), x10_sphere(sphere) {}
static bool CollideMovingAABox(const CInternalCollisionStructure& collision, const CVector3f& dir,
double& dOut, CCollisionInfo& infoOut);
static bool CollideMovingSphere(const CInternalCollisionStructure& collision,
const CVector3f& dir, double& dOut, CCollisionInfo& infoOut);
uint GetTableIndex() const override;
CAABox CalculateAABox(const CTransform4f&) const override;
@ -19,9 +24,17 @@ public:
~CCollidableSphere() override {}
CRayCastResult CastRayInternal(const CInternalRayCastStructure&) const;
static Type GetType();
private:
CSphere x10_sphere;
};
CHECK_SIZEOF(CCollidableSphere, 0x20)
namespace Collide {
bool Sphere_Sphere(const CInternalCollisionStructure& collision, CCollisionInfoList& list);
bool Sphere_AABox_Bool(const CInternalCollisionStructure& collision);
bool Sphere_Sphere_Bool(const CInternalCollisionStructure& collision);
} // namespace Collide
#endif // _CCOLLIDABLESPHERE

View File

@ -38,6 +38,10 @@ public:
const char* mInfo;
};
class Comparison {
};
CCollisionPrimitive(const CMaterialList& list);
virtual uint GetTableIndex() const = 0;
@ -52,6 +56,12 @@ public:
static void InitBeginTypes();
static void InitAddType(const Type& type);
static void InitEndTypes();
static void InitBeginColliders();
static void InitAddCollider(const Comparison& comp);
static void InitAddCollider(ComparisonFunc comp, const char*, const char*);
static void InitAddBooleanCollider(BooleanComparisonFunc comp, const char*, const char*);
static void InitAddMovingCollider(MovingComparisonFunc comp, const char*, const char*);
static void InitEndColliders();
static void Uninitialize();
private:

View File

@ -2,4 +2,5 @@
namespace InternalColliders {
void AddTypes();
void AddColliders();
}

View File

@ -10,6 +10,8 @@ public:
int IterateSearch(uchar a, const CVector3f& pos) const;
uint GetNumChildren(uchar a) const;
static CPVSVisOctree MakePVSVisOctree(const char* data, int len);
private:
CAABox mBounds;
uint mNumObjects;

View File

@ -45,6 +45,7 @@ public:
short ReadInt16() { return Get< short >(); }
uint GetBlockOffset() const { return x4_blockOffset; }
const uint GetReadPosition() const { return x18_readPosition; }
private:
bool GrabAnotherBlock();

View File

@ -1,11 +1,32 @@
#ifndef _CPVSAREASET
#define _CPVSAREASET
#include "Kyoto/PVS/CPVSVisOctree.hpp"
class CPVSVisSet;
class CInputStream;
class CPVSAreaSet {
public:
CPVSAreaSet(const int, const int, const int, const int, const int, const int, const char*,
const char*, const char*);
const CPVSVisOctree& GetOctree() const { return x20_octree; }
static rstl::auto_ptr< CPVSAreaSet > MakeAreaSet(const char* data, int len);
CPVSVisSet GetLightSet(int) const;
const CPVSVisOctree& GetVisOctree(const uint) const;
private:
int x0_;
int x4_;
int x8_;
int xc_;
int x10_;
int x14_;
const char* x18_;
const char* x1c_;
CPVSVisOctree x20_octree;
};
#endif // _CPVSAREASET

View File

@ -1,6 +1,9 @@
#ifndef _DOLPHIN_OSBOOTINFO
#define _DOLPHIN_OSBOOTINFO
#include "dolphin/DVDPriv.h"
#include "dolphin/types.h"
typedef struct OSBootInfo {
DVDDiskID DVDDiskID;
u32 magic;
@ -36,4 +39,12 @@ typedef struct BI2Debug {
u32 padSpec; // 0x24
} BI2Debug;
// Magic number defines.
#define OS_BOOTINFO_MAGIC 0x0D15EA5E
#define OS_BOOTINFO_MAGIC_JTAG 0xE5207C22
#define OS_DVD_MAGIC_NINTENDO 0xC2339F3D
#define OS_THREAD_STACK_MAGIC 0xDEADBABE
#define OS_BOOTROM_ADDR 0x81300000
#endif // _DOLPHIN_OSBOOTINFO

View File

@ -0,0 +1,24 @@
#include "Collision/CCollisionPrimitive.hpp"
#include <Collision/InternalColliders.hpp>
#include <Collision/CCollidableAABox.hpp>
#include <Collision/CCollidableSphere.hpp>
#include <Collision/CCollidableCollisionSurface.hpp>
void InternalColliders::AddTypes() {
CCollisionPrimitive::InitAddType(CCollidableAABox::GetType());
CCollisionPrimitive::InitAddType(CCollidableCollisionSurface::GetType());
CCollisionPrimitive::InitAddType(CCollidableSphere::GetType());
}
void InternalColliders::AddColliders() {
CCollisionPrimitive::InitAddCollider(Collide::AABox_AABox, "CCollidableAABox", "CCollidableAABox");
CCollisionPrimitive::InitAddCollider(Collide::Sphere_AABox, "CCollidableSphere", "CCollidableAABox");
CCollisionPrimitive::InitAddCollider(Collide::Sphere_Sphere, "CCollidableSphere", "CCollidableSphere");
CCollisionPrimitive::InitAddBooleanCollider(Collide::AABox_AABox_Bool, "CCollidableAABox", "CCollidableAABox");
CCollisionPrimitive::InitAddBooleanCollider(Collide::Sphere_AABox_Bool, "CCollidableSphere", "CCollidableAABox");
CCollisionPrimitive::InitAddBooleanCollider(Collide::Sphere_Sphere_Bool, "CCollidableSphere", "CCollidableSphere");
CCollisionPrimitive::InitAddMovingCollider(CCollidableAABox::CollideMovingAABox, "CCollidableAABox", "CCollidableAABox");
CCollisionPrimitive::InitAddMovingCollider(CCollidableAABox::CollideMovingSphere, "CCollidableAABox", "CCollidableSphere");
CCollisionPrimitive::InitAddMovingCollider(CCollidableSphere::CollideMovingAABox, "CCollidableSphere", "CCollidableAABox");
CCollisionPrimitive::InitAddMovingCollider(CCollidableSphere::CollideMovingSphere, "CCollidableSphere", "CCollidableSphere");
}

View File

@ -1,12 +1,14 @@
#include "dolphin/os.h"
#include "dolphin/os/OSBootInfo.h"
#include "dolphin/dvd.h"
typedef struct ApploaderHeader {
// total size: 0x20
char date[16]; // offset 0x0, size 0x10
u32 entry; // offset 0x10, size 0x4
u32 size; // offset 0x14, size 0x4
u32 rebootSize; // offset 0x18, size 0x4
u32 reserved2; // offset 0x1C, size 0x4
// total size: 0x20
char date[16]; // offset 0x0, size 0x10
u32 entry; // offset 0x10, size 0x4
u32 size; // offset 0x14, size 0x4
u32 rebootSize; // offset 0x18, size 0x4
u32 reserved2; // offset 0x1C, size 0x4
} ApploaderHeader;
static ApploaderHeader Header;
@ -17,6 +19,10 @@ extern void* __OSSavedRegionEnd;
static void* SaveStart = NULL;
static void* SaveEnd = NULL;
extern u32 BOOT_REGION_START AT_ADDRESS(0x812FDFF0); //(*(u32 *)0x812fdff0)
extern u32 BOOT_REGION_END AT_ADDRESS(0x812FDFEC); //(*(u32 *)0x812fdfec)
extern u32 __OSIsGcam;
static BOOL Prepared = FALSE;
asm void Run() {
@ -29,12 +35,12 @@ asm void Run() {
// clang-format on
}
static void Callback() {
Prepared = TRUE;
static void Callback() { Prepared = TRUE; }
void ReadApploader(OSTime time1, OSTime time2) {
}
void __OSReboot(u32 resetCode, u32 bootDol) {
OSDisableInterrupts();
}
void OSSetSaveRegion(void* start, void* end) {
@ -49,5 +55,5 @@ void OSGetSaveRegion(void** start, void** end) {
void OSGetSavedRegion(void** start, void** end) {
*start = __OSSavedRegionStart;
*end = __OSSavedRegionEnd;
*end = __OSSavedRegionEnd;
}

View File

@ -0,0 +1,37 @@
#include "Kyoto/PVS/CPVSVisOctree.hpp"
#include "rstl/auto_ptr.hpp"
#include <WorldFormat/CPVSAreaSet.hpp>
#include <Kyoto/Streams/CMemoryInStream.hpp>
#pragma inline_max_size(250)
CPVSAreaSet::CPVSAreaSet(int numFeatures, int numLights, int num2ndLights, int numActors,
int leafSize, int lightIndexCount, const char* w7, const char* w8,
const char* w9)
: x0_(numFeatures)
, x4_(numLights)
, x8_(num2ndLights)
, xc_(numActors)
, x10_(leafSize)
, x14_(lightIndexCount)
, x18_(w7)
, x1c_(w8)
, x20_octree(CPVSVisOctree::MakePVSVisOctree(w9, 68)) {}
rstl::auto_ptr< CPVSAreaSet > CPVSAreaSet::MakeAreaSet(const char* data, int len) {
CMemoryInStream in(data, len);
int numFeatures = in.ReadLong();
int numLights = in.ReadLong();
int num2ndLights = in.ReadLong();
int numActors = in.ReadLong();
int leafSize = in.ReadLong();
int lightIndexCount = in.ReadLong();
char* data1 = (char*)(data + in.GetReadPosition());
char* entityIndexEnd = (char*)(data + in.GetReadPosition() + (numActors * 4));
char* data3 = entityIndexEnd + lightIndexCount * leafSize;
return rs_new CPVSAreaSet(numFeatures, numLights, num2ndLights, numActors, leafSize,
lightIndexCount, data1, entityIndexEnd, data3);
}
const CPVSVisOctree& CPVSAreaSet::GetVisOctree(const uint) const { return x20_octree; }