// Copyright (C) 2015 Jérôme Leclercq // This file is part of the "Nazara Engine - Physics 2D module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_COLLIDER2D_HPP #define NAZARA_COLLIDER2D_HPP #include #include #include #include #include #include #include #include #include struct cpShape; struct cpSpace; namespace Nz { class Collider2D; class RigidBody2D; using Collider2DConstRef = ObjectRef; using Collider2DLibrary = ObjectLibrary; using Collider2DRef = ObjectRef; class NAZARA_PHYSICS2D_API Collider2D : public RefCounted { friend Collider2DLibrary; friend RigidBody2D; public: Collider2D() = default; Collider2D(const Collider2D&) = delete; Collider2D(Collider2D&&) = delete; virtual ~Collider2D(); virtual float ComputeInertialMatrix(float mass) const = 0; virtual ColliderType2D GetType() const = 0; Collider2D& operator=(const Collider2D&) = delete; Collider2D& operator=(Collider2D&&) = delete; // Signals: NazaraSignal(OnColliderRelease, const Collider2D* /*collider*/); protected: virtual std::vector CreateShapes(RigidBody2D* body) const = 0; static Collider2DLibrary::LibraryMap s_library; }; class BoxCollider2D; using BoxCollider2DConstRef = ObjectRef; using BoxCollider2DRef = ObjectRef; class NAZARA_PHYSICS2D_API BoxCollider2D : public Collider2D { public: BoxCollider2D(const Vector2f& size, float radius = 0.f); BoxCollider2D(const Rectf& rect, float radius = 0.f); float ComputeInertialMatrix(float mass) const override; inline const Rectf& GetRect() const; inline Vector2f GetSize() const; ColliderType2D GetType() const override; template static BoxCollider2DRef New(Args&&... args); private: std::vector CreateShapes(RigidBody2D* body) const override; Rectf m_rect; float m_radius; }; class CircleCollider2D; using CircleCollider2DConstRef = ObjectRef; using CircleCollider2DRef = ObjectRef; class NAZARA_PHYSICS2D_API CircleCollider2D : public Collider2D { public: CircleCollider2D(float radius, const Vector2f& offset = Vector2f::Zero()); float ComputeInertialMatrix(float mass) const override; inline float GetRadius() const; ColliderType2D GetType() const override; template static CircleCollider2DRef New(Args&&... args); private: std::vector CreateShapes(RigidBody2D* body) const override; Vector2f m_offset; float m_radius; }; class NullCollider2D; using NullCollider2DConstRef = ObjectRef; using NullCollider2DRef = ObjectRef; class NAZARA_PHYSICS2D_API NullCollider2D : public Collider2D { public: NullCollider2D() = default; float ComputeInertialMatrix(float mass) const override; ColliderType2D GetType() const override; template static NullCollider2DRef New(Args&&... args); private: std::vector CreateShapes(RigidBody2D* body) const override; }; class SegmentCollider2D; using SegmentCollider2DConstRef = ObjectRef; using SegmentCollider2DRef = ObjectRef; class NAZARA_PHYSICS2D_API SegmentCollider2D : public Collider2D { public: inline SegmentCollider2D(const Vector2f& first, const Vector2f& second, float thickness = 1.f); float ComputeInertialMatrix(float mass) const override; inline const Vector2f& GetFirstPoint() const; inline float GetLength() const; inline const Vector2f& GetSecondPoint() const; ColliderType2D GetType() const override; template static SegmentCollider2DRef New(Args&&... args); private: std::vector CreateShapes(RigidBody2D* body) const override; Vector2f m_first; Vector2f m_second; float m_thickness; }; } #include #endif // NAZARA_COLLIDER2D_HPP