2018-10-06 20:42:33 -07:00
|
|
|
#pragma once
|
2019-09-27 19:53:03 -07:00
|
|
|
|
|
|
|
#include <optional>
|
|
|
|
|
|
|
|
#include "Runtime/RetroTypes.hpp"
|
|
|
|
#include "Runtime/rstl.hpp"
|
|
|
|
#include "Runtime/Collision/CCollisionPrimitive.hpp"
|
|
|
|
#include "Runtime/Collision/CMetroidAreaCollider.hpp"
|
|
|
|
#include "Runtime/Collision/CRayCastResult.hpp"
|
|
|
|
|
|
|
|
#include <zeus/CPlane.hpp>
|
|
|
|
#include <zeus/CVector3f.hpp>
|
2016-04-17 15:38:05 -07:00
|
|
|
|
2021-04-10 01:42:06 -07:00
|
|
|
namespace metaforce {
|
2016-04-17 15:38:05 -07:00
|
|
|
|
2017-01-03 20:08:30 -08:00
|
|
|
class CActor;
|
|
|
|
class CCollisionInfo;
|
|
|
|
class CCollisionInfoList;
|
2019-09-30 14:16:22 -07:00
|
|
|
class CGameArea;
|
|
|
|
class CMaterialFilter;
|
2017-01-03 20:08:30 -08:00
|
|
|
class CMaterialList;
|
2017-03-25 22:53:04 -07:00
|
|
|
class CPhysicsActor;
|
2019-09-30 14:16:22 -07:00
|
|
|
class CStateManager;
|
2017-06-17 18:58:13 -07:00
|
|
|
class ICollisionFilter;
|
2017-03-23 22:30:16 -07:00
|
|
|
|
2018-12-07 21:30:43 -08:00
|
|
|
class CGameCollision {
|
|
|
|
static void MovePlayer(CStateManager& mgr, CPhysicsActor& actor, float dt,
|
2021-06-06 16:53:41 -07:00
|
|
|
const rstl::reserved_vector<TUniqueId, kMaxEntities>* colliderList);
|
2018-12-07 21:30:43 -08:00
|
|
|
static void MoveAndCollide(CStateManager& mgr, CPhysicsActor& actor, float dt, const ICollisionFilter& filter,
|
2021-06-06 16:53:41 -07:00
|
|
|
const rstl::reserved_vector<TUniqueId, kMaxEntities>* colliderList);
|
2018-12-07 21:30:43 -08:00
|
|
|
static zeus::CVector3f GetActorRelativeVelocities(const CPhysicsActor& act0, const CPhysicsActor* act1);
|
|
|
|
|
2016-04-17 15:38:05 -07:00
|
|
|
public:
|
2018-12-07 21:30:43 -08:00
|
|
|
static float GetCoefficientOfRestitution(const CCollisionInfo&) { return 0.f; }
|
|
|
|
static bool NullMovingCollider(const CInternalCollisionStructure&, const zeus::CVector3f&, double&, CCollisionInfo&) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
static bool NullBooleanCollider(const CInternalCollisionStructure&) { return false; }
|
|
|
|
static bool NullCollisionCollider(const CInternalCollisionStructure&, CCollisionInfoList&) { return false; }
|
|
|
|
static void InitCollision();
|
|
|
|
static void Move(CStateManager& mgr, CPhysicsActor& actor, float dt,
|
2021-06-06 16:53:41 -07:00
|
|
|
const rstl::reserved_vector<TUniqueId, kMaxEntities>* colliderList);
|
2016-04-17 15:38:05 -07:00
|
|
|
|
2021-05-23 13:10:57 -07:00
|
|
|
static bool CanBlock(const CMaterialList&, const zeus::CUnitVector3f&);
|
|
|
|
static bool IsFloor(const CMaterialList&, const zeus::CUnitVector3f&);
|
2018-12-07 21:30:43 -08:00
|
|
|
static void SendMaterialMessage(CStateManager&, const CMaterialList&, CActor&);
|
|
|
|
static CRayCastResult RayStaticIntersection(const CStateManager& mgr, const zeus::CVector3f& pos,
|
|
|
|
const zeus::CVector3f& dir, float mag, const CMaterialFilter& filter);
|
|
|
|
static bool RayStaticIntersectionBool(const CStateManager& mgr, const zeus::CVector3f& start,
|
|
|
|
const zeus::CVector3f& dir, float length, const CMaterialFilter& filter);
|
|
|
|
static CRayCastResult RayDynamicIntersection(const CStateManager& mgr, TUniqueId& idOut, const zeus::CVector3f& pos,
|
2017-03-30 15:36:18 -07:00
|
|
|
const zeus::CVector3f& dir, float mag, const CMaterialFilter& filter,
|
2021-06-06 16:53:41 -07:00
|
|
|
const rstl::reserved_vector<TUniqueId, kMaxEntities>& nearList);
|
2018-12-07 21:30:43 -08:00
|
|
|
static bool RayDynamicIntersectionBool(const CStateManager& mgr, const zeus::CVector3f& pos,
|
|
|
|
const zeus::CVector3f& dir, const CMaterialFilter& filter,
|
2021-06-06 16:53:41 -07:00
|
|
|
const rstl::reserved_vector<TUniqueId, kMaxEntities>& nearList, const CActor* damagee,
|
2018-12-07 21:30:43 -08:00
|
|
|
float length);
|
|
|
|
static CRayCastResult RayWorldIntersection(const CStateManager& mgr, TUniqueId& idOut, const zeus::CVector3f& pos,
|
|
|
|
const zeus::CVector3f& dir, float mag, const CMaterialFilter& filter,
|
2021-06-06 16:53:41 -07:00
|
|
|
const rstl::reserved_vector<TUniqueId, kMaxEntities>& nearList);
|
2018-12-07 21:30:43 -08:00
|
|
|
static bool RayStaticIntersectionArea(const CGameArea& area, const zeus::CVector3f& pos, const zeus::CVector3f& dir,
|
|
|
|
float mag, const CMaterialFilter& filter);
|
|
|
|
static void BuildAreaCollisionCache(const CStateManager& mgr, CAreaCollisionCache& cache);
|
|
|
|
static float GetMinExtentForCollisionPrimitive(const CCollisionPrimitive& prim);
|
|
|
|
static bool DetectCollisionBoolean(const CStateManager& mgr, const CCollisionPrimitive& prim,
|
|
|
|
const zeus::CTransform& xf, const CMaterialFilter& filter,
|
2021-06-06 16:53:41 -07:00
|
|
|
const rstl::reserved_vector<TUniqueId, kMaxEntities>& nearList);
|
2018-12-07 21:30:43 -08:00
|
|
|
static bool DetectCollisionBoolean_Cached(const CStateManager& mgr, CAreaCollisionCache& cache,
|
|
|
|
const CCollisionPrimitive& prim, const zeus::CTransform& xf,
|
|
|
|
const CMaterialFilter& filter,
|
2021-06-06 16:53:41 -07:00
|
|
|
const rstl::reserved_vector<TUniqueId, kMaxEntities>& nearList);
|
2018-12-07 21:30:43 -08:00
|
|
|
static bool DetectStaticCollisionBoolean(const CStateManager& mgr, const CCollisionPrimitive& prim,
|
|
|
|
const zeus::CTransform& xf, const CMaterialFilter& filter);
|
|
|
|
static bool DetectStaticCollisionBoolean_Cached(const CStateManager& mgr, CAreaCollisionCache& cache,
|
|
|
|
const CCollisionPrimitive& prim, const zeus::CTransform& xf,
|
|
|
|
const CMaterialFilter& filter);
|
|
|
|
static bool DetectDynamicCollisionBoolean(const CCollisionPrimitive& prim, const zeus::CTransform& xf,
|
2021-06-06 16:53:41 -07:00
|
|
|
const rstl::reserved_vector<TUniqueId, kMaxEntities>& nearList,
|
2018-12-07 21:30:43 -08:00
|
|
|
const CStateManager& mgr);
|
|
|
|
static bool DetectCollision_Cached(const CStateManager& mgr, CAreaCollisionCache& cache,
|
|
|
|
const CCollisionPrimitive& prim, const zeus::CTransform& xf,
|
|
|
|
const CMaterialFilter& filter,
|
2021-06-06 16:53:41 -07:00
|
|
|
const rstl::reserved_vector<TUniqueId, kMaxEntities>& nearList, TUniqueId& idOut,
|
2018-12-07 21:30:43 -08:00
|
|
|
CCollisionInfoList& infoList);
|
|
|
|
static bool DetectCollision_Cached_Moving(const CStateManager& mgr, CAreaCollisionCache& cache,
|
|
|
|
const CCollisionPrimitive& prim, const zeus::CTransform& xf,
|
|
|
|
const CMaterialFilter& filter,
|
2021-06-06 16:53:41 -07:00
|
|
|
const rstl::reserved_vector<TUniqueId, kMaxEntities>& nearList,
|
2018-12-07 21:30:43 -08:00
|
|
|
const zeus::CVector3f& vec, TUniqueId& idOut, CCollisionInfo& infoOut,
|
|
|
|
double&);
|
|
|
|
static bool DetectStaticCollision(const CStateManager& mgr, const CCollisionPrimitive& prim,
|
|
|
|
const zeus::CTransform& xf, const CMaterialFilter& filter,
|
|
|
|
CCollisionInfoList& list);
|
|
|
|
static bool DetectStaticCollision_Cached(const CStateManager& mgr, CAreaCollisionCache& cache,
|
|
|
|
const CCollisionPrimitive& prim, const zeus::CTransform& xf,
|
|
|
|
const CMaterialFilter& filter, CCollisionInfoList& list);
|
|
|
|
static bool DetectStaticCollision_Cached_Moving(const CStateManager& mgr, CAreaCollisionCache& cache,
|
|
|
|
const CCollisionPrimitive& prim, const zeus::CTransform& xf,
|
|
|
|
const CMaterialFilter& filter, const zeus::CVector3f& vec,
|
|
|
|
CCollisionInfo& infoOut, double& d);
|
|
|
|
static bool DetectDynamicCollision(const CCollisionPrimitive& prim, const zeus::CTransform& xf,
|
2021-06-06 16:53:41 -07:00
|
|
|
const rstl::reserved_vector<TUniqueId, kMaxEntities>& nearList, TUniqueId& idOut,
|
2018-12-07 21:30:43 -08:00
|
|
|
CCollisionInfoList& list, const CStateManager& mgr);
|
|
|
|
static bool DetectDynamicCollisionMoving(const CCollisionPrimitive& prim, const zeus::CTransform& xf,
|
2021-06-06 16:53:41 -07:00
|
|
|
const rstl::reserved_vector<TUniqueId, kMaxEntities>& nearList,
|
2018-12-07 21:30:43 -08:00
|
|
|
const zeus::CVector3f& vec, TUniqueId& idOut, CCollisionInfo& infoOut,
|
|
|
|
double& d, const CStateManager& mgr);
|
2020-09-20 14:25:46 -07:00
|
|
|
static bool DetectCollision(const CStateManager& mgr, const CCollisionPrimitive& prim, const zeus::CTransform& xf,
|
2021-06-06 16:53:41 -07:00
|
|
|
const CMaterialFilter& filter, const rstl::reserved_vector<TUniqueId, kMaxEntities>& nearList,
|
2020-09-20 14:25:46 -07:00
|
|
|
TUniqueId& idOut, CCollisionInfoList& infoOut);
|
2018-12-07 21:30:43 -08:00
|
|
|
static void MakeCollisionCallbacks(CStateManager& mgr, CPhysicsActor& actor, TUniqueId id,
|
|
|
|
const CCollisionInfoList& list);
|
|
|
|
static void SendScriptMessages(CStateManager& mgr, CActor& a0, CActor* a1, const CCollisionInfoList& list);
|
|
|
|
static void ResolveCollisions(CPhysicsActor& a0, CPhysicsActor* a1, const CCollisionInfoList& list);
|
|
|
|
static void CollideWithDynamicBodyNoRot(CPhysicsActor& a0, CPhysicsActor& a1, const CCollisionInfo& info,
|
|
|
|
float restitution, bool);
|
|
|
|
static void CollideWithStaticBodyNoRot(CPhysicsActor& a0, const CMaterialList& m0, const CMaterialList& m1,
|
|
|
|
const zeus::CUnitVector3f& normal, float restitution, bool);
|
|
|
|
static void CollisionFailsafe(const CStateManager& mgr, CAreaCollisionCache& cache, CPhysicsActor& actor,
|
2021-06-06 16:53:41 -07:00
|
|
|
const CCollisionPrimitive& prim, const rstl::reserved_vector<TUniqueId, kMaxEntities>& nearList,
|
2018-12-07 21:30:43 -08:00
|
|
|
float, u32 failsafeTicks);
|
2019-06-11 19:05:17 -07:00
|
|
|
static std::optional<zeus::CVector3f>
|
2018-12-07 21:30:43 -08:00
|
|
|
FindNonIntersectingVector(const CStateManager& mgr, CAreaCollisionCache& cache, CPhysicsActor& actor,
|
2021-06-06 16:53:41 -07:00
|
|
|
const CCollisionPrimitive& prim, const rstl::reserved_vector<TUniqueId, kMaxEntities>& nearList);
|
2020-04-06 13:53:54 -07:00
|
|
|
static void AvoidStaticCollisionWithinRadius(const CStateManager& mgr, CPhysicsActor& actor, u32 iterations, float dt,
|
|
|
|
float height, float size, float mass, float radius);
|
2017-01-03 20:08:30 -08:00
|
|
|
};
|
2021-04-10 01:42:06 -07:00
|
|
|
} // namespace metaforce
|