// Copyright (C) 2015 Jérôme Leclercq // This file is part of the "Nazara Engine - Physics module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_GEOM_HPP #define NAZARA_GEOM_HPP #include #include #include #include #include #include #include #include #include #include #include #include ///TODO: CollisionModifier ///TODO: HeightfieldGeom ///TODO: PlaneGeom ? ///TODO: SceneGeom ///TODO: TreeGeom class NzPhysGeom; class NzPhysWorld; struct NewtonCollision; using NzPhysGeomConstListener = NzObjectListenerWrapper; using NzPhysGeomConstRef = NzObjectRef; using NzPhysGeomLibrary = NzObjectLibrary; using NzPhysGeomListener = NzObjectListenerWrapper; using NzPhysGeomRef = NzObjectRef; class NAZARA_API NzPhysGeom : public NzRefCounted, NzNonCopyable { public: NzPhysGeom() = default; virtual ~NzPhysGeom(); NzBoxf ComputeAABB(const NzVector3f& translation, const NzQuaternionf& rotation, const NzVector3f& scale) const; virtual NzBoxf ComputeAABB(const NzMatrix4f& offsetMatrix = NzMatrix4f::Identity(), const NzVector3f& scale = NzVector3f::Unit()) const; virtual void ComputeInertialMatrix(NzVector3f* inertia, NzVector3f* center) const; virtual float ComputeVolume() const; NewtonCollision* GetHandle(NzPhysWorld* world) const; virtual nzGeomType GetType() const = 0; static NzPhysGeomRef Build(const NzPrimitiveList& list); protected: virtual NewtonCollision* CreateHandle(NzPhysWorld* world) const = 0; mutable std::unordered_map m_handles; static NzPhysGeomLibrary::LibraryMap s_library; }; class NzBoxGeom; using NzBoxGeomConstListener = NzObjectListenerWrapper; using NzBoxGeomConstRef = NzObjectRef; using NzBoxGeomListener = NzObjectListenerWrapper; using NzBoxGeomRef = NzObjectRef; class NAZARA_API NzBoxGeom : public NzPhysGeom { public: NzBoxGeom(const NzVector3f& lengths, const NzMatrix4f& transformMatrix = NzMatrix4f::Identity()); NzBoxGeom(const NzVector3f& lengths, const NzVector3f& translation, const NzQuaternionf& rotation = NzQuaternionf::Identity()); NzBoxf ComputeAABB(const NzMatrix4f& offsetMatrix = NzMatrix4f::Identity(), const NzVector3f& scale = NzVector3f::Unit()) const override; float ComputeVolume() const override; NzVector3f GetLengths() const; nzGeomType GetType() const override; template static NzBoxGeomRef New(Args&&... args); private: NewtonCollision* CreateHandle(NzPhysWorld* world) const override; NzMatrix4f m_matrix; NzVector3f m_lengths; }; class NzCapsuleGeom; using NzCapsuleGeomConstListener = NzObjectListenerWrapper; using NzCapsuleGeomConstRef = NzObjectRef; using NzCapsuleGeomListener = NzObjectListenerWrapper; using NzCapsuleGeomRef = NzObjectRef; class NAZARA_API NzCapsuleGeom : public NzPhysGeom { public: NzCapsuleGeom(float length, float radius, const NzMatrix4f& transformMatrix = NzMatrix4f::Identity()); NzCapsuleGeom(float length, float radius, const NzVector3f& translation, const NzQuaternionf& rotation = NzQuaternionf::Identity()); float GetLength() const; float GetRadius() const; nzGeomType GetType() const override; template static NzCapsuleGeomRef New(Args&&... args); private: NewtonCollision* CreateHandle(NzPhysWorld* world) const override; NzMatrix4f m_matrix; float m_length; float m_radius; }; class NzCompoundGeom; using NzCompoundGeomConstListener = NzObjectListenerWrapper; using NzCompoundGeomConstRef = NzObjectRef; using NzCompoundGeomListener = NzObjectListenerWrapper; using NzCompoundGeomRef = NzObjectRef; class NAZARA_API NzCompoundGeom : public NzPhysGeom { public: NzCompoundGeom(NzPhysGeom** geoms, unsigned int geomCount); const std::vector& GetGeoms() const; nzGeomType GetType() const override; template static NzCompoundGeomRef New(Args&&... args); private: NewtonCollision* CreateHandle(NzPhysWorld* world) const override; std::vector m_geoms; }; class NzConeGeom; using NzConeGeomConstListener = NzObjectListenerWrapper; using NzConeGeomConstRef = NzObjectRef; using NzConeGeomListener = NzObjectListenerWrapper; using NzConeGeomRef = NzObjectRef; class NAZARA_API NzConeGeom : public NzPhysGeom { public: NzConeGeom(float length, float radius, const NzMatrix4f& transformMatrix = NzMatrix4f::Identity()); NzConeGeom(float length, float radius, const NzVector3f& translation, const NzQuaternionf& rotation = NzQuaternionf::Identity()); float GetLength() const; float GetRadius() const; nzGeomType GetType() const override; template static NzConeGeomRef New(Args&&... args); private: NewtonCollision* CreateHandle(NzPhysWorld* world) const override; NzMatrix4f m_matrix; float m_length; float m_radius; }; class NzConvexHullGeom; using NzConvexHullGeomConstListener = NzObjectListenerWrapper; using NzConvexHullGeomConstRef = NzObjectRef; using NzConvexHullGeomListener = NzObjectListenerWrapper; using NzConvexHullGeomRef = NzObjectRef; class NAZARA_API NzConvexHullGeom : public NzPhysGeom { public: NzConvexHullGeom(const void* vertices, unsigned int vertexCount, unsigned int stride = sizeof(NzVector3f), float tolerance = 0.002f, const NzMatrix4f& transformMatrix = NzMatrix4f::Identity()); NzConvexHullGeom(const void* vertices, unsigned int vertexCount, unsigned int stride, float tolerance, const NzVector3f& translation, const NzQuaternionf& rotation = NzQuaternionf::Identity()); nzGeomType GetType() const override; template static NzConvexHullGeomRef New(Args&&... args); private: NewtonCollision* CreateHandle(NzPhysWorld* world) const override; std::vector m_vertices; NzMatrix4f m_matrix; float m_tolerance; unsigned int m_vertexStride; }; class NzCylinderGeom; using NzCylinderGeomConstListener = NzObjectListenerWrapper; using NzCylinderGeomConstRef = NzObjectRef; using NzCylinderGeomListener = NzObjectListenerWrapper; using NzCylinderGeomRef = NzObjectRef; class NAZARA_API NzCylinderGeom : public NzPhysGeom { public: NzCylinderGeom(float length, float radius, const NzMatrix4f& transformMatrix = NzMatrix4f::Identity()); NzCylinderGeom(float length, float radius, const NzVector3f& translation, const NzQuaternionf& rotation = NzQuaternionf::Identity()); float GetLength() const; float GetRadius() const; nzGeomType GetType() const override; template static NzCylinderGeomRef New(Args&&... args); private: NewtonCollision* CreateHandle(NzPhysWorld* world) const override; NzMatrix4f m_matrix; float m_length; float m_radius; }; class NzNullGeom; using NzNullGeomConstListener = NzObjectListenerWrapper; using NzNullGeomConstRef = NzObjectRef; using NzNullGeomListener = NzObjectListenerWrapper; using NzNullGeomRef = NzObjectRef; class NAZARA_API NzNullGeom : public NzPhysGeom { public: NzNullGeom(); nzGeomType GetType() const override; template static NzNullGeomRef New(Args&&... args); private: NewtonCollision* CreateHandle(NzPhysWorld* world) const override; }; class NzSphereGeom; using NzSphereGeomConstListener = NzObjectListenerWrapper; using NzSphereGeomConstRef = NzObjectRef; using NzSphereGeomListener = NzObjectListenerWrapper; using NzSphereGeomRef = NzObjectRef; class NAZARA_API NzSphereGeom : public NzPhysGeom { public: NzSphereGeom(float radius, const NzMatrix4f& transformMatrix = NzMatrix4f::Identity()); NzSphereGeom(float radius, const NzVector3f& translation, const NzQuaternionf& rotation = NzQuaternionf::Identity()); NzBoxf ComputeAABB(const NzMatrix4f& offsetMatrix = NzMatrix4f::Identity(), const NzVector3f& scale = NzVector3f::Unit()) const override; float ComputeVolume() const override; float GetRadius() const; nzGeomType GetType() const override; template static NzSphereGeomRef New(Args&&... args); private: NewtonCollision* CreateHandle(NzPhysWorld* world) const override; NzVector3f m_position; float m_radius; }; #include #endif // NAZARA_PHYSWORLD_HPP