Initial Collision stubs

This commit is contained in:
Phillip Stephens 2016-06-24 13:09:38 -07:00
parent 40cd1226fa
commit c66dac6df2
18 changed files with 310 additions and 25 deletions

View File

@ -1,6 +1,51 @@
#include "CCollidableAABox.hpp" #include "CCollidableAABox.hpp"
namespace urde
{
const CCollisionPrimitive::Type CCollidableAABox::sType(CCollidableAABox::SetStaticTableIndex, "CCollidableAABox");
u32 CCollidableAABox::sTableIndex = -1;
CCollidableAABox::CCollidableAABox() CCollidableAABox::CCollidableAABox()
{ {
}
zeus::CAABox CCollidableAABox::Transform(const zeus::CTransform& xf) const
{
return {xf.origin + x10_aabox.min, xf.origin + x10_aabox.max};
}
u32 CCollidableAABox::GetTableIndex() const
{
return sTableIndex;
}
zeus::CAABox CCollidableAABox::CalculateAABox(const zeus::CTransform& xf) const
{
return Transform(xf);
}
zeus::CAABox CCollidableAABox::CalculateLocalAABox() const
{
return x10_aabox;
}
FourCC CCollidableAABox::GetPrimType() const
{
return SBIG('AABX');
}
CRayCastResult CCollidableAABox::CastRayInternal(const CInternalRayCastStructure &) const
{
return {};
}
const CCollisionPrimitive::Type& CCollidableAABox::GetType()
{
return sType;
}
void CCollidableAABox::SetStaticTableIndex(u32 index)
{
sTableIndex = index;
}
} }

View File

@ -1,11 +1,29 @@
#ifndef CCOLLIDABLEAABOX_HPP #ifndef __URDE_CCOLLIDABLEAABOX_HPP__
#define CCOLLIDABLEAABOX_HPP #define __URDE_CCOLLIDABLEAABOX_HPP__
#include "CCollisionPrimitive.hpp"
class CCollidableAABox namespace urde
{ {
class CCollidableAABox : public CCollisionPrimitive
{
static const Type sType;
static u32 sTableIndex;
zeus::CAABox x10_aabox;
public: public:
CCollidableAABox(); CCollidableAABox();
};
#endif // CCOLLIDABLEAABOX_HPP zeus::CAABox Transform(const zeus::CTransform&) const;
virtual u32 GetTableIndex() const;
virtual zeus::CAABox CalculateAABox(const zeus::CTransform&) const;
virtual zeus::CAABox CalculateLocalAABox() const;
virtual FourCC GetPrimType() const;
virtual CRayCastResult CastRayInternal(const CInternalRayCastStructure&) const;
static const CCollisionPrimitive::Type& GetType();
static void SetStaticTableIndex(u32 index);
};
}
#endif // __URDE_CCOLLIDABLEAABOX_HPP__

View File

@ -0,0 +1,14 @@
#include "CCollidableCollisionSurface.hpp"
namespace urde
{
const CCollisionPrimitive::Type& CCollidableCollisionSurface::GetType()
{
return sType;
}
void CCollidableCollisionSurface::SetStaticTableIndex(u32 index)
{
sTableIndex = index;
}
}

View File

@ -0,0 +1,17 @@
#ifndef __URDE_COLLIDABLECOLLISIONSURFACE_HPP__
#define __URDE_COLLIDABLECOLLISIONSURFACE_HPP__
#include "CCollisionPrimitive.hpp"
namespace urde
{
class CCollidableCollisionSurface
{
static const CCollisionPrimitive::Type sType;
static u32 sTableIndex;
public:
static const CCollisionPrimitive::Type& GetType();
static void SetStaticTableIndex(u32 index);
};
}
#endif // __URDE_COLLIDABLECOLLISIONSURFACE_HPP__

View File

