diff --git a/examples/Particles/main.cpp b/examples/Particles/main.cpp index 5329a371d..ede9ed14e 100644 --- a/examples/Particles/main.cpp +++ b/examples/Particles/main.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/examples/PhysicsDemo/main.cpp b/examples/PhysicsDemo/main.cpp index c859be5a9..a88a12b31 100644 --- a/examples/PhysicsDemo/main.cpp +++ b/examples/PhysicsDemo/main.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include #include #include @@ -20,14 +20,14 @@ int main() if (!std::filesystem::is_directory(resourceDir) && std::filesystem::is_directory("../.." / resourceDir)) resourceDir = "../.." / resourceDir; - Nz::Application app; + Nz::Application app; auto& windowing = app.AddComponent(); auto& ecs = app.AddComponent(); auto& world = ecs.AddWorld(); - Nz::Physics3DSystem& physSytem = world.AddSystem(); + Nz::BulletPhysics3DSystem& physSytem = world.AddSystem(); physSytem.GetPhysWorld().SetGravity(Nz::Vector3f::Zero()); Nz::RenderSystem& renderSystem = world.AddSystem(); @@ -140,7 +140,7 @@ int main() auto& entityNode = playerEntity.emplace(); entityNode.SetPosition(Nz::Vector3f(12.5f, 0.f, 25.f)); - auto& entityPhys = playerEntity.emplace(physSytem.CreateRigidBody(shipCollider)); + auto& entityPhys = playerEntity.emplace(physSytem.CreateRigidBody(shipCollider)); entityPhys.SetMass(50.f); entityPhys.SetAngularDamping(0.1f); entityPhys.SetLinearDamping(0.5f); @@ -179,7 +179,7 @@ int main() entityNode.SetPosition(Nz::Vector3f(x * 2.f, y * 1.5f, z * 2.f)); entityNode.SetRotation(Nz::EulerAnglesf(0.f, Nz::TurnAnglef(0.5f), 0.f)); - auto& entityPhys = entity.emplace(physSytem.CreateRigidBody(shipCollider)); + auto& entityPhys = entity.emplace(physSytem.CreateRigidBody(shipCollider)); entityPhys.SetMass(1.f); entityPhys.SetAngularDamping(0.f); entityPhys.SetLinearDamping(0.f); @@ -214,13 +214,13 @@ int main() showColliders = !showColliders; if (showColliders) { - auto view = world.GetRegistry().view(); + auto view = world.GetRegistry().view(); for (auto [entity, gfxComponent, _] : view.each()) gfxComponent.AttachRenderable(colliderModel, 1); } else { - auto view = world.GetRegistry().view(); + auto view = world.GetRegistry().view(); for (auto [entity, gfxComponent, _] : view.each()) gfxComponent.DetachRenderable(colliderModel); } @@ -235,7 +235,7 @@ int main() entity.emplace(); - auto& entityPhys = entity.emplace(physSytem.CreateRigidBody(shipCollider)); + auto& entityPhys = entity.emplace(physSytem.CreateRigidBody(shipCollider)); entityPhys.SetMass(1.f); entityPhys.SetAngularDamping(0.f); entityPhys.SetLinearDamping(0.f); @@ -262,7 +262,7 @@ int main() { float elapsedTime = deltaTime->AsSeconds(); - auto spaceshipView = world.GetRegistry().view(); + auto spaceshipView = world.GetRegistry().view(); for (auto&& [entity, node, _] : spaceshipView.each()) { if (entity == playerEntity) @@ -273,7 +273,7 @@ int main() world.GetRegistry().destroy(entity); } - Nz::RigidBody3DComponent& playerShipBody = playerEntity.get(); + Nz::BulletRigidBody3DComponent& playerShipBody = playerEntity.get(); Nz::Quaternionf currentRotation = playerShipBody.GetRotation(); Nz::Vector3f desiredHeading = headingEntity.get().GetForward(); diff --git a/examples/PhysicsDemo/xmake.lua b/examples/PhysicsDemo/xmake.lua index ed19da755..356c7d89b 100644 --- a/examples/PhysicsDemo/xmake.lua +++ b/examples/PhysicsDemo/xmake.lua @@ -1,5 +1,5 @@ target("PhysicsDemo") - add_deps("NazaraGraphics", "NazaraPhysics3D") + add_deps("NazaraGraphics", "NazaraBulletPhysics3D") add_packages("entt") add_files("main.cpp") add_defines("NAZARA_ENTT") diff --git a/examples/Showcase/main.cpp b/examples/Showcase/main.cpp index 08f4d664c..140beb8c9 100644 --- a/examples/Showcase/main.cpp +++ b/examples/Showcase/main.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include #include #include @@ -30,7 +30,8 @@ int main() auto& world = ecs.AddWorld(); world.AddSystem(); - Nz::Physics3DSystem& physSytem = world.AddSystem(); + Nz::BulletPhysics3DSystem& physSytem = world.AddSystem(); + physSytem.GetPhysWorld().SetGravity(Nz::Vector3f::Zero()); Nz::RenderSystem& renderSystem = world.AddSystem(); auto& windowing = app.AddComponent(); @@ -59,7 +60,7 @@ int main() auto playerCollider = std::make_shared(Nz::Vector3f(0.2f, 1.8f, 0.2f)); - auto& playerBody = playerEntity.emplace(physSytem.CreateRigidBody(playerCollider)); + auto& playerBody = playerEntity.emplace(physSytem.CreateRigidBody(playerCollider)); playerBody.SetMass(42.f); std::shared_ptr colliderMesh = Nz::Mesh::Build(playerCollider->GenerateMesh()); @@ -240,6 +241,9 @@ int main() sphereNode.SetInheritScale(false); sphereNode.SetParentJoint(bobEntity, "RightHand"); + auto& sphereBody = sphereEntity.emplace(&physSytem.GetPhysWorld()); + sphereBody.SetGeom(std::make_shared(0.1f)); + auto& sphereGfx = sphereEntity.emplace(); sphereGfx.AttachRenderable(sphereModel); } @@ -331,8 +335,8 @@ int main() floorEntity.emplace(); - auto& planeBody = floorEntity.emplace(&physSytem.GetPhysWorld()); - planeBody.SetGeom(std::make_shared(Nz::Vector3f(planeSize.x, 0.5f, planeSize.y), Nz::Vector3f(0.f, -0.25f, 0.f))); + auto& planeBody = planeEntity.emplace(&physSytem.GetPhysWorld()); + planeBody.SetGeom(std::make_shared(Nz::Vector3f(planeSize.x, 0.5f, planeSize.y))); std::shared_ptr boxMeshGfx = Nz::GraphicalMesh::Build(Nz::Primitive::Box(Nz::Vector3f(0.5f, 0.5f, 0.5f)), meshPrimitiveParams); diff --git a/examples/Showcase/xmake.lua b/examples/Showcase/xmake.lua index 294193c68..61dff77a6 100644 --- a/examples/Showcase/xmake.lua +++ b/examples/Showcase/xmake.lua @@ -5,7 +5,7 @@ end target("Showcase") set_group("Examples") set_kind("binary") - add_deps("NazaraAudio", "NazaraGraphics", "NazaraPhysics2D", "NazaraPhysics3D", "NazaraWidgets") + add_deps("NazaraAudio", "NazaraGraphics", "NazaraPhysics2D", "NazaraBulletPhysics3D", "NazaraWidgets") if has_config("embed_plugins") then add_deps("PluginAssimp") else diff --git a/examples/Tut00/main.cpp b/examples/Tut00/main.cpp index 0edf08690..ed1817fbf 100644 --- a/examples/Tut00/main.cpp +++ b/examples/Tut00/main.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include #include @@ -12,7 +12,7 @@ int main(int argc, char* argv[]) { // This "example" has only one purpose: Giving an empty project for you to test whatever you want // If you wish to have multiple test projects, you only have to copy/paste this directory and change the name in the xmake.lua - Nz::Application app; + Nz::Application app; return EXIT_SUCCESS; } diff --git a/examples/Tut00/xmake.lua b/examples/Tut00/xmake.lua index 0a5322b56..7d4d4f16c 100644 --- a/examples/Tut00/xmake.lua +++ b/examples/Tut00/xmake.lua @@ -1,3 +1,3 @@ target("Tut00_EmptyProject") - add_deps("NazaraAudio", "NazaraGraphics", "NazaraNetwork", "NazaraPhysics2D", "NazaraPhysics3D", "NazaraRenderer", "NazaraUtility") + add_deps("NazaraAudio", "NazaraGraphics", "NazaraNetwork", "NazaraPhysics2D", "NazaraBulletPhysics3D", "NazaraRenderer", "NazaraUtility") add_files("main.cpp") diff --git a/include/Nazara/Physics3D.hpp b/include/Nazara/BulletPhysics3D.hpp similarity index 72% rename from include/Nazara/Physics3D.hpp rename to include/Nazara/BulletPhysics3D.hpp index 28340548a..1096362c2 100644 --- a/include/Nazara/Physics3D.hpp +++ b/include/Nazara/BulletPhysics3D.hpp @@ -1,7 +1,7 @@ // this file was automatically generated and should not be edited /* - Nazara Engine - Physics3D module + Nazara Engine - BulletPhysics3D module Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) @@ -29,18 +29,18 @@ #ifndef NAZARA_GLOBAL_PHYSICS3D_HPP #define NAZARA_GLOBAL_PHYSICS3D_HPP -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #ifdef NAZARA_ENTT -#include -#include +#include +#include #endif diff --git a/include/Nazara/Physics3D/Collider3D.hpp b/include/Nazara/BulletPhysics3D/BulletCollider3D.hpp similarity index 75% rename from include/Nazara/Physics3D/Collider3D.hpp rename to include/Nazara/BulletPhysics3D/BulletCollider3D.hpp index aed30628e..c918c045f 100644 --- a/include/Nazara/Physics3D/Collider3D.hpp +++ b/include/Nazara/BulletPhysics3D/BulletCollider3D.hpp @@ -1,22 +1,22 @@ // Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" +// This file is part of the "Nazara Engine - BulletPhysics3D module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once -#ifndef NAZARA_PHYSICS3D_COLLIDER3D_HPP -#define NAZARA_PHYSICS3D_COLLIDER3D_HPP +#ifndef NAZARA_BULLETPHYSICS3D_BULLETCOLLIDER3D_HPP +#define NAZARA_BULLETPHYSICS3D_BULLETCOLLIDER3D_HPP #include +#include +#include #include #include #include #include -#include -#include #include #include -#include +#include class btBoxShape; class btCapsuleShape; @@ -34,13 +34,13 @@ namespace Nz class StaticMesh; struct Primitive; - class NAZARA_PHYSICS3D_API Collider3D + class NAZARA_BULLETPHYSICS3D_API BulletCollider3D { public: - Collider3D() = default; - Collider3D(const Collider3D&) = delete; - Collider3D(Collider3D&&) = delete; - virtual ~Collider3D(); + BulletCollider3D() = default; + BulletCollider3D(const BulletCollider3D&) = delete; + BulletCollider3D(BulletCollider3D&&) = delete; + virtual ~BulletCollider3D(); virtual void BuildDebugMesh(std::vector& vertices, std::vector& indices, const Matrix4f& offsetMatrix = Matrix4f::Identity()) const = 0; @@ -53,16 +53,16 @@ namespace Nz virtual btCollisionShape* GetShape() const = 0; virtual ColliderType3D GetType() const = 0; - Collider3D& operator=(const Collider3D&) = delete; - Collider3D& operator=(Collider3D&&) = delete; + BulletCollider3D& operator=(const BulletCollider3D&) = delete; + BulletCollider3D& operator=(BulletCollider3D&&) = delete; - static std::shared_ptr Build(const PrimitiveList& list); + static std::shared_ptr Build(const PrimitiveList& list); private: - static std::shared_ptr CreateGeomFromPrimitive(const Primitive& primitive); + static std::shared_ptr CreateGeomFromPrimitive(const Primitive& primitive); }; - class NAZARA_PHYSICS3D_API BoxCollider3D final : public Collider3D + class NAZARA_BULLETPHYSICS3D_API BoxCollider3D final : public BulletCollider3D { public: BoxCollider3D(const Vector3f& lengths); @@ -79,7 +79,7 @@ namespace Nz Vector3f m_lengths; }; - class NAZARA_PHYSICS3D_API CapsuleCollider3D final : public Collider3D + class NAZARA_BULLETPHYSICS3D_API CapsuleCollider3D final : public BulletCollider3D { public: CapsuleCollider3D(float length, float radius); @@ -98,7 +98,7 @@ namespace Nz float m_radius; }; - class NAZARA_PHYSICS3D_API CompoundCollider3D final : public Collider3D + class NAZARA_BULLETPHYSICS3D_API CompoundCollider3D final : public BulletCollider3D { public: struct ChildCollider; @@ -114,7 +114,7 @@ namespace Nz struct ChildCollider { - std::shared_ptr collider; + std::shared_ptr collider; Matrix4f offsetMatrix; }; @@ -123,7 +123,7 @@ namespace Nz std::vector m_childs; }; - class NAZARA_PHYSICS3D_API ConeCollider3D final : public Collider3D + class NAZARA_BULLETPHYSICS3D_API ConeCollider3D final : public BulletCollider3D { public: ConeCollider3D(float length, float radius); @@ -142,7 +142,7 @@ namespace Nz float m_radius; }; - class NAZARA_PHYSICS3D_API ConvexCollider3D final : public Collider3D + class NAZARA_BULLETPHYSICS3D_API ConvexCollider3D final : public BulletCollider3D { public: ConvexCollider3D(SparsePtr vertices, unsigned int vertexCount); @@ -157,7 +157,7 @@ namespace Nz std::unique_ptr m_shape; }; - class NAZARA_PHYSICS3D_API CylinderCollider3D final : public Collider3D + class NAZARA_BULLETPHYSICS3D_API CylinderCollider3D final : public BulletCollider3D { public: CylinderCollider3D(float length, float radius); @@ -177,7 +177,7 @@ namespace Nz float m_radius; }; - class NAZARA_PHYSICS3D_API NullCollider3D final : public Collider3D + class NAZARA_BULLETPHYSICS3D_API NullCollider3D final : public BulletCollider3D { public: NullCollider3D(); @@ -194,7 +194,7 @@ namespace Nz std::unique_ptr m_shape; }; - class NAZARA_PHYSICS3D_API SphereCollider3D final : public Collider3D + class NAZARA_BULLETPHYSICS3D_API SphereCollider3D final : public BulletCollider3D { public: SphereCollider3D(float radius); @@ -213,6 +213,6 @@ namespace Nz }; } -#include +#include -#endif // NAZARA_PHYSICS3D_COLLIDER3D_HPP +#endif // NAZARA_BULLETPHYSICS3D_BULLETCOLLIDER3D_HPP diff --git a/include/Nazara/Physics3D/Collider3D.inl b/include/Nazara/BulletPhysics3D/BulletCollider3D.inl similarity index 53% rename from include/Nazara/Physics3D/Collider3D.inl rename to include/Nazara/BulletPhysics3D/BulletCollider3D.inl index 1b4e1276a..c609c27c4 100644 --- a/include/Nazara/Physics3D/Collider3D.inl +++ b/include/Nazara/BulletPhysics3D/BulletCollider3D.inl @@ -1,12 +1,12 @@ // Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" +// This file is part of the "Nazara Engine - BulletPhysics3D module" // For conditions of distribution and use, see copyright notice in Config.hpp #include -#include +#include namespace Nz { } -#include +#include diff --git a/include/Nazara/BulletPhysics3D/BulletConstraint3D.hpp b/include/Nazara/BulletPhysics3D/BulletConstraint3D.hpp new file mode 100644 index 000000000..d5afbe889 --- /dev/null +++ b/include/Nazara/BulletPhysics3D/BulletConstraint3D.hpp @@ -0,0 +1,74 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - BulletPhysics3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_BULLETPHYSICS3D_BULLETCONSTRAINT3D_HPP +#define NAZARA_BULLETPHYSICS3D_BULLETCONSTRAINT3D_HPP + +#include +#include +#include +#include +#include +#include + +class btTypedConstraint; + +namespace Nz +{ + class BulletConstraint3D; + + using BulletConstraint3DHandle = ObjectHandle; + + class NAZARA_BULLETPHYSICS3D_API BulletConstraint3D : public HandledObject + { + public: + BulletConstraint3D(const BulletConstraint3D&) = delete; + BulletConstraint3D(BulletConstraint3D&& constraint) noexcept; + virtual ~BulletConstraint3D(); + + BulletRigidBody3D& GetBodyA(); + const BulletRigidBody3D& GetBodyA() const; + BulletRigidBody3D& GetBodyB(); + const BulletRigidBody3D& GetBodyB() const; + BulletPhysWorld3D& GetWorld(); + const BulletPhysWorld3D& GetWorld() const; + + inline bool IsBodyCollisionEnabled() const; + bool IsSingleBody() const; + + BulletConstraint3D& operator=(const BulletConstraint3D&) = delete; + BulletConstraint3D& operator=(BulletConstraint3D&& constraint) noexcept; + + protected: + BulletConstraint3D(std::unique_ptr constraint, bool disableCollisions = false); + + template T* GetConstraint(); + template const T* GetConstraint() const; + + private: + std::unique_ptr m_constraint; + bool m_bodyCollisionEnabled; + }; + + class NAZARA_BULLETPHYSICS3D_API BulletPivotConstraint3D : public BulletConstraint3D + { + public: + BulletPivotConstraint3D(BulletRigidBody3D& first, const Vector3f& pivot); + BulletPivotConstraint3D(BulletRigidBody3D& first, BulletRigidBody3D& second, const Vector3f& pivot, bool disableCollisions = false); + BulletPivotConstraint3D(BulletRigidBody3D& first, BulletRigidBody3D& second, const Vector3f& firstAnchor, const Vector3f& secondAnchor, bool disableCollisions = false); + ~BulletPivotConstraint3D() = default; + + Vector3f GetFirstAnchor() const; + Vector3f GetSecondAnchor() const; + + void SetFirstAnchor(const Vector3f& firstAnchor); + void SetSecondAnchor(const Vector3f& secondAnchor); + }; +} + +#include + +#endif // NAZARA_BULLETPHYSICS3D_BULLETCONSTRAINT3D_HPP diff --git a/include/Nazara/BulletPhysics3D/BulletConstraint3D.inl b/include/Nazara/BulletPhysics3D/BulletConstraint3D.inl new file mode 100644 index 000000000..0500dc611 --- /dev/null +++ b/include/Nazara/BulletPhysics3D/BulletConstraint3D.inl @@ -0,0 +1,27 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - BulletPhysics3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include + +namespace Nz +{ + inline bool BulletConstraint3D::IsBodyCollisionEnabled() const + { + return m_bodyCollisionEnabled; + } + + template + T* BulletConstraint3D::GetConstraint() + { + return SafeCast(m_constraint.get()); + } + + template + const T* BulletConstraint3D::GetConstraint() const + { + return SafeCast(m_constraint.get()); + } +} + +#include diff --git a/include/Nazara/Physics3D/PhysWorld3D.hpp b/include/Nazara/BulletPhysics3D/BulletPhysWorld3D.hpp similarity index 65% rename from include/Nazara/Physics3D/PhysWorld3D.hpp rename to include/Nazara/BulletPhysics3D/BulletPhysWorld3D.hpp index d0866d044..6ae12f812 100644 --- a/include/Nazara/Physics3D/PhysWorld3D.hpp +++ b/include/Nazara/BulletPhysics3D/BulletPhysWorld3D.hpp @@ -1,17 +1,17 @@ // Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" +// This file is part of the "Nazara Engine - BulletPhysics3D module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once -#ifndef NAZARA_PHYSICS3D_PHYSWORLD3D_HPP -#define NAZARA_PHYSICS3D_PHYSWORLD3D_HPP +#ifndef NAZARA_BULLETPHYSICS3D_BULLETPHYSWORLD3D_HPP +#define NAZARA_BULLETPHYSICS3D_BULLETPHYSWORLD3D_HPP #include +#include #include #include #include -#include #include #include @@ -20,19 +20,19 @@ class btRigidBody; namespace Nz { - class RigidBody3D; + class BulletRigidBody3D; - class NAZARA_PHYSICS3D_API PhysWorld3D + class NAZARA_BULLETPHYSICS3D_API BulletPhysWorld3D { - friend RigidBody3D; + friend BulletRigidBody3D; public: struct RaycastHit; - PhysWorld3D(); - PhysWorld3D(const PhysWorld3D&) = delete; - PhysWorld3D(PhysWorld3D&& ph) = delete; - ~PhysWorld3D(); + BulletPhysWorld3D(); + BulletPhysWorld3D(const BulletPhysWorld3D&) = delete; + BulletPhysWorld3D(BulletPhysWorld3D&& ph) = delete; + ~BulletPhysWorld3D(); btDynamicsWorld* GetDynamicsWorld(); Vector3f GetGravity() const; @@ -47,13 +47,13 @@ namespace Nz void Step(Time timestep); - PhysWorld3D& operator=(const PhysWorld3D&) = delete; - PhysWorld3D& operator=(PhysWorld3D&&) = delete; + BulletPhysWorld3D& operator=(const BulletPhysWorld3D&) = delete; + BulletPhysWorld3D& operator=(BulletPhysWorld3D&&) = delete; struct RaycastHit { float fraction; - RigidBody3D* hitBody = nullptr; + BulletRigidBody3D* hitBody = nullptr; Vector3f hitPosition; Vector3f hitNormal; }; @@ -72,4 +72,4 @@ namespace Nz }; } -#endif // NAZARA_PHYSICS3D_PHYSWORLD3D_HPP +#endif // NAZARA_BULLETPHYSICS3D_BULLETPHYSWORLD3D_HPP diff --git a/include/Nazara/BulletPhysics3D/BulletPhysics3D.hpp b/include/Nazara/BulletPhysics3D/BulletPhysics3D.hpp new file mode 100644 index 000000000..14d96eb97 --- /dev/null +++ b/include/Nazara/BulletPhysics3D/BulletPhysics3D.hpp @@ -0,0 +1,33 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - BulletPhysics3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_BULLETPHYSICS3D_HPP +#define NAZARA_BULLETPHYSICS3D_HPP + +#include +#include +#include + +namespace Nz +{ + class NAZARA_BULLETPHYSICS3D_API BulletPhysics3D : public ModuleBase + { + friend ModuleBase; + + public: + using Dependencies = TypeList; + + struct Config {}; + + BulletPhysics3D(Config /*config*/); + ~BulletPhysics3D() = default; + + private: + static BulletPhysics3D* s_instance; + }; +} + +#endif // NAZARA_BULLETPHYSICS3D_HPP diff --git a/include/Nazara/Physics3D/RigidBody3D.hpp b/include/Nazara/BulletPhysics3D/BulletRigidBody3D.hpp similarity index 62% rename from include/Nazara/Physics3D/RigidBody3D.hpp rename to include/Nazara/BulletPhysics3D/BulletRigidBody3D.hpp index 09a5bd78f..9f053673e 100644 --- a/include/Nazara/Physics3D/RigidBody3D.hpp +++ b/include/Nazara/BulletPhysics3D/BulletRigidBody3D.hpp @@ -1,35 +1,35 @@ // Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" +// This file is part of the "Nazara Engine - BulletPhysics3D module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once -#ifndef NAZARA_PHYSICS3D_RIGIDBODY3D_HPP -#define NAZARA_PHYSICS3D_RIGIDBODY3D_HPP +#ifndef NAZARA_BULLETPHYSICS3D_BULLETRIGIDBODY3D_HPP +#define NAZARA_BULLETPHYSICS3D_BULLETRIGIDBODY3D_HPP #include +#include +#include #include #include #include #include -#include -#include #include class btRigidBody; namespace Nz { - class PhysWorld3D; + class BulletPhysWorld3D; - class NAZARA_PHYSICS3D_API RigidBody3D + class NAZARA_BULLETPHYSICS3D_API BulletRigidBody3D { public: - RigidBody3D(PhysWorld3D* world, const Matrix4f& mat = Matrix4f::Identity()); - RigidBody3D(PhysWorld3D* world, std::shared_ptr geom, const Matrix4f& mat = Matrix4f::Identity()); - RigidBody3D(const RigidBody3D& object) = delete; - RigidBody3D(RigidBody3D&& object) noexcept; - ~RigidBody3D(); + BulletRigidBody3D(BulletPhysWorld3D* world, const Matrix4f& mat = Matrix4f::Identity()); + BulletRigidBody3D(BulletPhysWorld3D* world, std::shared_ptr geom, const Matrix4f& mat = Matrix4f::Identity()); + BulletRigidBody3D(const BulletRigidBody3D& object) = delete; + BulletRigidBody3D(BulletRigidBody3D&& object) noexcept; + ~BulletRigidBody3D(); void AddForce(const Vector3f& force, CoordSys coordSys = CoordSys::Global); void AddForce(const Vector3f& force, const Vector3f& point, CoordSys coordSys = CoordSys::Global); @@ -43,7 +43,7 @@ namespace Nz Boxf GetAABB() const; float GetAngularDamping() const; Vector3f GetAngularVelocity() const; - inline const std::shared_ptr& GetGeom() const; + inline const std::shared_ptr& GetGeom() const; float GetLinearDamping() const; Vector3f GetLinearVelocity() const; float GetMass() const; @@ -53,7 +53,7 @@ namespace Nz inline btRigidBody* GetRigidBody() const; Quaternionf GetRotation() const; inline std::size_t GetUniqueIndex() const; - inline PhysWorld3D* GetWorld() const; + inline BulletPhysWorld3D* GetWorld() const; bool IsSimulationEnabled() const; bool IsSleeping() const; @@ -61,7 +61,7 @@ namespace Nz void SetAngularDamping(float angularDamping); void SetAngularVelocity(const Vector3f& angularVelocity); - void SetGeom(std::shared_ptr geom, bool recomputeInertia = true); + void SetGeom(std::shared_ptr geom, bool recomputeInertia = true); void SetLinearDamping(float damping); void SetLinearVelocity(const Vector3f& velocity); void SetMass(float mass); @@ -76,20 +76,20 @@ namespace Nz void WakeUp(); - RigidBody3D& operator=(const RigidBody3D& object) = delete; - RigidBody3D& operator=(RigidBody3D&& object) noexcept; + BulletRigidBody3D& operator=(const BulletRigidBody3D& object) = delete; + BulletRigidBody3D& operator=(BulletRigidBody3D&& object) noexcept; protected: void Destroy(); private: - std::shared_ptr m_geom; + std::shared_ptr m_geom; std::size_t m_bodyPoolIndex; btRigidBody* m_body; - PhysWorld3D* m_world; + BulletPhysWorld3D* m_world; }; } -#include +#include -#endif // NAZARA_PHYSICS3D_RIGIDBODY3D_HPP +#endif // NAZARA_BULLETPHYSICS3D_BULLETRIGIDBODY3D_HPP diff --git a/include/Nazara/BulletPhysics3D/BulletRigidBody3D.inl b/include/Nazara/BulletPhysics3D/BulletRigidBody3D.inl new file mode 100644 index 000000000..3671aecb5 --- /dev/null +++ b/include/Nazara/BulletPhysics3D/BulletRigidBody3D.inl @@ -0,0 +1,34 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - BulletPhysics3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include + +namespace Nz +{ + inline void BulletRigidBody3D::DisableSleeping() + { + return EnableSleeping(false); + } + + inline const std::shared_ptr& BulletRigidBody3D::GetGeom() const + { + return m_geom; + } + + inline btRigidBody* BulletRigidBody3D::GetRigidBody() const + { + return m_body; + } + inline std::size_t BulletRigidBody3D::GetUniqueIndex() const + { + return m_bodyPoolIndex; + } + + inline BulletPhysWorld3D* BulletRigidBody3D::GetWorld() const + { + return m_world; + } +} + +#include diff --git a/include/Nazara/Physics3D/Components.hpp b/include/Nazara/BulletPhysics3D/Components.hpp similarity index 82% rename from include/Nazara/Physics3D/Components.hpp rename to include/Nazara/BulletPhysics3D/Components.hpp index 5adfe5173..6c6aad2ad 100644 --- a/include/Nazara/Physics3D/Components.hpp +++ b/include/Nazara/BulletPhysics3D/Components.hpp @@ -1,7 +1,7 @@ // this file was automatically generated and should not be edited /* - Nazara Engine - Physics3D module + Nazara Engine - BulletPhysics3D module Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) @@ -26,9 +26,9 @@ #pragma once -#ifndef NAZARA_PHYSICS3D_COMPONENTS_HPP -#define NAZARA_PHYSICS3D_COMPONENTS_HPP +#ifndef NAZARA_BULLETPHYSICS3D_COMPONENTS_HPP +#define NAZARA_BULLETPHYSICS3D_COMPONENTS_HPP -#include +#include -#endif // NAZARA_PHYSICS3D_COMPONENTS_HPP +#endif // NAZARA_BULLETPHYSICS3D_COMPONENTS_HPP diff --git a/include/Nazara/BulletPhysics3D/Components/BulletRigidBody3DComponent.hpp b/include/Nazara/BulletPhysics3D/Components/BulletRigidBody3DComponent.hpp new file mode 100644 index 000000000..0e901a44b --- /dev/null +++ b/include/Nazara/BulletPhysics3D/Components/BulletRigidBody3DComponent.hpp @@ -0,0 +1,32 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - BulletPhysics3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_BULLETPHYSICS3D_COMPONENTS_BULLETRIGIDBODY3DCOMPONENT_HPP +#define NAZARA_BULLETPHYSICS3D_COMPONENTS_BULLETRIGIDBODY3DCOMPONENT_HPP + +#include +#include + +namespace Nz +{ + class NAZARA_BULLETPHYSICS3D_API BulletRigidBody3DComponent : public BulletRigidBody3D + { + friend class BulletPhysics3DSystem; + + public: + using BulletRigidBody3D::BulletRigidBody3D; + BulletRigidBody3DComponent(const BulletRigidBody3DComponent&) = default; + BulletRigidBody3DComponent(BulletRigidBody3DComponent&&) noexcept = default; + ~BulletRigidBody3DComponent() = default; + + BulletRigidBody3DComponent& operator=(const BulletRigidBody3DComponent&) = default; + BulletRigidBody3DComponent& operator=(BulletRigidBody3DComponent&&) noexcept = default; + }; +} + +#include + +#endif // NAZARA_BULLETPHYSICS3D_COMPONENTS_BULLETRIGIDBODY3DCOMPONENT_HPP diff --git a/include/Nazara/Physics3D/Components/RigidBody3DComponent.inl b/include/Nazara/BulletPhysics3D/Components/BulletRigidBody3DComponent.inl similarity index 51% rename from include/Nazara/Physics3D/Components/RigidBody3DComponent.inl rename to include/Nazara/BulletPhysics3D/Components/BulletRigidBody3DComponent.inl index 3f5f8b381..bc940c808 100644 --- a/include/Nazara/Physics3D/Components/RigidBody3DComponent.inl +++ b/include/Nazara/BulletPhysics3D/Components/BulletRigidBody3DComponent.inl @@ -1,11 +1,11 @@ // Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" +// This file is part of the "Nazara Engine - BulletPhysics3D module" // For conditions of distribution and use, see copyright notice in Config.hpp -#include +#include namespace Nz { } -#include +#include diff --git a/include/Nazara/Physics3D/Config.hpp b/include/Nazara/BulletPhysics3D/Config.hpp similarity index 76% rename from include/Nazara/Physics3D/Config.hpp rename to include/Nazara/BulletPhysics3D/Config.hpp index a8e851eb7..dada768b6 100644 --- a/include/Nazara/Physics3D/Config.hpp +++ b/include/Nazara/BulletPhysics3D/Config.hpp @@ -1,5 +1,5 @@ /* - Nazara Engine - Physics3D module + Nazara Engine - BulletPhysics3D module Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) @@ -24,25 +24,25 @@ #pragma once -#ifndef NAZARA_PHYSICS3D_CONFIG_HPP -#define NAZARA_PHYSICS3D_CONFIG_HPP +#ifndef NAZARA_BULLETPHYSICS3D_CONFIG_HPP +#define NAZARA_BULLETPHYSICS3D_CONFIG_HPP /// Chaque modification d'un paramètre du module nécessite une recompilation de celui-ci // Active les tests de sécurité basés sur le code (Conseillé pour le développement) -#define NAZARA_PHYSICS3D_SAFE 1 +#define NAZARA_BULLETPHYSICS3D_SAFE 1 /// Vérification des valeurs et types de certaines constantes -#include +#include #if defined(NAZARA_STATIC) - #define NAZARA_PHYSICS3D_API + #define NAZARA_BULLETPHYSICS3D_API #else - #ifdef NAZARA_PHYSICS3D_BUILD - #define NAZARA_PHYSICS3D_API NAZARA_EXPORT + #ifdef NAZARA_BULLETPHYSICS3D_BUILD + #define NAZARA_BULLETPHYSICS3D_API NAZARA_EXPORT #else - #define NAZARA_PHYSICS3D_API NAZARA_IMPORT + #define NAZARA_BULLETPHYSICS3D_API NAZARA_IMPORT #endif #endif -#endif // NAZARA_PHYSICS3D_CONFIG_HPP +#endif // NAZARA_BULLETPHYSICS3D_CONFIG_HPP diff --git a/include/Nazara/BulletPhysics3D/ConfigCheck.hpp b/include/Nazara/BulletPhysics3D/ConfigCheck.hpp new file mode 100644 index 000000000..e75469fbc --- /dev/null +++ b/include/Nazara/BulletPhysics3D/ConfigCheck.hpp @@ -0,0 +1,10 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - BulletPhysics3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_BULLETPHYSICS3D_CONFIGCHECK_HPP +#define NAZARA_BULLETPHYSICS3D_CONFIGCHECK_HPP + +#endif // NAZARA_BULLETPHYSICS3D_CONFIGCHECK_HPP diff --git a/include/Nazara/Physics3D/Debug.hpp b/include/Nazara/BulletPhysics3D/Debug.hpp similarity index 70% rename from include/Nazara/Physics3D/Debug.hpp rename to include/Nazara/BulletPhysics3D/Debug.hpp index 5844cb700..68fc8408c 100644 --- a/include/Nazara/Physics3D/Debug.hpp +++ b/include/Nazara/BulletPhysics3D/Debug.hpp @@ -1,5 +1,5 @@ // Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" +// This file is part of the "Nazara Engine - BulletPhysics3D module" // For conditions of distribution and use, see copyright notice in Config.hpp // no header guards diff --git a/include/Nazara/Physics3D/DebugOff.hpp b/include/Nazara/BulletPhysics3D/DebugOff.hpp similarity index 70% rename from include/Nazara/Physics3D/DebugOff.hpp rename to include/Nazara/BulletPhysics3D/DebugOff.hpp index 5844cb700..68fc8408c 100644 --- a/include/Nazara/Physics3D/DebugOff.hpp +++ b/include/Nazara/BulletPhysics3D/DebugOff.hpp @@ -1,5 +1,5 @@ // Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" +// This file is part of the "Nazara Engine - BulletPhysics3D module" // For conditions of distribution and use, see copyright notice in Config.hpp // no header guards diff --git a/include/Nazara/Physics3D/Enums.hpp b/include/Nazara/BulletPhysics3D/Enums.hpp similarity index 63% rename from include/Nazara/Physics3D/Enums.hpp rename to include/Nazara/BulletPhysics3D/Enums.hpp index 04344b3e7..6d650bf1f 100644 --- a/include/Nazara/Physics3D/Enums.hpp +++ b/include/Nazara/BulletPhysics3D/Enums.hpp @@ -1,11 +1,11 @@ // Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" +// This file is part of the "Nazara Engine - BulletPhysics3D module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once -#ifndef NAZARA_PHYSICS3D_ENUMS_HPP -#define NAZARA_PHYSICS3D_ENUMS_HPP +#ifndef NAZARA_BULLETPHYSICS3D_ENUMS_HPP +#define NAZARA_BULLETPHYSICS3D_ENUMS_HPP namespace Nz { @@ -27,4 +27,4 @@ namespace Nz }; } -#endif // NAZARA_PHYSICS3D_ENUMS_HPP +#endif // NAZARA_BULLETPHYSICS3D_ENUMS_HPP diff --git a/include/Nazara/Physics3D/Systems.hpp b/include/Nazara/BulletPhysics3D/Systems.hpp similarity index 83% rename from include/Nazara/Physics3D/Systems.hpp rename to include/Nazara/BulletPhysics3D/Systems.hpp index c98af7926..cb92ac9d0 100644 --- a/include/Nazara/Physics3D/Systems.hpp +++ b/include/Nazara/BulletPhysics3D/Systems.hpp @@ -1,7 +1,7 @@ // this file was automatically generated and should not be edited /* - Nazara Engine - Physics3D module + Nazara Engine - BulletPhysics3D module Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) @@ -26,9 +26,9 @@ #pragma once -#ifndef NAZARA_PHYSICS3D_SYSTEMS_HPP -#define NAZARA_PHYSICS3D_SYSTEMS_HPP +#ifndef NAZARA_BULLETPHYSICS3D_SYSTEMS_HPP +#define NAZARA_BULLETPHYSICS3D_SYSTEMS_HPP -#include +#include -#endif // NAZARA_PHYSICS3D_SYSTEMS_HPP +#endif // NAZARA_BULLETPHYSICS3D_SYSTEMS_HPP diff --git a/include/Nazara/BulletPhysics3D/Systems/BulletPhysics3DSystem.hpp b/include/Nazara/BulletPhysics3D/Systems/BulletPhysics3DSystem.hpp new file mode 100644 index 000000000..3b3c8aa8f --- /dev/null +++ b/include/Nazara/BulletPhysics3D/Systems/BulletPhysics3DSystem.hpp @@ -0,0 +1,65 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - BulletPhysics3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_BULLETPHYSICS3D_SYSTEMS_BULLETPHYSICS3DSYSTEM_HPP +#define NAZARA_BULLETPHYSICS3D_SYSTEMS_BULLETPHYSICS3DSYSTEM_HPP + +#include +#include +#include +#include +#include +#include +#include + +namespace Nz +{ + class NAZARA_BULLETPHYSICS3D_API BulletPhysics3DSystem + { + public: + static constexpr Int64 ExecutionOrder = 0; + using Components = TypeList; + + struct RaycastHit; + + BulletPhysics3DSystem(entt::registry& registry); + BulletPhysics3DSystem(const BulletPhysics3DSystem&) = delete; + BulletPhysics3DSystem(BulletPhysics3DSystem&&) = delete; + ~BulletPhysics3DSystem(); + + template BulletRigidBody3DComponent CreateRigidBody(Args&&... args); + + inline BulletPhysWorld3D& GetPhysWorld(); + inline const BulletPhysWorld3D& GetPhysWorld() const; + + bool RaycastQueryFirst(const Vector3f& from, const Vector3f& to, RaycastHit* hitInfo = nullptr); + + void Update(Time elapsedTime); + + BulletPhysics3DSystem& operator=(const BulletPhysics3DSystem&) = delete; + BulletPhysics3DSystem& operator=(BulletPhysics3DSystem&&) = delete; + + struct RaycastHit : BulletPhysWorld3D::RaycastHit + { + entt::handle hitEntity; + }; + + private: + void OnConstruct(entt::registry& registry, entt::entity entity); + void OnDestruct(entt::registry& registry, entt::entity entity); + + std::vector m_physicsEntities; + entt::registry& m_registry; + entt::observer m_physicsConstructObserver; + entt::scoped_connection m_constructConnection; + entt::scoped_connection m_destructConnection; + BulletPhysWorld3D m_physWorld; + }; +} + +#include + +#endif // NAZARA_BULLETPHYSICS3D_SYSTEMS_BULLETPHYSICS3DSYSTEM_HPP diff --git a/include/Nazara/BulletPhysics3D/Systems/BulletPhysics3DSystem.inl b/include/Nazara/BulletPhysics3D/Systems/BulletPhysics3DSystem.inl new file mode 100644 index 000000000..3d0aa1438 --- /dev/null +++ b/include/Nazara/BulletPhysics3D/Systems/BulletPhysics3DSystem.inl @@ -0,0 +1,26 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - BulletPhysics3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include + +namespace Nz +{ + template + BulletRigidBody3DComponent BulletPhysics3DSystem::CreateRigidBody(Args&&... args) + { + return BulletRigidBody3DComponent(&m_physWorld, std::forward(args)...); + } + + inline BulletPhysWorld3D& BulletPhysics3DSystem::GetPhysWorld() + { + return m_physWorld; + } + + inline const BulletPhysWorld3D& BulletPhysics3DSystem::GetPhysWorld() const + { + return m_physWorld; + } +} + +#include diff --git a/include/Nazara/Physics3D/Components/RigidBody3DComponent.hpp b/include/Nazara/Physics3D/Components/RigidBody3DComponent.hpp deleted file mode 100644 index 4c37a9a4f..000000000 --- a/include/Nazara/Physics3D/Components/RigidBody3DComponent.hpp +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#pragma once - -#ifndef NAZARA_PHYSICS3D_COMPONENTS_RIGIDBODY3DCOMPONENT_HPP -#define NAZARA_PHYSICS3D_COMPONENTS_RIGIDBODY3DCOMPONENT_HPP - -#include -#include - -namespace Nz -{ - class NAZARA_PHYSICS3D_API RigidBody3DComponent : public RigidBody3D - { - friend class Physics3DSystem; - - public: - using RigidBody3D::RigidBody3D; - RigidBody3DComponent(const RigidBody3DComponent&) = default; - RigidBody3DComponent(RigidBody3DComponent&&) noexcept = default; - ~RigidBody3DComponent() = default; - - RigidBody3DComponent& operator=(const RigidBody3DComponent&) = default; - RigidBody3DComponent& operator=(RigidBody3DComponent&&) noexcept = default; - }; -} - -#include - -#endif // NAZARA_PHYSICS3D_COMPONENTS_RIGIDBODY3DCOMPONENT_HPP diff --git a/include/Nazara/Physics3D/ConfigCheck.hpp b/include/Nazara/Physics3D/ConfigCheck.hpp deleted file mode 100644 index 8cea71d31..000000000 --- a/include/Nazara/Physics3D/ConfigCheck.hpp +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#pragma once - -#ifndef NAZARA_PHYSICS3D_CONFIGCHECK_HPP -#define NAZARA_PHYSICS3D_CONFIGCHECK_HPP - -#endif // NAZARA_PHYSICS3D_CONFIGCHECK_HPP diff --git a/include/Nazara/Physics3D/Constraint3D.hpp b/include/Nazara/Physics3D/Constraint3D.hpp deleted file mode 100644 index e039319aa..000000000 --- a/include/Nazara/Physics3D/Constraint3D.hpp +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#pragma once - -#ifndef NAZARA_PHYSICS3D_CONSTRAINT3D_HPP -#define NAZARA_PHYSICS3D_CONSTRAINT3D_HPP - -#include -#include -#include -#include -#include -#include - -class btTypedConstraint; - -namespace Nz -{ - class Constraint3D; - - using Constraint3DHandle = ObjectHandle; - - class NAZARA_PHYSICS3D_API Constraint3D : public HandledObject - { - public: - Constraint3D(const Constraint3D&) = delete; - Constraint3D(Constraint3D&& constraint) noexcept; - virtual ~Constraint3D(); - - RigidBody3D& GetBodyA(); - const RigidBody3D& GetBodyA() const; - RigidBody3D& GetBodyB(); - const RigidBody3D& GetBodyB() const; - PhysWorld3D& GetWorld(); - const PhysWorld3D& GetWorld() const; - - inline bool IsBodyCollisionEnabled() const; - bool IsSingleBody() const; - - Constraint3D& operator=(const Constraint3D&) = delete; - Constraint3D& operator=(Constraint3D&& constraint) noexcept; - - protected: - Constraint3D(std::unique_ptr constraint, bool disableCollisions = false); - - template T* GetConstraint(); - template const T* GetConstraint() const; - - private: - std::unique_ptr m_constraint; - bool m_bodyCollisionEnabled; - }; - - class NAZARA_PHYSICS3D_API PivotConstraint3D : public Constraint3D - { - public: - PivotConstraint3D(RigidBody3D& first, const Vector3f& pivot); - PivotConstraint3D(RigidBody3D& first, RigidBody3D& second, const Vector3f& pivot, bool disableCollisions = false); - PivotConstraint3D(RigidBody3D& first, RigidBody3D& second, const Vector3f& firstAnchor, const Vector3f& secondAnchor, bool disableCollisions = false); - ~PivotConstraint3D() = default; - - Vector3f GetFirstAnchor() const; - Vector3f GetSecondAnchor() const; - - void SetFirstAnchor(const Vector3f& firstAnchor); - void SetSecondAnchor(const Vector3f& secondAnchor); - }; -} - -#include - -#endif // NAZARA_PHYSICS3D_CONSTRAINT3D_HPP diff --git a/include/Nazara/Physics3D/Constraint3D.inl b/include/Nazara/Physics3D/Constraint3D.inl deleted file mode 100644 index 69f5e3b88..000000000 --- a/include/Nazara/Physics3D/Constraint3D.inl +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#include -#include -#include - -namespace Nz -{ - inline bool Constraint3D::IsBodyCollisionEnabled() const - { - return m_bodyCollisionEnabled; - } - - template - T* Constraint3D::GetConstraint() - { - return SafeCast(m_constraint.get()); - } - - template - const T* Constraint3D::GetConstraint() const - { - return SafeCast(m_constraint.get()); - } -} - -#include diff --git a/include/Nazara/Physics3D/Physics3D.hpp b/include/Nazara/Physics3D/Physics3D.hpp deleted file mode 100644 index f07c375f7..000000000 --- a/include/Nazara/Physics3D/Physics3D.hpp +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#pragma once - -#ifndef NAZARA_PHYSICS3D_HPP -#define NAZARA_PHYSICS3D_HPP - -#include -#include -#include - -namespace Nz -{ - class NAZARA_PHYSICS3D_API Physics3D : public ModuleBase - { - friend ModuleBase; - - public: - using Dependencies = TypeList; - - struct Config {}; - - Physics3D(Config /*config*/); - ~Physics3D() = default; - - private: - static Physics3D* s_instance; - }; -} - -#endif // NAZARA_PHYSICS3D_HPP diff --git a/include/Nazara/Physics3D/RigidBody3D.inl b/include/Nazara/Physics3D/RigidBody3D.inl deleted file mode 100644 index d49c5d4d9..000000000 --- a/include/Nazara/Physics3D/RigidBody3D.inl +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#include - -namespace Nz -{ - inline void RigidBody3D::DisableSleeping() - { - return EnableSleeping(false); - } - - inline const std::shared_ptr& RigidBody3D::GetGeom() const - { - return m_geom; - } - - inline btRigidBody* RigidBody3D::GetRigidBody() const - { - return m_body; - } - inline std::size_t RigidBody3D::GetUniqueIndex() const - { - return m_bodyPoolIndex; - } - - inline PhysWorld3D* RigidBody3D::GetWorld() const - { - return m_world; - } -} - -#include diff --git a/include/Nazara/Physics3D/Systems/Physics3DSystem.hpp b/include/Nazara/Physics3D/Systems/Physics3DSystem.hpp deleted file mode 100644 index acd20ca1c..000000000 --- a/include/Nazara/Physics3D/Systems/Physics3DSystem.hpp +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#pragma once - -#ifndef NAZARA_PHYSICS3D_SYSTEMS_PHYSICS3DSYSTEM_HPP -#define NAZARA_PHYSICS3D_SYSTEMS_PHYSICS3DSYSTEM_HPP - -#include -#include -#include -#include -#include -#include -#include - -namespace Nz -{ - class NAZARA_PHYSICS3D_API Physics3DSystem - { - public: - static constexpr Int64 ExecutionOrder = 0; - using Components = TypeList; - - struct RaycastHit; - - Physics3DSystem(entt::registry& registry); - Physics3DSystem(const Physics3DSystem&) = delete; - Physics3DSystem(Physics3DSystem&&) = delete; - ~Physics3DSystem(); - - template RigidBody3DComponent CreateRigidBody(Args&&... args); - - inline PhysWorld3D& GetPhysWorld(); - inline const PhysWorld3D& GetPhysWorld() const; - - bool RaycastQueryFirst(const Vector3f& from, const Vector3f& to, RaycastHit* hitInfo = nullptr); - - void Update(Time elapsedTime); - - Physics3DSystem& operator=(const Physics3DSystem&) = delete; - Physics3DSystem& operator=(Physics3DSystem&&) = delete; - - struct RaycastHit : PhysWorld3D::RaycastHit - { - entt::handle hitEntity; - }; - - private: - void OnConstruct(entt::registry& registry, entt::entity entity); - void OnDestruct(entt::registry& registry, entt::entity entity); - - std::vector m_physicsEntities; - entt::registry& m_registry; - entt::observer m_physicsConstructObserver; - entt::scoped_connection m_constructConnection; - entt::scoped_connection m_destructConnection; - PhysWorld3D m_physWorld; - }; -} - -#include - -#endif // NAZARA_PHYSICS3D_SYSTEMS_PHYSICS3DSYSTEM_HPP diff --git a/include/Nazara/Physics3D/Systems/Physics3DSystem.inl b/include/Nazara/Physics3D/Systems/Physics3DSystem.inl deleted file mode 100644 index 6395991f0..000000000 --- a/include/Nazara/Physics3D/Systems/Physics3DSystem.inl +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#include - -namespace Nz -{ - template - RigidBody3DComponent Physics3DSystem::CreateRigidBody(Args&&... args) - { - return RigidBody3DComponent(&m_physWorld, std::forward(args)...); - } - - inline PhysWorld3D& Physics3DSystem::GetPhysWorld() - { - return m_physWorld; - } - - inline const PhysWorld3D& Physics3DSystem::GetPhysWorld() const - { - return m_physWorld; - } -} - -#include diff --git a/src/Nazara/Physics3D/Collider3D.cpp b/src/Nazara/BulletPhysics3D/BulletCollider3D.cpp similarity index 92% rename from src/Nazara/Physics3D/Collider3D.cpp rename to src/Nazara/BulletPhysics3D/BulletCollider3D.cpp index c79f6a409..937e378d2 100644 --- a/src/Nazara/Physics3D/Collider3D.cpp +++ b/src/Nazara/BulletPhysics3D/BulletCollider3D.cpp @@ -1,10 +1,10 @@ // Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" +// This file is part of the "Nazara Engine - BulletPhysics3D module" // For conditions of distribution and use, see copyright notice in Config.hpp -#include +#include +#include #include -#include #include #include #include @@ -20,18 +20,18 @@ #include #include #include -#include +#include namespace Nz { - Collider3D::~Collider3D() = default; + BulletCollider3D::~BulletCollider3D() = default; - Boxf Collider3D::ComputeAABB(const Vector3f& translation, const Quaternionf& rotation, const Vector3f& scale) const + Boxf BulletCollider3D::ComputeAABB(const Vector3f& translation, const Quaternionf& rotation, const Vector3f& scale) const { return ComputeAABB(Matrix4f::Transform(translation, rotation), scale); } - Boxf Collider3D::ComputeAABB(const Matrix4f& offsetMatrix, const Vector3f& scale) const + Boxf BulletCollider3D::ComputeAABB(const Matrix4f& offsetMatrix, const Vector3f& scale) const { btTransform transform = ToBullet(offsetMatrix); @@ -41,7 +41,7 @@ namespace Nz return Boxf(scale * FromBullet(min), scale * FromBullet(max)); } - void Collider3D::ComputeInertia(float mass, Vector3f* inertia) const + void BulletCollider3D::ComputeInertia(float mass, Vector3f* inertia) const { NazaraAssert(inertia, "invalid inertia pointer"); @@ -51,7 +51,7 @@ namespace Nz *inertia = FromBullet(inertiaVec); } - std::shared_ptr Collider3D::GenerateDebugMesh() const + std::shared_ptr BulletCollider3D::GenerateDebugMesh() const { std::vector colliderVertices; std::vector colliderIndices; @@ -67,7 +67,7 @@ namespace Nz return colliderSubMesh; } - std::shared_ptr Collider3D::Build(const PrimitiveList& list) + std::shared_ptr BulletCollider3D::Build(const PrimitiveList& list) { std::size_t primitiveCount = list.GetSize(); if (primitiveCount > 1) @@ -89,7 +89,7 @@ namespace Nz return std::make_shared(); } - std::shared_ptr Collider3D::CreateGeomFromPrimitive(const Primitive& primitive) + std::shared_ptr BulletCollider3D::CreateGeomFromPrimitive(const Primitive& primitive) { switch (primitive.type) { @@ -108,7 +108,7 @@ namespace Nz } NazaraError("Primitive type not handled (0x" + NumberToString(UnderlyingCast(primitive.type), 16) + ')'); - return std::shared_ptr(); + return std::shared_ptr(); } /********************************** BoxCollider3D **********************************/ diff --git a/src/Nazara/BulletPhysics3D/BulletConstraint3D.cpp b/src/Nazara/BulletPhysics3D/BulletConstraint3D.cpp new file mode 100644 index 000000000..0126108de --- /dev/null +++ b/src/Nazara/BulletPhysics3D/BulletConstraint3D.cpp @@ -0,0 +1,123 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - BulletPhysics3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include +#include +#include + +namespace Nz +{ + BulletConstraint3D::BulletConstraint3D(std::unique_ptr constraint, bool disableCollisions) : + m_constraint(std::move(constraint)), + m_bodyCollisionEnabled(!disableCollisions) + { + btDynamicsWorld* world = GetWorld().GetDynamicsWorld(); + world->addConstraint(m_constraint.get(), disableCollisions); + } + + BulletConstraint3D::BulletConstraint3D(BulletConstraint3D&& constraint) noexcept : + m_constraint(std::move(constraint.m_constraint)), + m_bodyCollisionEnabled(constraint.m_bodyCollisionEnabled) + { + if (m_constraint) + m_constraint->setUserConstraintPtr(this); + } + + BulletConstraint3D::~BulletConstraint3D() + { + if (m_constraint) + { + btDynamicsWorld* world = GetWorld().GetDynamicsWorld(); + world->removeConstraint(m_constraint.get()); + } + } + + BulletRigidBody3D& BulletConstraint3D::GetBodyA() + { + return *static_cast(m_constraint->getRigidBodyA().getUserPointer()); + } + + const BulletRigidBody3D& BulletConstraint3D::GetBodyA() const + { + return *static_cast(m_constraint->getRigidBodyA().getUserPointer()); + } + + BulletRigidBody3D& BulletConstraint3D::GetBodyB() + { + NazaraAssert(!IsSingleBody(), "constraint is not attached to a second body"); + return *static_cast(m_constraint->getRigidBodyB().getUserPointer()); + } + + const BulletRigidBody3D& BulletConstraint3D::GetBodyB() const + { + NazaraAssert(!IsSingleBody(), "constraint is not attached to a second body"); + return *static_cast(m_constraint->getRigidBodyB().getUserPointer()); + } + + BulletPhysWorld3D& BulletConstraint3D::GetWorld() + { + return *GetBodyA().GetWorld(); + } + + const BulletPhysWorld3D& BulletConstraint3D::GetWorld() const + { + return *GetBodyA().GetWorld(); + } + + bool BulletConstraint3D::IsSingleBody() const + { + return &m_constraint->getRigidBodyB() == &btTypedConstraint::getFixedBody(); + } + + BulletConstraint3D& BulletConstraint3D::operator=(BulletConstraint3D&& constraint) noexcept + { + m_constraint.reset(); + + m_constraint = std::move(constraint.m_constraint); + m_bodyCollisionEnabled = constraint.m_bodyCollisionEnabled; + + if (m_constraint) + m_constraint->setUserConstraintPtr(this); + + return *this; + } + + + BulletPivotConstraint3D::BulletPivotConstraint3D(BulletRigidBody3D& first, const Vector3f& pivot) : + BulletConstraint3D(std::make_unique(*first.GetRigidBody(), ToBullet(first.ToLocal(pivot)))) + { + } + + BulletPivotConstraint3D::BulletPivotConstraint3D(BulletRigidBody3D& first, BulletRigidBody3D& second, const Vector3f& pivot, bool disableCollisions) : + BulletConstraint3D(std::make_unique(*first.GetRigidBody(), *second.GetRigidBody(), ToBullet(first.ToLocal(pivot)), ToBullet(second.ToLocal(pivot))), disableCollisions) + { + } + + BulletPivotConstraint3D::BulletPivotConstraint3D(BulletRigidBody3D& first, BulletRigidBody3D& second, const Vector3f& firstAnchor, const Vector3f& secondAnchor, bool disableCollisions) : + BulletConstraint3D(std::make_unique(*first.GetRigidBody(), *second.GetRigidBody(), ToBullet(firstAnchor), ToBullet(secondAnchor)), disableCollisions) + { + } + + Vector3f BulletPivotConstraint3D::GetFirstAnchor() const + { + return FromBullet(GetConstraint()->getPivotInA()); + } + + Vector3f BulletPivotConstraint3D::GetSecondAnchor() const + { + return FromBullet(GetConstraint()->getPivotInB()); + } + + void BulletPivotConstraint3D::SetFirstAnchor(const Vector3f& firstAnchor) + { + GetConstraint()->setPivotA(ToBullet(firstAnchor)); + } + + void BulletPivotConstraint3D::SetSecondAnchor(const Vector3f& secondAnchor) + { + GetConstraint()->setPivotB(ToBullet(secondAnchor)); + } +} diff --git a/src/Nazara/Physics3D/BulletHelper.hpp b/src/Nazara/BulletPhysics3D/BulletHelper.hpp similarity index 71% rename from src/Nazara/Physics3D/BulletHelper.hpp rename to src/Nazara/BulletPhysics3D/BulletHelper.hpp index bd4bea0cf..19729d13d 100644 --- a/src/Nazara/Physics3D/BulletHelper.hpp +++ b/src/Nazara/BulletPhysics3D/BulletHelper.hpp @@ -1,17 +1,17 @@ // Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" +// This file is part of the "Nazara Engine - BulletPhysics3D module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once -#ifndef NAZARA_PHYSICS3D_BULLETHELPER_HPP -#define NAZARA_PHYSICS3D_BULLETHELPER_HPP +#ifndef NAZARA_BULLETPHYSICS3D_BULLETHELPER_HPP +#define NAZARA_BULLETPHYSICS3D_BULLETHELPER_HPP #include +#include #include #include #include -#include #include #include #include @@ -27,6 +27,6 @@ namespace Nz inline btVector3 ToBullet(const Vector3f& vec); } -#include +#include -#endif // NAZARA_PHYSICS3D_BULLETHELPER_HPP +#endif // NAZARA_BULLETPHYSICS3D_BULLETHELPER_HPP diff --git a/src/Nazara/Physics3D/BulletHelper.inl b/src/Nazara/BulletPhysics3D/BulletHelper.inl similarity index 90% rename from src/Nazara/Physics3D/BulletHelper.inl rename to src/Nazara/BulletPhysics3D/BulletHelper.inl index b5fc0869e..1e063ddf5 100644 --- a/src/Nazara/Physics3D/BulletHelper.inl +++ b/src/Nazara/BulletPhysics3D/BulletHelper.inl @@ -1,8 +1,8 @@ // Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" +// This file is part of the "Nazara Engine - BulletPhysics3D module" // For conditions of distribution and use, see copyright notice in Config.hpp -#include +#include namespace Nz { @@ -57,4 +57,4 @@ namespace Nz } } -#include +#include diff --git a/src/Nazara/Physics3D/PhysWorld3D.cpp b/src/Nazara/BulletPhysics3D/BulletPhysWorld3D.cpp similarity index 74% rename from src/Nazara/Physics3D/PhysWorld3D.cpp rename to src/Nazara/BulletPhysics3D/BulletPhysWorld3D.cpp index 848d1f9eb..b16c38046 100644 --- a/src/Nazara/Physics3D/PhysWorld3D.cpp +++ b/src/Nazara/BulletPhysics3D/BulletPhysWorld3D.cpp @@ -1,9 +1,9 @@ // Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" +// This file is part of the "Nazara Engine - BulletPhysics3D module" // For conditions of distribution and use, see copyright notice in Config.hpp -#include -#include +#include +#include #include #include #include @@ -12,11 +12,11 @@ #include #include #include -#include +#include namespace Nz { - struct PhysWorld3D::BulletWorld + struct BulletPhysWorld3D::BulletWorld { btDefaultCollisionConfiguration collisionConfiguration; btCollisionDispatcher dispatcher; @@ -39,7 +39,7 @@ namespace Nz BulletWorld& operator=(BulletWorld&&) = delete; }; - PhysWorld3D::PhysWorld3D() : + BulletPhysWorld3D::BulletPhysWorld3D() : m_maxStepCount(50), m_gravity(Vector3f::Zero()), m_stepSize(Time::TickDuration(120)), @@ -48,29 +48,29 @@ namespace Nz m_world = std::make_unique(); } - PhysWorld3D::~PhysWorld3D() = default; + BulletPhysWorld3D::~BulletPhysWorld3D() = default; - btDynamicsWorld* PhysWorld3D::GetDynamicsWorld() + btDynamicsWorld* BulletPhysWorld3D::GetDynamicsWorld() { return &m_world->dynamicWorld; } - Vector3f PhysWorld3D::GetGravity() const + Vector3f BulletPhysWorld3D::GetGravity() const { return FromBullet(m_world->dynamicWorld.getGravity()); } - std::size_t PhysWorld3D::GetMaxStepCount() const + std::size_t BulletPhysWorld3D::GetMaxStepCount() const { return m_maxStepCount; } - Time PhysWorld3D::GetStepSize() const + Time BulletPhysWorld3D::GetStepSize() const { return m_stepSize; } - bool PhysWorld3D::RaycastQueryFirst(const Vector3f& from, const Vector3f& to, RaycastHit* hitInfo) + bool BulletPhysWorld3D::RaycastQueryFirst(const Vector3f& from, const Vector3f& to, RaycastHit* hitInfo) { btCollisionWorld::ClosestRayResultCallback callback(ToBullet(from), ToBullet(to)); m_world->dynamicWorld.rayTest(ToBullet(from), ToBullet(to), callback); @@ -85,28 +85,28 @@ namespace Nz hitInfo->hitPosition = FromBullet(callback.m_hitPointWorld); if (const btRigidBody* body = btRigidBody::upcast(callback.m_collisionObject)) - hitInfo->hitBody = static_cast(body->getUserPointer()); + hitInfo->hitBody = static_cast(body->getUserPointer()); } return true; } - void PhysWorld3D::SetGravity(const Vector3f& gravity) + void BulletPhysWorld3D::SetGravity(const Vector3f& gravity) { m_world->dynamicWorld.setGravity(ToBullet(gravity)); } - void PhysWorld3D::SetMaxStepCount(std::size_t maxStepCount) + void BulletPhysWorld3D::SetMaxStepCount(std::size_t maxStepCount) { m_maxStepCount = maxStepCount; } - void PhysWorld3D::SetStepSize(Time stepSize) + void BulletPhysWorld3D::SetStepSize(Time stepSize) { m_stepSize = stepSize; } - void PhysWorld3D::Step(Time timestep) + void BulletPhysWorld3D::Step(Time timestep) { m_timestepAccumulator += timestep; @@ -121,7 +121,7 @@ namespace Nz } } - btRigidBody* PhysWorld3D::AddRigidBody(std::size_t& rigidBodyIndex, FunctionRef constructor) + btRigidBody* BulletPhysWorld3D::AddRigidBody(std::size_t& rigidBodyIndex, FunctionRef constructor) { btRigidBody* rigidBody = m_world->rigidBodyPool.Allocate(m_world->rigidBodyPool.DeferConstruct, rigidBodyIndex); constructor(rigidBody); @@ -148,7 +148,7 @@ namespace Nz return rigidBody; } - void PhysWorld3D::RemoveRigidBody(btRigidBody* rigidBody, std::size_t rigidBodyIndex) + void BulletPhysWorld3D::RemoveRigidBody(btRigidBody* rigidBody, std::size_t rigidBodyIndex) { // TODO: Improve deletion (since rigid bodies are sorted) m_world->dynamicWorld.removeRigidBody(rigidBody); //< this does a linear search diff --git a/src/Nazara/BulletPhysics3D/BulletPhysics3D.cpp b/src/Nazara/BulletPhysics3D/BulletPhysics3D.cpp new file mode 100644 index 000000000..22b4190e5 --- /dev/null +++ b/src/Nazara/BulletPhysics3D/BulletPhysics3D.cpp @@ -0,0 +1,21 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - BulletPhysics3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include +#include +#include +#include +#include + +namespace Nz +{ + BulletPhysics3D::BulletPhysics3D(Config /*config*/) : + ModuleBase("BulletPhysics3D", this) + { + } + + BulletPhysics3D* BulletPhysics3D::s_instance; +} diff --git a/src/Nazara/Physics3D/RigidBody3D.cpp b/src/Nazara/BulletPhysics3D/BulletRigidBody3D.cpp similarity index 66% rename from src/Nazara/Physics3D/RigidBody3D.cpp rename to src/Nazara/BulletPhysics3D/BulletRigidBody3D.cpp index 3ee0a8046..91e469155 100644 --- a/src/Nazara/Physics3D/RigidBody3D.cpp +++ b/src/Nazara/BulletPhysics3D/BulletRigidBody3D.cpp @@ -1,26 +1,26 @@ // Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" +// This file is part of the "Nazara Engine - BulletPhysics3D module" // For conditions of distribution and use, see copyright notice in Config.hpp -#include -#include -#include +#include +#include +#include #include #include #include #include #include #include -#include +#include namespace Nz { - RigidBody3D::RigidBody3D(PhysWorld3D* world, const Matrix4f& mat) : - RigidBody3D(world, nullptr, mat) + BulletRigidBody3D::BulletRigidBody3D(BulletPhysWorld3D* world, const Matrix4f& mat) : + BulletRigidBody3D(world, nullptr, mat) { } - RigidBody3D::RigidBody3D(PhysWorld3D* world, std::shared_ptr geom, const Matrix4f& mat) : + BulletRigidBody3D::BulletRigidBody3D(BulletPhysWorld3D* world, std::shared_ptr geom, const Matrix4f& mat) : m_geom(std::move(geom)), m_world(world) { @@ -42,7 +42,7 @@ namespace Nz m_body->setUserPointer(this); } - RigidBody3D::RigidBody3D(RigidBody3D&& object) noexcept : + BulletRigidBody3D::BulletRigidBody3D(BulletRigidBody3D&& object) noexcept : m_geom(std::move(object.m_geom)), m_bodyPoolIndex(object.m_bodyPoolIndex), m_body(object.m_body), @@ -54,12 +54,12 @@ namespace Nz object.m_body = nullptr; } - RigidBody3D::~RigidBody3D() + BulletRigidBody3D::~BulletRigidBody3D() { Destroy(); } - void RigidBody3D::AddForce(const Vector3f& force, CoordSys coordSys) + void BulletRigidBody3D::AddForce(const Vector3f& force, CoordSys coordSys) { switch (coordSys) { @@ -75,7 +75,7 @@ namespace Nz } } - void RigidBody3D::AddForce(const Vector3f& force, const Vector3f& point, CoordSys coordSys) + void BulletRigidBody3D::AddForce(const Vector3f& force, const Vector3f& point, CoordSys coordSys) { switch (coordSys) { @@ -92,7 +92,7 @@ namespace Nz } } - void RigidBody3D::AddTorque(const Vector3f& torque, CoordSys coordSys) + void BulletRigidBody3D::AddTorque(const Vector3f& torque, CoordSys coordSys) { switch (coordSys) { @@ -109,7 +109,7 @@ namespace Nz } } - void RigidBody3D::EnableSleeping(bool enable) + void BulletRigidBody3D::EnableSleeping(bool enable) { if (enable) { @@ -123,13 +123,13 @@ namespace Nz } } - void RigidBody3D::FallAsleep() + void BulletRigidBody3D::FallAsleep() { if (m_body->getActivationState() != DISABLE_DEACTIVATION) m_body->setActivationState(ISLAND_SLEEPING); } - Boxf RigidBody3D::GetAABB() const + Boxf BulletRigidBody3D::GetAABB() const { btVector3 min, max; m_body->getAabb(min, max); @@ -137,77 +137,77 @@ namespace Nz return Boxf(FromBullet(min), FromBullet(max)); } - float RigidBody3D::GetAngularDamping() const + float BulletRigidBody3D::GetAngularDamping() const { return m_body->getAngularDamping(); } - Vector3f RigidBody3D::GetAngularVelocity() const + Vector3f BulletRigidBody3D::GetAngularVelocity() const { return FromBullet(m_body->getAngularVelocity()); } - float RigidBody3D::GetLinearDamping() const + float BulletRigidBody3D::GetLinearDamping() const { return m_body->getLinearDamping(); } - Vector3f RigidBody3D::GetLinearVelocity() const + Vector3f BulletRigidBody3D::GetLinearVelocity() const { return FromBullet(m_body->getLinearVelocity()); } - float RigidBody3D::GetMass() const + float BulletRigidBody3D::GetMass() const { return m_body->getMass(); } - Vector3f RigidBody3D::GetMassCenter(CoordSys coordSys) const + Vector3f BulletRigidBody3D::GetMassCenter(CoordSys coordSys) const { return FromBullet(m_body->getCenterOfMassPosition()); } - Matrix4f RigidBody3D::GetMatrix() const + Matrix4f BulletRigidBody3D::GetMatrix() const { return FromBullet(m_body->getWorldTransform()); } - Vector3f RigidBody3D::GetPosition() const + Vector3f BulletRigidBody3D::GetPosition() const { return FromBullet(m_body->getWorldTransform().getOrigin()); } - Quaternionf RigidBody3D::GetRotation() const + Quaternionf BulletRigidBody3D::GetRotation() const { return FromBullet(m_body->getWorldTransform().getRotation()); } - bool RigidBody3D::IsSimulationEnabled() const + bool BulletRigidBody3D::IsSimulationEnabled() const { return m_body->isActive(); } - bool RigidBody3D::IsSleeping() const + bool BulletRigidBody3D::IsSleeping() const { return m_body->getActivationState() == ISLAND_SLEEPING; } - bool RigidBody3D::IsSleepingEnabled() const + bool BulletRigidBody3D::IsSleepingEnabled() const { return m_body->getActivationState() != DISABLE_DEACTIVATION; } - void RigidBody3D::SetAngularDamping(float angularDamping) + void BulletRigidBody3D::SetAngularDamping(float angularDamping) { m_body->setDamping(m_body->getLinearDamping(), angularDamping); } - void RigidBody3D::SetAngularVelocity(const Vector3f& angularVelocity) + void BulletRigidBody3D::SetAngularVelocity(const Vector3f& angularVelocity) { m_body->setAngularVelocity(ToBullet(angularVelocity)); } - void RigidBody3D::SetGeom(std::shared_ptr geom, bool recomputeInertia) + void BulletRigidBody3D::SetGeom(std::shared_ptr geom, bool recomputeInertia) { if (m_geom != geom) { @@ -229,17 +229,17 @@ namespace Nz } } - void RigidBody3D::SetLinearDamping(float damping) + void BulletRigidBody3D::SetLinearDamping(float damping) { m_body->setDamping(damping, m_body->getAngularDamping()); } - void RigidBody3D::SetLinearVelocity(const Vector3f& velocity) + void BulletRigidBody3D::SetLinearVelocity(const Vector3f& velocity) { m_body->setLinearVelocity(ToBullet(velocity)); } - void RigidBody3D::SetMass(float mass) + void BulletRigidBody3D::SetMass(float mass) { NazaraAssert(mass >= 0.f, "Mass must be positive and finite"); NazaraAssert(std::isfinite(mass), "Mass must be positive and finite"); @@ -250,7 +250,7 @@ namespace Nz m_body->setMassProps(mass, ToBullet(inertia)); } - void RigidBody3D::SetMassCenter(const Vector3f& center) + void BulletRigidBody3D::SetMassCenter(const Vector3f& center) { btTransform centerTransform; centerTransform.setIdentity(); @@ -259,7 +259,7 @@ namespace Nz m_body->setCenterOfMassTransform(centerTransform); } - void RigidBody3D::SetPosition(const Vector3f& position) + void BulletRigidBody3D::SetPosition(const Vector3f& position) { btTransform worldTransform = m_body->getWorldTransform(); worldTransform.setOrigin(ToBullet(position)); @@ -267,7 +267,7 @@ namespace Nz m_body->setWorldTransform(worldTransform); } - void RigidBody3D::SetRotation(const Quaternionf& rotation) + void BulletRigidBody3D::SetRotation(const Quaternionf& rotation) { btTransform worldTransform = m_body->getWorldTransform(); worldTransform.setRotation(ToBullet(rotation)); @@ -275,33 +275,33 @@ namespace Nz m_body->setWorldTransform(worldTransform); } - Quaternionf RigidBody3D::ToLocal(const Quaternionf& worldRotation) + Quaternionf BulletRigidBody3D::ToLocal(const Quaternionf& worldRotation) { return GetRotation().Conjugate() * worldRotation; } - Vector3f RigidBody3D::ToLocal(const Vector3f& worldPosition) + Vector3f BulletRigidBody3D::ToLocal(const Vector3f& worldPosition) { btTransform worldTransform = m_body->getWorldTransform(); return GetMatrix().InverseTransform() * worldPosition; } - Quaternionf RigidBody3D::ToWorld(const Quaternionf& localRotation) + Quaternionf BulletRigidBody3D::ToWorld(const Quaternionf& localRotation) { return GetRotation() * localRotation; } - Vector3f RigidBody3D::ToWorld(const Vector3f& localPosition) + Vector3f BulletRigidBody3D::ToWorld(const Vector3f& localPosition) { return GetMatrix() * localPosition; } - void RigidBody3D::WakeUp() + void BulletRigidBody3D::WakeUp() { m_body->activate(); } - RigidBody3D& RigidBody3D::operator=(RigidBody3D&& object) noexcept + BulletRigidBody3D& BulletRigidBody3D::operator=(BulletRigidBody3D&& object) noexcept { Destroy(); @@ -318,7 +318,7 @@ namespace Nz return *this; } - void RigidBody3D::Destroy() + void BulletRigidBody3D::Destroy() { if (m_body) { diff --git a/src/Nazara/BulletPhysics3D/Components/BulletRigidBody3DComponent.cpp b/src/Nazara/BulletPhysics3D/Components/BulletRigidBody3DComponent.cpp new file mode 100644 index 000000000..456883331 --- /dev/null +++ b/src/Nazara/BulletPhysics3D/Components/BulletRigidBody3DComponent.cpp @@ -0,0 +1,10 @@ +// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) +// This file is part of the "Nazara Engine - BulletPhysics3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ +} diff --git a/src/Nazara/Physics3D/Systems/Physics3DSystem.cpp b/src/Nazara/BulletPhysics3D/Systems/BulletPhysics3DSystem.cpp similarity index 58% rename from src/Nazara/Physics3D/Systems/Physics3DSystem.cpp rename to src/Nazara/BulletPhysics3D/Systems/BulletPhysics3DSystem.cpp index 0994d9030..d406745d8 100644 --- a/src/Nazara/Physics3D/Systems/Physics3DSystem.cpp +++ b/src/Nazara/BulletPhysics3D/Systems/BulletPhysics3DSystem.cpp @@ -1,32 +1,32 @@ // Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" +// This file is part of the "Nazara Engine - BulletPhysics3D module" // For conditions of distribution and use, see copyright notice in Config.hpp -#include +#include #include -#include +#include namespace Nz { - Physics3DSystem::Physics3DSystem(entt::registry& registry) : + BulletPhysics3DSystem::BulletPhysics3DSystem(entt::registry& registry) : m_registry(registry), - m_physicsConstructObserver(m_registry, entt::collector.group()) + m_physicsConstructObserver(m_registry, entt::collector.group()) { - m_constructConnection = registry.on_construct().connect<&Physics3DSystem::OnConstruct>(this); - m_destructConnection = registry.on_destroy().connect<&Physics3DSystem::OnDestruct>(this); + m_constructConnection = registry.on_construct().connect<&BulletPhysics3DSystem::OnConstruct>(this); + m_destructConnection = registry.on_destroy().connect<&BulletPhysics3DSystem::OnDestruct>(this); } - Physics3DSystem::~Physics3DSystem() + BulletPhysics3DSystem::~BulletPhysics3DSystem() { m_physicsConstructObserver.disconnect(); // Ensure every RigidBody3D is destroyed before world is - auto rigidBodyView = m_registry.view(); + auto rigidBodyView = m_registry.view(); for (auto [entity, rigidBodyComponent] : rigidBodyView.each()) rigidBodyComponent.Destroy(); } - bool Physics3DSystem::RaycastQueryFirst(const Vector3f& from, const Vector3f& to, RaycastHit* hitInfo) + bool BulletPhysics3DSystem::RaycastQueryFirst(const Vector3f& from, const Vector3f& to, RaycastHit* hitInfo) { if (!m_physWorld.RaycastQueryFirst(from, to, hitInfo)) return false; @@ -41,12 +41,12 @@ namespace Nz return true; } - void Physics3DSystem::Update(Time elapsedTime) + void BulletPhysics3DSystem::Update(Time elapsedTime) { // Move newly-created physics entities to their node position/rotation m_physicsConstructObserver.each([&](entt::entity entity) { - RigidBody3DComponent& entityPhysics = m_registry.get(entity); + BulletRigidBody3DComponent& entityPhysics = m_registry.get(entity); NodeComponent& entityNode = m_registry.get(entity); entityPhysics.SetPosition(entityNode.GetPosition(CoordSys::Global)); @@ -58,7 +58,7 @@ namespace Nz // Replicate rigid body position to their node components // TODO: Only replicate active entities - auto view = m_registry.view(); + auto view = m_registry.view(); for (auto [entity, nodeComponent, rigidBodyComponent] : view.each()) { if (rigidBodyComponent.IsSleeping()) @@ -69,10 +69,10 @@ namespace Nz } } - void Physics3DSystem::OnConstruct(entt::registry& registry, entt::entity entity) + void BulletPhysics3DSystem::OnConstruct(entt::registry& registry, entt::entity entity) { // Register rigid body owning entity - RigidBody3DComponent& rigidBody = registry.get(entity); + BulletRigidBody3DComponent& rigidBody = registry.get(entity); std::size_t uniqueIndex = rigidBody.GetUniqueIndex(); if (uniqueIndex >= m_physicsEntities.size()) m_physicsEntities.resize(uniqueIndex + 1); @@ -80,10 +80,10 @@ namespace Nz m_physicsEntities[uniqueIndex] = entity; } - void Physics3DSystem::OnDestruct(entt::registry& registry, entt::entity entity) + void BulletPhysics3DSystem::OnDestruct(entt::registry& registry, entt::entity entity) { // Unregister owning entity - RigidBody3DComponent& rigidBody = registry.get(entity); + BulletRigidBody3DComponent& rigidBody = registry.get(entity); std::size_t uniqueIndex = rigidBody.GetUniqueIndex(); assert(uniqueIndex <= m_physicsEntities.size()); diff --git a/src/Nazara/Physics3D/Components/RigidBody3DComponent.cpp b/src/Nazara/Physics3D/Components/RigidBody3DComponent.cpp deleted file mode 100644 index 55196133e..000000000 --- a/src/Nazara/Physics3D/Components/RigidBody3DComponent.cpp +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#include -#include - -namespace Nz -{ -} diff --git a/src/Nazara/Physics3D/Constraint3D.cpp b/src/Nazara/Physics3D/Constraint3D.cpp deleted file mode 100644 index 4eb7b9656..000000000 --- a/src/Nazara/Physics3D/Constraint3D.cpp +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#include -#include -#include -#include -#include - -namespace Nz -{ - Constraint3D::Constraint3D(std::unique_ptr constraint, bool disableCollisions) : - m_constraint(std::move(constraint)), - m_bodyCollisionEnabled(!disableCollisions) - { - btDynamicsWorld* world = GetWorld().GetDynamicsWorld(); - world->addConstraint(m_constraint.get(), disableCollisions); - } - - Constraint3D::Constraint3D(Constraint3D&& constraint) noexcept : - m_constraint(std::move(constraint.m_constraint)), - m_bodyCollisionEnabled(constraint.m_bodyCollisionEnabled) - { - if (m_constraint) - m_constraint->setUserConstraintPtr(this); - } - - Constraint3D::~Constraint3D() - { - if (m_constraint) - { - btDynamicsWorld* world = GetWorld().GetDynamicsWorld(); - world->removeConstraint(m_constraint.get()); - } - } - - RigidBody3D& Constraint3D::GetBodyA() - { - return *static_cast(m_constraint->getRigidBodyA().getUserPointer()); - } - - const RigidBody3D& Constraint3D::GetBodyA() const - { - return *static_cast(m_constraint->getRigidBodyA().getUserPointer()); - } - - RigidBody3D& Constraint3D::GetBodyB() - { - NazaraAssert(!IsSingleBody(), "constraint is not attached to a second body"); - return *static_cast(m_constraint->getRigidBodyB().getUserPointer()); - } - - const RigidBody3D& Constraint3D::GetBodyB() const - { - NazaraAssert(!IsSingleBody(), "constraint is not attached to a second body"); - return *static_cast(m_constraint->getRigidBodyB().getUserPointer()); - } - - PhysWorld3D& Constraint3D::GetWorld() - { - return *GetBodyA().GetWorld(); - } - - const PhysWorld3D& Constraint3D::GetWorld() const - { - return *GetBodyA().GetWorld(); - } - - bool Constraint3D::IsSingleBody() const - { - return &m_constraint->getRigidBodyB() == &btTypedConstraint::getFixedBody(); - } - - Constraint3D& Constraint3D::operator=(Constraint3D&& constraint) noexcept - { - m_constraint.reset(); - - m_constraint = std::move(constraint.m_constraint); - m_bodyCollisionEnabled = constraint.m_bodyCollisionEnabled; - - if (m_constraint) - m_constraint->setUserConstraintPtr(this); - - return *this; - } - - - PivotConstraint3D::PivotConstraint3D(RigidBody3D& first, const Vector3f& pivot) : - Constraint3D(std::make_unique(*first.GetRigidBody(), ToBullet(first.ToLocal(pivot)))) - { - } - - PivotConstraint3D::PivotConstraint3D(RigidBody3D& first, RigidBody3D& second, const Vector3f& pivot, bool disableCollisions) : - Constraint3D(std::make_unique(*first.GetRigidBody(), *second.GetRigidBody(), ToBullet(first.ToLocal(pivot)), ToBullet(second.ToLocal(pivot))), disableCollisions) - { - } - - PivotConstraint3D::PivotConstraint3D(RigidBody3D& first, RigidBody3D& second, const Vector3f& firstAnchor, const Vector3f& secondAnchor, bool disableCollisions) : - Constraint3D(std::make_unique(*first.GetRigidBody(), *second.GetRigidBody(), ToBullet(firstAnchor), ToBullet(secondAnchor)), disableCollisions) - { - } - - Vector3f PivotConstraint3D::GetFirstAnchor() const - { - return FromBullet(GetConstraint()->getPivotInA()); - } - - Vector3f PivotConstraint3D::GetSecondAnchor() const - { - return FromBullet(GetConstraint()->getPivotInB()); - } - - void PivotConstraint3D::SetFirstAnchor(const Vector3f& firstAnchor) - { - GetConstraint()->setPivotA(ToBullet(firstAnchor)); - } - - void PivotConstraint3D::SetSecondAnchor(const Vector3f& secondAnchor) - { - GetConstraint()->setPivotB(ToBullet(secondAnchor)); - } -} diff --git a/src/Nazara/Physics3D/Physics3D.cpp b/src/Nazara/Physics3D/Physics3D.cpp deleted file mode 100644 index d3ba300f3..000000000 --- a/src/Nazara/Physics3D/Physics3D.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) -// This file is part of the "Nazara Engine - Physics3D module" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#include -#include -#include -#include -#include -#include -#include - -namespace Nz -{ - Physics3D::Physics3D(Config /*config*/) : - ModuleBase("Physics3D", this) - { - } - - Physics3D* Physics3D::s_instance; -} diff --git a/tests/UnitTests/Engine/Modules.hpp b/tests/UnitTests/Engine/Modules.hpp index 7fce6d5db..8baef12c5 100644 --- a/tests/UnitTests/Engine/Modules.hpp +++ b/tests/UnitTests/Engine/Modules.hpp @@ -3,5 +3,5 @@ #include #include #include -#include +#include #include diff --git a/xmake.lua b/xmake.lua index 783fc48d3..40c7562ef 100644 --- a/xmake.lua +++ b/xmake.lua @@ -122,7 +122,7 @@ local modules = { Deps = {"NazaraUtility"}, Packages = { "chipmunk2d", "entt" } }, - Physics3D = { + BulletPhysics3D = { Deps = {"NazaraUtility"}, Packages = { "bullet3", "entt", "ordered_map" } },