diff --git a/.gitignore b/.gitignore index c138894b3..9bde34c4f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ version.h *.user .DS_Store +*.autosave diff --git a/Runtime/Collision/CCollidableAABox.hpp b/Runtime/Collision/CCollidableAABox.hpp index a4212131c..9e5d9a099 100644 --- a/Runtime/Collision/CCollidableAABox.hpp +++ b/Runtime/Collision/CCollidableAABox.hpp @@ -5,6 +5,12 @@ namespace urde { +namespace Collide +{ +bool AABox_AABox(const CInternalCollisionStructure&, CCollisionInfoList&); +bool AABox_AABox_Bool(const CInternalCollisionStructure&, CCollisionInfoList&); +} + class CCollidableAABox : public CCollisionPrimitive { static const Type sType; diff --git a/Runtime/Collision/CCollisionInfo.cpp b/Runtime/Collision/CCollisionInfo.cpp index e69de29bb..daa488f40 100644 --- a/Runtime/Collision/CCollisionInfo.cpp +++ b/Runtime/Collision/CCollisionInfo.cpp @@ -0,0 +1,6 @@ +#include "CCollisionInfo.hpp" + +namespace urde +{ + +} diff --git a/Runtime/Collision/CCollisionInfo.hpp b/Runtime/Collision/CCollisionInfo.hpp index b22b20b18..98bfd87e6 100644 --- a/Runtime/Collision/CCollisionInfo.hpp +++ b/Runtime/Collision/CCollisionInfo.hpp @@ -1,11 +1,14 @@ #ifndef __URDE_CCOLLISIONINFO_HPP__ #define __URDE_CCOLLISIONINFO_HPP__ +#include "zeus/CAABox.hpp" + namespace urde { - +class CMaterialList; class CCollisionInfo { +public: }; } diff --git a/Runtime/Collision/CCollisionInfoList.cpp b/Runtime/Collision/CCollisionInfoList.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/Runtime/Collision/CCollisionInfoList.hpp b/Runtime/Collision/CCollisionInfoList.hpp new file mode 100644 index 000000000..e97c24220 --- /dev/null +++ b/Runtime/Collision/CCollisionInfoList.hpp @@ -0,0 +1,30 @@ +#ifndef __URDE_CCOLLISIONINFOLIST_HPP__ +#define __URDE_CCOLLISIONINFOLIST_HPP__ + +#include "RetroTypes.hpp" + +namespace urde +{ +class CCollisionInfo; +class CCollisionInfoList +{ + rstl::reserved_vector x0_list; +public: + CCollisionInfoList() = default; + + void GetAverageLeftNormal() const; + void GetAveragePoint() const; + void GetUnionOfAllLeftMaterials() const; + s32 GetCount() const; + void Swap(s32); + + void Add(const CCollisionInfo&, bool); + void Clear(); + void End(); + void End() const; + void Begin(); + void Begin() const; +}; +} + +#endif // __URDE_CCOLLISIONINFOLIST_HPP__ diff --git a/Runtime/Collision/CCollisionPrimitive.cpp b/Runtime/Collision/CCollisionPrimitive.cpp index fd91a7dff..203a8b503 100644 --- a/Runtime/Collision/CCollisionPrimitive.cpp +++ b/Runtime/Collision/CCollisionPrimitive.cpp @@ -50,7 +50,7 @@ void CCollisionPrimitive::InitEndTypes() sTypesAdding = false; } -CCollisionPrimitive::Type::Type(std::function setter, const char *info) +CCollisionPrimitive::Type::Type(const std::function& setter, const char *info) : x0_setter(setter), x4_info(info) { diff --git a/Runtime/Collision/CCollisionPrimitive.hpp b/Runtime/Collision/CCollisionPrimitive.hpp index da4a13331..cda8f94fb 100644 --- a/Runtime/Collision/CCollisionPrimitive.hpp +++ b/Runtime/Collision/CCollisionPrimitive.hpp @@ -11,6 +11,9 @@ namespace urde { class COBBTree; +class CInternalCollisionStructure; +class CCollisionInfo; +class CCollisionInfoList; class CInternalRayCastStructure; class CMaterialFilter; class CCollisionPrimitive @@ -29,13 +32,73 @@ public: const char* x4_info; public: Type() = default; - Type(std::function setter, const char * info); + Type(const std::function& setter, const char * info); const char* GetInfo() const; std::function GetSetter() const; }; + class Comparison + { + std::function x0_collider; + const char* x4_type1; + const char* x8_type2; + public: + Comparison(const std::function& collider, + const char* type1, const char* type2) + : x0_collider(collider), + x4_type1(type1), + x8_type2(type2) + { + } + + std::function GetCollider() const { return x0_collider; } + const char* GetType1() const { return x4_type1; } + const char* GetType2() const { return x8_type2; } + }; + + class MovingComparison + { + std::function x0_collider; + const char* x4_type1; + const char* x8_type2; + public: + MovingComparison(const std::function& collider, const char* type1, const char* type2) + : x0_collider(collider), + x4_type1(type1), + x8_type2(type2) + { + } + + std::function GetCollider() const { return x0_collider; } + const char* GetType1() const { return x4_type1; } + const char* GetType2() const { return x8_type2; } + }; + + class BooleanComparison + { + std::function x0_collider; + const char* x4_type1; + const char* x8_type2; + + public: + BooleanComparison(const std::function& collider, const char* type1, + const char* type2) + : x0_collider(collider), + x4_type1(type1), + x8_type2(type2) + { + } + + std::function GetCollider() const { return x0_collider; } + const char* GetType1() const { return x4_type1; } + const char* GetType2() const { return x8_type2; } + }; + CCollisionPrimitive()=default; CCollisionPrimitive(const CMaterialList& list); virtual u32 GetTableIndex() const=0; @@ -55,7 +118,9 @@ public: static void InitEndTypes(); static void InitBeginColliders(); - static void InitAddCollider(const Type& tp); + static void InitAddBooleanCollider(const BooleanComparison& cmp); + static void InitAddMovingCollider(const MovingComparison& cmp); + static void InitAddCollider(const Comparison& cmp); static void InitEndColliders(); }; diff --git a/Runtime/Collision/CMakeLists.txt b/Runtime/Collision/CMakeLists.txt index 1302add80..ad4202743 100644 --- a/Runtime/Collision/CMakeLists.txt +++ b/Runtime/Collision/CMakeLists.txt @@ -1,6 +1,8 @@ set(COLLISION_SOURCES + CollisionUtil.hpp CollisionUtil.cpp CGameCollision.hpp CGameCollision.cpp CCollisionInfo.hpp CCollisionInfo.cpp + CCollisionInfoList.hpp CCollisionInfoList.cpp CCollisionEdge.hpp CCollisionEdge.cpp CCollisionSurface.hpp CCollisionSurface.cpp InternalColliders.hpp InternalColliders.cpp diff --git a/Runtime/Collision/CollisionUtil.cpp b/Runtime/Collision/CollisionUtil.cpp new file mode 100644 index 000000000..c04319456 --- /dev/null +++ b/Runtime/Collision/CollisionUtil.cpp @@ -0,0 +1,25 @@ +#include "CollisionUtil.hpp" +namespace urde +{ +namespace CollisionUtil +{ +bool LineIntersectsOBBox(const zeus::COBBox& obb, const zeus::CMRay& ray, float& d) +{ + const zeus::CVector3f transXf = obb.transform.toMatrix4f().vec[0].toVec3f(); + return RayAABoxIntersection(ray.getInvUnscaledTransformRay(obb.transform), {-obb.extents, obb.extents}, + transXf, d); +} + +u32 RayAABoxIntersection(const zeus::CMRay& ray, const zeus::CAABox& box, const zeus::CVector3f&, float& d) +{ + + return 0; +} + +u32 RaySphereIntersection_Double(const zeus::CSphere&, const zeus::CVector3f &, const zeus::CVector3f &, double &) +{ + return 0; +} + +} +} diff --git a/Runtime/Collision/CollisionUtil.hpp b/Runtime/Collision/CollisionUtil.hpp new file mode 100644 index 000000000..6e2e68f4c --- /dev/null +++ b/Runtime/Collision/CollisionUtil.hpp @@ -0,0 +1,16 @@ +#ifndef __URDE_COLLISIONUTIL_HPP__ +#define __URDE_COLLISIONUTIL_HPP__ + +#include "GCNTypes.hpp" +#include "zeus/zeus.hpp" + +namespace urde +{ +namespace CollisionUtil +{ +bool LineIntersectsOBBox(const zeus::COBBox&, const zeus::CMRay&, float&); +u32 RayAABoxIntersection(const zeus::CMRay&, const zeus::CAABox&, const zeus::CVector3f&, float&); +u32 RaySphereIntersection_Double(const zeus::CSphere&, const zeus::CVector3f&, const zeus::CVector3f&, double&); +} +} +#endif // __URDE_COLLISIONUTIL_HPP__ diff --git a/specter b/specter index 4dff27e3c..47a6e28db 160000 --- a/specter +++ b/specter @@ -1 +1 @@ -Subproject commit 4dff27e3c69b11d7fa8232c4b32d28089e524b57 +Subproject commit 47a6e28db624f100e8cbc6ef11f3feba2a575ec7