@ -11,7 +11,7 @@ namespace urde
{ {
class CCollidableOBBTreeGroup : public CCollisionPrimitive class CCollidableOBBTreeGroup : public CCollisionPrimitive
{ {
static const CCollisionPrimitive::Type sType; static const Type sType;
static u32 sTableIndex; static u32 sTableIndex;
std::vector<std::unique_ptr<COBBTree>> x0_trees; std::vector<std::unique_ptr<COBBTree>> x0_trees;
std::vector<zeus::CAABox> x10_aabbs; std::vector<zeus::CAABox> x10_aabbs;
@ -26,7 +26,7 @@ public:
virtual FourCC GetPrimType() const; virtual FourCC GetPrimType() const;
virtual CRayCastResult CastRayInternal(const CInternalRayCastStructure&) const; virtual CRayCastResult CastRayInternal(const CInternalRayCastStructure&) const;
static const CCollisionPrimitive::Type& GetType(); static const Type& GetType();
static void SetStaticTableIndex(u32 index); static void SetStaticTableIndex(u32 index);
}; };

View File

@ -0,0 +1,33 @@
#include "CCollidableSphere.hpp"
namespace urde
{
const CCollisionPrimitive::Type CCollidableSphere::sType(CCollidableSphere::SetStaticTableIndex, "CCollidableSphere");
u32 CCollidableSphere::sTableIndex = -1;
u32 CCollidableSphere::GetTableIndex() const
{
return sTableIndex;
}
zeus::CAABox CCollidableSphere::CalculateAABox(const zeus::CTransform &) const
{
return {};
}
zeus::CAABox CCollidableSphere::CalculateLocalAABox() const
{
return {};
}
FourCC CCollidableSphere::GetPrimType() const
{
return SBIG('SPHR');
}
CRayCastResult CCollidableSphere::CastRayInternal(const CInternalRayCastStructure &) const
{
return {};
}
}

View File

@ -0,0 +1,25 @@
#ifndef __URDE_CCOLLIDALBESPHERE_HPP
#define __URDE_CCOLLIDALBESPHERE_HPP
#include "CCollisionPrimitive.hpp"
namespace urde
{
class CCollidableSphere : public CCollisionPrimitive
{
static const Type sType;
static u32 sTableIndex;
public:
virtual u32 GetTableIndex() const;
virtual zeus::CAABox CalculateAABox(const zeus::CTransform&) const;
virtual zeus::CAABox CalculateLocalAABox() const;
virtual FourCC GetPrimType() const;
virtual CRayCastResult CastRayInternal(const CInternalRayCastStructure&) const;
static const CCollisionPrimitive::Type& GetType();
static void SetStaticTableIndex(u32 index);
};
}
#endif // __URDE_CCOLLIDALBESPHERE_HPP

View File

@ -1,6 +1,7 @@
#include "CCollisionPrimitive.hpp" #include "CCollisionPrimitive.hpp"
#include "CInternalRayCastStructure.hpp" #include "CInternalRayCastStructure.hpp"
#include "CMaterialFilter.hpp" #include "CMaterialFilter.hpp"
#include "InternalColliders.hpp"
namespace urde namespace urde
{ {
@ -14,7 +15,7 @@ void CCollisionPrimitive::SetMaterial(const CMaterialList& material)
x8_material = material; x8_material = material;
} }
const CMaterialList&CCollisionPrimitive::GetMaterial() const const CMaterialList& CCollisionPrimitive::GetMaterial() const
{ {
return x8_material; return x8_material;
@ -26,4 +27,35 @@ CRayCastResult CCollisionPrimitive::CastRay(const zeus::CVector3f& start, const
return CastRayInternal(CInternalRayCastStructure(start, end, d, xf, filter)); return CastRayInternal(CInternalRayCastStructure(start, end, d, xf, filter));
} }
void CCollisionPrimitive::InitBeginTypes()
{
}
void CCollisionPrimitive::InitAddType(const CCollisionPrimitive::Type& tp)
{
}
void CCollisionPrimitive::InitEndTypes()
{
}
CCollisionPrimitive::Type::Type(std::function<void (unsigned int)> setter, const char *info)
: x0_setter(setter),
x4_info(info)
{
}
const char *CCollisionPrimitive::Type::GetInfo() const
{
return x4_info;
}
std::function<void (u32)> CCollisionPrimitive::Type::GetSetter() const
{
return x0_setter;
}
} }

View File

@ -23,21 +23,11 @@ public:
const char* x4_info; const char* x4_info;
public: public:
Type() = default; Type() = default;
Type(std::function<void(unsigned int)> setter, const char * info) Type(std::function<void(unsigned int)> setter, const char * info);
: x0_setter(setter),
x4_info(info)
{
}
const char* GetInfo() const const char* GetInfo() const;
{
return x4_info;
}
std::function<void(u32)> GetSetter() const std::function<void(u32)> GetSetter() const;
{
return x0_setter;
}
}; };
CCollisionPrimitive()=default; CCollisionPrimitive()=default;
@ -60,6 +50,7 @@ public:
static void InitBeginColliders(); static void InitBeginColliders();
static void InitAddCollider(const Type& tp); static void InitAddCollider(const Type& tp);
static void InitEndColliders();
}; };
} }

