Revamped collision system
This commit is contained in:
@@ -13,8 +13,6 @@ class SceneManager;
|
||||
enum class CollisionType : uint8_t {
|
||||
None = 0,
|
||||
Solid = 1,
|
||||
Trigger = 2,
|
||||
Platform = 3
|
||||
};
|
||||
|
||||
using CollisionMask = uint8_t;
|
||||
@@ -23,14 +21,12 @@ struct AABB {
|
||||
psyqo::Vec3 min;
|
||||
psyqo::Vec3 max;
|
||||
|
||||
// Check if this AABB intersects another
|
||||
bool intersects(const AABB& other) const {
|
||||
return (min.x <= other.max.x && max.x >= other.min.x) &&
|
||||
(min.y <= other.max.y && max.y >= other.min.y) &&
|
||||
(min.z <= other.max.z && max.z >= other.min.z);
|
||||
}
|
||||
|
||||
// Check if a point is inside this AABB
|
||||
bool contains(const psyqo::Vec3& point) const {
|
||||
return (point.x >= min.x && point.x <= max.x) &&
|
||||
(point.y >= min.y && point.y <= max.y) &&
|
||||
@@ -72,12 +68,18 @@ struct CollisionResult {
|
||||
psyqo::FixedPoint<12> penetration;
|
||||
};
|
||||
|
||||
struct TriggerBoxData {
|
||||
AABB bounds;
|
||||
int16_t luaFileIndex;
|
||||
uint16_t padding;
|
||||
};
|
||||
|
||||
struct TriggerPair {
|
||||
uint16_t triggerIndex;
|
||||
uint16_t otherIndex;
|
||||
uint8_t framesSinceContact;
|
||||
uint8_t state; // 0=new, 1=staying, 2=exiting
|
||||
uint16_t padding;
|
||||
uint8_t framesSinceContact;
|
||||
uint8_t state; // 0=new(enter), 1=active, 2=exiting
|
||||
uint16_t padding2;
|
||||
};
|
||||
|
||||
class SpatialGrid {
|
||||
@@ -109,7 +111,8 @@ private:
|
||||
class CollisionSystem {
|
||||
public:
|
||||
static constexpr int MAX_COLLIDERS = 64;
|
||||
static constexpr int MAX_TRIGGERS = 32;
|
||||
static constexpr int MAX_TRIGGER_BOXES = 32;
|
||||
static constexpr int MAX_TRIGGER_PAIRS = 32;
|
||||
static constexpr int MAX_COLLISION_RESULTS = 32;
|
||||
|
||||
CollisionSystem() = default;
|
||||
@@ -122,7 +125,11 @@ public:
|
||||
void updateCollider(uint16_t gameObjectIndex, const psyqo::Vec3& position,
|
||||
const psyqo::Matrix33& rotation);
|
||||
|
||||
int detectCollisions();
|
||||
void registerTriggerBox(const AABB& bounds, int16_t luaFileIndex);
|
||||
|
||||
int detectCollisions(const AABB& playerAABB, psyqo::Vec3& pushBack);
|
||||
|
||||
void detectTriggers(const AABB& playerAABB, class SceneManager& scene);
|
||||
|
||||
const CollisionResult* getResults() const { return m_results; }
|
||||
int getResultCount() const { return m_resultCount; }
|
||||
@@ -134,24 +141,25 @@ public:
|
||||
psyqo::Vec3& hitPoint, psyqo::Vec3& hitNormal,
|
||||
uint16_t& hitObjectIndex) const;
|
||||
|
||||
void processTriggerEvents(class SceneManager& scene);
|
||||
int getColliderCount() const { return m_colliderCount; }
|
||||
|
||||
private:
|
||||
CollisionData m_colliders[MAX_COLLIDERS];
|
||||
int m_colliderCount = 0;
|
||||
|
||||
TriggerBoxData m_triggerBoxes[MAX_TRIGGER_BOXES];
|
||||
int m_triggerBoxCount = 0;
|
||||
|
||||
SpatialGrid m_grid;
|
||||
|
||||
CollisionResult m_results[MAX_COLLISION_RESULTS];
|
||||
int m_resultCount = 0;
|
||||
|
||||
TriggerPair m_triggerPairs[MAX_TRIGGERS];
|
||||
TriggerPair m_triggerPairs[MAX_TRIGGER_PAIRS];
|
||||
int m_triggerPairCount = 0;
|
||||
|
||||
bool testAABB(const AABB& a, const AABB& b,
|
||||
psyqo::Vec3& normal, psyqo::FixedPoint<12>& penetration) const;
|
||||
void updateTriggerState(uint16_t triggerIndex, uint16_t otherIndex, bool isOverlapping);
|
||||
};
|
||||
|
||||
} // namespace psxsplash
|
||||
Reference in New Issue
Block a user