metaforce/Runtime/Collision/CCollisionPrimitive.hpp

135 lines
4.5 KiB
C++
Raw Normal View History

#ifndef __URDE_CCOLLISIONPRIMITIVE_HPP__
#define __URDE_CCOLLISIONPRIMITIVE_HPP__
2016-04-22 20:22:45 +00:00
#include "Collision/CMaterialList.hpp"
2016-04-27 00:26:02 +00:00
#include "CRayCastResult.hpp"
#include "zeus/CAABox.hpp"
2016-04-23 18:04:49 +00:00
#include <functional>
namespace urde
{
2016-04-27 00:26:02 +00:00
class COBBTree;
class CInternalCollisionStructure;
class CCollisionInfo;
class CCollisionInfoList;
2016-04-27 00:26:02 +00:00
class CInternalRayCastStructure;
class CMaterialFilter;
using ComparisonFunc = std::function<bool(const CInternalCollisionStructure&, CCollisionInfoList&)>;
using MovingComparisonFunc =
std::function<bool(const CInternalCollisionStructure&, const zeus::CVector3f&, double&, CCollisionInfo&)>;
using BooleanComparisonFunc = std::function<bool(const CInternalCollisionStructure&)>;
class CCollisionPrimitive
{
public:
2016-04-23 18:04:49 +00:00
class Type
{
2016-04-23 18:04:49 +00:00
std::function<void(u32)> x0_setter;
const char* x4_info;
2016-04-23 18:04:49 +00:00
public:
Type() = default;
Type(const std::function<void(u32)>& setter, const char* info);
2016-04-23 18:04:49 +00:00
2016-06-24 20:09:38 +00:00
const char* GetInfo() const;
2016-04-23 18:04:49 +00:00
2016-06-24 20:09:38 +00:00
std::function<void(u32)> GetSetter() const;
};
class Comparison
{
ComparisonFunc x0_collider;
const char* x4_type1;
const char* x8_type2;
public:
Comparison(const ComparisonFunc& collider, const char* type1, const char* type2)
: x0_collider(collider), x4_type1(type1), x8_type2(type2)
{
}
const ComparisonFunc& GetCollider() const { return x0_collider; }
const char* GetType1() const { return x4_type1; }
const char* GetType2() const { return x8_type2; }
};
class MovingComparison
{
MovingComparisonFunc x0_collider;
const char* x4_type1;
const char* x8_type2;
public:
MovingComparison(const MovingComparisonFunc& collider, const char* type1, const char* type2)
: x0_collider(collider), x4_type1(type1), x8_type2(type2)
{
}
const MovingComparisonFunc& GetCollider() const { return x0_collider; }
const char* GetType1() const { return x4_type1; }
const char* GetType2() const { return x8_type2; }
};
class BooleanComparison
{
BooleanComparisonFunc x0_collider;
const char* x4_type1;
const char* x8_type2;
public:
BooleanComparison(const BooleanComparisonFunc& collider, const char* type1, const char* type2)
: x0_collider(collider), x4_type1(type1), x8_type2(type2)
{
}
const BooleanComparisonFunc& GetCollider() const { return x0_collider; }
const char* GetType1() const { return x4_type1; }
const char* GetType2() const { return x8_type2; }
};
private:
CMaterialList x8_material;
static std::unique_ptr<std::vector<Type>> sCollisionTypeList;
static std::unique_ptr<std::vector<ComparisonFunc>> sTableOfCollidables;
static std::unique_ptr<std::vector<BooleanComparisonFunc>> sTableOfBooleanCollidables;
static std::unique_ptr<std::vector<MovingComparisonFunc>> sTableOfMovingCollidables;
2017-01-21 15:46:51 +00:00
static s32 sNumTypes;
static bool sTypesAdded;
static bool sTypesAdding;
static bool sCollidersAdded;
static bool sCollidersAdding;
public:
CCollisionPrimitive() = default;
2016-04-27 00:26:02 +00:00
CCollisionPrimitive(const CMaterialList& list);
virtual u32 GetTableIndex() const = 0;
2016-04-27 00:26:02 +00:00
virtual void SetMaterial(const CMaterialList&);
virtual const CMaterialList& GetMaterial() const;
virtual zeus::CAABox CalculateAABox(const zeus::CTransform&) const = 0;
virtual zeus::CAABox CalculateLocalAABox() const = 0;
virtual FourCC GetPrimType() const = 0;
2016-04-27 00:26:02 +00:00
virtual ~CCollisionPrimitive() {}
virtual CRayCastResult CastRayInternal(const CInternalRayCastStructure&) const = 0;
CRayCastResult CastRay(const zeus::CVector3f& start, const zeus::CVector3f& dir, float length,
const CMaterialFilter& filter, const zeus::CTransform& xf) const;
2016-04-27 00:26:02 +00:00
static void InitBeginTypes();
2016-04-23 18:04:49 +00:00
static void InitAddType(const Type& tp);
static void InitEndTypes();
2016-04-22 20:29:31 +00:00
static void InitBeginColliders();
static void InitAddBooleanCollider(const BooleanComparison& cmp);
static void InitAddBooleanCollider(const BooleanComparisonFunc&, const char*, const char*);
static void InitAddMovingCollider(const MovingComparison& cmp);
static void InitAddMovingCollider(const MovingComparisonFunc&, const char*, const char*);
static void InitAddCollider(const Comparison& cmp);
static void InitAddCollider(const ComparisonFunc&, const char*, const char*);
2016-06-24 20:09:38 +00:00
static void InitEndColliders();
2017-01-21 15:46:51 +00:00
static void Unitialize();
};
}
#endif // __URDE_CCOLLISIONPRIMITIVE_HPP__