View File

@ -0,0 +1,12 @@
#include "CCollisionSurface.hpp"
namespace urde
{
CCollisionSurface::CCollisionSurface(const zeus::CVector3f& a, const zeus::CVector3f& b, const zeus::CVector3f& c, u32 flags)
: x0_a(a),
xc_b(b),
x18_c(c),
x24_flags(flags)
{
}
}

View File

@ -0,0 +1,22 @@
#ifndef __URDE_CCOLLISIONSURFACE_HPP__
#define __URDE_CCOLLISIONSURFACE_HPP__
#include "zeus/zeus.hpp"
#include "RetroTypes.hpp"
namespace urde
{
class CCollisionSurface
{
zeus::CVector3f x0_a;
zeus::CVector3f xc_b;
zeus::CVector3f x18_c;
u32 x24_flags;
public:
CCollisionSurface(const zeus::CVector3f&, const zeus::CVector3f&, const zeus::CVector3f&, u32);
zeus::CVector3f GetPoint(u32) const;
};
}
#endif // __URDE_CCOLLISIONSURFACE_HPP__

View File

@ -1 +1,13 @@
#include "CMaterialFilter.hpp" #include "CMaterialFilter.hpp"
#include "CGameCollision.hpp"
#include "CCollidableOBBTreeGroup.hpp"
namespace urde
{
void CGameCollision::InitCollision()
{
CCollisionPrimitive::InitBeginTypes();
}
}

View File

@ -24,7 +24,7 @@ public:
const zeus::CMRay& GetRay() const { return x0_ray; } const zeus::CMRay& GetRay() const { return x0_ray; }
const zeus::CVector3f& GetStart() const { return x0_ray.start; } const zeus::CVector3f& GetStart() const { return x0_ray.start; }
const zeus::CVector3f& GetNormal() const { return x0_ray.normal; } const zeus::CVector3f& GetNormal() const { return x0_ray.normal; }
float GetMaxTime() const { return 0.f; } float GetMaxTime() const { return x38_maxTime; }
const zeus::CTransform& GetTransform() const { return x3c_xf; } const zeus::CTransform& GetTransform() const { return x3c_xf; }
const CMaterialFilter& GetFilter() const { return x6c_filter; } const CMaterialFilter& GetFilter() const { return x6c_filter; }
}; };

View File

@ -2,7 +2,12 @@ set(COLLISION_SOURCES
CGameCollision.hpp CGameCollision.cpp CGameCollision.hpp CGameCollision.cpp
CCollisionInfo.hpp CCollisionInfo.cpp CCollisionInfo.hpp CCollisionInfo.cpp
CCollisionEdge.hpp CCollisionEdge.cpp CCollisionEdge.hpp CCollisionEdge.cpp
CCollisionSurface.hpp CCollisionSurface.cpp
InternalColliders.hpp InternalColliders.cpp
COBBTree.hpp COBBTree.cpp COBBTree.hpp COBBTree.cpp
CCollidableAABox.hpp CCollidableAABox.cpp
CCollidableCollisionSurface.hpp CCollidableCollisionSurface.cpp
CCollidableSphere.hpp CCollidableSphere.cpp
CCollidableOBBTree.hpp CCollidableOBBTree.cpp CCollidableOBBTree.hpp CCollidableOBBTree.cpp
CCollidableOBBTreeGroup.hpp CCollidableOBBTreeGroup.cpp CCollidableOBBTreeGroup.hpp CCollidableOBBTreeGroup.cpp
CCollisionPrimitive.hpp CCollisionPrimitive.cpp CCollisionPrimitive.hpp CCollisionPrimitive.cpp

View File

@ -15,7 +15,9 @@ u32 verify_version(CInputStream& in)
return in.readUint32Big(); return in.readUint32Big();
} }
COBBTree::COBBTree(const COBBTree::SIndexData&, const COBBTree::CNode*) COBBTree::COBBTree(const SIndexData& indexData, const CNode* root)
: x18_indexData(indexData),
x88_root((CNode*)root)
{ {
} }
@ -114,6 +116,25 @@ const zeus::COBBox& COBBTree::CNode::GetOBB() const
return x0_obb; return x0_obb;
} }
size_t COBBTree::CNode::GetMemoryUsage() const
{
size_t ret = 0;
if (x3c_isLeaf)
ret = x48_leaf->GetMemoryUsage() + 80;
else
{
if (x40_left)
ret = x40_left->GetMemoryUsage() + 80;
if (x44_right)
ret += x44_right->GetMemoryUsage();
}
if (!(ret & 3))
return ret;
return ret + ((ret & 3) - 4);
}
COBBTree::CLeafData::CLeafData(const std::vector<u16>& surface) COBBTree::CLeafData::CLeafData(const std::vector<u16>& surface)
: x0_surface(surface) : x0_surface(surface)
{ {
@ -124,6 +145,14 @@ const std::vector<u16>& COBBTree::CLeafData::GetSurfaceVector() const
return x0_surface; return x0_surface;
} }
size_t COBBTree::CLeafData::GetMemoryUsage() const
{
size_t ret = (x0_surface.size() * 2) + 16;
if (!(ret & 3))
return ret;
return ret + ((ret & 3) - 4);
}
COBBTree::CLeafData::CLeafData(CInputStream& in) COBBTree::CLeafData::CLeafData(CInputStream& in)
{ {
u32 edgeCount = in.readUint32Big(); u32 edgeCount = in.readUint32Big();

View File

@ -32,6 +32,7 @@ public:
CLeafData(CInputStream&); CLeafData(CInputStream&);
const std::vector<u16>& GetSurfaceVector() const; const std::vector<u16>& GetSurfaceVector() const;
size_t GetMemoryUsage() const;
}; };
class CNode class CNode
@ -48,11 +49,12 @@ public:
CNode(CInputStream&); CNode(CInputStream&);
bool WasHit() const; bool WasHit() const;
void SetWasHit(bool) const; void SetHit(bool) const;
CNode* GetLeft() const; CNode* GetLeft() const;
CNode* GetRight() const; CNode* GetRight() const;
CLeafData* GetLeafData() const; CLeafData* GetLeafData() const;
const zeus::COBBox& GetOBB() const; const zeus::COBBox& GetOBB() const;
size_t GetMemoryUsage() const;
}; };
private: private:

View File

@ -0,0 +1,17 @@
#include "InternalColliders.hpp"
#include "CCollidableAABox.hpp"
#include "CCollidableCollisionSurface.hpp"
#include "CCollidableSphere.hpp"
namespace urde
{
namespace InternalColliders
{
void AddTypes()
{
CCollisionPrimitive::InitAddType(CCollidableAABox::GetType());
CCollisionPrimitive::InitAddType(CCollidableCollisionSurface::GetType());
CCollisionPrimitive::InitAddType(CCollidableSphere::GetType());
}
}
}

View File

@ -0,0 +1,11 @@
#ifndef __URDE_INTERNALCOLLIDERS_HPP__
#define __URDE_INTERNALCOLLIDERS_HPP__
namespace urde
{
namespace InternalColliders
{
void AddTypes();
}
}
#endif // __URDE_INTERNALCOLLIDERS_HPP__