diff --git a/.gitignore b/.gitignore index 2e9057d9c..0801d2577 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ build/config.lua # Nazara libraries lib/* +# Nazara plugin libraries +plugins/lib/* + # Nazara package package/* diff --git a/.travis.yml b/.travis.yml index d1ed3ec6d..4fcb85c55 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,8 +34,13 @@ compiler: - clang env: - - COMPILER=clang++-3.7 CONFIG=debug - - COMPILER=clang++-3.7 CONFIG=release + global: + - COMPILER=clang++-3.7 + - CFLAGS="-Wall -Wextra" + - CXXFLAGS="-Wall -Wextra" + matrix: + - CONFIG=debug + - CONFIG=release script: - cd build && diff --git a/SDK/include/NDK/Application.inl b/SDK/include/NDK/Application.inl index 2c74acb19..d26a2daa8 100644 --- a/SDK/include/NDK/Application.inl +++ b/SDK/include/NDK/Application.inl @@ -374,8 +374,8 @@ namespace Ndk } inline Application::WindowInfo::WindowInfo(std::unique_ptr&& window) : - window(std::move(window)), - renderTarget(nullptr) + renderTarget(nullptr), + window(std::move(window)) { } #endif diff --git a/SDK/include/NDK/BaseSystem.inl b/SDK/include/NDK/BaseSystem.inl index 1afc242c0..31a0c314e 100644 --- a/SDK/include/NDK/BaseSystem.inl +++ b/SDK/include/NDK/BaseSystem.inl @@ -15,8 +15,8 @@ namespace Ndk */ inline BaseSystem::BaseSystem(SystemIndex systemId) : - m_updateEnabled(true), - m_systemIndex(systemId) + m_systemIndex(systemId), + m_updateEnabled(true) { SetUpdateRate(30); } diff --git a/SDK/include/NDK/Components.hpp b/SDK/include/NDK/Components.hpp index 79bc196f7..afa25ade8 100644 --- a/SDK/include/NDK/Components.hpp +++ b/SDK/include/NDK/Components.hpp @@ -6,14 +6,14 @@ #define NDK_COMPONENTS_GLOBAL_HPP #include -#include +#include #include #include #include #include #include #include -#include +#include #include #endif // NDK_COMPONENTS_GLOBAL_HPP diff --git a/SDK/include/NDK/Components/CollisionComponent.hpp b/SDK/include/NDK/Components/CollisionComponent3D.hpp similarity index 51% rename from SDK/include/NDK/Components/CollisionComponent.hpp rename to SDK/include/NDK/Components/CollisionComponent3D.hpp index e0af0d09b..f6a07ede6 100644 --- a/SDK/include/NDK/Components/CollisionComponent.hpp +++ b/SDK/include/NDK/Components/CollisionComponent3D.hpp @@ -7,53 +7,53 @@ #ifndef NDK_COMPONENTS_COLLISIONCOMPONENT_HPP #define NDK_COMPONENTS_COLLISIONCOMPONENT_HPP -#include +#include #include #include namespace Nz { - class PhysObject; + class RigidBody3D; } namespace Ndk { class Entity; - class NDK_API CollisionComponent : public Component + class NDK_API CollisionComponent3D : public Component { - friend class PhysicsSystem; + friend class PhysicsSystem3D; friend class StaticCollisionSystem; public: - CollisionComponent(Nz::PhysGeomRef geom = Nz::PhysGeomRef()); - CollisionComponent(const CollisionComponent& collision); - ~CollisionComponent() = default; + CollisionComponent3D(Nz::Collider3DRef geom = Nz::Collider3DRef()); + CollisionComponent3D(const CollisionComponent3D& collision); + ~CollisionComponent3D() = default; - const Nz::PhysGeomRef& GetGeom() const; + const Nz::Collider3DRef& GetGeom() const; - void SetGeom(Nz::PhysGeomRef geom); + void SetGeom(Nz::Collider3DRef geom); - CollisionComponent& operator=(Nz::PhysGeomRef geom); - CollisionComponent& operator=(CollisionComponent&& collision) = default; + CollisionComponent3D& operator=(Nz::Collider3DRef geom); + CollisionComponent3D& operator=(CollisionComponent3D&& collision) = default; static ComponentIndex componentIndex; private: void InitializeStaticBody(); - Nz::PhysObject* GetStaticBody(); + Nz::RigidBody3D* GetStaticBody(); void OnAttached() override; void OnComponentAttached(BaseComponent& component) override; void OnComponentDetached(BaseComponent& component) override; void OnDetached() override; - std::unique_ptr m_staticBody; - Nz::PhysGeomRef m_geom; + std::unique_ptr m_staticBody; + Nz::Collider3DRef m_geom; bool m_bodyUpdated; }; } -#include +#include #endif // NDK_COMPONENTS_COLLISIONCOMPONENT_HPP diff --git a/SDK/include/NDK/Components/CollisionComponent.inl b/SDK/include/NDK/Components/CollisionComponent3D.inl similarity index 57% rename from SDK/include/NDK/Components/CollisionComponent.inl rename to SDK/include/NDK/Components/CollisionComponent3D.inl index b08e7054e..d5dfeaacc 100644 --- a/SDK/include/NDK/Components/CollisionComponent.inl +++ b/SDK/include/NDK/Components/CollisionComponent3D.inl @@ -4,30 +4,30 @@ #include #include -#include -#include +#include +#include namespace Ndk { /*! - * \brief Constructs a CollisionComponent object with a geometry + * \brief Constructs a CollisionComponent3D object with a geometry * * \param geom Reference to a geometry symbolizing the entity */ - inline CollisionComponent::CollisionComponent(Nz::PhysGeomRef geom) : + inline CollisionComponent3D::CollisionComponent3D(Nz::Collider3DRef geom) : m_geom(std::move(geom)), m_bodyUpdated(false) { } /*! - * \brief Constructs a CollisionComponent object by copy semantic + * \brief Constructs a CollisionComponent3D object by copy semantic * - * \param collision CollisionComponent to copy + * \param collision CollisionComponent3D to copy */ - inline CollisionComponent::CollisionComponent(const CollisionComponent& collision) : + inline CollisionComponent3D::CollisionComponent3D(const CollisionComponent3D& collision) : m_geom(collision.m_geom), m_bodyUpdated(false) { @@ -38,7 +38,7 @@ namespace Ndk * \return A constant reference to the physics geometry */ - inline const Nz::PhysGeomRef& CollisionComponent::GetGeom() const + inline const Nz::Collider3DRef& CollisionComponent3D::GetGeom() const { return m_geom; } @@ -50,7 +50,7 @@ namespace Ndk * \param geom Reference to a geometry symbolizing the entity */ - inline CollisionComponent& CollisionComponent::operator=(Nz::PhysGeomRef geom) + inline CollisionComponent3D& CollisionComponent3D::operator=(Nz::Collider3DRef geom) { SetGeom(geom); @@ -62,7 +62,7 @@ namespace Ndk * \return A pointer to the entity */ - inline Nz::PhysObject* CollisionComponent::GetStaticBody() + inline Nz::RigidBody3D* CollisionComponent3D::GetStaticBody() { return m_staticBody.get(); } diff --git a/SDK/include/NDK/Components/GraphicsComponent.hpp b/SDK/include/NDK/Components/GraphicsComponent.hpp index 3dac592c4..187e881ec 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.hpp +++ b/SDK/include/NDK/Components/GraphicsComponent.hpp @@ -79,12 +79,12 @@ namespace Ndk } Renderable(Renderable&& renderable) noexcept : - data(std::move(renderable.data)), - renderable(std::move(renderable.renderable)), - dataUpdated(renderable.dataUpdated), renderableBoundingVolumeInvalidationSlot(std::move(renderable.renderableBoundingVolumeInvalidationSlot)), renderableDataInvalidationSlot(std::move(renderable.renderableDataInvalidationSlot)), - renderableReleaseSlot(std::move(renderable.renderableReleaseSlot)) + renderableReleaseSlot(std::move(renderable.renderableReleaseSlot)), + data(std::move(renderable.data)), + renderable(std::move(renderable.renderable)), + dataUpdated(renderable.dataUpdated) { } diff --git a/SDK/include/NDK/Components/PhysicsComponent.hpp b/SDK/include/NDK/Components/PhysicsComponent3D.hpp similarity index 74% rename from SDK/include/NDK/Components/PhysicsComponent.hpp rename to SDK/include/NDK/Components/PhysicsComponent3D.hpp index 9c5618785..fc1367d84 100644 --- a/SDK/include/NDK/Components/PhysicsComponent.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent3D.hpp @@ -4,10 +4,10 @@ #pragma once -#ifndef NDK_COMPONENTS_PHYSICSCOMPONENT_HPP -#define NDK_COMPONENTS_PHYSICSCOMPONENT_HPP +#ifndef NDK_COMPONENTS_PHYSICSCOMPONENT3D_HPP +#define NDK_COMPONENTS_PHYSICSCOMPONENT3D_HPP -#include +#include #include #include @@ -15,15 +15,15 @@ namespace Ndk { class Entity; - class NDK_API PhysicsComponent : public Component + class NDK_API PhysicsComponent3D : public Component { - friend class CollisionComponent; - friend class PhysicsSystem; + friend class CollisionComponent3D; + friend class PhysicsSystem3D; public: - PhysicsComponent() = default; - PhysicsComponent(const PhysicsComponent& physics); - ~PhysicsComponent() = default; + PhysicsComponent3D() = default; + PhysicsComponent3D(const PhysicsComponent3D& physics); + ~PhysicsComponent3D() = default; void AddForce(const Nz::Vector3f& force, Nz::CoordSys coordSys = Nz::CoordSys_Global); void AddForce(const Nz::Vector3f& force, const Nz::Vector3f& point, Nz::CoordSys coordSys = Nz::CoordSys_Global); @@ -56,17 +56,17 @@ namespace Ndk static ComponentIndex componentIndex; private: - Nz::PhysObject& GetPhysObject(); + Nz::RigidBody3D& GetPhysObject(); void OnAttached() override; void OnComponentAttached(BaseComponent& component) override; void OnComponentDetached(BaseComponent& component) override; void OnDetached() override; - std::unique_ptr m_object; + std::unique_ptr m_object; }; } -#include +#include -#endif // NDK_COMPONENTS_PHYSICSCOMPONENT_HPP +#endif // NDK_COMPONENTS_PHYSICSCOMPONENT3D_HPP diff --git a/SDK/include/NDK/Components/PhysicsComponent.inl b/SDK/include/NDK/Components/PhysicsComponent3D.inl similarity index 79% rename from SDK/include/NDK/Components/PhysicsComponent.inl rename to SDK/include/NDK/Components/PhysicsComponent3D.inl index 5682603e0..84bc36db7 100644 --- a/SDK/include/NDK/Components/PhysicsComponent.inl +++ b/SDK/include/NDK/Components/PhysicsComponent3D.inl @@ -7,12 +7,12 @@ namespace Ndk { /*! - * \brief Constructs a PhysicsComponent object by copy semantic + * \brief Constructs a PhysicsComponent3D object by copy semantic * - * \param physics PhysicsComponent to copy + * \param physics PhysicsComponent3D to copy */ - inline PhysicsComponent::PhysicsComponent(const PhysicsComponent& physics) + inline PhysicsComponent3D::PhysicsComponent3D(const PhysicsComponent3D& physics) { // No copy of physical object (because we only create it when attached to an entity) NazaraUnused(physics); @@ -27,7 +27,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline void PhysicsComponent::AddForce(const Nz::Vector3f& force, Nz::CoordSys coordSys) + inline void PhysicsComponent3D::AddForce(const Nz::Vector3f& force, Nz::CoordSys coordSys) { NazaraAssert(m_object, "Invalid physics object"); @@ -44,7 +44,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline void PhysicsComponent::AddForce(const Nz::Vector3f& force, const Nz::Vector3f& point, Nz::CoordSys coordSys) + inline void PhysicsComponent3D::AddForce(const Nz::Vector3f& force, const Nz::Vector3f& point, Nz::CoordSys coordSys) { NazaraAssert(m_object, "Invalid physics object"); @@ -60,7 +60,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline void PhysicsComponent::AddTorque(const Nz::Vector3f& torque, Nz::CoordSys coordSys) + inline void PhysicsComponent3D::AddTorque(const Nz::Vector3f& torque, Nz::CoordSys coordSys) { NazaraAssert(m_object, "Invalid physics object"); @@ -75,7 +75,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline void PhysicsComponent::EnableAutoSleep(bool autoSleep) + inline void PhysicsComponent3D::EnableAutoSleep(bool autoSleep) { NazaraAssert(m_object, "Invalid physics object"); @@ -89,7 +89,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline Nz::Boxf PhysicsComponent::GetAABB() const + inline Nz::Boxf PhysicsComponent3D::GetAABB() const { NazaraAssert(m_object, "Invalid physics object"); @@ -103,7 +103,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline Nz::Vector3f PhysicsComponent::GetAngularVelocity() const + inline Nz::Vector3f PhysicsComponent3D::GetAngularVelocity() const { NazaraAssert(m_object, "Invalid physics object"); @@ -117,7 +117,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline float PhysicsComponent::GetGravityFactor() const + inline float PhysicsComponent3D::GetGravityFactor() const { NazaraAssert(m_object, "Invalid physics object"); @@ -131,7 +131,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline float PhysicsComponent::GetMass() const + inline float PhysicsComponent3D::GetMass() const { NazaraAssert(m_object, "Invalid physics object"); @@ -147,7 +147,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline Nz::Vector3f PhysicsComponent::GetMassCenter(Nz::CoordSys coordSys) const + inline Nz::Vector3f PhysicsComponent3D::GetMassCenter(Nz::CoordSys coordSys) const { NazaraAssert(m_object, "Invalid physics object"); @@ -161,7 +161,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline const Nz::Matrix4f& PhysicsComponent::GetMatrix() const + inline const Nz::Matrix4f& PhysicsComponent3D::GetMatrix() const { NazaraAssert(m_object, "Invalid physics object"); @@ -175,7 +175,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline Nz::Vector3f PhysicsComponent::GetPosition() const + inline Nz::Vector3f PhysicsComponent3D::GetPosition() const { NazaraAssert(m_object, "Invalid physics object"); @@ -189,7 +189,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline Nz::Quaternionf PhysicsComponent::GetRotation() const + inline Nz::Quaternionf PhysicsComponent3D::GetRotation() const { NazaraAssert(m_object, "Invalid physics object"); @@ -203,7 +203,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline Nz::Vector3f PhysicsComponent::GetVelocity() const + inline Nz::Vector3f PhysicsComponent3D::GetVelocity() const { NazaraAssert(m_object, "Invalid physics object"); @@ -217,7 +217,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline bool PhysicsComponent::IsAutoSleepEnabled() const + inline bool PhysicsComponent3D::IsAutoSleepEnabled() const { NazaraAssert(m_object, "Invalid physics object"); @@ -231,7 +231,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline bool PhysicsComponent::IsSleeping() const + inline bool PhysicsComponent3D::IsSleeping() const { NazaraAssert(m_object, "Invalid physics object"); @@ -246,7 +246,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline void PhysicsComponent::SetAngularVelocity(const Nz::Vector3f& angularVelocity) + inline void PhysicsComponent3D::SetAngularVelocity(const Nz::Vector3f& angularVelocity) { NazaraAssert(m_object, "Invalid physics object"); @@ -261,7 +261,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline void PhysicsComponent::SetGravityFactor(float gravityFactor) + inline void PhysicsComponent3D::SetGravityFactor(float gravityFactor) { NazaraAssert(m_object, "Invalid physics object"); @@ -277,7 +277,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the mass is negative */ - inline void PhysicsComponent::SetMass(float mass) + inline void PhysicsComponent3D::SetMass(float mass) { NazaraAssert(m_object, "Invalid physics object"); NazaraAssert(mass > 0.f, "Mass should be positive"); @@ -293,7 +293,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline void PhysicsComponent::SetMassCenter(const Nz::Vector3f& center) + inline void PhysicsComponent3D::SetMassCenter(const Nz::Vector3f& center) { NazaraAssert(m_object, "Invalid physics object"); @@ -308,7 +308,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline void PhysicsComponent::SetPosition(const Nz::Vector3f& position) + inline void PhysicsComponent3D::SetPosition(const Nz::Vector3f& position) { NazaraAssert(m_object, "Invalid physics object"); @@ -323,7 +323,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline void PhysicsComponent::SetRotation(const Nz::Quaternionf& rotation) + inline void PhysicsComponent3D::SetRotation(const Nz::Quaternionf& rotation) { NazaraAssert(m_object, "Invalid physics object"); @@ -338,7 +338,7 @@ namespace Ndk * \remark Produces a NazaraAssert if the physics object is invalid */ - inline void PhysicsComponent::SetVelocity(const Nz::Vector3f& velocity) + inline void PhysicsComponent3D::SetVelocity(const Nz::Vector3f& velocity) { NazaraAssert(m_object, "Invalid physics object"); @@ -350,7 +350,7 @@ namespace Ndk * \return A reference to the physics object */ - inline Nz::PhysObject& PhysicsComponent::GetPhysObject() + inline Nz::RigidBody3D& PhysicsComponent3D::GetPhysObject() { return *m_object.get(); } diff --git a/SDK/include/NDK/Systems.hpp b/SDK/include/NDK/Systems.hpp index 269bead6f..287a2d61a 100644 --- a/SDK/include/NDK/Systems.hpp +++ b/SDK/include/NDK/Systems.hpp @@ -7,7 +7,7 @@ #include #include -#include +#include #include #include diff --git a/SDK/include/NDK/Systems/PhysicsSystem.hpp b/SDK/include/NDK/Systems/PhysicsSystem.hpp deleted file mode 100644 index a5b0b9fcc..000000000 --- a/SDK/include/NDK/Systems/PhysicsSystem.hpp +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Development Kit" -// For conditions of distribution and use, see copyright notice in Prerequesites.hpp - -#pragma once - -#ifndef NDK_SYSTEMS_PHYSICSSYSTEM_HPP -#define NDK_SYSTEMS_PHYSICSSYSTEM_HPP - -#include -#include -#include - -namespace Ndk -{ - class NDK_API PhysicsSystem : public System - { - public: - PhysicsSystem(); - PhysicsSystem(const PhysicsSystem& system); - ~PhysicsSystem() = default; - - Nz::PhysWorld& GetWorld(); - const Nz::PhysWorld& GetWorld() const; - - static SystemIndex systemIndex; - - private: - void OnEntityValidation(Entity* entity, bool justAdded) override; - void OnUpdate(float elapsedTime) override; - - EntityList m_dynamicObjects; - EntityList m_staticObjects; - Nz::PhysWorld m_world; - }; -} - -#include - -#endif // NDK_SYSTEMS_PHYSICSSYSTEM_HPP diff --git a/SDK/include/NDK/Systems/PhysicsSystem3D.hpp b/SDK/include/NDK/Systems/PhysicsSystem3D.hpp new file mode 100644 index 000000000..35194b7c8 --- /dev/null +++ b/SDK/include/NDK/Systems/PhysicsSystem3D.hpp @@ -0,0 +1,42 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Development Kit" +// For conditions of distribution and use, see copyright notice in Prerequesites.hpp + +#pragma once + +#ifndef NDK_SYSTEMS_PHYSICSSYSTEM3D_HPP +#define NDK_SYSTEMS_PHYSICSSYSTEM3D_HPP + +#include +#include +#include +#include + +namespace Ndk +{ + class NDK_API PhysicsSystem3D : public System + { + public: + PhysicsSystem3D(); + PhysicsSystem3D(const PhysicsSystem3D& system); + ~PhysicsSystem3D() = default; + + Nz::PhysWorld3D& GetWorld(); + const Nz::PhysWorld3D& GetWorld() const; + + static SystemIndex systemIndex; + + private: + void CreatePhysWorld() const; + void OnEntityValidation(Entity* entity, bool justAdded) override; + void OnUpdate(float elapsedTime) override; + + EntityList m_dynamicObjects; + EntityList m_staticObjects; + mutable std::unique_ptr m_world; ///TODO: std::optional (Should I make a Nz::Optional class?) + }; +} + +#include + +#endif // NDK_SYSTEMS_PHYSICSSYSTEM3D_HPP diff --git a/SDK/include/NDK/Systems/PhysicsSystem.inl b/SDK/include/NDK/Systems/PhysicsSystem3D.inl similarity index 62% rename from SDK/include/NDK/Systems/PhysicsSystem.inl rename to SDK/include/NDK/Systems/PhysicsSystem3D.inl index bfe886cb1..b6b1cbb03 100644 --- a/SDK/include/NDK/Systems/PhysicsSystem.inl +++ b/SDK/include/NDK/Systems/PhysicsSystem3D.inl @@ -9,9 +9,12 @@ namespace Ndk * \return A reference to the physical world */ - inline Nz::PhysWorld& PhysicsSystem::GetWorld() + inline Nz::PhysWorld3D& PhysicsSystem3D::GetWorld() { - return m_world; + if (!m_world) + CreatePhysWorld(); + + return *m_world; } /*! @@ -19,8 +22,11 @@ namespace Ndk * \return A constant reference to the physical world */ - inline const Nz::PhysWorld& PhysicsSystem::GetWorld() const + inline const Nz::PhysWorld3D& PhysicsSystem3D::GetWorld() const { - return m_world; + if (!m_world) + CreatePhysWorld(); + + return *m_world; } } diff --git a/SDK/src/NDK/Components/CollisionComponent.cpp b/SDK/src/NDK/Components/CollisionComponent3D.cpp similarity index 61% rename from SDK/src/NDK/Components/CollisionComponent.cpp rename to SDK/src/NDK/Components/CollisionComponent3D.cpp index 0f812e73b..423b06cb4 100644 --- a/SDK/src/NDK/Components/CollisionComponent.cpp +++ b/SDK/src/NDK/Components/CollisionComponent3D.cpp @@ -2,18 +2,18 @@ // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequesites.hpp -#include -#include +#include +#include #include #include -#include -#include +#include +#include namespace Ndk { /*! * \ingroup NDK - * \class Ndk::CollisionComponent + * \class Ndk::CollisionComponent3D * \brief NDK class that represents the component for collision (meant for static objects) */ @@ -25,14 +25,14 @@ namespace Ndk * \remark Produces a NazaraAssert if the entity has no physics component and has no static body */ - void CollisionComponent::SetGeom(Nz::PhysGeomRef geom) + void CollisionComponent3D::SetGeom(Nz::Collider3DRef geom) { m_geom = std::move(geom); - if (m_entity->HasComponent()) + if (m_entity->HasComponent()) { - // We update the geometry of the PhysiscsObject linked to the PhysicsComponent - PhysicsComponent& physComponent = m_entity->GetComponent(); + // We update the geometry of the PhysiscsObject linked to the PhysicsComponent3D + PhysicsComponent3D& physComponent = m_entity->GetComponent(); physComponent.GetPhysObject().SetGeom(m_geom); } else @@ -49,16 +49,16 @@ namespace Ndk * \remark Produces a NazaraAssert if entity is not linked to a world, or the world has no physics system */ - void CollisionComponent::InitializeStaticBody() + void CollisionComponent3D::InitializeStaticBody() { NazaraAssert(m_entity, "Invalid entity"); World* entityWorld = m_entity->GetWorld(); NazaraAssert(entityWorld, "Entity must have world"); - NazaraAssert(entityWorld->HasSystem(), "World must have a physics system"); - Nz::PhysWorld& physWorld = entityWorld->GetSystem().GetWorld(); + NazaraAssert(entityWorld->HasSystem(), "World must have a physics system"); + Nz::PhysWorld3D& physWorld = entityWorld->GetSystem().GetWorld(); - m_staticBody.reset(new Nz::PhysObject(&physWorld, m_geom)); + m_staticBody.reset(new Nz::RigidBody3D(&physWorld, m_geom)); m_staticBody->EnableAutoSleep(false); } @@ -66,9 +66,9 @@ namespace Ndk * \brief Operation to perform when component is attached to an entity */ - void CollisionComponent::OnAttached() + void CollisionComponent3D::OnAttached() { - if (!m_entity->HasComponent()) + if (!m_entity->HasComponent()) InitializeStaticBody(); } @@ -78,9 +78,9 @@ namespace Ndk * \param component Component being attached */ - void CollisionComponent::OnComponentAttached(BaseComponent& component) + void CollisionComponent3D::OnComponentAttached(BaseComponent& component) { - if (IsComponent(component)) + if (IsComponent(component)) m_staticBody.reset(); } @@ -90,9 +90,9 @@ namespace Ndk * \param component Component being detached */ - void CollisionComponent::OnComponentDetached(BaseComponent& component) + void CollisionComponent3D::OnComponentDetached(BaseComponent& component) { - if (IsComponent(component)) + if (IsComponent(component)) InitializeStaticBody(); } @@ -100,10 +100,10 @@ namespace Ndk * \brief Operation to perform when component is detached from an entity */ - void CollisionComponent::OnDetached() + void CollisionComponent3D::OnDetached() { m_staticBody.reset(); } - ComponentIndex CollisionComponent::componentIndex; + ComponentIndex CollisionComponent3D::componentIndex; } diff --git a/SDK/src/NDK/Components/PhysicsComponent.cpp b/SDK/src/NDK/Components/PhysicsComponent3D.cpp similarity index 56% rename from SDK/src/NDK/Components/PhysicsComponent.cpp rename to SDK/src/NDK/Components/PhysicsComponent3D.cpp index 6cfd1077d..7dfffab85 100644 --- a/SDK/src/NDK/Components/PhysicsComponent.cpp +++ b/SDK/src/NDK/Components/PhysicsComponent3D.cpp @@ -2,19 +2,19 @@ // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequesites.hpp -#include -#include +#include +#include #include #include -#include +#include #include -#include +#include namespace Ndk { /*! * \ingroup NDK - * \class Ndk::PhysicsComponent + * \class Ndk::PhysicsComponent3D * \brief NDK class that represents the component for physics (meant for dynamic objects) */ @@ -24,16 +24,16 @@ namespace Ndk * \remark Produces a NazaraAssert if the world does not have a physics system */ - void PhysicsComponent::OnAttached() + void PhysicsComponent3D::OnAttached() { World* entityWorld = m_entity->GetWorld(); - NazaraAssert(entityWorld->HasSystem(), "World must have a physics system"); + NazaraAssert(entityWorld->HasSystem(), "World must have a physics system"); - Nz::PhysWorld& world = entityWorld->GetSystem().GetWorld(); + Nz::PhysWorld3D& world = entityWorld->GetSystem().GetWorld(); - Nz::PhysGeomRef geom; - if (m_entity->HasComponent()) - geom = m_entity->GetComponent().GetGeom(); + Nz::Collider3DRef geom; + if (m_entity->HasComponent()) + geom = m_entity->GetComponent().GetGeom(); Nz::Matrix4f matrix; if (m_entity->HasComponent()) @@ -41,7 +41,7 @@ namespace Ndk else matrix.MakeIdentity(); - m_object.reset(new Nz::PhysObject(&world, geom, matrix)); + m_object.reset(new Nz::RigidBody3D(&world, geom, matrix)); m_object->SetMass(1.f); } @@ -53,12 +53,12 @@ namespace Ndk * \remark Produces a NazaraAssert if physical object is invalid */ - void PhysicsComponent::OnComponentAttached(BaseComponent& component) + void PhysicsComponent3D::OnComponentAttached(BaseComponent& component) { - if (IsComponent(component)) + if (IsComponent(component)) { NazaraAssert(m_object, "Invalid object"); - m_object->SetGeom(static_cast(component).GetGeom()); + m_object->SetGeom(static_cast(component).GetGeom()); } } @@ -70,12 +70,12 @@ namespace Ndk * \remark Produces a NazaraAssert if physical object is invalid */ - void PhysicsComponent::OnComponentDetached(BaseComponent& component) + void PhysicsComponent3D::OnComponentDetached(BaseComponent& component) { - if (IsComponent(component)) + if (IsComponent(component)) { NazaraAssert(m_object, "Invalid object"); - m_object->SetGeom(Nz::NullGeom::New()); + m_object->SetGeom(Nz::NullCollider3D::New()); } } @@ -83,10 +83,10 @@ namespace Ndk * \brief Operation to perform when component is detached from an entity */ - void PhysicsComponent::OnDetached() + void PhysicsComponent3D::OnDetached() { m_object.reset(); } - ComponentIndex PhysicsComponent::componentIndex; + ComponentIndex PhysicsComponent3D::componentIndex; } diff --git a/SDK/src/NDK/LuaBinding_Core.cpp b/SDK/src/NDK/LuaBinding_Core.cpp index d111a0266..01f2a2c01 100644 --- a/SDK/src/NDK/LuaBinding_Core.cpp +++ b/SDK/src/NDK/LuaBinding_Core.cpp @@ -13,7 +13,7 @@ namespace Ndk void LuaBinding::BindCore() { /*********************************** Nz::Clock **********************************/ - clockClass.SetConstructor([](Nz::LuaInstance& lua, Nz::Clock* clock, std::size_t argumentCount) + clockClass.SetConstructor([](Nz::LuaInstance& lua, Nz::Clock* clock, std::size_t /*argumentCount*/) { int argIndex = 1; Nz::Int64 startingValue = lua.Check(&argIndex, 0); diff --git a/SDK/src/NDK/LuaBinding_Graphics.cpp b/SDK/src/NDK/LuaBinding_Graphics.cpp index 7505c1d9a..af319417e 100644 --- a/SDK/src/NDK/LuaBinding_Graphics.cpp +++ b/SDK/src/NDK/LuaBinding_Graphics.cpp @@ -20,10 +20,8 @@ namespace Ndk return reinterpret_cast(model); //TODO: Make a ObjectRefCast }); - modelClass.SetConstructor([] (Nz::LuaInstance& lua, Nz::ModelRef* model, std::size_t argumentCount) + modelClass.SetConstructor([] (Nz::LuaInstance& /*lua*/, Nz::ModelRef* model, std::size_t /*argumentCount*/) { - NazaraUnused(argumentCount); - Nz::PlacementNew(model, Nz::Model::New()); return true; }); diff --git a/SDK/src/NDK/LuaBinding_Utility.cpp b/SDK/src/NDK/LuaBinding_Utility.cpp index 3d8dbdc18..9966b6f21 100644 --- a/SDK/src/NDK/LuaBinding_Utility.cpp +++ b/SDK/src/NDK/LuaBinding_Utility.cpp @@ -93,10 +93,8 @@ namespace Ndk }); /*********************************** Nz::Font **********************************/ - fontClass.SetConstructor([] (Nz::LuaInstance& lua, Nz::FontRef* font, std::size_t argumentCount) + fontClass.SetConstructor([] (Nz::LuaInstance& /*lua*/, Nz::FontRef* font, std::size_t /*argumentCount*/) { - NazaraUnused(argumentCount); - Nz::PlacementNew(font, Nz::Font::New()); return true; }); diff --git a/SDK/src/NDK/Sdk.cpp b/SDK/src/NDK/Sdk.cpp index 326eec502..36283ada3 100644 --- a/SDK/src/NDK/Sdk.cpp +++ b/SDK/src/NDK/Sdk.cpp @@ -9,15 +9,15 @@ #include #include #include -#include +#include #include #include #include -#include +#include #include -#include +#include #include -#include +#include #include #ifndef NDK_SERVER @@ -68,7 +68,7 @@ namespace Ndk Nz::Lua::Initialize(); Nz::Noise::Initialize(); - Nz::Physics::Initialize(); + Nz::Physics3D::Initialize(); Nz::Utility::Initialize(); #ifndef NDK_SERVER @@ -83,9 +83,9 @@ namespace Ndk BaseComponent::Initialize(); // Shared components - InitializeComponent("NdkColli"); + InitializeComponent("NdkColli"); InitializeComponent("NdkNode"); - InitializeComponent("NdkPhys"); + InitializeComponent("NdkPhys"); InitializeComponent("NdkVeloc"); #ifndef NDK_SERVER @@ -103,7 +103,7 @@ namespace Ndk BaseSystem::Initialize(); // Shared systems - InitializeSystem(); + InitializeSystem(); InitializeSystem(); #ifndef NDK_SERVER @@ -161,7 +161,7 @@ namespace Ndk // Shared modules Nz::Lua::Uninitialize(); Nz::Noise::Uninitialize(); - Nz::Physics::Uninitialize(); + Nz::Physics3D::Uninitialize(); Nz::Utility::Uninitialize(); NazaraNotice("Uninitialized: SDK"); diff --git a/SDK/src/NDK/Systems/PhysicsSystem.cpp b/SDK/src/NDK/Systems/PhysicsSystem3D.cpp similarity index 64% rename from SDK/src/NDK/Systems/PhysicsSystem.cpp rename to SDK/src/NDK/Systems/PhysicsSystem3D.cpp index 442784c22..fd5e05d66 100644 --- a/SDK/src/NDK/Systems/PhysicsSystem.cpp +++ b/SDK/src/NDK/Systems/PhysicsSystem3D.cpp @@ -2,11 +2,11 @@ // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequesites.hpp -#include -#include -#include +#include +#include +#include #include -#include +#include namespace Ndk { @@ -15,7 +15,7 @@ namespace Ndk * \class Ndk::PhysicsSystem * \brief NDK class that represents the physics system * - * \remark This system is enabled if the entity has the trait: NodeComponent and any of these two: CollisionComponent or PhysicsComponent + * \remark This system is enabled if the entity has the trait: NodeComponent and any of these two: CollisionComponent3D or PhysicsComponent3D * \remark Static objects do not have a velocity specified by the physical engine */ @@ -23,10 +23,10 @@ namespace Ndk * \brief Constructs an PhysicsSystem object by default */ - PhysicsSystem::PhysicsSystem() + PhysicsSystem3D::PhysicsSystem3D() { Requires(); - RequiresAny(); + RequiresAny(); } /*! @@ -35,12 +35,19 @@ namespace Ndk * \param system PhysicsSystem to copy */ - PhysicsSystem::PhysicsSystem(const PhysicsSystem& system) : + PhysicsSystem3D::PhysicsSystem3D(const PhysicsSystem3D& system) : System(system), m_world() { } + void PhysicsSystem3D::CreatePhysWorld() const + { + NazaraAssert(!m_world, "Physics world should not be created twice"); + + m_world = std::make_unique(); + } + /*! * \brief Operation to perform when entity is validated for the system * @@ -48,18 +55,21 @@ namespace Ndk * \param justAdded Is the entity newly added */ - void PhysicsSystem::OnEntityValidation(Entity* entity, bool justAdded) + void PhysicsSystem3D::OnEntityValidation(Entity* entity, bool justAdded) { - // If entity has not been just added to the system, it is possible that it does not own to the right array + // It's possible our entity got revalidated because of the addition/removal of a PhysicsComponent3D if (!justAdded) { - // We take the inverted array from which the entity should belong to - auto& entities = (entity->HasComponent()) ? m_staticObjects : m_dynamicObjects; + // We take the opposite array from which the entity should belong to + auto& entities = (entity->HasComponent()) ? m_staticObjects : m_dynamicObjects; entities.Remove(entity); } - auto& entities = (entity->HasComponent()) ? m_dynamicObjects : m_staticObjects; + auto& entities = (entity->HasComponent()) ? m_dynamicObjects : m_staticObjects; entities.Insert(entity); + + if (!m_world) + CreatePhysWorld(); } /*! @@ -68,16 +78,19 @@ namespace Ndk * \param elapsedTime Delta time used for the update */ - void PhysicsSystem::OnUpdate(float elapsedTime) + void PhysicsSystem3D::OnUpdate(float elapsedTime) { - m_world.Step(elapsedTime); + if (!m_world) + return; + + m_world->Step(elapsedTime); for (const Ndk::EntityHandle& entity : m_dynamicObjects) { NodeComponent& node = entity->GetComponent(); - PhysicsComponent& phys = entity->GetComponent(); + PhysicsComponent3D& phys = entity->GetComponent(); - Nz::PhysObject& physObj = phys.GetPhysObject(); + Nz::RigidBody3D& physObj = phys.GetPhysObject(); node.SetRotation(physObj.GetRotation(), Nz::CoordSys_Global); node.SetPosition(physObj.GetPosition(), Nz::CoordSys_Global); } @@ -85,10 +98,10 @@ namespace Ndk float invElapsedTime = 1.f / elapsedTime; for (const Ndk::EntityHandle& entity : m_staticObjects) { - CollisionComponent& collision = entity->GetComponent(); + CollisionComponent3D& collision = entity->GetComponent(); NodeComponent& node = entity->GetComponent(); - Nz::PhysObject* physObj = collision.GetStaticBody(); + Nz::RigidBody3D* physObj = collision.GetStaticBody(); Nz::Quaternionf oldRotation = physObj->GetRotation(); Nz::Vector3f oldPosition = physObj->GetPosition(); @@ -121,5 +134,5 @@ namespace Ndk } } - SystemIndex PhysicsSystem::systemIndex; + SystemIndex PhysicsSystem3D::systemIndex; } diff --git a/SDK/src/NDK/Systems/RenderSystem.cpp b/SDK/src/NDK/Systems/RenderSystem.cpp index 806a45e8c..d4754a619 100644 --- a/SDK/src/NDK/Systems/RenderSystem.cpp +++ b/SDK/src/NDK/Systems/RenderSystem.cpp @@ -234,7 +234,7 @@ namespace Ndk * \param viewer Viewer of the scene */ - void RenderSystem::UpdateDirectionalShadowMaps(const Nz::AbstractViewer& viewer) + void RenderSystem::UpdateDirectionalShadowMaps(const Nz::AbstractViewer& /*viewer*/) { if (!m_shadowRT.IsValid()) m_shadowRT.Create(); @@ -265,7 +265,6 @@ namespace Ndk for (const Ndk::EntityHandle& drawable : m_drawables) { GraphicsComponent& graphicsComponent = drawable->GetComponent(); - NodeComponent& drawableNode = drawable->GetComponent(); graphicsComponent.AddToRenderQueue(renderQueue); } @@ -338,7 +337,6 @@ namespace Ndk for (const Ndk::EntityHandle& drawable : m_drawables) { GraphicsComponent& graphicsComponent = drawable->GetComponent(); - NodeComponent& drawableNode = drawable->GetComponent(); graphicsComponent.AddToRenderQueue(renderQueue); } @@ -366,7 +364,6 @@ namespace Ndk for (const Ndk::EntityHandle& drawable : m_drawables) { GraphicsComponent& graphicsComponent = drawable->GetComponent(); - NodeComponent& drawableNode = drawable->GetComponent(); graphicsComponent.AddToRenderQueue(renderQueue); } diff --git a/SDK/src/NDK/Systems/VelocitySystem.cpp b/SDK/src/NDK/Systems/VelocitySystem.cpp index e8cfe2f23..c1298bde3 100644 --- a/SDK/src/NDK/Systems/VelocitySystem.cpp +++ b/SDK/src/NDK/Systems/VelocitySystem.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include namespace Ndk @@ -15,7 +15,7 @@ namespace Ndk * \brief NDK class that represents the velocity system * * \remark This system is enabled if the entity owns the trait: NodeComponent and VelocityComponent - * but it's disabled with the trait: PhysicsComponent + * but it's disabled with the trait: PhysicsComponent3D */ /*! @@ -25,7 +25,7 @@ namespace Ndk VelocitySystem::VelocitySystem() { Requires(); - Excludes(); + Excludes(); } /*! diff --git a/SDK/src/NDK/World.cpp b/SDK/src/NDK/World.cpp index 938722feb..6ba110aee 100644 --- a/SDK/src/NDK/World.cpp +++ b/SDK/src/NDK/World.cpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #ifndef NDK_SERVER @@ -40,7 +40,7 @@ namespace Ndk void World::AddDefaultSystems() { - AddSystem(); + AddSystem(); AddSystem(); #ifndef NDK_SERVER diff --git a/build/scripts/common.lua b/build/scripts/common.lua index 30272acfd..423ebad0d 100644 --- a/build/scripts/common.lua +++ b/build/scripts/common.lua @@ -312,7 +312,7 @@ function NazaraBuild:Execute() if (toolTable.Kind == "library") then targetdir(toolTable.TargetDirectory .. "/" .. makeLibDir .. "/x86") elseif (toolTable.Kind == "plugin") then - targetdir("../plugins/" .. toolTable.Name .. "/lib/" .. makeLibDir .. "/x86") + targetdir("../plugins/lib/" .. makeLibDir .. "/x86") end configuration({"codeblocks or codelite or gmake", "x64"}) @@ -321,7 +321,7 @@ function NazaraBuild:Execute() if (toolTable.Kind == "library") then targetdir(toolTable.TargetDirectory .. "/" .. makeLibDir .. "/x64") elseif (toolTable.Kind == "plugin") then - targetdir("../plugins/" .. toolTable.Name .. "/lib/" .. makeLibDir .. "/x64") + targetdir("../plugins/lib/" .. makeLibDir .. "/x64") end configuration({"vs*", "x32"}) @@ -330,7 +330,7 @@ function NazaraBuild:Execute() if (toolTable.Kind == "library") then targetdir(toolTable.TargetDirectory .. "/msvc/x86") elseif (toolTable.Kind == "plugin") then - targetdir("../plugins/" .. toolTable.Name .. "/lib/msvc/x86") + targetdir("../plugins/lib/msvc/x86") end configuration({"vs*", "x64"}) @@ -339,7 +339,7 @@ function NazaraBuild:Execute() if (toolTable.Kind == "library") then targetdir(toolTable.TargetDirectory .. "/msvc/x64") elseif (toolTable.Kind == "plugin") then - targetdir("../plugins/" .. toolTable.Name .. "/lib/msvc/x64") + targetdir("../plugins/lib/msvc/x64") end configuration({"xcode3 or xcode4", "x32"}) @@ -348,7 +348,7 @@ function NazaraBuild:Execute() if (toolTable.Kind == "library") then targetdir(toolTable.TargetDirectory .. "/xcode/x86") elseif (toolTable.Kind == "plugin") then - targetdir("../plugins/" .. toolTable.Name .. "/lib/xcode/x86") + targetdir("../plugins/lib/xcode/x86") end configuration({"xcode3 or xcode4", "x64"}) @@ -357,7 +357,7 @@ function NazaraBuild:Execute() if (toolTable.Kind == "library") then targetdir(toolTable.TargetDirectory .. "/xcode/x64") elseif (toolTable.Kind == "plugin") then - targetdir("../plugins/" .. toolTable.Name .. "/lib/xcode/x64") + targetdir("../plugins/lib/xcode/x64") end configuration("*Static") @@ -403,7 +403,7 @@ function NazaraBuild:Execute() for k, exampleTable in ipairs(self.OrderedExamples) do local destPath = "../examples/bin" - + project("Demo" .. exampleTable.Name) location(_ACTION .. "/examples") diff --git a/build/scripts/modules/physics2d.lua b/build/scripts/modules/physics2d.lua new file mode 100644 index 000000000..a7514b8cd --- /dev/null +++ b/build/scripts/modules/physics2d.lua @@ -0,0 +1,6 @@ +MODULE.Name = "Physics2D" + +MODULE.Libraries = { + "NazaraCore", + "chipmunk-s" +} diff --git a/build/scripts/modules/physics.lua b/build/scripts/modules/physics3d.lua similarity index 73% rename from build/scripts/modules/physics.lua rename to build/scripts/modules/physics3d.lua index 0796c46fd..d98a6f645 100644 --- a/build/scripts/modules/physics.lua +++ b/build/scripts/modules/physics3d.lua @@ -1,4 +1,4 @@ -MODULE.Name = "Physics" +MODULE.Name = "Physics3D" MODULE.Libraries = { "NazaraCore", diff --git a/build/scripts/tools/ndk.lua b/build/scripts/tools/ndk.lua index 66dcf9a17..6c98029ef 100644 --- a/build/scripts/tools/ndk.lua +++ b/build/scripts/tools/ndk.lua @@ -26,6 +26,6 @@ TOOL.Libraries = function() for k,v in pairs(NazaraBuild.Modules) do table.insert(libraries, "Nazara" .. v.Name) end - + return libraries end \ No newline at end of file diff --git a/build/scripts/tools/ndk_server.lua b/build/scripts/tools/ndk_server.lua index cebd158c6..841aa6e4e 100644 --- a/build/scripts/tools/ndk_server.lua +++ b/build/scripts/tools/ndk_server.lua @@ -44,6 +44,7 @@ TOOL.Libraries = { "NazaraLua", "NazaraNetwork", "NazaraNoise", - "NazaraPhysics", + "NazaraPhysics2D", + "NazaraPhysics3D", "NazaraUtility" } diff --git a/build/scripts/tools/unittests.lua b/build/scripts/tools/unittests.lua index 5dcf6e215..6c44540a3 100644 --- a/build/scripts/tools/unittests.lua +++ b/build/scripts/tools/unittests.lua @@ -14,7 +14,9 @@ TOOL.Includes = { TOOL.Files = { "../tests/main.cpp", + "../tests/Engine/**.hpp", "../tests/Engine/**.cpp", + "../tests/SDK/**.hpp", "../tests/SDK/**.cpp" } diff --git a/build/scripts/tools/unittests_server.lua b/build/scripts/tools/unittests_server.lua index b3eab27c0..c94a54d6d 100644 --- a/build/scripts/tools/unittests_server.lua +++ b/build/scripts/tools/unittests_server.lua @@ -15,7 +15,9 @@ TOOL.Includes = { TOOL.Files = { "../tests/main.cpp", + "../tests/Engine/**.hpp", "../tests/Engine/**.cpp", + "../tests/SDK/**.hpp", "../tests/SDK/**.cpp" } @@ -23,6 +25,7 @@ TOOL.Files = { TOOL.FilesExcluded = { "../tests/Engine/Audio/**", "../tests/Engine/Graphics/**", + "../tests/Engine/Utility/**", "../tests/SDK/NDK/Application.cpp", "../tests/SDK/NDK/Systems/ListenerSystem.cpp", "../tests/SDK/NDK/Systems/RenderSystem.cpp" diff --git a/examples/Tut00/build.lua b/examples/Tut00/build.lua index ed5ea5995..678aa3394 100644 --- a/examples/Tut00/build.lua +++ b/examples/Tut00/build.lua @@ -13,7 +13,8 @@ EXAMPLE.Libraries = { "NazaraLua", "NazaraNetwork", "NazaraNoise", - "NazaraPhysics", + "NazaraPhysics2D", + "NazaraPhysics3D", "NazaraRenderer", "NazaraUtility", "NazaraSDK" diff --git a/examples/Tut00/main.cpp b/examples/Tut00/main.cpp index cfffa4c59..a1029eb99 100644 --- a/examples/Tut00/main.cpp +++ b/examples/Tut00/main.cpp @@ -4,7 +4,8 @@ #include #include #include -#include +#include +#include #include #include #include @@ -19,4 +20,4 @@ int main(int argc, char* argv[]) // Do what you want here return EXIT_SUCCESS; -} \ No newline at end of file +} diff --git a/include/Nazara/Core/AbstractLogger.hpp b/include/Nazara/Core/AbstractLogger.hpp index d4cd772f5..fbe61c080 100644 --- a/include/Nazara/Core/AbstractLogger.hpp +++ b/include/Nazara/Core/AbstractLogger.hpp @@ -21,7 +21,7 @@ namespace Nz virtual void EnableStdReplication(bool enable) = 0; - virtual bool IsStdReplicationEnabled() = 0; + virtual bool IsStdReplicationEnabled() const = 0; virtual void Write(const String& string) = 0; virtual void WriteError(ErrorType type, const String& error, unsigned int line = 0, const char* file = nullptr, const char* function = nullptr); diff --git a/include/Nazara/Core/Algorithm.inl b/include/Nazara/Core/Algorithm.inl index 4008f8860..15827144d 100644 --- a/include/Nazara/Core/Algorithm.inl +++ b/include/Nazara/Core/Algorithm.inl @@ -123,9 +123,8 @@ namespace Nz * \see CountOf */ template - constexpr std::size_t CountOf(T(&name)[N]) noexcept + constexpr std::size_t CountOf(T(&)[N]) noexcept { - // NazaraUnused(name); //< Because "body of function is not a return-statement" >.> return N; } diff --git a/include/Nazara/Core/FileLogger.hpp b/include/Nazara/Core/FileLogger.hpp index d0e4fe2aa..d7b1d8f14 100644 --- a/include/Nazara/Core/FileLogger.hpp +++ b/include/Nazara/Core/FileLogger.hpp @@ -25,8 +25,8 @@ namespace Nz void EnableTimeLogging(bool enable); void EnableStdReplication(bool enable) override; - bool IsStdReplicationEnabled() override; - bool IsTimeLoggingEnabled(); + bool IsStdReplicationEnabled() const override; + bool IsTimeLoggingEnabled() const; void Write(const String& string) override; void WriteError(ErrorType type, const String& error, unsigned int line = 0, const char* file = nullptr, const char* function = nullptr) override; diff --git a/include/Nazara/Core/HandledObject.inl b/include/Nazara/Core/HandledObject.inl index 6b4d64c45..43feebcd3 100644 --- a/include/Nazara/Core/HandledObject.inl +++ b/include/Nazara/Core/HandledObject.inl @@ -71,6 +71,8 @@ namespace Nz template HandledObject& HandledObject::operator=(const HandledObject& object) { + NazaraUnused(object); + // Nothing to do return *this; } diff --git a/include/Nazara/Core/StdLogger.hpp b/include/Nazara/Core/StdLogger.hpp index 430b5a7af..16fd0bb47 100644 --- a/include/Nazara/Core/StdLogger.hpp +++ b/include/Nazara/Core/StdLogger.hpp @@ -22,7 +22,7 @@ namespace Nz void EnableStdReplication(bool enable) override; - bool IsStdReplicationEnabled() override; + bool IsStdReplicationEnabled() const override; void Write(const String& string) override; void WriteError(ErrorType type, const String& error, unsigned int line = 0, const char* file = nullptr, const char* function = nullptr) override; diff --git a/include/Nazara/Graphics/TextSprite.hpp b/include/Nazara/Graphics/TextSprite.hpp index 8e0afa93e..3e05c2795 100644 --- a/include/Nazara/Graphics/TextSprite.hpp +++ b/include/Nazara/Graphics/TextSprite.hpp @@ -78,7 +78,6 @@ namespace Nz Color m_color; MaterialRef m_material; Recti m_localBounds; - mutable bool m_verticesUpdated; float m_scale; static TextSpriteLibrary::LibraryMap s_library; diff --git a/include/Nazara/Math/Vector2.hpp b/include/Nazara/Math/Vector2.hpp index e0ac1d68d..49890b06f 100644 --- a/include/Nazara/Math/Vector2.hpp +++ b/include/Nazara/Math/Vector2.hpp @@ -8,6 +8,7 @@ #define NAZARA_VECTOR2_HPP #include +#include namespace Nz { @@ -119,6 +120,11 @@ template std::ostream& operator<<(std::ostream& out, const Nz::Vecto template Nz::Vector2 operator*(T scale, const Nz::Vector2& vec); template Nz::Vector2 operator/(T scale, const Nz::Vector2& vec); +namespace std +{ + template struct hash>; +} + #include #endif // NAZARA_VECTOR2_HPP diff --git a/include/Nazara/Math/Vector2.inl b/include/Nazara/Math/Vector2.inl index 80e588ba4..8ca023843 100644 --- a/include/Nazara/Math/Vector2.inl +++ b/include/Nazara/Math/Vector2.inl @@ -1057,6 +1057,29 @@ Nz::Vector2 operator/(T scale, const Nz::Vector2& vec) return Nz::Vector2(scale / vec.x, scale / vec.y); } +namespace std +{ + template + struct hash> + { + /*! + * \brief Specialisation of std to hash + * \return Result of the hash + * + * \param v Vector2 to hash + */ + std::size_t operator()(const Nz::Vector2& v) const + { + std::size_t seed {}; + + Nz::HashCombine(seed, v.x); + Nz::HashCombine(seed, v.y); + + return seed; + } + }; +} + #undef F #include diff --git a/include/Nazara/Math/Vector3.hpp b/include/Nazara/Math/Vector3.hpp index 4e6da14ec..27681683f 100644 --- a/include/Nazara/Math/Vector3.hpp +++ b/include/Nazara/Math/Vector3.hpp @@ -8,6 +8,7 @@ #define NAZARA_VECTOR3_HPP #include +#include namespace Nz { @@ -141,6 +142,11 @@ template std::ostream& operator<<(std::ostream& out, const Nz::Vecto template Nz::Vector3 operator*(T scale, const Nz::Vector3& vec); template Nz::Vector3 operator/(T scale, const Nz::Vector3& vec); +namespace std +{ + template struct hash>; +} + #include #endif // NAZARA_VECTOR3_HPP diff --git a/include/Nazara/Math/Vector3.inl b/include/Nazara/Math/Vector3.inl index c5a0155c7..555286024 100644 --- a/include/Nazara/Math/Vector3.inl +++ b/include/Nazara/Math/Vector3.inl @@ -1347,6 +1347,31 @@ Nz::Vector3 operator/(T scale, const Nz::Vector3& vec) return Nz::Vector3(scale / vec.x, scale / vec.y, scale / vec.z); } +namespace std +{ + template + struct hash> + { + /*! + * \brief Specialisation of std to hash + * \return Result of the hash + * + * \param v Vector3 to hash + */ + + std::size_t operator()(const Nz::Vector3& v) const + { + std::size_t seed {}; + + Nz::HashCombine(seed, v.x); + Nz::HashCombine(seed, v.y); + Nz::HashCombine(seed, v.z); + + return seed; + } + }; +} + #undef F #include diff --git a/include/Nazara/Math/Vector4.hpp b/include/Nazara/Math/Vector4.hpp index 0f8e907fc..d878c2ea5 100644 --- a/include/Nazara/Math/Vector4.hpp +++ b/include/Nazara/Math/Vector4.hpp @@ -8,6 +8,7 @@ #define NAZARA_VECTOR4_HPP #include +#include namespace Nz { @@ -117,6 +118,11 @@ template std::ostream& operator<<(std::ostream& out, const Nz::Vecto template Nz::Vector4 operator*(T scale, const Nz::Vector4& vec); template Nz::Vector4 operator/(T scale, const Nz::Vector4& vec); +namespace std +{ + template struct hash>; +} + #include #endif // NAZARA_VECTOR4_HPP diff --git a/include/Nazara/Math/Vector4.inl b/include/Nazara/Math/Vector4.inl index 73a9a0802..190d31b99 100644 --- a/include/Nazara/Math/Vector4.inl +++ b/include/Nazara/Math/Vector4.inl @@ -1120,6 +1120,31 @@ Nz::Vector4 operator/(T scale, const Nz::Vector4& vec) return Nz::Vector4(scale / vec.x, scale / vec.y, scale / vec.z, scale / vec.w); } +namespace std +{ + template + struct hash> + { + /*! + * \brief Specialisation of std to hash + * \return Result of the hash + * + * \param v Vector4 to hash + */ + std::size_t operator()(const Nz::Vector4& v) const + { + std::size_t seed {}; + + Nz::HashCombine(seed, v.x); + Nz::HashCombine(seed, v.y); + Nz::HashCombine(seed, v.z); + Nz::HashCombine(seed, v.w); + + return seed; + } + }; +} + #undef F #include diff --git a/include/Nazara/Network/IpAddress.inl b/include/Nazara/Network/IpAddress.inl index 2fc9ac2bd..1eaef4341 100644 --- a/include/Nazara/Network/IpAddress.inl +++ b/include/Nazara/Network/IpAddress.inl @@ -56,7 +56,7 @@ namespace Nz */ inline IpAddress::IpAddress(const UInt8& a, const UInt8& b, const UInt8& c, const UInt8& d, UInt16 port) : - IpAddress(IPv4{a, b, c, d}, port) + IpAddress(IPv4{{a, b, c, d}}, port) { } @@ -68,7 +68,7 @@ namespace Nz */ inline IpAddress::IpAddress(const UInt16& a, const UInt16& b, const UInt16& c, const UInt16& d, const UInt16& e, const UInt16& f, const UInt16& g, const UInt16& h, UInt16 port) : - IpAddress(IPv6{a, b, c, d, e, f, g, h}, port) + IpAddress(IPv6{{a, b, c, d, e, f, g, h}}, port) { } diff --git a/include/Nazara/Network/TcpClient.hpp b/include/Nazara/Network/TcpClient.hpp index fda4671f9..0fcedcf39 100644 --- a/include/Nazara/Network/TcpClient.hpp +++ b/include/Nazara/Network/TcpClient.hpp @@ -79,8 +79,8 @@ namespace Nz PendingPacket m_pendingPacket; UInt64 m_keepAliveInterval; UInt64 m_keepAliveTime; - bool m_isLowDelayEnabled; bool m_isKeepAliveEnabled; + bool m_isLowDelayEnabled; }; } diff --git a/include/Nazara/Noise/HybridMultiFractal.hpp b/include/Nazara/Noise/HybridMultiFractal.hpp index c73dafc73..cbb80ef65 100644 --- a/include/Nazara/Noise/HybridMultiFractal.hpp +++ b/include/Nazara/Noise/HybridMultiFractal.hpp @@ -25,11 +25,6 @@ namespace Nz private: const NoiseBase& m_source; - float m_value; - float m_remainder; - float m_offset; - float m_weight; - float m_signal; }; } diff --git a/include/Nazara/Physics/Enums.hpp b/include/Nazara/Physics/Enums.hpp deleted file mode 100644 index 1951d3eda..000000000 --- a/include/Nazara/Physics/Enums.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// 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_ENUMS_PHYSICS_HPP -#define NAZARA_ENUMS_PHYSICS_HPP - -enum GeomType -{ - GeomType_Box, - GeomType_Capsule, - GeomType_Cone, - GeomType_Compound, - GeomType_ConvexHull, - GeomType_Cylinder, - GeomType_Heightfield, - GeomType_Null, - GeomType_Scene, - GeomType_Sphere, - GeomType_Tree, - - GeomType_Max = GeomType_Tree -}; - -#endif // NAZARA_ENUMS_PHYSICS_HPP diff --git a/include/Nazara/Physics/Geom.hpp b/include/Nazara/Physics/Geom.hpp deleted file mode 100644 index e228c3d07..000000000 --- a/include/Nazara/Physics/Geom.hpp +++ /dev/null @@ -1,273 +0,0 @@ -// 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 - -class NewtonCollision; - -namespace Nz -{ - ///TODO: CollisionModifier - ///TODO: HeightfieldGeom - ///TODO: PlaneGeom ? - ///TODO: SceneGeom - ///TODO: TreeGeom - - class PhysGeom; - class PhysWorld; - - using PhysGeomConstRef = ObjectRef; - using PhysGeomLibrary = ObjectLibrary; - using PhysGeomRef = ObjectRef; - - class NAZARA_PHYSICS_API PhysGeom : public RefCounted - { - friend PhysGeomLibrary; - friend class Physics; - - public: - PhysGeom() = default; - PhysGeom(const PhysGeom&) = delete; - PhysGeom(PhysGeom&&) = delete; - virtual ~PhysGeom(); - - Boxf ComputeAABB(const Vector3f& translation, const Quaternionf& rotation, const Vector3f& scale) const; - virtual Boxf ComputeAABB(const Matrix4f& offsetMatrix = Matrix4f::Identity(), const Vector3f& scale = Vector3f::Unit()) const; - virtual void ComputeInertialMatrix(Vector3f* inertia, Vector3f* center) const; - virtual float ComputeVolume() const; - - NewtonCollision* GetHandle(PhysWorld* world) const; - virtual GeomType GetType() const = 0; - - PhysGeom& operator=(const PhysGeom&) = delete; - PhysGeom& operator=(PhysGeom&&) = delete; - - static PhysGeomRef Build(const PrimitiveList& list); - - // Signals: - NazaraSignal(OnPhysGeomRelease, const PhysGeom* /*physGeom*/); - - protected: - virtual NewtonCollision* CreateHandle(PhysWorld* world) const = 0; - - static bool Initialize(); - static void Uninitialize(); - - mutable std::unordered_map m_handles; - - static PhysGeomLibrary::LibraryMap s_library; - }; - - class BoxGeom; - - using BoxGeomConstRef = ObjectRef; - using BoxGeomRef = ObjectRef; - - class NAZARA_PHYSICS_API BoxGeom : public PhysGeom - { - public: - BoxGeom(const Vector3f& lengths, const Matrix4f& transformMatrix = Matrix4f::Identity()); - BoxGeom(const Vector3f& lengths, const Vector3f& translation, const Quaternionf& rotation = Quaternionf::Identity()); - - Boxf ComputeAABB(const Matrix4f& offsetMatrix = Matrix4f::Identity(), const Vector3f& scale = Vector3f::Unit()) const override; - float ComputeVolume() const override; - - Vector3f GetLengths() const; - GeomType GetType() const override; - - template static BoxGeomRef New(Args&&... args); - - private: - NewtonCollision* CreateHandle(PhysWorld* world) const override; - - Matrix4f m_matrix; - Vector3f m_lengths; - }; - - class CapsuleGeom; - - using CapsuleGeomConstRef = ObjectRef; - using CapsuleGeomRef = ObjectRef; - - class NAZARA_PHYSICS_API CapsuleGeom : public PhysGeom - { - public: - CapsuleGeom(float length, float radius, const Matrix4f& transformMatrix = Matrix4f::Identity()); - CapsuleGeom(float length, float radius, const Vector3f& translation, const Quaternionf& rotation = Quaternionf::Identity()); - - float GetLength() const; - float GetRadius() const; - GeomType GetType() const override; - - template static CapsuleGeomRef New(Args&&... args); - - private: - NewtonCollision* CreateHandle(PhysWorld* world) const override; - - Matrix4f m_matrix; - float m_length; - float m_radius; - }; - - class CompoundGeom; - - using CompoundGeomConstRef = ObjectRef; - using CompoundGeomRef = ObjectRef; - - class NAZARA_PHYSICS_API CompoundGeom : public PhysGeom - { - public: - CompoundGeom(PhysGeom** geoms, std::size_t geomCount); - - const std::vector& GetGeoms() const; - GeomType GetType() const override; - - template static CompoundGeomRef New(Args&&... args); - - private: - NewtonCollision* CreateHandle(PhysWorld* world) const override; - - std::vector m_geoms; - }; - - class ConeGeom; - - using ConeGeomConstRef = ObjectRef; - using ConeGeomRef = ObjectRef; - - class NAZARA_PHYSICS_API ConeGeom : public PhysGeom - { - public: - ConeGeom(float length, float radius, const Matrix4f& transformMatrix = Matrix4f::Identity()); - ConeGeom(float length, float radius, const Vector3f& translation, const Quaternionf& rotation = Quaternionf::Identity()); - - float GetLength() const; - float GetRadius() const; - GeomType GetType() const override; - - template static ConeGeomRef New(Args&&... args); - - private: - NewtonCollision* CreateHandle(PhysWorld* world) const override; - - Matrix4f m_matrix; - float m_length; - float m_radius; - }; - - class ConvexHullGeom; - - using ConvexHullGeomConstRef = ObjectRef; - using ConvexHullGeomRef = ObjectRef; - - class NAZARA_PHYSICS_API ConvexHullGeom : public PhysGeom - { - public: - ConvexHullGeom(const void* vertices, unsigned int vertexCount, unsigned int stride = sizeof(Vector3f), float tolerance = 0.002f, const Matrix4f& transformMatrix = Matrix4f::Identity()); - ConvexHullGeom(const void* vertices, unsigned int vertexCount, unsigned int stride, float tolerance, const Vector3f& translation, const Quaternionf& rotation = Quaternionf::Identity()); - - GeomType GetType() const override; - - template static ConvexHullGeomRef New(Args&&... args); - - private: - NewtonCollision* CreateHandle(PhysWorld* world) const override; - - std::vector m_vertices; - Matrix4f m_matrix; - float m_tolerance; - unsigned int m_vertexStride; - }; - - class CylinderGeom; - - using CylinderGeomConstRef = ObjectRef; - using CylinderGeomRef = ObjectRef; - - class NAZARA_PHYSICS_API CylinderGeom : public PhysGeom - { - public: - CylinderGeom(float length, float radius, const Matrix4f& transformMatrix = Matrix4f::Identity()); - CylinderGeom(float length, float radius, const Vector3f& translation, const Quaternionf& rotation = Quaternionf::Identity()); - - float GetLength() const; - float GetRadius() const; - GeomType GetType() const override; - - template static CylinderGeomRef New(Args&&... args); - - private: - NewtonCollision* CreateHandle(PhysWorld* world) const override; - - Matrix4f m_matrix; - float m_length; - float m_radius; - }; - - class NullGeom; - - using NullGeomConstRef = ObjectRef; - using NullGeomRef = ObjectRef; - - class NAZARA_PHYSICS_API NullGeom : public PhysGeom - { - public: - NullGeom(); - - void ComputeInertialMatrix(Vector3f* inertia, Vector3f* center) const override; - - GeomType GetType() const override; - - template static NullGeomRef New(Args&&... args); - - private: - NewtonCollision* CreateHandle(PhysWorld* world) const override; - }; - - class SphereGeom; - - using SphereGeomConstRef = ObjectRef; - using SphereGeomRef = ObjectRef; - - class NAZARA_PHYSICS_API SphereGeom : public PhysGeom - { - public: - SphereGeom(float radius, const Matrix4f& transformMatrix = Matrix4f::Identity()); - SphereGeom(float radius, const Vector3f& translation, const Quaternionf& rotation = Quaternionf::Identity()); - - Boxf ComputeAABB(const Matrix4f& offsetMatrix = Matrix4f::Identity(), const Vector3f& scale = Vector3f::Unit()) const override; - float ComputeVolume() const override; - - float GetRadius() const; - GeomType GetType() const override; - - template static SphereGeomRef New(Args&&... args); - - private: - NewtonCollision* CreateHandle(PhysWorld* world) const override; - - Vector3f m_position; - float m_radius; - }; -} - -#include - -#endif // NAZARA_PHYSWORLD_HPP diff --git a/include/Nazara/Physics/Geom.inl b/include/Nazara/Physics/Geom.inl deleted file mode 100644 index 9699cac96..000000000 --- a/include/Nazara/Physics/Geom.inl +++ /dev/null @@ -1,83 +0,0 @@ -// 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 - -#include -#include - -namespace Nz -{ - template - BoxGeomRef BoxGeom::New(Args&&... args) - { - std::unique_ptr object(new BoxGeom(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - CapsuleGeomRef CapsuleGeom::New(Args&&... args) - { - std::unique_ptr object(new CapsuleGeom(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - CompoundGeomRef CompoundGeom::New(Args&&... args) - { - std::unique_ptr object(new CompoundGeom(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - ConeGeomRef ConeGeom::New(Args&&... args) - { - std::unique_ptr object(new ConeGeom(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - ConvexHullGeomRef ConvexHullGeom::New(Args&&... args) - { - std::unique_ptr object(new ConvexHullGeom(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - CylinderGeomRef CylinderGeom::New(Args&&... args) - { - std::unique_ptr object(new CylinderGeom(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - NullGeomRef NullGeom::New(Args&&... args) - { - std::unique_ptr object(new NullGeom(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } - - template - SphereGeomRef SphereGeom::New(Args&&... args) - { - std::unique_ptr object(new SphereGeom(std::forward(args)...)); - object->SetPersistent(false); - - return object.release(); - } -} - -#include diff --git a/include/Nazara/Physics.hpp b/include/Nazara/Physics2D.hpp similarity index 70% rename from include/Nazara/Physics.hpp rename to include/Nazara/Physics2D.hpp index a4fcfc768..9b4ce41f4 100644 --- a/include/Nazara/Physics.hpp +++ b/include/Nazara/Physics2D.hpp @@ -1,7 +1,7 @@ -// This file was automatically generated on 24 Jun 2015 at 13:55:50 +// This file was automatically generated on 14 Oct 2016 at 18:58:18 /* - Nazara Engine - Physics module + Nazara Engine - Physics 2D module Copyright (C) 2015 Jérôme "Lynix" Leclercq (Lynix680@gmail.com) @@ -26,14 +26,14 @@ #pragma once -#ifndef NAZARA_GLOBAL_PHYSICS_HPP -#define NAZARA_GLOBAL_PHYSICS_HPP +#ifndef NAZARA_GLOBAL_PHYSICS2D_HPP +#define NAZARA_GLOBAL_PHYSICS2D_HPP -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include -#endif // NAZARA_GLOBAL_PHYSICS_HPP +#endif // NAZARA_GLOBAL_PHYSICS2D_HPP diff --git a/include/Nazara/Physics2D/Collider2D.hpp b/include/Nazara/Physics2D/Collider2D.hpp new file mode 100644 index 000000000..f8cd7d6af --- /dev/null +++ b/include/Nazara/Physics2D/Collider2D.hpp @@ -0,0 +1,132 @@ +// 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; + }; +} + +#include + +#endif // NAZARA_COLLIDER2D_HPP diff --git a/include/Nazara/Physics2D/Collider2D.inl b/include/Nazara/Physics2D/Collider2D.inl new file mode 100644 index 000000000..2cd44d326 --- /dev/null +++ b/include/Nazara/Physics2D/Collider2D.inl @@ -0,0 +1,54 @@ +// 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 + +#include +#include + +namespace Nz +{ + inline const Rectf& BoxCollider2D::GetRect() const + { + return m_rect; + } + + inline Vector2f BoxCollider2D::GetSize() const + { + return m_rect.GetLengths(); + } + + template + BoxCollider2DRef BoxCollider2D::New(Args&&... args) + { + std::unique_ptr object(new BoxCollider2D(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); + } + + inline float CircleCollider2D::GetRadius() const + { + return m_radius; + } + + template + CircleCollider2DRef CircleCollider2D::New(Args&&... args) + { + std::unique_ptr object(new CircleCollider2D(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); + } + + template + NullCollider2DRef NullCollider2D::New(Args&&... args) + { + std::unique_ptr object(new NullCollider2D(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); + } + +} + +#include diff --git a/include/Nazara/Physics/Config.hpp b/include/Nazara/Physics2D/Config.hpp similarity index 79% rename from include/Nazara/Physics/Config.hpp rename to include/Nazara/Physics2D/Config.hpp index b57e39378..e356e1009 100644 --- a/include/Nazara/Physics/Config.hpp +++ b/include/Nazara/Physics2D/Config.hpp @@ -1,5 +1,5 @@ /* - Nazara Engine - Physics module + Nazara Engine - Physics 2D module Copyright (C) 2015 Jérôme "Lynix" Leclercq (Lynix680@gmail.com) @@ -24,28 +24,28 @@ #pragma once -#ifndef NAZARA_CONFIG_PHYSICS_HPP -#define NAZARA_CONFIG_PHYSICS_HPP +#ifndef NAZARA_CONFIG_PHYSICS2D_HPP +#define NAZARA_CONFIG_PHYSICS2D_HPP /// Chaque modification d'un paramètre du module nécessite une recompilation de celui-ci // Utilise un manager de mémoire pour gérer les allocations dynamiques (détecte les leaks au prix d'allocations/libérations dynamiques plus lentes) -#define NAZARA_PHYSICS_MANAGE_MEMORY 0 +#define NAZARA_PHYSICS2D_MANAGE_MEMORY 0 // Active les tests de sécurité basés sur le code (Conseillé pour le développement) -#define NAZARA_PHYSICS_SAFE 1 +#define NAZARA_PHYSICS2D_SAFE 1 /// Vérification des valeurs et types de certaines constantes -#include +#include #if defined(NAZARA_STATIC) - #define NAZARA_PHYSICS_API + #define NAZARA_PHYSICS2D_API #else - #ifdef NAZARA_PHYSICS_BUILD - #define NAZARA_PHYSICS_API NAZARA_EXPORT + #ifdef NAZARA_PHYSICS2D_BUILD + #define NAZARA_PHYSICS2D_API NAZARA_EXPORT #else - #define NAZARA_PHYSICS_API NAZARA_IMPORT + #define NAZARA_PHYSICS2D_API NAZARA_IMPORT #endif #endif -#endif // NAZARA_CONFIG_PHYSICS_HPP +#endif // NAZARA_CONFIG_PHYSICS3D_HPP diff --git a/include/Nazara/Physics/ConfigCheck.hpp b/include/Nazara/Physics2D/ConfigCheck.hpp similarity index 82% rename from include/Nazara/Physics/ConfigCheck.hpp rename to include/Nazara/Physics2D/ConfigCheck.hpp index 5721e2660..4689d6e68 100644 --- a/include/Nazara/Physics/ConfigCheck.hpp +++ b/include/Nazara/Physics2D/ConfigCheck.hpp @@ -1,5 +1,5 @@ // Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Engine - Physics module" +// 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 @@ -12,7 +12,7 @@ // On force la valeur de MANAGE_MEMORY en mode debug #if defined(NAZARA_DEBUG) && !NAZARA_PHYSICS_MANAGE_MEMORY #undef NAZARA_PHYSICS_MANAGE_MEMORY - #define NAZARA_PHYSICS_MANAGE_MEMORY 0 + #define NAZARA_PHYSICS3D_MANAGE_MEMORY 0 #endif #endif // NAZARA_CONFIG_CHECK_PHYSICS_HPP diff --git a/include/Nazara/Physics/Debug.hpp b/include/Nazara/Physics2D/Debug.hpp similarity index 66% rename from include/Nazara/Physics/Debug.hpp rename to include/Nazara/Physics2D/Debug.hpp index 3f3d8fe41..f9cebc624 100644 --- a/include/Nazara/Physics/Debug.hpp +++ b/include/Nazara/Physics2D/Debug.hpp @@ -1,8 +1,8 @@ // Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Engine - Physics module" +// This file is part of the "Nazara Engine - Physics 2D module" // For conditions of distribution and use, see copyright notice in Config.hpp -#include +#include #if NAZARA_PHYSICS_MANAGE_MEMORY #include #endif diff --git a/include/Nazara/Physics/DebugOff.hpp b/include/Nazara/Physics2D/DebugOff.hpp similarity index 80% rename from include/Nazara/Physics/DebugOff.hpp rename to include/Nazara/Physics2D/DebugOff.hpp index 4ea033e46..dd95ffe34 100644 --- a/include/Nazara/Physics/DebugOff.hpp +++ b/include/Nazara/Physics2D/DebugOff.hpp @@ -1,5 +1,5 @@ // Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Engine - Physics module" +// This file is part of the "Nazara Engine - Physics 2D module" // For conditions of distribution and use, see copyright notice in Config.hpp // On suppose que Debug.hpp a déjà été inclus, tout comme Config.hpp diff --git a/include/Nazara/Physics2D/Enums.hpp b/include/Nazara/Physics2D/Enums.hpp new file mode 100644 index 000000000..529af6f6c --- /dev/null +++ b/include/Nazara/Physics2D/Enums.hpp @@ -0,0 +1,24 @@ +// 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_ENUMS_PHYSICS2D_HPP +#define NAZARA_ENUMS_PHYSICS2D_HPP + +namespace Nz +{ + enum ColliderType2D + { + ColliderType2D_Box, + ColliderType2D_Convex, + ColliderType2D_Circle, + ColliderType2D_Null, + ColliderType2D_Segment, + + ColliderType2D_Max = ColliderType2D_Segment + }; +} + +#endif // NAZARA_ENUMS_PHYSICS2D_HPP diff --git a/include/Nazara/Physics2D/PhysWorld2D.hpp b/include/Nazara/Physics2D/PhysWorld2D.hpp new file mode 100644 index 000000000..e194f89d2 --- /dev/null +++ b/include/Nazara/Physics2D/PhysWorld2D.hpp @@ -0,0 +1,46 @@ +// 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_PHYSWORLD2D_HPP +#define NAZARA_PHYSWORLD2D_HPP + +#include +#include +#include + +struct cpSpace; + +namespace Nz +{ + class NAZARA_PHYSICS2D_API PhysWorld2D + { + public: + PhysWorld2D(); + PhysWorld2D(const PhysWorld2D&) = delete; + PhysWorld2D(PhysWorld2D&&) = delete; ///TODO + ~PhysWorld2D(); + + Vector2f GetGravity() const; + cpSpace* GetHandle() const; + float GetStepSize() const; + + void SetGravity(const Vector2f& gravity); + void SetSolverModel(unsigned int model); + void SetStepSize(float stepSize); + + void Step(float timestep); + + PhysWorld2D& operator=(const PhysWorld2D&) = delete; + PhysWorld2D& operator=(PhysWorld2D&&) = delete; ///TODO + + private: + cpSpace* m_handle; + float m_stepSize; + float m_timestepAccumulator; + }; +} + +#endif // NAZARA_PHYSWORLD2D_HPP diff --git a/include/Nazara/Physics2D/Physics2D.hpp b/include/Nazara/Physics2D/Physics2D.hpp new file mode 100644 index 000000000..27fdf3128 --- /dev/null +++ b/include/Nazara/Physics2D/Physics2D.hpp @@ -0,0 +1,33 @@ +// 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_PHYSICS2D_HPP +#define NAZARA_PHYSICS2D_HPP + +#include +#include +#include + +namespace Nz +{ + class NAZARA_PHYSICS2D_API Physics2D + { + public: + Physics2D() = delete; + ~Physics2D() = delete; + + static bool Initialize(); + + static bool IsInitialized(); + + static void Uninitialize(); + + private: + static unsigned int s_moduleReferenceCounter; + }; +} + +#endif // NAZARA_PHYSICS2D_HPP diff --git a/include/Nazara/Physics2D/RigidBody2D.hpp b/include/Nazara/Physics2D/RigidBody2D.hpp new file mode 100644 index 000000000..7d521fbe6 --- /dev/null +++ b/include/Nazara/Physics2D/RigidBody2D.hpp @@ -0,0 +1,74 @@ +// 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_RIGIDBODY2D_HPP +#define NAZARA_RIGIDBODY2D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +struct cpBody; + +namespace Nz +{ + class PhysWorld2D; + + class NAZARA_PHYSICS2D_API RigidBody2D + { + public: + RigidBody2D(PhysWorld2D* world, float mass); + RigidBody2D(PhysWorld2D* world, float mass, Collider2DRef geom); + RigidBody2D(const RigidBody2D& object); + RigidBody2D(RigidBody2D&& object); + ~RigidBody2D(); + + void AddForce(const Vector2f& force, CoordSys coordSys = CoordSys_Global); + void AddForce(const Vector2f& force, const Vector2f& point, CoordSys coordSys = CoordSys_Global); + void AddTorque(float torque); + + Rectf GetAABB() const; + float GetAngularVelocity() const; + Vector2f GetCenterOfGravity(CoordSys coordSys = CoordSys_Local) const; + const Collider2DRef& GetGeom() const; + cpBody* GetHandle() const; + float GetMass() const; + Vector2f GetPosition() const; + float GetRotation() const; + Vector2f GetVelocity() const; + + bool IsMoveable() const; + bool IsSleeping() const; + + void SetAngularVelocity(float angularVelocity); + void SetMass(float mass); + void SetMassCenter(const Vector2f& center); + void SetPosition(const Vector2f& position); + void SetRotation(float rotation); + void SetVelocity(const Vector2f& velocity); + + RigidBody2D& operator=(const RigidBody2D& object); + RigidBody2D& operator=(RigidBody2D&& object); + + private: + void Destroy(); + void SetGeom(Collider2DRef geom); + + std::vector m_shapes; + Collider2DRef m_geom; + cpBody* m_handle; + PhysWorld2D* m_world; + float m_gravityFactor; + float m_mass; + }; +} + +#endif // NAZARA_RIGIDBODY3D_HPP diff --git a/include/Nazara/Physics3D.hpp b/include/Nazara/Physics3D.hpp new file mode 100644 index 000000000..e9c84e757 --- /dev/null +++ b/include/Nazara/Physics3D.hpp @@ -0,0 +1,39 @@ +// This file was automatically generated on 14 Oct 2016 at 18:58:18 + +/* + Nazara Engine - Physics 3D module + + Copyright (C) 2015 Jérôme "Lynix" Leclercq (Lynix680@gmail.com) + + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal in + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished to do + so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#pragma once + +#ifndef NAZARA_GLOBAL_PHYSICS3D_HPP +#define NAZARA_GLOBAL_PHYSICS3D_HPP + +#include +#include +#include +#include +#include +#include + +#endif // NAZARA_GLOBAL_PHYSICS3D_HPP diff --git a/include/Nazara/Physics3D/Collider3D.hpp b/include/Nazara/Physics3D/Collider3D.hpp new file mode 100644 index 000000000..89e0a4879 --- /dev/null +++ b/include/Nazara/Physics3D/Collider3D.hpp @@ -0,0 +1,273 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Physics 3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_COLLIDER3D_HPP +#define NAZARA_COLLIDER3D_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class NewtonCollision; + +namespace Nz +{ + ///TODO: CollisionModifier + ///TODO: HeightfieldGeom + ///TODO: PlaneGeom ? + ///TODO: SceneGeom + ///TODO: TreeGeom + + class Collider3D; + class PhysWorld3D; + + using Collider3DConstRef = ObjectRef; + using Collider3DLibrary = ObjectLibrary; + using Collider3DRef = ObjectRef; + + class NAZARA_PHYSICS3D_API Collider3D : public RefCounted + { + friend Collider3DLibrary; + friend class Physics3D; + + public: + Collider3D() = default; + Collider3D(const Collider3D&) = delete; + Collider3D(Collider3D&&) = delete; + virtual ~Collider3D(); + + Boxf ComputeAABB(const Vector3f& translation, const Quaternionf& rotation, const Vector3f& scale) const; + virtual Boxf ComputeAABB(const Matrix4f& offsetMatrix = Matrix4f::Identity(), const Vector3f& scale = Vector3f::Unit()) const; + virtual void ComputeInertialMatrix(Vector3f* inertia, Vector3f* center) const; + virtual float ComputeVolume() const; + + NewtonCollision* GetHandle(PhysWorld3D* world) const; + virtual ColliderType3D GetType() const = 0; + + Collider3D& operator=(const Collider3D&) = delete; + Collider3D& operator=(Collider3D&&) = delete; + + static Collider3DRef Build(const PrimitiveList& list); + + // Signals: + NazaraSignal(OnColliderRelease, const Collider3D* /*collider*/); + + protected: + virtual NewtonCollision* CreateHandle(PhysWorld3D* world) const = 0; + + static bool Initialize(); + static void Uninitialize(); + + mutable std::unordered_map m_handles; + + static Collider3DLibrary::LibraryMap s_library; + }; + + class BoxCollider3D; + + using BoxCollider3DConstRef = ObjectRef; + using BoxCollider3DRef = ObjectRef; + + class NAZARA_PHYSICS3D_API BoxCollider3D : public Collider3D + { + public: + BoxCollider3D(const Vector3f& lengths, const Matrix4f& transformMatrix = Matrix4f::Identity()); + BoxCollider3D(const Vector3f& lengths, const Vector3f& translation, const Quaternionf& rotation = Quaternionf::Identity()); + + Boxf ComputeAABB(const Matrix4f& offsetMatrix = Matrix4f::Identity(), const Vector3f& scale = Vector3f::Unit()) const override; + float ComputeVolume() const override; + + Vector3f GetLengths() const; + ColliderType3D GetType() const override; + + template static BoxCollider3DRef New(Args&&... args); + + private: + NewtonCollision* CreateHandle(PhysWorld3D* world) const override; + + Matrix4f m_matrix; + Vector3f m_lengths; + }; + + class CapsuleCollider3D; + + using CapsuleCollider3DConstRef = ObjectRef; + using CapsuleCollider3DRef = ObjectRef; + + class NAZARA_PHYSICS3D_API CapsuleCollider3D : public Collider3D + { + public: + CapsuleCollider3D(float length, float radius, const Matrix4f& transformMatrix = Matrix4f::Identity()); + CapsuleCollider3D(float length, float radius, const Vector3f& translation, const Quaternionf& rotation = Quaternionf::Identity()); + + float GetLength() const; + float GetRadius() const; + ColliderType3D GetType() const override; + + template static CapsuleCollider3DRef New(Args&&... args); + + private: + NewtonCollision* CreateHandle(PhysWorld3D* world) const override; + + Matrix4f m_matrix; + float m_length; + float m_radius; + }; + + class CompoundCollider3D; + + using CompoundCollider3DConstRef = ObjectRef; + using CompoundCollider3DRef = ObjectRef; + + class NAZARA_PHYSICS3D_API CompoundCollider3D : public Collider3D + { + public: + CompoundCollider3D(Collider3D** geoms, std::size_t geomCount); + + const std::vector& GetGeoms() const; + ColliderType3D GetType() const override; + + template static CompoundCollider3DRef New(Args&&... args); + + private: + NewtonCollision* CreateHandle(PhysWorld3D* world) const override; + + std::vector m_geoms; + }; + + class ConeCollider3D; + + using ConeCollider3DConstRef = ObjectRef; + using ConeCollider3DRef = ObjectRef; + + class NAZARA_PHYSICS3D_API ConeCollider3D : public Collider3D + { + public: + ConeCollider3D(float length, float radius, const Matrix4f& transformMatrix = Matrix4f::Identity()); + ConeCollider3D(float length, float radius, const Vector3f& translation, const Quaternionf& rotation = Quaternionf::Identity()); + + float GetLength() const; + float GetRadius() const; + ColliderType3D GetType() const override; + + template static ConeCollider3DRef New(Args&&... args); + + private: + NewtonCollision* CreateHandle(PhysWorld3D* world) const override; + + Matrix4f m_matrix; + float m_length; + float m_radius; + }; + + class ConvexCollider3D; + + using ConvexCollider3DConstRef = ObjectRef; + using ConvexCollider3DRef = ObjectRef; + + class NAZARA_PHYSICS3D_API ConvexCollider3D : public Collider3D + { + public: + ConvexCollider3D(SparsePtr vertices, unsigned int vertexCount, float tolerance = 0.002f, const Matrix4f& transformMatrix = Matrix4f::Identity()); + ConvexCollider3D(SparsePtr vertices, unsigned int vertexCount, float tolerance, const Vector3f& translation, const Quaternionf& rotation = Quaternionf::Identity()); + + ColliderType3D GetType() const override; + + template static ConvexCollider3DRef New(Args&&... args); + + private: + NewtonCollision* CreateHandle(PhysWorld3D* world) const override; + + std::vector m_vertices; + Matrix4f m_matrix; + float m_tolerance; + }; + + class CylinderCollider3D; + + using CylinderCollider3DConstRef = ObjectRef; + using CylinderCollider3DRef = ObjectRef; + + class NAZARA_PHYSICS3D_API CylinderCollider3D : public Collider3D + { + public: + CylinderCollider3D(float length, float radius, const Matrix4f& transformMatrix = Matrix4f::Identity()); + CylinderCollider3D(float length, float radius, const Vector3f& translation, const Quaternionf& rotation = Quaternionf::Identity()); + + float GetLength() const; + float GetRadius() const; + ColliderType3D GetType() const override; + + template static CylinderCollider3DRef New(Args&&... args); + + private: + NewtonCollision* CreateHandle(PhysWorld3D* world) const override; + + Matrix4f m_matrix; + float m_length; + float m_radius; + }; + + class NullCollider3D; + + using NullCollider3DConstRef = ObjectRef; + using NullCollider3DRef = ObjectRef; + + class NAZARA_PHYSICS3D_API NullCollider3D : public Collider3D + { + public: + NullCollider3D(); + + void ComputeInertialMatrix(Vector3f* inertia, Vector3f* center) const override; + + ColliderType3D GetType() const override; + + template static NullCollider3DRef New(Args&&... args); + + private: + NewtonCollision* CreateHandle(PhysWorld3D* world) const override; + }; + + class SphereCollider3D; + + using SphereCollider3DConstRef = ObjectRef; + using SphereCollider3DRef = ObjectRef; + + class NAZARA_PHYSICS3D_API SphereCollider3D : public Collider3D + { + public: + SphereCollider3D(float radius, const Matrix4f& transformMatrix = Matrix4f::Identity()); + SphereCollider3D(float radius, const Vector3f& translation, const Quaternionf& rotation = Quaternionf::Identity()); + + Boxf ComputeAABB(const Matrix4f& offsetMatrix = Matrix4f::Identity(), const Vector3f& scale = Vector3f::Unit()) const override; + float ComputeVolume() const override; + + float GetRadius() const; + ColliderType3D GetType() const override; + + template static SphereCollider3DRef New(Args&&... args); + + private: + NewtonCollision* CreateHandle(PhysWorld3D* world) const override; + + Vector3f m_position; + float m_radius; + }; +} + +#include + +#endif // NAZARA_COLLIDER3D_HPP diff --git a/include/Nazara/Physics3D/Collider3D.inl b/include/Nazara/Physics3D/Collider3D.inl new file mode 100644 index 000000000..aeb7073d8 --- /dev/null +++ b/include/Nazara/Physics3D/Collider3D.inl @@ -0,0 +1,83 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Physics 3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include + +namespace Nz +{ + template + BoxCollider3DRef BoxCollider3D::New(Args&&... args) + { + std::unique_ptr object(new BoxCollider3D(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); + } + + template + CapsuleCollider3DRef CapsuleCollider3D::New(Args&&... args) + { + std::unique_ptr object(new CapsuleCollider3D(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); + } + + template + CompoundCollider3DRef CompoundCollider3D::New(Args&&... args) + { + std::unique_ptr object(new CompoundCollider3D(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); + } + + template + ConeCollider3DRef ConeCollider3D::New(Args&&... args) + { + std::unique_ptr object(new ConeCollider3D(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); + } + + template + ConvexCollider3DRef ConvexCollider3D::New(Args&&... args) + { + std::unique_ptr object(new ConvexCollider3D(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); + } + + template + CylinderCollider3DRef CylinderCollider3D::New(Args&&... args) + { + std::unique_ptr object(new CylinderCollider3D(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); + } + + template + NullCollider3DRef NullCollider3D::New(Args&&... args) + { + std::unique_ptr object(new NullCollider3D(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); + } + + template + SphereCollider3DRef SphereCollider3D::New(Args&&... args) + { + std::unique_ptr object(new SphereCollider3D(std::forward(args)...)); + object->SetPersistent(false); + + return object.release(); + } +} + +#include diff --git a/include/Nazara/Physics3D/Config.hpp b/include/Nazara/Physics3D/Config.hpp new file mode 100644 index 000000000..91ecec8e3 --- /dev/null +++ b/include/Nazara/Physics3D/Config.hpp @@ -0,0 +1,51 @@ +/* + Nazara Engine - Physics 3D module + + Copyright (C) 2015 Jérôme "Lynix" Leclercq (Lynix680@gmail.com) + + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal in + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished to do + so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#pragma once + +#ifndef NAZARA_CONFIG_PHYSICS3D_HPP +#define NAZARA_CONFIG_PHYSICS3D_HPP + +/// Chaque modification d'un paramètre du module nécessite une recompilation de celui-ci + +// Utilise un manager de mémoire pour gérer les allocations dynamiques (détecte les leaks au prix d'allocations/libérations dynamiques plus lentes) +#define NAZARA_PHYSICS3D_MANAGE_MEMORY 0 + +// Active les tests de sécurité basés sur le code (Conseillé pour le développement) +#define NAZARA_PHYSICS3D_SAFE 1 + +/// Vérification des valeurs et types de certaines constantes +#include + +#if defined(NAZARA_STATIC) + #define NAZARA_PHYSICS3D_API +#else + #ifdef NAZARA_PHYSICS3D_BUILD + #define NAZARA_PHYSICS3D_API NAZARA_EXPORT + #else + #define NAZARA_PHYSICS3D_API NAZARA_IMPORT + #endif +#endif + +#endif // NAZARA_CONFIG_PHYSICS3D_HPP diff --git a/include/Nazara/Physics3D/ConfigCheck.hpp b/include/Nazara/Physics3D/ConfigCheck.hpp new file mode 100644 index 000000000..6b1c82073 --- /dev/null +++ b/include/Nazara/Physics3D/ConfigCheck.hpp @@ -0,0 +1,18 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Physics 3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_CONFIG_CHECK_PHYSICS_HPP +#define NAZARA_CONFIG_CHECK_PHYSICS_HPP + +/// Ce fichier sert à vérifier la valeur des constantes du fichier Config.hpp + +// On force la valeur de MANAGE_MEMORY en mode debug +#if defined(NAZARA_DEBUG) && !NAZARA_PHYSICS_MANAGE_MEMORY + #undef NAZARA_PHYSICS_MANAGE_MEMORY + #define NAZARA_PHYSICS3D_MANAGE_MEMORY 0 +#endif + +#endif // NAZARA_CONFIG_CHECK_PHYSICS_HPP diff --git a/include/Nazara/Physics3D/Debug.hpp b/include/Nazara/Physics3D/Debug.hpp new file mode 100644 index 000000000..f70a8b570 --- /dev/null +++ b/include/Nazara/Physics3D/Debug.hpp @@ -0,0 +1,8 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Physics 3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#if NAZARA_PHYSICS_MANAGE_MEMORY + #include +#endif diff --git a/include/Nazara/Physics3D/DebugOff.hpp b/include/Nazara/Physics3D/DebugOff.hpp new file mode 100644 index 000000000..595f0ad94 --- /dev/null +++ b/include/Nazara/Physics3D/DebugOff.hpp @@ -0,0 +1,9 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Physics 3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +// On suppose que Debug.hpp a déjà été inclus, tout comme Config.hpp +#if NAZARA_PHYSICS_MANAGE_MEMORY + #undef delete + #undef new +#endif diff --git a/include/Nazara/Physics3D/Enums.hpp b/include/Nazara/Physics3D/Enums.hpp new file mode 100644 index 000000000..1b8920cbc --- /dev/null +++ b/include/Nazara/Physics3D/Enums.hpp @@ -0,0 +1,30 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Physics 3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_ENUMS_PHYSICS3D_HPP +#define NAZARA_ENUMS_PHYSICS3D_HPP + +namespace Nz +{ + enum ColliderType3D + { + ColliderType3D_Box, + ColliderType3D_Capsule, + ColliderType3D_Cone, + ColliderType3D_Compound, + ColliderType3D_ConvexHull, + ColliderType3D_Cylinder, + ColliderType3D_Heightfield, + ColliderType3D_Null, + ColliderType3D_Scene, + ColliderType3D_Sphere, + ColliderType3D_Tree, + + ColliderType3D_Max = ColliderType3D_Tree + }; +}; + +#endif // NAZARA_ENUMS_PHYSICS3D_HPP diff --git a/include/Nazara/Physics/PhysWorld.hpp b/include/Nazara/Physics3D/PhysWorld3D.hpp similarity index 65% rename from include/Nazara/Physics/PhysWorld.hpp rename to include/Nazara/Physics3D/PhysWorld3D.hpp index 0300048b5..ea84aa931 100644 --- a/include/Nazara/Physics/PhysWorld.hpp +++ b/include/Nazara/Physics3D/PhysWorld3D.hpp @@ -1,5 +1,5 @@ // Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Engine - Physics module" +// This file is part of the "Nazara Engine - Physics 3D module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once @@ -10,19 +10,19 @@ #include #include #include -#include +#include class NewtonWorld; namespace Nz { - class NAZARA_PHYSICS_API PhysWorld + class NAZARA_PHYSICS3D_API PhysWorld3D { public: - PhysWorld(); - PhysWorld(const PhysWorld&) = delete; - PhysWorld(PhysWorld&&) = delete; ///TODO - ~PhysWorld(); + PhysWorld3D(); + PhysWorld3D(const PhysWorld3D&) = delete; + PhysWorld3D(PhysWorld3D&&) = delete; ///TODO + ~PhysWorld3D(); Vector3f GetGravity() const; NewtonWorld* GetHandle() const; @@ -34,8 +34,8 @@ namespace Nz void Step(float timestep); - PhysWorld& operator=(const PhysWorld&) = delete; - PhysWorld& operator=(PhysWorld&&) = delete; ///TODO + PhysWorld3D& operator=(const PhysWorld3D&) = delete; + PhysWorld3D& operator=(PhysWorld3D&&) = delete; ///TODO private: Vector3f m_gravity; diff --git a/include/Nazara/Physics/Physics.hpp b/include/Nazara/Physics3D/Physics3D.hpp similarity index 61% rename from include/Nazara/Physics/Physics.hpp rename to include/Nazara/Physics3D/Physics3D.hpp index 3bb6ebde3..949301002 100644 --- a/include/Nazara/Physics/Physics.hpp +++ b/include/Nazara/Physics3D/Physics3D.hpp @@ -1,23 +1,23 @@ // Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Engine - Physics module" +// This file is part of the "Nazara Engine - Physics 3D module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once -#ifndef NAZARA_PHYSICS_HPP -#define NAZARA_PHYSICS_HPP +#ifndef NAZARA_PHYSICS3D_HPP +#define NAZARA_PHYSICS3D_HPP #include #include -#include +#include namespace Nz { - class NAZARA_PHYSICS_API Physics + class NAZARA_PHYSICS3D_API Physics3D { public: - Physics() = delete; - ~Physics() = delete; + Physics3D() = delete; + ~Physics3D() = delete; static unsigned int GetMemoryUsed(); @@ -32,4 +32,4 @@ namespace Nz }; } -#endif // NAZARA_PHYSICS_HPP +#endif // NAZARA_PHYSICS3D_HPP diff --git a/include/Nazara/Physics/PhysObject.hpp b/include/Nazara/Physics3D/RigidBody3D.hpp similarity index 69% rename from include/Nazara/Physics/PhysObject.hpp rename to include/Nazara/Physics3D/RigidBody3D.hpp index d4d9c61b7..d895e9040 100644 --- a/include/Nazara/Physics/PhysObject.hpp +++ b/include/Nazara/Physics3D/RigidBody3D.hpp @@ -1,34 +1,34 @@ // Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Engine - Physics module" +// This file is part of the "Nazara Engine - Physics 3D module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once -#ifndef NAZARA_PHYSOBJECT_HPP -#define NAZARA_PHYSOBJECT_HPP +#ifndef NAZARA_RIGIDBODY3D_HPP +#define NAZARA_RIGIDBODY3D_HPP #include #include #include #include #include -#include -#include +#include +#include class NewtonBody; namespace Nz { - class PhysWorld; + class PhysWorld3D; - class NAZARA_PHYSICS_API PhysObject + class NAZARA_PHYSICS3D_API RigidBody3D { public: - PhysObject(PhysWorld* world, const Matrix4f& mat = Matrix4f::Identity()); - PhysObject(PhysWorld* world, PhysGeomRef geom, const Matrix4f& mat = Matrix4f::Identity()); - PhysObject(const PhysObject& object); - PhysObject(PhysObject&& object); - ~PhysObject(); + RigidBody3D(PhysWorld3D* world, const Matrix4f& mat = Matrix4f::Identity()); + RigidBody3D(PhysWorld3D* world, Collider3DRef geom, const Matrix4f& mat = Matrix4f::Identity()); + RigidBody3D(const RigidBody3D& object); + RigidBody3D(RigidBody3D&& object); + ~RigidBody3D(); void AddForce(const Vector3f& force, CoordSys coordSys = CoordSys_Global); void AddForce(const Vector3f& force, const Vector3f& point, CoordSys coordSys = CoordSys_Global); @@ -38,7 +38,7 @@ namespace Nz Boxf GetAABB() const; Vector3f GetAngularVelocity() const; - const PhysGeomRef& GetGeom() const; + const Collider3DRef& GetGeom() const; float GetGravityFactor() const; NewtonBody* GetHandle() const; float GetMass() const; @@ -53,7 +53,7 @@ namespace Nz bool IsSleeping() const; void SetAngularVelocity(const Vector3f& angularVelocity); - void SetGeom(PhysGeomRef geom); + void SetGeom(Collider3DRef geom); void SetGravityFactor(float gravityFactor); void SetMass(float mass); void SetMassCenter(const Vector3f& center); @@ -61,23 +61,23 @@ namespace Nz void SetRotation(const Quaternionf& rotation); void SetVelocity(const Vector3f& velocity); - PhysObject& operator=(const PhysObject& object); - PhysObject& operator=(PhysObject&& object); + RigidBody3D& operator=(const RigidBody3D& object); + RigidBody3D& operator=(RigidBody3D&& object); private: void UpdateBody(); static void ForceAndTorqueCallback(const NewtonBody* body, float timeStep, int threadIndex); static void TransformCallback(const NewtonBody* body, const float* matrix, int threadIndex); + Collider3DRef m_geom; Matrix4f m_matrix; - PhysGeomRef m_geom; Vector3f m_forceAccumulator; Vector3f m_torqueAccumulator; NewtonBody* m_body; - PhysWorld* m_world; + PhysWorld3D* m_world; float m_gravityFactor; float m_mass; }; } -#endif // NAZARA_PHYSOBJECT_HPP +#endif // NAZARA_RIGIDBODY3D_HPP diff --git a/include/Nazara/Utility/Formats/MTLParser.hpp b/include/Nazara/Utility/Formats/MTLParser.hpp index 9c5b49828..708e30685 100644 --- a/include/Nazara/Utility/Formats/MTLParser.hpp +++ b/include/Nazara/Utility/Formats/MTLParser.hpp @@ -71,7 +71,6 @@ namespace Nz mutable StringStream m_outputStream; bool m_keepLastLine; unsigned int m_lineCount; - unsigned int m_streamFlags; }; } diff --git a/include/Nazara/Utility/PixelFormat.inl b/include/Nazara/Utility/PixelFormat.inl index bf827c4c0..4d8676916 100644 --- a/include/Nazara/Utility/PixelFormat.inl +++ b/include/Nazara/Utility/PixelFormat.inl @@ -111,8 +111,8 @@ namespace Nz if (content <= PixelFormatContent_Undefined || content > PixelFormatContent_Max) return false; - std::array*, 4> masks = {&redMask, &greenMask, &blueMask, &alphaMask}; - std::array types = {redType, greenType, blueType, alphaType}; + std::array*, 4> masks = { {&redMask, &greenMask, &blueMask, &alphaMask} }; + std::array types = { {redType, greenType, blueType, alphaType} }; for (unsigned int i = 0; i < 4; ++i) { diff --git a/plugins/Assimp/CustomStream.cpp b/plugins/Assimp/CustomStream.cpp index 9a010b0b2..643a5b13f 100644 --- a/plugins/Assimp/CustomStream.cpp +++ b/plugins/Assimp/CustomStream.cpp @@ -40,6 +40,9 @@ aiReturn StreamSeek(aiFile* file, size_t offset, aiOrigin origin) case aiOrigin_SET: return (stream->SetCursorPos(offset)) ? aiReturn_SUCCESS : aiReturn_FAILURE; + + case _AI_ORIGIN_ENFORCE_ENUM_SIZE: // To prevent a warning + break; } NazaraWarning("Unhandled aiOrigin enum (value: 0x" + String(origin, 16) + ')'); diff --git a/plugins/Assimp/Plugin.cpp b/plugins/Assimp/Plugin.cpp index d1d0ace26..a668ec634 100644 --- a/plugins/Assimp/Plugin.cpp +++ b/plugins/Assimp/Plugin.cpp @@ -72,11 +72,11 @@ bool IsSupported(const String& extension) return (aiIsExtensionSupported(dotExt.GetConstBuffer()) == AI_TRUE); } -Ternary Check(Stream& stream, const MeshParams& parameters) +Ternary Check(Stream& /*stream*/, const MeshParams& parameters) { - bool skip; - if (parameters.custom.GetBooleanParameter("SkipAssimpLoader", &skip) && skip) - return Ternary_False; + bool skip; + if (parameters.custom.GetBooleanParameter("SkipAssimpLoader", &skip) && skip) + return Ternary_False; return Ternary_Unknown; } diff --git a/src/Nazara/Core/FileLogger.cpp b/src/Nazara/Core/FileLogger.cpp index bac0cb099..f08bd1b31 100644 --- a/src/Nazara/Core/FileLogger.cpp +++ b/src/Nazara/Core/FileLogger.cpp @@ -65,7 +65,7 @@ namespace Nz * \return true If replication is enabled */ - bool FileLogger::IsStdReplicationEnabled() + bool FileLogger::IsStdReplicationEnabled() const { return m_stdReplicationEnabled; } @@ -75,7 +75,7 @@ namespace Nz * \return true If logging of the time is enabled */ - bool FileLogger::IsTimeLoggingEnabled() + bool FileLogger::IsTimeLoggingEnabled() const { return m_timeLoggingEnabled; } @@ -147,14 +147,6 @@ namespace Nz void FileLogger::WriteError(ErrorType type, const String& error, unsigned int line, const char* file, const char* function) { - if (m_forceStdOutput || m_stdReplicationEnabled) - { - m_stdLogger.WriteError(type, error, line, file, function); - - if (m_forceStdOutput) - return; - } - AbstractLogger::WriteError(type, error, line, file, function); m_outputFile.Flush(); } diff --git a/src/Nazara/Core/Log.cpp b/src/Nazara/Core/Log.cpp index 9e6b13353..1ff1ea373 100644 --- a/src/Nazara/Core/Log.cpp +++ b/src/Nazara/Core/Log.cpp @@ -111,7 +111,9 @@ namespace Nz bool Log::Initialize() { - SetLogger(new FileLogger()); + if (s_logger == &s_stdLogger) + SetLogger(new FileLogger()); + return true; } diff --git a/src/Nazara/Core/Posix/FileImpl.cpp b/src/Nazara/Core/Posix/FileImpl.cpp index b9a6b0a31..037d795f0 100644 --- a/src/Nazara/Core/Posix/FileImpl.cpp +++ b/src/Nazara/Core/Posix/FileImpl.cpp @@ -208,8 +208,9 @@ namespace Nz time_t FileImpl::GetCreationTime(const String& filePath) { - NazaraWarning("Posix has no creation time information"); + NazaraUnused(filePath); + NazaraWarning("Posix has no creation time information"); return 0; } diff --git a/src/Nazara/Core/StdLogger.cpp b/src/Nazara/Core/StdLogger.cpp index e38daa077..c8dfc60bb 100644 --- a/src/Nazara/Core/StdLogger.cpp +++ b/src/Nazara/Core/StdLogger.cpp @@ -47,7 +47,7 @@ namespace Nz * \return Always returns true */ - bool StdLogger::IsStdReplicationEnabled() + bool StdLogger::IsStdReplicationEnabled() const { return true; } diff --git a/src/Nazara/Graphics/DeferredGeometryPass.cpp b/src/Nazara/Graphics/DeferredGeometryPass.cpp index dbdb95f5a..79e651926 100644 --- a/src/Nazara/Graphics/DeferredGeometryPass.cpp +++ b/src/Nazara/Graphics/DeferredGeometryPass.cpp @@ -82,7 +82,7 @@ namespace Nz if (pipelineEntry.maxInstanceCount > 0) { - bool instancing = (pipelineEntry.maxInstanceCount > NAZARA_GRAPHICS_INSTANCING_MIN_INSTANCES_COUNT); + bool instancing = instancingEnabled && (pipelineEntry.maxInstanceCount > NAZARA_GRAPHICS_INSTANCING_MIN_INSTANCES_COUNT); UInt32 flags = ShaderFlags_Deferred; if (instancing) diff --git a/src/Nazara/Graphics/DeferredRenderQueue.cpp b/src/Nazara/Graphics/DeferredRenderQueue.cpp index b240edcd7..6aecb8a5a 100644 --- a/src/Nazara/Graphics/DeferredRenderQueue.cpp +++ b/src/Nazara/Graphics/DeferredRenderQueue.cpp @@ -282,7 +282,6 @@ namespace Nz { for (auto& pipelinePair : layer.opaqueModels) { - const MaterialPipeline* pipeline = pipelinePair.first; auto& pipelineEntry = pipelinePair.second; if (pipelineEntry.maxInstanceCount > 0) diff --git a/src/Nazara/Graphics/DepthRenderTechnique.cpp b/src/Nazara/Graphics/DepthRenderTechnique.cpp index 46b1c3407..bcae2eb57 100644 --- a/src/Nazara/Graphics/DepthRenderTechnique.cpp +++ b/src/Nazara/Graphics/DepthRenderTechnique.cpp @@ -52,7 +52,7 @@ namespace Nz { ErrorFlags flags(ErrorFlag_ThrowException, true); - std::array whitePixel = {255, 255, 255, 255}; + std::array whitePixel = { {255, 255, 255, 255} }; m_whiteTexture.Create(ImageType_2D, PixelFormatType_RGBA8, 1, 1); m_whiteTexture.Update(whitePixel.data()); @@ -431,7 +431,6 @@ namespace Nz for (auto& matIt : pipelinePair.second.materialMap) { - const Material* material = matIt.first; auto& entry = matIt.second; auto& billboardVector = entry.billboards; @@ -551,9 +550,7 @@ namespace Nz const MeshData& meshData = meshIt.first; auto& meshEntry = meshIt.second; - const Spheref& squaredBoundingSphere = meshEntry.squaredBoundingSphere; std::vector& instances = meshEntry.instances; - if (!instances.empty()) { const IndexBuffer* indexBuffer = meshData.indexBuffer; diff --git a/src/Nazara/Graphics/ForwardRenderQueue.cpp b/src/Nazara/Graphics/ForwardRenderQueue.cpp index 2ffa45208..a7b94a0cb 100644 --- a/src/Nazara/Graphics/ForwardRenderQueue.cpp +++ b/src/Nazara/Graphics/ForwardRenderQueue.cpp @@ -560,9 +560,7 @@ namespace Nz auto& overlayMap = matEntry.overlayMap; for (auto& overlayIt : overlayMap) { - const Texture* overlay = overlayIt.first; auto& spriteChainVector = overlayIt.second.spriteChains; - spriteChainVector.clear(); } @@ -581,9 +579,7 @@ namespace Nz { for (auto& materialPair : pipelineEntry.materialMap) { - const Material* material = materialPair.first; auto& matEntry = materialPair.second; - if (matEntry.enabled) { MeshInstanceContainer& meshInstances = matEntry.meshMap; @@ -591,7 +587,6 @@ namespace Nz for (auto& meshIt : meshInstances) { auto& meshEntry = meshIt.second; - meshEntry.instances.clear(); } matEntry.enabled = false; diff --git a/src/Nazara/Graphics/ForwardRenderTechnique.cpp b/src/Nazara/Graphics/ForwardRenderTechnique.cpp index 3363d22b7..3eda7d462 100644 --- a/src/Nazara/Graphics/ForwardRenderTechnique.cpp +++ b/src/Nazara/Graphics/ForwardRenderTechnique.cpp @@ -53,7 +53,7 @@ namespace Nz { ErrorFlags flags(ErrorFlag_ThrowException, true); - std::array whitePixel = {255, 255, 255, 255}; + std::array whitePixel = { {255, 255, 255, 255} }; m_whiteTexture.Create(ImageType_2D, PixelFormatType_RGBA8, 1, 1); m_whiteTexture.Update(whitePixel.data()); @@ -412,7 +412,7 @@ namespace Nz const Shader* lastShader = nullptr; const ShaderUniforms* shaderUniforms = nullptr; - if (Renderer::HasCapability(RendererCap_Instancing)) + if (m_instancingEnabled && Renderer::HasCapability(RendererCap_Instancing)) { VertexBuffer* instanceBuffer = Renderer::GetInstanceBuffer(); instanceBuffer->SetVertexDeclaration(&s_billboardInstanceDeclaration); @@ -508,7 +508,6 @@ namespace Nz for (auto& matIt : pipelinePair.second.materialMap) { - const Material* material = matIt.first; auto& entry = matIt.second; auto& billboardVector = entry.billboards; @@ -591,7 +590,7 @@ namespace Nz if (pipelineEntry.maxInstanceCount > 0) { - bool instancing = (pipelineEntry.maxInstanceCount > NAZARA_GRAPHICS_INSTANCING_MIN_INSTANCES_COUNT); + bool instancing = m_instancingEnabled && (pipelineEntry.maxInstanceCount > NAZARA_GRAPHICS_INSTANCING_MIN_INSTANCES_COUNT); const MaterialPipeline::Instance& pipelineInstance = pipeline->Apply((instancing) ? ShaderFlags_Instancing : 0); const Shader* shader = pipelineInstance.uberInstance->GetShader(); diff --git a/src/Nazara/Network/Linux/SocketPollerImpl.cpp b/src/Nazara/Network/Linux/SocketPollerImpl.cpp index ec6b8235e..c839d7352 100644 --- a/src/Nazara/Network/Linux/SocketPollerImpl.cpp +++ b/src/Nazara/Network/Linux/SocketPollerImpl.cpp @@ -85,7 +85,7 @@ namespace Nz } m_activeSockets.clear(); - if (activeSockets > 0U) + if (activeSockets > 0) { int socketCount = activeSockets; for (int i = 0; i < socketCount; ++i) diff --git a/src/Nazara/Network/Posix/IpAddressImpl.cpp b/src/Nazara/Network/Posix/IpAddressImpl.cpp index 1e4f6a89e..13eb10c31 100644 --- a/src/Nazara/Network/Posix/IpAddressImpl.cpp +++ b/src/Nazara/Network/Posix/IpAddressImpl.cpp @@ -54,7 +54,7 @@ namespace Nz byteToInt hostOrder; hostOrder.i = ntohl(addr.s_addr); - return { hostOrder.b[3], hostOrder.b[2], hostOrder.b[1], hostOrder.b[0] }; + return { {hostOrder.b[3], hostOrder.b[2], hostOrder.b[1], hostOrder.b[0]} }; } IpAddress::IPv6 convertSockaddr6ToIPv6(const in6_addr& addr) diff --git a/src/Nazara/Network/Posix/SocketPollerImpl.cpp b/src/Nazara/Network/Posix/SocketPollerImpl.cpp index 4242e79a9..5d2a6c317 100644 --- a/src/Nazara/Network/Posix/SocketPollerImpl.cpp +++ b/src/Nazara/Network/Posix/SocketPollerImpl.cpp @@ -74,7 +74,7 @@ namespace Nz activeSockets = SocketImpl::Poll(m_sockets.data(), m_sockets.size(), static_cast(msTimeout), error); m_activeSockets.clear(); - if (activeSockets > 0U) + if (activeSockets > 0) { int socketRemaining = activeSockets; for (PollSocket& entry : m_sockets) diff --git a/src/Nazara/Noise/Simplex.cpp b/src/Nazara/Noise/Simplex.cpp index 8d4748bff..b1a2bd0b6 100644 --- a/src/Nazara/Noise/Simplex.cpp +++ b/src/Nazara/Noise/Simplex.cpp @@ -51,11 +51,12 @@ namespace Nz d[2] = d[0] + Vector2f(1.f - 2.f * s_UnskewCoeff2D); Vector2i offset(skewedCubeOrigin.x & 255, skewedCubeOrigin.y & 255); - std::array gi = - { - m_permutations[offset.x + m_permutations[offset.y]] & 7, - m_permutations[offset.x + off1.x + m_permutations[offset.y + off1.y]] & 7, - m_permutations[offset.x + 1 + m_permutations[offset.y + 1]] & 7 + std::array gi = { + { + m_permutations[offset.x + m_permutations[offset.y]] & 7, + m_permutations[offset.x + off1.x + m_permutations[offset.y + off1.y]] & 7, + m_permutations[offset.x + 1 + m_permutations[offset.y + 1]] & 7 + } }; float n = 0.f; diff --git a/src/Nazara/Noise/Worley.cpp b/src/Nazara/Noise/Worley.cpp index cc98fa378..4f2aa90f7 100644 --- a/src/Nazara/Noise/Worley.cpp +++ b/src/Nazara/Noise/Worley.cpp @@ -12,12 +12,13 @@ namespace Nz { namespace { - static constexpr std::array m_functionScales = - { - 1.f / float(M_SQRT2), - 0.5f / float(M_SQRT2), - 0.5f / float(M_SQRT2), - 0.5f / float(M_SQRT2) + static constexpr std::array m_functionScales = { + { + 1.f / float(M_SQRT2), + 0.5f / float(M_SQRT2), + 0.5f / float(M_SQRT2), + 0.5f / float(M_SQRT2) + } }; } Worley::Worley() : @@ -109,12 +110,12 @@ namespace Nz return it->first * m_functionScales[functionIndex]; } - float Worley::Get(float x, float y, float z, float scale) const + float Worley::Get(float /*x*/, float /*y*/, float /*z*/, float /*scale*/) const { throw std::runtime_error("Worley 3D not available yet."); } - float Worley::Get(float x, float y, float z, float w, float scale) const + float Worley::Get(float /*x*/, float /*y*/, float /*z*/, float /*w*/, float /*scale*/) const { throw std::runtime_error("Worley 4D not available yet."); } diff --git a/src/Nazara/Physics/Geom.cpp b/src/Nazara/Physics/Geom.cpp deleted file mode 100644 index 48d6f0090..000000000 --- a/src/Nazara/Physics/Geom.cpp +++ /dev/null @@ -1,448 +0,0 @@ -// 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 - -#include -#include -#include -#include -#include - -namespace Nz -{ - namespace - { - PhysGeomRef CreateGeomFromPrimitive(const Primitive& primitive) - { - switch (primitive.type) - { - case PrimitiveType_Box: - return BoxGeom::New(primitive.box.lengths, primitive.matrix); - - case PrimitiveType_Cone: - return ConeGeom::New(primitive.cone.length, primitive.cone.radius, primitive.matrix); - - case PrimitiveType_Plane: - return BoxGeom::New(Vector3f(primitive.plane.size.x, 0.01f, primitive.plane.size.y), primitive.matrix); - ///TODO: PlaneGeom? - - case PrimitiveType_Sphere: - return SphereGeom::New(primitive.sphere.size, primitive.matrix.GetTranslation()); - } - - NazaraError("Primitive type not handled (0x" + String::Number(primitive.type, 16) + ')'); - return PhysGeomRef(); - } - } - - PhysGeom::~PhysGeom() - { - for (auto& pair : m_handles) - NewtonDestroyCollision(pair.second); - } - - Boxf PhysGeom::ComputeAABB(const Vector3f& translation, const Quaternionf& rotation, const Vector3f& scale) const - { - return ComputeAABB(Matrix4f::Transform(translation, rotation), scale); - } - - Boxf PhysGeom::ComputeAABB(const Matrix4f& offsetMatrix, const Vector3f& scale) const - { - Vector3f min, max; - - // Si nous n'avons aucune instance, nous en créons une temporaire - if (m_handles.empty()) - { - PhysWorld world; - - NewtonCollision* collision = CreateHandle(&world); - { - NewtonCollisionCalculateAABB(collision, offsetMatrix, min, max); - } - NewtonDestroyCollision(collision); - } - else // Sinon on utilise une instance au hasard (elles sont toutes identiques de toute façon) - NewtonCollisionCalculateAABB(m_handles.begin()->second, offsetMatrix, min, max); - - return Boxf(scale * min, scale * max); - } - - void PhysGeom::ComputeInertialMatrix(Vector3f* inertia, Vector3f* center) const - { - float inertiaMatrix[3]; - float origin[3]; - - // Si nous n'avons aucune instance, nous en créons une temporaire - if (m_handles.empty()) - { - PhysWorld world; - - NewtonCollision* collision = CreateHandle(&world); - { - NewtonConvexCollisionCalculateInertialMatrix(collision, inertiaMatrix, origin); - } - NewtonDestroyCollision(collision); - } - else // Sinon on utilise une instance au hasard (elles sont toutes identiques de toute façon) - NewtonConvexCollisionCalculateInertialMatrix(m_handles.begin()->second, inertiaMatrix, origin); - - if (inertia) - inertia->Set(inertiaMatrix); - - if (center) - center->Set(origin); - } - - float PhysGeom::ComputeVolume() const - { - float volume; - - // Si nous n'avons aucune instance, nous en créons une temporaire - if (m_handles.empty()) - { - PhysWorld world; - - NewtonCollision* collision = CreateHandle(&world); - { - volume = NewtonConvexCollisionCalculateVolume(collision); - } - NewtonDestroyCollision(collision); - } - else // Sinon on utilise une instance au hasard (elles sont toutes identiques de toute façon) - volume = NewtonConvexCollisionCalculateVolume(m_handles.begin()->second); - - return volume; - } - - NewtonCollision* PhysGeom::GetHandle(PhysWorld* world) const - { - auto it = m_handles.find(world); - if (it == m_handles.end()) - it = m_handles.insert(std::make_pair(world, CreateHandle(world))).first; - - return it->second; - } - - PhysGeomRef PhysGeom::Build(const PrimitiveList& list) - { - std::size_t primitiveCount = list.GetSize(); - if (primitiveCount > 1) - { - std::vector geoms(primitiveCount); - - for (unsigned int i = 0; i < primitiveCount; ++i) - geoms[i] = CreateGeomFromPrimitive(list.GetPrimitive(i)); - - return CompoundGeom::New(&geoms[0], primitiveCount); - } - else if (primitiveCount > 0) - return CreateGeomFromPrimitive(list.GetPrimitive(0)); - else - return NullGeom::New(); - } - - bool PhysGeom::Initialize() - { - if (!PhysGeomLibrary::Initialize()) - { - NazaraError("Failed to initialise library"); - return false; - } - - return true; - } - - void PhysGeom::Uninitialize() - { - PhysGeomLibrary::Uninitialize(); - } - - PhysGeomLibrary::LibraryMap PhysGeom::s_library; - - /********************************** BoxGeom **********************************/ - - BoxGeom::BoxGeom(const Vector3f& lengths, const Matrix4f& transformMatrix) : - m_matrix(transformMatrix), - m_lengths(lengths) - { - } - - BoxGeom::BoxGeom(const Vector3f& lengths, const Vector3f& translation, const Quaternionf& rotation) : - BoxGeom(lengths, Matrix4f::Transform(translation, rotation)) - { - } - - Boxf BoxGeom::ComputeAABB(const Matrix4f& offsetMatrix, const Vector3f& scale) const - { - Vector3f halfLengths(m_lengths * 0.5f); - - Boxf aabb(-halfLengths.x, -halfLengths.y, -halfLengths.z, m_lengths.x, m_lengths.y, m_lengths.z); - aabb.Transform(offsetMatrix, true); - aabb *= scale; - - return aabb; - } - - float BoxGeom::ComputeVolume() const - { - return m_lengths.x * m_lengths.y * m_lengths.z; - } - - Vector3f BoxGeom::GetLengths() const - { - return m_lengths; - } - - GeomType BoxGeom::GetType() const - { - return GeomType_Box; - } - - NewtonCollision* BoxGeom::CreateHandle(PhysWorld* world) const - { - return NewtonCreateBox(world->GetHandle(), m_lengths.x, m_lengths.y, m_lengths.z, 0, m_matrix); - } - - /******************************** CapsuleGeom ********************************/ - - CapsuleGeom::CapsuleGeom(float length, float radius, const Matrix4f& transformMatrix) : - m_matrix(transformMatrix), - m_length(length), - m_radius(radius) - { - } - - CapsuleGeom::CapsuleGeom(float length, float radius, const Vector3f& translation, const Quaternionf& rotation) : - CapsuleGeom(length, radius, Matrix4f::Transform(translation, rotation)) - { - } - - float CapsuleGeom::GetLength() const - { - return m_length; - } - - float CapsuleGeom::GetRadius() const - { - return m_radius; - } - - GeomType CapsuleGeom::GetType() const - { - return GeomType_Capsule; - } - - NewtonCollision* CapsuleGeom::CreateHandle(PhysWorld* world) const - { - return NewtonCreateCapsule(world->GetHandle(), m_radius, m_length, 0, m_matrix); - } - - /******************************* CompoundGeom ********************************/ - - CompoundGeom::CompoundGeom(PhysGeom** geoms, std::size_t geomCount) - { - m_geoms.reserve(geomCount); - for (std::size_t i = 0; i < geomCount; ++i) - m_geoms.emplace_back(geoms[i]); - } - - const std::vector& CompoundGeom::GetGeoms() const - { - return m_geoms; - } - - GeomType CompoundGeom::GetType() const - { - return GeomType_Compound; - } - - NewtonCollision* CompoundGeom::CreateHandle(PhysWorld* world) const - { - NewtonCollision* compoundCollision = NewtonCreateCompoundCollision(world->GetHandle(), 0); - - NewtonCompoundCollisionBeginAddRemove(compoundCollision); - for (const PhysGeomRef& geom : m_geoms) - { - if (geom->GetType() == GeomType_Compound) - { - CompoundGeom* compoundGeom = static_cast(geom.Get()); - for (const PhysGeomRef& piece : compoundGeom->GetGeoms()) - NewtonCompoundCollisionAddSubCollision(compoundCollision, piece->GetHandle(world)); - } - else - NewtonCompoundCollisionAddSubCollision(compoundCollision, geom->GetHandle(world)); - } - NewtonCompoundCollisionEndAddRemove(compoundCollision); - - return compoundCollision; - } - - /********************************* ConeGeom **********************************/ - - ConeGeom::ConeGeom(float length, float radius, const Matrix4f& transformMatrix) : - m_matrix(transformMatrix), - m_length(length), - m_radius(radius) - { - } - - ConeGeom::ConeGeom(float length, float radius, const Vector3f& translation, const Quaternionf& rotation) : - ConeGeom(length, radius, Matrix4f::Transform(translation, rotation)) - { - } - - float ConeGeom::GetLength() const - { - return m_length; - } - - float ConeGeom::GetRadius() const - { - return m_radius; - } - - GeomType ConeGeom::GetType() const - { - return GeomType_Cone; - } - - NewtonCollision* ConeGeom::CreateHandle(PhysWorld* world) const - { - return NewtonCreateCone(world->GetHandle(), m_radius, m_length, 0, m_matrix); - } - - /****************************** ConvexHullGeom *******************************/ - - ConvexHullGeom::ConvexHullGeom(const void* vertices, unsigned int vertexCount, unsigned int stride, float tolerance, const Matrix4f& transformMatrix) : - m_matrix(transformMatrix), - m_tolerance(tolerance), - m_vertexStride(stride) - { - const UInt8* ptr = static_cast(vertices); - - m_vertices.resize(vertexCount); - if (stride != sizeof(Vector3f)) - { - for (unsigned int i = 0; i < vertexCount; ++i) - m_vertices[i] = *reinterpret_cast(ptr + stride*i); - } - else // Fast path - std::memcpy(m_vertices.data(), vertices, vertexCount*sizeof(Vector3f)); - } - - ConvexHullGeom::ConvexHullGeom(const void* vertices, unsigned int vertexCount, unsigned int stride, float tolerance, const Vector3f& translation, const Quaternionf& rotation) : - ConvexHullGeom(vertices, vertexCount, stride, tolerance, Matrix4f::Transform(translation, rotation)) - { - } - - GeomType ConvexHullGeom::GetType() const - { - return GeomType_Compound; - } - - NewtonCollision* ConvexHullGeom::CreateHandle(PhysWorld* world) const - { - return NewtonCreateConvexHull(world->GetHandle(), static_cast(m_vertices.size()), reinterpret_cast(m_vertices.data()), sizeof(Vector3f), m_tolerance, 0, m_matrix); - } - - /******************************* CylinderGeom ********************************/ - - CylinderGeom::CylinderGeom(float length, float radius, const Matrix4f& transformMatrix) : - m_matrix(transformMatrix), - m_length(length), - m_radius(radius) - { - } - - CylinderGeom::CylinderGeom(float length, float radius, const Vector3f& translation, const Quaternionf& rotation) : - CylinderGeom(length, radius, Matrix4f::Transform(translation, rotation)) - { - } - - float CylinderGeom::GetLength() const - { - return m_length; - } - - float CylinderGeom::GetRadius() const - { - return m_radius; - } - - GeomType CylinderGeom::GetType() const - { - return GeomType_Cylinder; - } - - NewtonCollision* CylinderGeom::CreateHandle(PhysWorld* world) const - { - return NewtonCreateCylinder(world->GetHandle(), m_radius, m_length, 0, m_matrix); - } - - /********************************* NullGeom **********************************/ - - NullGeom::NullGeom() - { - } - - GeomType NullGeom::GetType() const - { - return GeomType_Null; - } - - void NullGeom::ComputeInertialMatrix(Vector3f* inertia, Vector3f* center) const - { - if (inertia) - inertia->MakeUnit(); - - if (center) - center->MakeZero(); - } - - NewtonCollision* NullGeom::CreateHandle(PhysWorld* world) const - { - return NewtonCreateNull(world->GetHandle()); - } - - /******************************** SphereGeom *********************************/ - - SphereGeom::SphereGeom(float radius, const Matrix4f& transformMatrix) : - SphereGeom(radius, transformMatrix.GetTranslation()) - { - } - - SphereGeom::SphereGeom(float radius, const Vector3f& translation, const Quaternionf& rotation) : - m_position(translation), - m_radius(radius) - { - NazaraUnused(rotation); - } - - Boxf SphereGeom::ComputeAABB(const Matrix4f& offsetMatrix, const Vector3f& scale) const - { - Vector3f size(m_radius * NazaraSuffixMacro(M_SQRT3, f) * scale); - Vector3f position(offsetMatrix.GetTranslation()); - - return Boxf(position - size, position + size); - } - - float SphereGeom::ComputeVolume() const - { - return float(M_PI) * m_radius * m_radius * m_radius / 3.f; - } - - float SphereGeom::GetRadius() const - { - return m_radius; - } - - GeomType SphereGeom::GetType() const - { - return GeomType_Sphere; - } - - NewtonCollision* SphereGeom::CreateHandle(PhysWorld* world) const - { - return NewtonCreateSphere(world->GetHandle(), m_radius, 0, Matrix4f::Translate(m_position)); - } -} diff --git a/src/Nazara/Physics2D/Collider2D.cpp b/src/Nazara/Physics2D/Collider2D.cpp new file mode 100644 index 000000000..a840393e8 --- /dev/null +++ b/src/Nazara/Physics2D/Collider2D.cpp @@ -0,0 +1,87 @@ +// 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 + +#include +#include +#include +#include + +namespace Nz +{ + Collider2D::~Collider2D() = default; + + /******************************** BoxCollider2D *********************************/ + + BoxCollider2D::BoxCollider2D(const Vector2f& size, float radius) : + BoxCollider2D(Rectf(-size.x / 2.f, -size.y / 2.f, size.x / 2.f, size.y / 2.f), radius) + { + } + + BoxCollider2D::BoxCollider2D(const Rectf& rect, float radius) : + m_rect(rect), + m_radius(radius) + { + } + + float BoxCollider2D::ComputeInertialMatrix(float mass) const + { + return static_cast(cpMomentForBox2(mass, cpBBNew(m_rect.x, m_rect.y + m_rect.height, m_rect.x + m_rect.width, m_rect.y))); + } + + ColliderType2D BoxCollider2D::GetType() const + { + return ColliderType2D_Box; + } + + std::vector BoxCollider2D::CreateShapes(RigidBody2D* body) const + { + std::vector shapes; + shapes.push_back(cpBoxShapeNew2(body->GetHandle(), cpBBNew(m_rect.x, m_rect.y + m_rect.height, m_rect.x + m_rect.width, m_rect.y), m_radius)); + + return shapes; + } + + /******************************** CircleCollider2D *********************************/ + + CircleCollider2D::CircleCollider2D(float radius, const Vector2f& offset) : + m_offset(offset), + m_radius(radius) + { + } + + float CircleCollider2D::ComputeInertialMatrix(float mass) const + { + return static_cast(cpMomentForCircle(mass, 0.f, m_radius, cpv(m_offset.x, m_offset.y))); + } + + ColliderType2D CircleCollider2D::GetType() const + { + return ColliderType2D_Circle; + } + + std::vector CircleCollider2D::CreateShapes(RigidBody2D* body) const + { + std::vector shapes; + shapes.push_back(cpCircleShapeNew(body->GetHandle(), m_radius, cpv(m_offset.x, m_offset.y))); + + return shapes; + } + + /********************************* NullCollider2D **********************************/ + + ColliderType2D NullCollider2D::GetType() const + { + return ColliderType2D_Null; + } + + float NullCollider2D::ComputeInertialMatrix(float /*mass*/) const + { + return 0.f; + } + + std::vector NullCollider2D::CreateShapes(RigidBody2D* /*body*/) const + { + return std::vector(); + } +} diff --git a/src/Nazara/Physics/Debug/NewOverload.cpp b/src/Nazara/Physics2D/Debug/NewOverload.cpp similarity index 86% rename from src/Nazara/Physics/Debug/NewOverload.cpp rename to src/Nazara/Physics2D/Debug/NewOverload.cpp index b7ca2c243..bd3153d1d 100644 --- a/src/Nazara/Physics/Debug/NewOverload.cpp +++ b/src/Nazara/Physics2D/Debug/NewOverload.cpp @@ -1,8 +1,8 @@ // Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Engine - Physics module" +// This file is part of the "Nazara Engine - Physics 2D module" // For conditions of distribution and use, see copyright notice in Config.hpp -#include +#include #if NAZARA_PHYSICS_MANAGE_MEMORY #include diff --git a/src/Nazara/Physics2D/PhysWorld2D.cpp b/src/Nazara/Physics2D/PhysWorld2D.cpp new file mode 100644 index 000000000..5290abfcd --- /dev/null +++ b/src/Nazara/Physics2D/PhysWorld2D.cpp @@ -0,0 +1,60 @@ +// 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 + +#include +#include +#include + +namespace Nz +{ + PhysWorld2D::PhysWorld2D() : + m_stepSize(0.005f), + m_timestepAccumulator(0.f) + { + m_handle = cpSpaceNew(); + cpSpaceSetUserData(m_handle, this); + } + + PhysWorld2D::~PhysWorld2D() + { + cpSpaceFree(m_handle); + } + + Vector2f PhysWorld2D::GetGravity() const + { + cpVect gravity = cpSpaceGetGravity(m_handle); + return Vector2f(gravity.x, gravity.y); + } + + cpSpace* PhysWorld2D::GetHandle() const + { + return m_handle; + } + + float PhysWorld2D::GetStepSize() const + { + return m_stepSize; + } + + void PhysWorld2D::SetGravity(const Vector2f& gravity) + { + cpSpaceSetGravity(m_handle, cpv(gravity.x, gravity.y)); + } + + void PhysWorld2D::SetStepSize(float stepSize) + { + m_stepSize = stepSize; + } + + void PhysWorld2D::Step(float timestep) + { + m_timestepAccumulator += timestep; + + while (m_timestepAccumulator >= m_stepSize) + { + cpSpaceStep(m_handle, m_stepSize); + m_timestepAccumulator -= m_stepSize; + } + } +} diff --git a/src/Nazara/Physics2D/Physics2D.cpp b/src/Nazara/Physics2D/Physics2D.cpp new file mode 100644 index 000000000..840b14755 --- /dev/null +++ b/src/Nazara/Physics2D/Physics2D.cpp @@ -0,0 +1,59 @@ +// 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 + +#include +#include +#include +#include + +namespace Nz +{ + bool Physics2D::Initialize() + { + if (s_moduleReferenceCounter > 0) + { + s_moduleReferenceCounter++; + return true; // Déjà initialisé + } + + // Initialisation des dépendances + if (!Core::Initialize()) + { + NazaraError("Failed to initialize core module"); + return false; + } + + s_moduleReferenceCounter++; + + NazaraNotice("Initialized: Physics2D module"); + return true; + } + + bool Physics2D::IsInitialized() + { + return s_moduleReferenceCounter != 0; + } + + void Physics2D::Uninitialize() + { + if (s_moduleReferenceCounter != 1) + { + // Le module est soit encore utilisé, soit pas initialisé + if (s_moduleReferenceCounter > 1) + s_moduleReferenceCounter--; + + return; + } + + // Libération du module + s_moduleReferenceCounter = 0; + + NazaraNotice("Uninitialized: Physics2D module"); + + // Libération des dépendances + Core::Uninitialize(); + } + + unsigned int Physics2D::s_moduleReferenceCounter = 0; +} diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp new file mode 100644 index 000000000..faa6223d1 --- /dev/null +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -0,0 +1,251 @@ +// 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 + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Nz +{ + RigidBody2D::RigidBody2D(PhysWorld2D* world, float mass) : + RigidBody2D(world, mass, nullptr) + { + } + + RigidBody2D::RigidBody2D(PhysWorld2D* world, float mass, Collider2DRef geom) : + m_geom(), + m_world(world), + m_gravityFactor(1.f), + m_mass(0.f) + { + NazaraAssert(m_world, "Invalid world"); + + m_handle = cpBodyNew(0.f, 0.f); + cpBodySetUserData(m_handle, this); + cpSpaceAddBody(m_world->GetHandle(), m_handle); + + SetGeom(geom); + SetMass(mass); + } + + RigidBody2D::RigidBody2D(const RigidBody2D& object) : + m_geom(object.m_geom), + m_world(object.m_world), + m_gravityFactor(object.m_gravityFactor), + m_mass(0.f) + { + NazaraAssert(m_world, "Invalid world"); + NazaraAssert(m_geom, "Invalid geometry"); + + m_handle = cpBodyNew(0.f, 0.f); + cpBodySetUserData(m_handle, this); + cpSpaceAddBody(m_world->GetHandle(), m_handle); + + SetGeom(object.GetGeom()); + SetMass(object.GetMass()); + } + + RigidBody2D::RigidBody2D(RigidBody2D&& object) : + m_shapes(std::move(object.m_shapes)), + m_geom(std::move(object.m_geom)), + m_handle(object.m_handle), + m_world(object.m_world), + m_gravityFactor(object.m_gravityFactor), + m_mass(object.m_mass) + { + object.m_handle = nullptr; + } + + RigidBody2D::~RigidBody2D() + { + Destroy(); + } + + void RigidBody2D::AddForce(const Vector2f& force, CoordSys coordSys) + { + return AddForce(force, GetCenterOfGravity(coordSys), coordSys); + } + + void RigidBody2D::AddForce(const Vector2f& force, const Vector2f& point, CoordSys coordSys) + { + switch (coordSys) + { + case CoordSys_Global: + cpBodyApplyForceAtWorldPoint(m_handle, cpv(force.x, force.y), cpv(force.x, force.y)); + break; + + case CoordSys_Local: + cpBodyApplyForceAtLocalPoint(m_handle, cpv(force.x, force.y), cpv(point.x, point.y)); + break; + } + } + + void RigidBody2D::AddTorque(float torque) + { + cpBodySetTorque(m_handle, cpBodyGetTorque(m_handle) + torque); + } + + Rectf RigidBody2D::GetAABB() const + { + cpBB bb = cpBBNew(0.f, 0.f, 0.f, 0.f); + for (cpShape* shape : m_shapes) + bb = cpBBMerge(bb, cpShapeGetBB(shape)); + + return Rectf(Rect(bb.l, bb.t, bb.r - bb.l, bb.b - bb.t)); + } + + float RigidBody2D::GetAngularVelocity() const + { + return static_cast(cpBodyGetAngularVelocity(m_handle)); + } + + const Collider2DRef& RigidBody2D::GetGeom() const + { + return m_geom; + } + + cpBody* RigidBody2D::GetHandle() const + { + return m_handle; + } + + float RigidBody2D::GetMass() const + { + return m_mass; + } + + Vector2f RigidBody2D::GetCenterOfGravity(CoordSys coordSys) const + { + cpVect cog = cpBodyGetCenterOfGravity(m_handle); + + switch (coordSys) + { + case CoordSys_Global: + cog = cpBodyLocalToWorld(m_handle, cog); + break; + + case CoordSys_Local: + break; // Nothing to do + } + + return Vector2f(static_cast(cog.x), static_cast(cog.y)); + } + + Vector2f RigidBody2D::GetPosition() const + { + cpVect pos = cpBodyGetPosition(m_handle); + return Vector2f(static_cast(pos.x), static_cast(pos.y)); + } + + float RigidBody2D::GetRotation() const + { + return static_cast(cpBodyGetAngle(m_handle)); + } + + Vector2f RigidBody2D::GetVelocity() const + { + cpVect vel = cpBodyGetVelocity(m_handle); + return Vector2f(static_cast(vel.x), static_cast(vel.y)); + } + + bool RigidBody2D::IsMoveable() const + { + return m_mass > 0.f; + } + + bool RigidBody2D::IsSleeping() const + { + return cpBodyIsSleeping(m_handle) != 0; + } + + void RigidBody2D::SetAngularVelocity(float angularVelocity) + { + cpBodySetAngularVelocity(m_handle, angularVelocity); + } + + void RigidBody2D::SetMass(float mass) + { + if (m_mass > 0.f) + { + if (mass > 0.f) + cpBodySetMass(m_handle, mass); + else + cpBodySetType(m_handle, CP_BODY_TYPE_STATIC); + } + else if (mass > 0.f) + { + if (cpBodyGetType(m_handle) == CP_BODY_TYPE_STATIC) + cpBodySetType(m_handle, CP_BODY_TYPE_DYNAMIC); + } + + m_mass = mass; + } + + void RigidBody2D::SetMassCenter(const Vector2f& center) + { + if (m_mass > 0.f) + cpBodySetCenterOfGravity(m_handle, cpv(center.x, center.y)); + } + + void RigidBody2D::SetPosition(const Vector2f& position) + { + cpBodySetPosition(m_handle, cpv(position.x, position.y)); + } + + void RigidBody2D::SetRotation(float rotation) + { + cpBodySetAngle(m_handle, rotation); + } + + void RigidBody2D::SetVelocity(const Vector2f& velocity) + { + cpBodySetVelocity(m_handle, cpv(velocity.x, velocity.y)); + } + + RigidBody2D& RigidBody2D::operator=(const RigidBody2D& object) + { + RigidBody2D physObj(object); + return operator=(std::move(physObj)); + } + + RigidBody2D& RigidBody2D::operator=(RigidBody2D&& object) + { + Destroy(); + + m_handle = object.m_handle; + m_geom = std::move(object.m_geom); + m_gravityFactor = object.m_gravityFactor; + m_mass = object.m_mass; + m_shapes = std::move(object.m_shapes); + m_world = object.m_world; + + object.m_handle = nullptr; + + return *this; + } + + void RigidBody2D::Destroy() + { + for (cpShape* shape : m_shapes) + cpShapeFree(shape); + + if (m_handle) + cpBodyFree(m_handle); + } + + void RigidBody2D::SetGeom(Collider2DRef geom) + { + if (geom) + m_geom = geom; + else + m_geom = NullCollider2D::New(); + + m_shapes = m_geom->CreateShapes(this); + } +} diff --git a/src/Nazara/Physics3D/Collider3D.cpp b/src/Nazara/Physics3D/Collider3D.cpp new file mode 100644 index 000000000..7cddffdbe --- /dev/null +++ b/src/Nazara/Physics3D/Collider3D.cpp @@ -0,0 +1,445 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Physics 3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include +#include +#include + +namespace Nz +{ + namespace + { + Collider3DRef CreateGeomFromPrimitive(const Primitive& primitive) + { + switch (primitive.type) + { + case PrimitiveType_Box: + return BoxCollider3D::New(primitive.box.lengths, primitive.matrix); + + case PrimitiveType_Cone: + return ConeCollider3D::New(primitive.cone.length, primitive.cone.radius, primitive.matrix); + + case PrimitiveType_Plane: + return BoxCollider3D::New(Vector3f(primitive.plane.size.x, 0.01f, primitive.plane.size.y), primitive.matrix); + ///TODO: PlaneGeom? + + case PrimitiveType_Sphere: + return SphereCollider3D::New(primitive.sphere.size, primitive.matrix.GetTranslation()); + } + + NazaraError("Primitive type not handled (0x" + String::Number(primitive.type, 16) + ')'); + return Collider3DRef(); + } + } + + Collider3D::~Collider3D() + { + for (auto& pair : m_handles) + NewtonDestroyCollision(pair.second); + } + + Boxf Collider3D::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 + { + Vector3f min, max; + + // Si nous n'avons aucune instance, nous en créons une temporaire + if (m_handles.empty()) + { + PhysWorld3D world; + + NewtonCollision* collision = CreateHandle(&world); + { + NewtonCollisionCalculateAABB(collision, offsetMatrix, min, max); + } + NewtonDestroyCollision(collision); + } + else // Sinon on utilise une instance au hasard (elles sont toutes identiques de toute façon) + NewtonCollisionCalculateAABB(m_handles.begin()->second, offsetMatrix, min, max); + + return Boxf(scale * min, scale * max); + } + + void Collider3D::ComputeInertialMatrix(Vector3f* inertia, Vector3f* center) const + { + float inertiaMatrix[3]; + float origin[3]; + + // Si nous n'avons aucune instance, nous en créons une temporaire + if (m_handles.empty()) + { + PhysWorld3D world; + + NewtonCollision* collision = CreateHandle(&world); + { + NewtonConvexCollisionCalculateInertialMatrix(collision, inertiaMatrix, origin); + } + NewtonDestroyCollision(collision); + } + else // Sinon on utilise une instance au hasard (elles sont toutes identiques de toute façon) + NewtonConvexCollisionCalculateInertialMatrix(m_handles.begin()->second, inertiaMatrix, origin); + + if (inertia) + inertia->Set(inertiaMatrix); + + if (center) + center->Set(origin); + } + + float Collider3D::ComputeVolume() const + { + float volume; + + // Si nous n'avons aucune instance, nous en créons une temporaire + if (m_handles.empty()) + { + PhysWorld3D world; + + NewtonCollision* collision = CreateHandle(&world); + { + volume = NewtonConvexCollisionCalculateVolume(collision); + } + NewtonDestroyCollision(collision); + } + else // Sinon on utilise une instance au hasard (elles sont toutes identiques de toute façon) + volume = NewtonConvexCollisionCalculateVolume(m_handles.begin()->second); + + return volume; + } + + NewtonCollision* Collider3D::GetHandle(PhysWorld3D* world) const + { + auto it = m_handles.find(world); + if (it == m_handles.end()) + it = m_handles.insert(std::make_pair(world, CreateHandle(world))).first; + + return it->second; + } + + Collider3DRef Collider3D::Build(const PrimitiveList& list) + { + std::size_t primitiveCount = list.GetSize(); + if (primitiveCount > 1) + { + std::vector geoms(primitiveCount); + + for (unsigned int i = 0; i < primitiveCount; ++i) + geoms[i] = CreateGeomFromPrimitive(list.GetPrimitive(i)); + + return CompoundCollider3D::New(&geoms[0], primitiveCount); + } + else if (primitiveCount > 0) + return CreateGeomFromPrimitive(list.GetPrimitive(0)); + else + return NullCollider3D::New(); + } + + bool Collider3D::Initialize() + { + if (!Collider3DLibrary::Initialize()) + { + NazaraError("Failed to initialise library"); + return false; + } + + return true; + } + + void Collider3D::Uninitialize() + { + Collider3DLibrary::Uninitialize(); + } + + Collider3DLibrary::LibraryMap Collider3D::s_library; + + /********************************** BoxCollider3D **********************************/ + + BoxCollider3D::BoxCollider3D(const Vector3f& lengths, const Matrix4f& transformMatrix) : + m_matrix(transformMatrix), + m_lengths(lengths) + { + } + + BoxCollider3D::BoxCollider3D(const Vector3f& lengths, const Vector3f& translation, const Quaternionf& rotation) : + BoxCollider3D(lengths, Matrix4f::Transform(translation, rotation)) + { + } + + Boxf BoxCollider3D::ComputeAABB(const Matrix4f& offsetMatrix, const Vector3f& scale) const + { + Vector3f halfLengths(m_lengths * 0.5f); + + Boxf aabb(-halfLengths.x, -halfLengths.y, -halfLengths.z, m_lengths.x, m_lengths.y, m_lengths.z); + aabb.Transform(offsetMatrix, true); + aabb *= scale; + + return aabb; + } + + float BoxCollider3D::ComputeVolume() const + { + return m_lengths.x * m_lengths.y * m_lengths.z; + } + + Vector3f BoxCollider3D::GetLengths() const + { + return m_lengths; + } + + ColliderType3D BoxCollider3D::GetType() const + { + return ColliderType3D_Box; + } + + NewtonCollision* BoxCollider3D::CreateHandle(PhysWorld3D* world) const + { + return NewtonCreateBox(world->GetHandle(), m_lengths.x, m_lengths.y, m_lengths.z, 0, m_matrix); + } + + /******************************** CapsuleCollider3D ********************************/ + + CapsuleCollider3D::CapsuleCollider3D(float length, float radius, const Matrix4f& transformMatrix) : + m_matrix(transformMatrix), + m_length(length), + m_radius(radius) + { + } + + CapsuleCollider3D::CapsuleCollider3D(float length, float radius, const Vector3f& translation, const Quaternionf& rotation) : + CapsuleCollider3D(length, radius, Matrix4f::Transform(translation, rotation)) + { + } + + float CapsuleCollider3D::GetLength() const + { + return m_length; + } + + float CapsuleCollider3D::GetRadius() const + { + return m_radius; + } + + ColliderType3D CapsuleCollider3D::GetType() const + { + return ColliderType3D_Capsule; + } + + NewtonCollision* CapsuleCollider3D::CreateHandle(PhysWorld3D* world) const + { + return NewtonCreateCapsule(world->GetHandle(), m_radius, m_length, 0, m_matrix); + } + + /******************************* CompoundCollider3D ********************************/ + + CompoundCollider3D::CompoundCollider3D(Collider3D** geoms, std::size_t geomCount) + { + m_geoms.reserve(geomCount); + for (std::size_t i = 0; i < geomCount; ++i) + m_geoms.emplace_back(geoms[i]); + } + + const std::vector& CompoundCollider3D::GetGeoms() const + { + return m_geoms; + } + + ColliderType3D CompoundCollider3D::GetType() const + { + return ColliderType3D_Compound; + } + + NewtonCollision* CompoundCollider3D::CreateHandle(PhysWorld3D* world) const + { + NewtonCollision* compoundCollision = NewtonCreateCompoundCollision(world->GetHandle(), 0); + + NewtonCompoundCollisionBeginAddRemove(compoundCollision); + for (const Collider3DRef& geom : m_geoms) + { + if (geom->GetType() == ColliderType3D_Compound) + { + CompoundCollider3D* compoundGeom = static_cast(geom.Get()); + for (const Collider3DRef& piece : compoundGeom->GetGeoms()) + NewtonCompoundCollisionAddSubCollision(compoundCollision, piece->GetHandle(world)); + } + else + NewtonCompoundCollisionAddSubCollision(compoundCollision, geom->GetHandle(world)); + } + NewtonCompoundCollisionEndAddRemove(compoundCollision); + + return compoundCollision; + } + + /********************************* ConeCollider3D **********************************/ + + ConeCollider3D::ConeCollider3D(float length, float radius, const Matrix4f& transformMatrix) : + m_matrix(transformMatrix), + m_length(length), + m_radius(radius) + { + } + + ConeCollider3D::ConeCollider3D(float length, float radius, const Vector3f& translation, const Quaternionf& rotation) : + ConeCollider3D(length, radius, Matrix4f::Transform(translation, rotation)) + { + } + + float ConeCollider3D::GetLength() const + { + return m_length; + } + + float ConeCollider3D::GetRadius() const + { + return m_radius; + } + + ColliderType3D ConeCollider3D::GetType() const + { + return ColliderType3D_Cone; + } + + NewtonCollision* ConeCollider3D::CreateHandle(PhysWorld3D* world) const + { + return NewtonCreateCone(world->GetHandle(), m_radius, m_length, 0, m_matrix); + } + + /****************************** ConvexCollider3D *******************************/ + + ConvexCollider3D::ConvexCollider3D(SparsePtr vertices, unsigned int vertexCount, float tolerance, const Matrix4f& transformMatrix) : + m_matrix(transformMatrix), + m_tolerance(tolerance) + { + m_vertices.resize(vertexCount); + if (vertices.GetStride() != sizeof(Vector3f)) + { + for (unsigned int i = 0; i < vertexCount; ++i) + m_vertices[i] = *vertices++; + } + else // Fast path + std::memcpy(m_vertices.data(), vertices, vertexCount*sizeof(Vector3f)); + } + + ConvexCollider3D::ConvexCollider3D(SparsePtr vertices, unsigned int vertexCount, float tolerance, const Vector3f& translation, const Quaternionf& rotation) : + ConvexCollider3D(vertices, vertexCount, tolerance, Matrix4f::Transform(translation, rotation)) + { + } + + ColliderType3D ConvexCollider3D::GetType() const + { + return ColliderType3D_Compound; + } + + NewtonCollision* ConvexCollider3D::CreateHandle(PhysWorld3D* world) const + { + return NewtonCreateConvexHull(world->GetHandle(), static_cast(m_vertices.size()), reinterpret_cast(m_vertices.data()), sizeof(Vector3f), m_tolerance, 0, m_matrix); + } + + /******************************* CylinderCollider3D ********************************/ + + CylinderCollider3D::CylinderCollider3D(float length, float radius, const Matrix4f& transformMatrix) : + m_matrix(transformMatrix), + m_length(length), + m_radius(radius) + { + } + + CylinderCollider3D::CylinderCollider3D(float length, float radius, const Vector3f& translation, const Quaternionf& rotation) : + CylinderCollider3D(length, radius, Matrix4f::Transform(translation, rotation)) + { + } + + float CylinderCollider3D::GetLength() const + { + return m_length; + } + + float CylinderCollider3D::GetRadius() const + { + return m_radius; + } + + ColliderType3D CylinderCollider3D::GetType() const + { + return ColliderType3D_Cylinder; + } + + NewtonCollision* CylinderCollider3D::CreateHandle(PhysWorld3D* world) const + { + return NewtonCreateCylinder(world->GetHandle(), m_radius, m_length, 0, m_matrix); + } + + /********************************* NullCollider3D **********************************/ + + NullCollider3D::NullCollider3D() + { + } + + ColliderType3D NullCollider3D::GetType() const + { + return ColliderType3D_Null; + } + + void NullCollider3D::ComputeInertialMatrix(Vector3f* inertia, Vector3f* center) const + { + if (inertia) + inertia->MakeUnit(); + + if (center) + center->MakeZero(); + } + + NewtonCollision* NullCollider3D::CreateHandle(PhysWorld3D* world) const + { + return NewtonCreateNull(world->GetHandle()); + } + + /******************************** SphereCollider3D *********************************/ + + SphereCollider3D::SphereCollider3D(float radius, const Matrix4f& transformMatrix) : + SphereCollider3D(radius, transformMatrix.GetTranslation()) + { + } + + SphereCollider3D::SphereCollider3D(float radius, const Vector3f& translation, const Quaternionf& rotation) : + m_position(translation), + m_radius(radius) + { + NazaraUnused(rotation); + } + + Boxf SphereCollider3D::ComputeAABB(const Matrix4f& offsetMatrix, const Vector3f& scale) const + { + Vector3f size(m_radius * NazaraSuffixMacro(M_SQRT3, f) * scale); + Vector3f position(offsetMatrix.GetTranslation()); + + return Boxf(position - size, position + size); + } + + float SphereCollider3D::ComputeVolume() const + { + return float(M_PI) * m_radius * m_radius * m_radius / 3.f; + } + + float SphereCollider3D::GetRadius() const + { + return m_radius; + } + + ColliderType3D SphereCollider3D::GetType() const + { + return ColliderType3D_Sphere; + } + + NewtonCollision* SphereCollider3D::CreateHandle(PhysWorld3D* world) const + { + return NewtonCreateSphere(world->GetHandle(), m_radius, 0, Matrix4f::Translate(m_position)); + } +} diff --git a/src/Nazara/Physics3D/Debug/NewOverload.cpp b/src/Nazara/Physics3D/Debug/NewOverload.cpp new file mode 100644 index 000000000..18092514c --- /dev/null +++ b/src/Nazara/Physics3D/Debug/NewOverload.cpp @@ -0,0 +1,31 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Physics 3D module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#if NAZARA_PHYSICS_MANAGE_MEMORY + +#include +#include // Nécessaire ? + +void* operator new(std::size_t size) +{ + return Nz::MemoryManager::Allocate(size, false); +} + +void* operator new[](std::size_t size) +{ + return Nz::MemoryManager::Allocate(size, true); +} + +void operator delete(void* pointer) noexcept +{ + Nz::MemoryManager::Free(pointer, false); +} + +void operator delete[](void* pointer) noexcept +{ + Nz::MemoryManager::Free(pointer, true); +} + +#endif // NAZARA_PHYSICS_MANAGE_MEMORY diff --git a/src/Nazara/Physics/PhysWorld.cpp b/src/Nazara/Physics3D/PhysWorld3D.cpp similarity index 57% rename from src/Nazara/Physics/PhysWorld.cpp rename to src/Nazara/Physics3D/PhysWorld3D.cpp index a3d76429b..c6990f635 100644 --- a/src/Nazara/Physics/PhysWorld.cpp +++ b/src/Nazara/Physics3D/PhysWorld3D.cpp @@ -1,14 +1,14 @@ // Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Engine - Physics module" +// This file is part of the "Nazara Engine - Physics 3D module" // For conditions of distribution and use, see copyright notice in Config.hpp -#include +#include #include -#include +#include namespace Nz { - PhysWorld::PhysWorld() : + PhysWorld3D::PhysWorld3D() : m_gravity(Vector3f::Zero()), m_stepSize(0.005f), m_timestepAccumulator(0.f) @@ -17,42 +17,42 @@ namespace Nz NewtonWorldSetUserData(m_world, this); } - PhysWorld::~PhysWorld() + PhysWorld3D::~PhysWorld3D() { NewtonDestroy(m_world); } - Vector3f PhysWorld::GetGravity() const + Vector3f PhysWorld3D::GetGravity() const { return m_gravity; } - NewtonWorld* PhysWorld::GetHandle() const + NewtonWorld* PhysWorld3D::GetHandle() const { return m_world; } - float PhysWorld::GetStepSize() const + float PhysWorld3D::GetStepSize() const { return m_stepSize; } - void PhysWorld::SetGravity(const Vector3f& gravity) + void PhysWorld3D::SetGravity(const Vector3f& gravity) { m_gravity = gravity; } - void PhysWorld::SetSolverModel(unsigned int model) + void PhysWorld3D::SetSolverModel(unsigned int model) { NewtonSetSolverModel(m_world, model); } - void PhysWorld::SetStepSize(float stepSize) + void PhysWorld3D::SetStepSize(float stepSize) { m_stepSize = stepSize; } - void PhysWorld::Step(float timestep) + void PhysWorld3D::Step(float timestep) { m_timestepAccumulator += timestep; diff --git a/src/Nazara/Physics/Physics.cpp b/src/Nazara/Physics3D/Physics3D.cpp similarity index 64% rename from src/Nazara/Physics/Physics.cpp rename to src/Nazara/Physics3D/Physics3D.cpp index 584c334ab..8fb470f2a 100644 --- a/src/Nazara/Physics/Physics.cpp +++ b/src/Nazara/Physics3D/Physics3D.cpp @@ -1,24 +1,24 @@ // Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Engine - Physics module" +// This file is part of the "Nazara Engine - Physics 3D 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 namespace Nz { - unsigned int Physics::GetMemoryUsed() + unsigned int Physics3D::GetMemoryUsed() { return NewtonGetMemoryUsed(); } - bool Physics::Initialize() + bool Physics3D::Initialize() { if (s_moduleReferenceCounter > 0) { @@ -36,22 +36,22 @@ namespace Nz s_moduleReferenceCounter++; // Initialisation du module - if (!PhysGeom::Initialize()) + if (!Collider3D::Initialize()) { NazaraError("Failed to initialize geoms"); return false; } - NazaraNotice("Initialized: Physics module"); + NazaraNotice("Initialized: Physics3D module"); return true; } - bool Physics::IsInitialized() + bool Physics3D::IsInitialized() { return s_moduleReferenceCounter != 0; } - void Physics::Uninitialize() + void Physics3D::Uninitialize() { if (s_moduleReferenceCounter != 1) { @@ -63,15 +63,15 @@ namespace Nz } // Libération du module - PhysGeom::Uninitialize(); + Collider3D::Uninitialize(); s_moduleReferenceCounter = 0; - NazaraNotice("Uninitialized: Physics module"); + NazaraNotice("Uninitialized: Physics3D module"); // Libération des dépendances Core::Uninitialize(); } - unsigned int Physics::s_moduleReferenceCounter = 0; + unsigned int Physics3D::s_moduleReferenceCounter = 0; } diff --git a/src/Nazara/Physics/PhysObject.cpp b/src/Nazara/Physics3D/RigidBody3D.cpp similarity index 67% rename from src/Nazara/Physics/PhysObject.cpp rename to src/Nazara/Physics3D/RigidBody3D.cpp index 1ee4a44d5..5051fa143 100644 --- a/src/Nazara/Physics/PhysObject.cpp +++ b/src/Nazara/Physics3D/RigidBody3D.cpp @@ -1,25 +1,25 @@ // Copyright (C) 2015 Jérôme Leclercq -// This file is part of the "Nazara Engine - Physics module" +// This file is part of the "Nazara Engine - Physics 3D module" // For conditions of distribution and use, see copyright notice in Config.hpp -#include +#include #include -#include -#include +#include +#include #include #include -#include +#include namespace Nz { - PhysObject::PhysObject(PhysWorld* world, const Matrix4f& mat) : - PhysObject(world, NullGeom::New(), mat) + RigidBody3D::RigidBody3D(PhysWorld3D* world, const Matrix4f& mat) : + RigidBody3D(world, NullCollider3D::New(), mat) { } - PhysObject::PhysObject(PhysWorld* world, PhysGeomRef geom, const Matrix4f& mat) : - m_matrix(mat), + RigidBody3D::RigidBody3D(PhysWorld3D* world, Collider3DRef geom, const Matrix4f& mat) : m_geom(std::move(geom)), + m_matrix(mat), m_forceAccumulator(Vector3f::Zero()), m_torqueAccumulator(Vector3f::Zero()), m_world(world), @@ -29,15 +29,15 @@ namespace Nz NazaraAssert(m_world, "Invalid world"); if (!m_geom) - m_geom = NullGeom::New(); + m_geom = NullCollider3D::New(); m_body = NewtonCreateDynamicBody(m_world->GetHandle(), m_geom->GetHandle(m_world), m_matrix); NewtonBodySetUserData(m_body, this); } - PhysObject::PhysObject(const PhysObject& object) : - m_matrix(object.m_matrix), + RigidBody3D::RigidBody3D(const RigidBody3D& object) : m_geom(object.m_geom), + m_matrix(object.m_matrix), m_forceAccumulator(Vector3f::Zero()), m_torqueAccumulator(Vector3f::Zero()), m_world(object.m_world), @@ -52,9 +52,9 @@ namespace Nz SetMass(object.m_mass); } - PhysObject::PhysObject(PhysObject&& object) : - m_matrix(std::move(object.m_matrix)), + RigidBody3D::RigidBody3D(RigidBody3D&& object) : m_geom(std::move(object.m_geom)), + m_matrix(std::move(object.m_matrix)), m_forceAccumulator(std::move(object.m_forceAccumulator)), m_torqueAccumulator(std::move(object.m_torqueAccumulator)), m_body(object.m_body), @@ -65,13 +65,13 @@ namespace Nz object.m_body = nullptr; } - PhysObject::~PhysObject() + RigidBody3D::~RigidBody3D() { if (m_body) NewtonDestroyBody(m_body); } - void PhysObject::AddForce(const Vector3f& force, CoordSys coordSys) + void RigidBody3D::AddForce(const Vector3f& force, CoordSys coordSys) { switch (coordSys) { @@ -88,7 +88,7 @@ namespace Nz NewtonBodySetSleepState(m_body, 0); } - void PhysObject::AddForce(const Vector3f& force, const Vector3f& point, CoordSys coordSys) + void RigidBody3D::AddForce(const Vector3f& force, const Vector3f& point, CoordSys coordSys) { switch (coordSys) { @@ -105,7 +105,7 @@ namespace Nz NewtonBodySetSleepState(m_body, 0); } - void PhysObject::AddTorque(const Vector3f& torque, CoordSys coordSys) + void RigidBody3D::AddTorque(const Vector3f& torque, CoordSys coordSys) { switch (coordSys) { @@ -122,12 +122,12 @@ namespace Nz NewtonBodySetSleepState(m_body, 0); } - void PhysObject::EnableAutoSleep(bool autoSleep) + void RigidBody3D::EnableAutoSleep(bool autoSleep) { NewtonBodySetAutoSleep(m_body, autoSleep); } - Boxf PhysObject::GetAABB() const + Boxf RigidBody3D::GetAABB() const { Vector3f min, max; NewtonBodyGetAABB(m_body, min, max); @@ -135,7 +135,7 @@ namespace Nz return Boxf(min, max); } - Vector3f PhysObject::GetAngularVelocity() const + Vector3f RigidBody3D::GetAngularVelocity() const { Vector3f angularVelocity; NewtonBodyGetOmega(m_body, angularVelocity); @@ -143,27 +143,27 @@ namespace Nz return angularVelocity; } - const PhysGeomRef& PhysObject::GetGeom() const + const Collider3DRef& RigidBody3D::GetGeom() const { return m_geom; } - float PhysObject::GetGravityFactor() const + float RigidBody3D::GetGravityFactor() const { return m_gravityFactor; } - NewtonBody* PhysObject::GetHandle() const + NewtonBody* RigidBody3D::GetHandle() const { return m_body; } - float PhysObject::GetMass() const + float RigidBody3D::GetMass() const { return m_mass; } - Vector3f PhysObject::GetMassCenter(CoordSys coordSys) const + Vector3f RigidBody3D::GetMassCenter(CoordSys coordSys) const { Vector3f center; NewtonBodyGetCentreOfMass(m_body, center); @@ -181,22 +181,22 @@ namespace Nz return center; } - const Matrix4f& PhysObject::GetMatrix() const + const Matrix4f& RigidBody3D::GetMatrix() const { return m_matrix; } - Vector3f PhysObject::GetPosition() const + Vector3f RigidBody3D::GetPosition() const { return m_matrix.GetTranslation(); } - Quaternionf PhysObject::GetRotation() const + Quaternionf RigidBody3D::GetRotation() const { return m_matrix.GetRotation(); } - Vector3f PhysObject::GetVelocity() const + Vector3f RigidBody3D::GetVelocity() const { Vector3f velocity; NewtonBodyGetVelocity(m_body, velocity); @@ -204,50 +204,52 @@ namespace Nz return velocity; } - bool PhysObject::IsAutoSleepEnabled() const + bool RigidBody3D::IsAutoSleepEnabled() const { return NewtonBodyGetAutoSleep(m_body) != 0; } - bool PhysObject::IsMoveable() const + bool RigidBody3D::IsMoveable() const { return m_mass > 0.f; } - bool PhysObject::IsSleeping() const + bool RigidBody3D::IsSleeping() const { return NewtonBodyGetSleepState(m_body) != 0; } - void PhysObject::SetAngularVelocity(const Vector3f& angularVelocity) + void RigidBody3D::SetAngularVelocity(const Vector3f& angularVelocity) { NewtonBodySetOmega(m_body, angularVelocity); } - void PhysObject::SetGeom(PhysGeomRef geom) + void RigidBody3D::SetGeom(Collider3DRef geom) { if (m_geom.Get() != geom) { if (geom) m_geom = geom; else - m_geom = NullGeom::New(); + m_geom = NullCollider3D::New(); NewtonBodySetCollision(m_body, m_geom->GetHandle(m_world)); } } - void PhysObject::SetGravityFactor(float gravityFactor) + void RigidBody3D::SetGravityFactor(float gravityFactor) { m_gravityFactor = gravityFactor; } - void PhysObject::SetMass(float mass) + void RigidBody3D::SetMass(float mass) { if (m_mass > 0.f) { + // If we already have a mass, we already have an inertial matrix as well, just rescale it float Ix, Iy, Iz; NewtonBodyGetMassMatrix(m_body, &m_mass, &Ix, &Iy, &Iz); + float scale = mass/m_mass; NewtonBodySetMassMatrix(m_body, mass, Ix*scale, Iy*scale, Iz*scale); } @@ -265,41 +267,44 @@ namespace Nz m_mass = mass; } - void PhysObject::SetMassCenter(const Vector3f& center) + void RigidBody3D::SetMassCenter(const Vector3f& center) { if (m_mass > 0.f) NewtonBodySetCentreOfMass(m_body, center); } - void PhysObject::SetPosition(const Vector3f& position) + void RigidBody3D::SetPosition(const Vector3f& position) { m_matrix.SetTranslation(position); + UpdateBody(); } - void PhysObject::SetRotation(const Quaternionf& rotation) + void RigidBody3D::SetRotation(const Quaternionf& rotation) { m_matrix.SetRotation(rotation); + UpdateBody(); } - void PhysObject::SetVelocity(const Vector3f& velocity) + void RigidBody3D::SetVelocity(const Vector3f& velocity) { NewtonBodySetVelocity(m_body, velocity); } - PhysObject& PhysObject::operator=(const PhysObject& object) + RigidBody3D& RigidBody3D::operator=(const RigidBody3D& object) { - PhysObject physObj(object); + RigidBody3D physObj(object); return operator=(std::move(physObj)); } - void PhysObject::UpdateBody() + void RigidBody3D::UpdateBody() { NewtonBodySetMatrix(m_body, m_matrix); if (NumberEquals(m_mass, 0.f)) { + // Moving a static body in Newton does not update bodies at the target location // http://newtondynamics.com/wiki/index.php5?title=Can_i_dynamicly_move_a_TriMesh%3F Vector3f min, max; NewtonBodyGetAABB(m_body, min, max); @@ -312,11 +317,9 @@ namespace Nz }, nullptr); } - /*for (std::set::iterator it = m_listeners.begin(); it != m_listeners.end(); ++it) - (*it)->PhysObjectOnUpdate(this);*/ } - PhysObject& PhysObject::operator=(PhysObject&& object) + RigidBody3D& RigidBody3D::operator=(RigidBody3D&& object) { if (m_body) NewtonDestroyBody(m_body); @@ -335,36 +338,30 @@ namespace Nz return *this; } - void PhysObject::ForceAndTorqueCallback(const NewtonBody* body, float timeStep, int threadIndex) + void RigidBody3D::ForceAndTorqueCallback(const NewtonBody* body, float timeStep, int threadIndex) { NazaraUnused(timeStep); NazaraUnused(threadIndex); - PhysObject* me = static_cast(NewtonBodyGetUserData(body)); + RigidBody3D* me = static_cast(NewtonBodyGetUserData(body)); if (!NumberEquals(me->m_gravityFactor, 0.f)) me->m_forceAccumulator += me->m_world->GetGravity() * me->m_gravityFactor * me->m_mass; - /*for (std::set::iterator it = me->m_listeners.begin(); it != me->m_listeners.end(); ++it) - (*it)->PhysObjectApplyForce(me);*/ - NewtonBodySetForce(body, me->m_forceAccumulator); NewtonBodySetTorque(body, me->m_torqueAccumulator); me->m_torqueAccumulator.Set(0.f); me->m_forceAccumulator.Set(0.f); - ///TODO: Implanter la force gyroscopique? + ///TODO: Implement gyroscopic force? } - void PhysObject::TransformCallback(const NewtonBody* body, const float* matrix, int threadIndex) + void RigidBody3D::TransformCallback(const NewtonBody* body, const float* matrix, int threadIndex) { NazaraUnused(threadIndex); - PhysObject* me = static_cast(NewtonBodyGetUserData(body)); + RigidBody3D* me = static_cast(NewtonBodyGetUserData(body)); me->m_matrix.Set(matrix); - - /*for (std::set::iterator it = me->m_listeners.begin(); it != me->m_listeners.end(); ++it) - (*it)->PhysObjectOnUpdate(me);*/ - } + } } diff --git a/src/Nazara/Renderer/GLX/ContextImpl.hpp b/src/Nazara/Renderer/GLX/ContextImpl.hpp index 40bbd5fc7..7508537d1 100644 --- a/src/Nazara/Renderer/GLX/ContextImpl.hpp +++ b/src/Nazara/Renderer/GLX/ContextImpl.hpp @@ -11,7 +11,7 @@ namespace Nz { - class ContextParameters; + struct ContextParameters; class ContextImpl { diff --git a/src/Nazara/Renderer/UberShaderPreprocessor.cpp b/src/Nazara/Renderer/UberShaderPreprocessor.cpp index f0e46c7d3..2aeba18b9 100644 --- a/src/Nazara/Renderer/UberShaderPreprocessor.cpp +++ b/src/Nazara/Renderer/UberShaderPreprocessor.cpp @@ -76,7 +76,7 @@ namespace Nz code << "#define GLSL_VERSION " << glslVersion << "\n\n"; - code << "#define EARLY_FRAGMENT_TEST " << ((glslVersion >= 420 || OpenGL::IsSupported(OpenGLExtension_Shader_ImageLoadStore)) ? '1' : '0') << "\n\n"; + code << "#define EARLY_FRAGMENT_TESTS " << ((glslVersion >= 420 || OpenGL::IsSupported(OpenGLExtension_Shader_ImageLoadStore)) ? '1' : '0') << "\n\n"; for (auto it = shaderStage.flags.begin(); it != shaderStage.flags.end(); ++it) code << "#define " << it->first << ' ' << ((stageFlags & it->second) ? '1' : '0') << '\n'; diff --git a/src/Nazara/Utility/Formats/MD5AnimLoader.cpp b/src/Nazara/Utility/Formats/MD5AnimLoader.cpp index 942b54f8e..e263ceef3 100644 --- a/src/Nazara/Utility/Formats/MD5AnimLoader.cpp +++ b/src/Nazara/Utility/Formats/MD5AnimLoader.cpp @@ -25,7 +25,7 @@ namespace Nz return parser.Check(); } - bool Load(Animation* animation, Stream& stream, const AnimationParams& parameters) + bool Load(Animation* animation, Stream& stream, const AnimationParams& /*parameters*/) { ///TODO: Utiliser les paramètres MD5AnimParser parser(stream); diff --git a/src/Nazara/Utility/Formats/MTLParser.cpp b/src/Nazara/Utility/Formats/MTLParser.cpp index b31ee24a9..1bbed892f 100644 --- a/src/Nazara/Utility/Formats/MTLParser.cpp +++ b/src/Nazara/Utility/Formats/MTLParser.cpp @@ -304,7 +304,7 @@ namespace Nz const Material& mat = pair.second; Emit("newmtl "); - EmitLine(pair.first); + EmitLine(matName); EmitLine(); Emit("Ka "); diff --git a/src/Nazara/Utility/Formats/OBJSaver.cpp b/src/Nazara/Utility/Formats/OBJSaver.cpp index 6ed15e717..761432473 100644 --- a/src/Nazara/Utility/Formats/OBJSaver.cpp +++ b/src/Nazara/Utility/Formats/OBJSaver.cpp @@ -66,6 +66,8 @@ namespace Nz bool SaveToStream(const Mesh& mesh, const String& format, Stream& stream, const MeshParams& parameters) { + NazaraUnused(parameters); + if (!mesh.IsValid()) { NazaraError("Invalid mesh"); diff --git a/src/Nazara/Utility/Formats/STBSaver.cpp b/src/Nazara/Utility/Formats/STBSaver.cpp index 1b65312fe..26c6067fe 100644 --- a/src/Nazara/Utility/Formats/STBSaver.cpp +++ b/src/Nazara/Utility/Formats/STBSaver.cpp @@ -99,7 +99,7 @@ namespace Nz void WriteToStream(void* userdata, void* data, int size) { Stream* stream = static_cast(userdata); - if (stream->Write(data, size) != size) + if (stream->Write(data, size) != static_cast(size)) throw std::runtime_error("Failed to write to stream"); } @@ -142,6 +142,8 @@ namespace Nz bool SaveBMP(const Image& image, const ImageParams& parameters, Stream& stream) { + NazaraUnused(parameters); + Image tempImage(image); //< We're using COW here to prevent Image copy unless required int componentCount = ConvertToIntegerFormat(tempImage); @@ -159,9 +161,11 @@ namespace Nz return true; } - + bool SaveHDR(const Image& image, const ImageParams& parameters, Stream& stream) { + NazaraUnused(parameters); + Image tempImage(image); //< We're using COW here to prevent Image copy unless required int componentCount = ConvertToFloatFormat(tempImage); @@ -182,6 +186,8 @@ namespace Nz bool SavePNG(const Image& image, const ImageParams& parameters, Stream& stream) { + NazaraUnused(parameters); + Image tempImage(image); //< We're using COW here to prevent Image copy unless required int componentCount = ConvertToIntegerFormat(tempImage); @@ -202,6 +208,8 @@ namespace Nz bool SaveTGA(const Image& image, const ImageParams& parameters, Stream& stream) { + NazaraUnused(parameters); + Image tempImage(image); //< We're using COW here to prevent Image copy unless required int componentCount = ConvertToIntegerFormat(tempImage); diff --git a/src/Nazara/Utility/SoftwareBuffer.cpp b/src/Nazara/Utility/SoftwareBuffer.cpp index e9193c8dd..081f0fda3 100644 --- a/src/Nazara/Utility/SoftwareBuffer.cpp +++ b/src/Nazara/Utility/SoftwareBuffer.cpp @@ -11,10 +11,8 @@ namespace Nz { - SoftwareBuffer::SoftwareBuffer(Buffer* parent, BufferType type) : - m_type(type) + SoftwareBuffer::SoftwareBuffer(Buffer* /*parent*/, BufferType type) { - NazaraUnused(parent); } SoftwareBuffer::~SoftwareBuffer() @@ -25,7 +23,7 @@ namespace Nz { NazaraUnused(usage); - // Cette allocation est protégée car sa taille dépend directement de paramètres utilisateurs + // Protect the allocation to prevent a memory exception to escape the function try { m_buffer = new UInt8[size]; @@ -46,20 +44,11 @@ namespace Nz delete[] m_buffer; } - bool SoftwareBuffer::Fill(const void* data, unsigned int offset, unsigned int size, bool forceDiscard) + bool SoftwareBuffer::Fill(const void* data, unsigned int offset, unsigned int size, bool /*forceDiscard*/) { - NazaraUnused(forceDiscard); - - #if NAZARA_UTILITY_SAFE - if (m_mapped) - { - NazaraError("Buffer already mapped"); - return false; - } - #endif + NazaraAssert(!m_mapped, "Buffer is already mapped"); std::memcpy(&m_buffer[offset], data, size); - return true; } @@ -68,18 +57,9 @@ namespace Nz return false; } - void* SoftwareBuffer::Map(BufferAccess access, unsigned int offset, unsigned int size) + void* SoftwareBuffer::Map(BufferAccess /*access*/, unsigned int offset, unsigned int /*size*/) { - NazaraUnused(access); - NazaraUnused(size); - - #if NAZARA_UTILITY_SAFE - if (m_mapped) - { - NazaraError("Buffer already mapped"); - return nullptr; - } - #endif + NazaraAssert(!m_mapped, "Buffer is already mapped"); m_mapped = true; @@ -88,13 +68,7 @@ namespace Nz bool SoftwareBuffer::Unmap() { - #if NAZARA_UTILITY_SAFE - if (!m_mapped) - { - NazaraError("Buffer not mapped"); - return true; - } - #endif + NazaraAssert(m_mapped, "Buffer is not mapped"); m_mapped = false; diff --git a/src/Nazara/Utility/SoftwareBuffer.hpp b/src/Nazara/Utility/SoftwareBuffer.hpp index ab84b1899..1e074257a 100644 --- a/src/Nazara/Utility/SoftwareBuffer.hpp +++ b/src/Nazara/Utility/SoftwareBuffer.hpp @@ -29,7 +29,6 @@ namespace Nz bool Unmap(); private: - BufferType m_type; UInt8* m_buffer; bool m_mapped; }; diff --git a/src/Nazara/Utility/X11/WindowImpl.cpp b/src/Nazara/Utility/X11/WindowImpl.cpp index ecb8f1cc4..72b85912a 100644 --- a/src/Nazara/Utility/X11/WindowImpl.cpp +++ b/src/Nazara/Utility/X11/WindowImpl.cpp @@ -768,19 +768,79 @@ namespace Nz if (!keysyms) { NazaraError("Failed to get key symbols"); - return XCB_NONE; + return XCB_NO_SYMBOL; } - int col = state & XCB_MOD_MASK_SHIFT ? 1 : 0; - const int altGrOffset = 4; - if (state & XCB_MOD_MASK_5) - col += altGrOffset; - xcb_keysym_t keysym = xcb_key_symbols_get_keysym(keysyms, keycode, col); - if (keysym == XCB_NO_SYMBOL) - keysym = xcb_key_symbols_get_keysym(keysyms, keycode, col ^ 0x1); - X11::XCBKeySymbolsFree(keysyms); + xcb_keysym_t k0, k1; - return keysym; + CallOnExit onExit([&](){ + X11::XCBKeySymbolsFree(keysyms); + }); + + // Based on documentation in https://cgit.freedesktop.org/xcb/util-keysyms/tree/keysyms/keysyms.c + // Mode switch = ctlr and alt gr = XCB_MOD_MASK_5 + + // The first four elements of the list are split into two groups of KeySyms. + if (state & XCB_MOD_MASK_1) + { + k0 = xcb_key_symbols_get_keysym(keysyms, keycode, 2); + k1 = xcb_key_symbols_get_keysym(keysyms, keycode, 3); + } + if (state & XCB_MOD_MASK_5) + { + k0 = xcb_key_symbols_get_keysym(keysyms, keycode, 4); + k1 = xcb_key_symbols_get_keysym(keysyms, keycode, 5); + } + else + { + k0 = xcb_key_symbols_get_keysym(keysyms, keycode, 0); + k1 = xcb_key_symbols_get_keysym(keysyms, keycode, 1); + } + + // If the second element of the group is NoSymbol, then the group should be treated as if the second element were the same as the first element. + if (k1 == XCB_NO_SYMBOL) + k1 = k0; + + /* The numlock modifier is on and the second KeySym is a keypad KeySym + The numlock modifier is on and the second KeySym is a keypad KeySym. In + this case, if the Shift modifier is on, or if the Lock modifier is on + and is interpreted as ShiftLock, then the first KeySym is used, + otherwise the second KeySym is used. + */ + if ((state & XCB_MOD_MASK_2) && xcb_is_keypad_key(k1)) + { + if ((state & XCB_MOD_MASK_SHIFT) || (state & XCB_MOD_MASK_LOCK && (state & XCB_MOD_MASK_SHIFT))) + return k0; + else + return k1; + } + + /* The Shift and Lock modifiers are both off. In this case, the first + KeySym is used.*/ + else if (!(state & XCB_MOD_MASK_SHIFT) && !(state & XCB_MOD_MASK_LOCK)) + return k0; + + /* The Shift modifier is off, and the Lock modifier is on and is + interpreted as CapsLock. In this case, the first KeySym is used, but + if that KeySym is lowercase alphabetic, then the corresponding + uppercase KeySym is used instead. */ + else if (!(state & XCB_MOD_MASK_SHIFT) && (state & XCB_MOD_MASK_LOCK && (state & XCB_MOD_MASK_SHIFT))) + return k0; + + /* The Shift modifier is on, and the Lock modifier is on and is + interpreted as CapsLock. In this case, the second KeySym is used, but + if that KeySym is lowercase alphabetic, then the corresponding + uppercase KeySym is used instead.*/ + else if ((state & XCB_MOD_MASK_SHIFT) && (state & XCB_MOD_MASK_LOCK && (state & XCB_MOD_MASK_SHIFT))) + return k1; + + /* The Shift modifier is on, or the Lock modifier is on and is + interpreted as ShiftLock, or both. In this case, the second KeySym is + used. */ + else if ((state & XCB_MOD_MASK_SHIFT) || (state & XCB_MOD_MASK_LOCK && (state & XCB_MOD_MASK_SHIFT))) + return k1; + + return XCB_NO_SYMBOL; } Keyboard::Key WindowImpl::ConvertVirtualKey(xcb_keysym_t symbol) @@ -1013,6 +1073,64 @@ namespace Nz xcb_flush(connection); } + char32_t WindowImpl::GetRepresentation(xcb_keysym_t keysym) const + { + switch (keysym) + { + case XK_KP_Space: + return ' '; + case XK_BackSpace: + return '\b'; + case XK_Tab: + case XK_KP_Tab: + return '\t'; + case XK_Linefeed: + return '\n'; + case XK_Return: + return '\r'; + // Numpad + case XK_KP_Multiply: + return '*'; + case XK_KP_Add: + return '+'; + case XK_KP_Separator: + return ','; // In french, it's '.' + case XK_KP_Subtract: + return '-'; + case XK_KP_Decimal: + return '.'; // In french, it's ',' + case XK_KP_Divide: + return '/'; + case XK_KP_0: + return '0'; + case XK_KP_1: + return '1'; + case XK_KP_2: + return '2'; + case XK_KP_3: + return '3'; + case XK_KP_4: + return '4'; + case XK_KP_5: + return '5'; + case XK_KP_6: + return '6'; + case XK_KP_7: + return '7'; + case XK_KP_8: + return '8'; + case XK_KP_9: + return '9'; + case XK_KP_Enter: + return '\r'; + default: + if (xcb_is_modifier_key(keysym) == true) + return '\0'; + else + return keysym; + } + } + void WindowImpl::ProcessEvent(xcb_generic_event_t* windowEvent) { if (!m_eventListener) @@ -1127,7 +1245,7 @@ namespace Nz event.key.system = keyPressEvent->state & XCB_MOD_MASK_4; m_parent->PushEvent(event); - char32_t codePoint = static_cast(keysym); + char32_t codePoint = GetRepresentation(keysym); // WTF if (std::isprint(codePoint, std::locale(""))) + handle combining ? { diff --git a/src/Nazara/Utility/X11/WindowImpl.hpp b/src/Nazara/Utility/X11/WindowImpl.hpp index 6a0e26391..6096dcac2 100644 --- a/src/Nazara/Utility/X11/WindowImpl.hpp +++ b/src/Nazara/Utility/X11/WindowImpl.hpp @@ -89,6 +89,8 @@ namespace Nz const char* ConvertWindowCursorToXName(WindowCursor cursor); void CommonInitialize(); + char32_t GetRepresentation(xcb_keysym_t keysym) const; + void ProcessEvent(xcb_generic_event_t* windowEvent); void ResetVideoMode(); diff --git a/tests/Engine/Audio/AlgorithmAudio.cpp b/tests/Engine/Audio/AlgorithmAudio.cpp index dfcfeee56..1d6de09c3 100644 --- a/tests/Engine/Audio/AlgorithmAudio.cpp +++ b/tests/Engine/Audio/AlgorithmAudio.cpp @@ -7,13 +7,13 @@ TEST_CASE("MixToMono", "[AUDIO][ALGORITHM]") { SECTION("Mix two channels together") { - std::array input{ 1, 3, 5, 3 }; - std::array output{ 0, 0 }; + std::array input = { { 1, 3, 5, 3 } }; + std::array output = { { 0, 0 } }; // Two channels and two frames ! Nz::MixToMono(input.data(), output.data(), 2, 2); - std::array theoric{ 2, 4 }; // It's the mean of the two channels - REQUIRE(output == theoric); + std::array theoric = { { 2, 4 } }; // It's the mean of the two channels + CHECK(output == theoric); } } diff --git a/tests/Engine/Core/AbstractHash.cpp b/tests/Engine/Core/AbstractHash.cpp index f5ee57d30..a2b4f49e1 100644 --- a/tests/Engine/Core/AbstractHash.cpp +++ b/tests/Engine/Core/AbstractHash.cpp @@ -14,13 +14,13 @@ SCENARIO("AbstractHash", "[CORE][ABSTRACTHASH]") WHEN("We introduce data") { - std::array array{ 0, 1, 2, 3 }; + std::array array{ { 0, 1, 2, 3 } }; SHA512->Append(array.data(), array.size()); THEN("We ask for the bytearray") { Nz::ByteArray byteArray = SHA512->End(); - REQUIRE(byteArray.GetSize() == SHA512->GetDigestLength()); + CHECK(byteArray.GetSize() == SHA512->GetDigestLength()); } } } diff --git a/tests/Engine/Core/Bitset.cpp b/tests/Engine/Core/Bitset.cpp index cb870f7a4..124556170 100644 --- a/tests/Engine/Core/Bitset.cpp +++ b/tests/Engine/Core/Bitset.cpp @@ -11,8 +11,8 @@ SCENARIO("Bitset", "[CORE][BITSET]") THEN("Capacity is 3 and size is 3") { - REQUIRE(bitset.GetSize() == 3); - REQUIRE(bitset.GetCapacity() >= 3); + CHECK(bitset.GetSize() == 3); + CHECK(bitset.GetCapacity() >= 3); } } @@ -25,11 +25,11 @@ SCENARIO("Bitset", "[CORE][BITSET]") WHEN("We assign 'anotherData'") { defaultByte = anotherDataString; - REQUIRE(anotherData == defaultByte); - REQUIRE(defaultByte.GetSize() == 4); - REQUIRE(defaultByte.GetCapacity() >= 4); - REQUIRE(anotherData.GetSize() == 4); - REQUIRE(anotherData.GetCapacity() >= 4); + CHECK(anotherData == defaultByte); + CHECK(defaultByte.GetSize() == 4); + CHECK(defaultByte.GetCapacity() >= 4); + CHECK(anotherData.GetSize() == 4); + CHECK(anotherData.GetCapacity() >= 4); } } @@ -43,17 +43,17 @@ SCENARIO("Bitset", "[CORE][BITSET]") THEN("We get a copy") { - REQUIRE(copyBitset == originalArray); + CHECK(copyBitset == originalArray); AND_WHEN("We modify one") { - for (auto i = 0; i < copyBitset.GetSize(); ++i) + for (std::size_t i = 0; i < copyBitset.GetSize(); ++i) copyBitset[i] = false; THEN("They are no more equal") { - REQUIRE(copyBitset != originalArray); - REQUIRE(copyBitset == Nz::Bitset<>(3, false)); + CHECK(copyBitset != originalArray); + CHECK(copyBitset == Nz::Bitset<>(3, false)); } } } diff --git a/tests/Engine/Core/SparsePtr.cpp b/tests/Engine/Core/SparsePtr.cpp index e727d0807..e0a921129 100644 --- a/tests/Engine/Core/SparsePtr.cpp +++ b/tests/Engine/Core/SparsePtr.cpp @@ -7,40 +7,40 @@ SCENARIO("SparsePtr", "[CORE][SPARSEPTR]") { GIVEN("A sparse pointer pointing to an array with a stride of 2") { - std::array arrays{0, 1, 2, 3, 4}; + std::array arrays = { {0, 1, 2, 3, 4} }; Nz::SparsePtr sparsePtr(arrays.data(), 2 * sizeof(int)); WHEN("We use operators") { THEN("Operator[] with 2 should be 4") { - REQUIRE(4 == sparsePtr[2]); + CHECK(4 == sparsePtr[2]); } THEN("Operator++ and Operator-- should be opposite") { ++sparsePtr; - REQUIRE(2 == *sparsePtr); + CHECK(2 == *sparsePtr); auto old = sparsePtr++; - REQUIRE(2 == *old); - REQUIRE(4 == *sparsePtr); + CHECK(2 == *old); + CHECK(4 == *sparsePtr); --sparsePtr; - REQUIRE(2 == *sparsePtr); + CHECK(2 == *sparsePtr); auto oldMinus = sparsePtr--; - REQUIRE(2 == *oldMinus); - REQUIRE(0 == *sparsePtr); + CHECK(2 == *oldMinus); + CHECK(0 == *sparsePtr); } THEN("Operator+ and operator-") { auto offsetTwo = sparsePtr + 2; - REQUIRE(4 == *offsetTwo); + CHECK(4 == *offsetTwo); auto offsetZero = offsetTwo - 2; - REQUIRE(0 == *offsetZero); + CHECK(0 == *offsetZero); - REQUIRE((offsetTwo - offsetZero) == 2); + CHECK((offsetTwo - offsetZero) == 2); } } } diff --git a/tests/Engine/Graphics/ParticleGroup.cpp b/tests/Engine/Graphics/ParticleGroup.cpp index 36ad2cb0b..361a5fba3 100644 --- a/tests/Engine/Graphics/ParticleGroup.cpp +++ b/tests/Engine/Graphics/ParticleGroup.cpp @@ -32,13 +32,13 @@ class TestParticleEmitter : public Nz::ParticleEmitter public: ~TestParticleEmitter() override = default; - void Emit(Nz::ParticleGroup& system, float elapsedTime) const override + void Emit(Nz::ParticleGroup& system, float /*elapsedTime*/) const override { system.GenerateParticles(GetEmissionCount()); } private: - void SetupParticles(Nz::ParticleMapper& mapper, unsigned int count) const override + void SetupParticles(Nz::ParticleMapper& /*mapper*/, unsigned int /*count*/) const override { } }; @@ -49,7 +49,7 @@ class TestParticleGenerator : public Nz::ParticleGenerator ~TestParticleGenerator() override = default; // Be aware that the interval is [startId, endId] and NOT [startId, endId) - void Generate(Nz::ParticleGroup& system, Nz::ParticleMapper& mapper, unsigned int startId, unsigned int endId) override + void Generate(Nz::ParticleGroup& /*system*/, Nz::ParticleMapper& mapper, unsigned int startId, unsigned int endId) override { Nz::SparsePtr positionPtr = mapper.GetComponentPtr(Nz::ParticleComponent_Position); Nz::SparsePtr velocityPtr = mapper.GetComponentPtr(Nz::ParticleComponent_Velocity); diff --git a/tests/Engine/Network/IpAddress.cpp b/tests/Engine/Network/IpAddress.cpp index c87880d7b..abcb65909 100644 --- a/tests/Engine/Network/IpAddress.cpp +++ b/tests/Engine/Network/IpAddress.cpp @@ -17,8 +17,8 @@ SCENARIO("IpAddress", "[NETWORK][IPADDRESS]") THEN("It's the loop back") { - REQUIRE(ipAddressV4.IsLoopback()); - REQUIRE(ipAddressV6.IsLoopback()); + CHECK(ipAddressV4.IsLoopback()); + CHECK(ipAddressV6.IsLoopback()); } } } @@ -31,7 +31,7 @@ SCENARIO("IpAddress", "[NETWORK][IPADDRESS]") THEN("Result is not null") { - REQUIRE(!hostnameInfos.empty()); + CHECK_FALSE(hostnameInfos.empty()); } } @@ -40,7 +40,7 @@ SCENARIO("IpAddress", "[NETWORK][IPADDRESS]") Nz::IpAddress google(8, 8, 8, 8); THEN("Google (DNS) is 8.8.8.8") { - REQUIRE(Nz::IpAddress::ResolveAddress(google) == "google-public-dns-a.google.com"); + CHECK(Nz::IpAddress::ResolveAddress(google) == "google-public-dns-a.google.com"); } } } diff --git a/tests/Engine/Network/SocketPoller.cpp b/tests/Engine/Network/SocketPoller.cpp index d44c5f65d..7081c1b30 100644 --- a/tests/Engine/Network/SocketPoller.cpp +++ b/tests/Engine/Network/SocketPoller.cpp @@ -37,7 +37,7 @@ SCENARIO("SocketPoller", "[NETWORK][SOCKETPOLLER]") { Nz::SocketState state = clientToServer.Connect(serverIP); - REQUIRE(state != Nz::SocketState_NotConnected); + CHECK(state != Nz::SocketState_NotConnected); AND_THEN("We wait on our selector, it should return true") { @@ -65,15 +65,15 @@ SCENARIO("SocketPoller", "[NETWORK][SOCKETPOLLER]") REQUIRE(serverPoller.Wait(1000)); - REQUIRE(serverPoller.IsReady(serverToClient)); + CHECK(serverPoller.IsReady(serverToClient)); - REQUIRE(serverToClient.Read(buffer.data(), buffer.size()) == sent); + CHECK(serverToClient.Read(buffer.data(), buffer.size()) == sent); AND_THEN("Our selector should report no socket ready") { - REQUIRE(!serverPoller.Wait(100)); + REQUIRE_FALSE(serverPoller.Wait(100)); - REQUIRE(!serverPoller.IsReady(serverToClient)); + REQUIRE_FALSE(serverPoller.IsReady(serverToClient)); } } } diff --git a/tests/Engine/Network/TCP.cpp b/tests/Engine/Network/TCP.cpp index 7d24fc835..2c34e0b0b 100644 --- a/tests/Engine/Network/TCP.cpp +++ b/tests/Engine/Network/TCP.cpp @@ -27,7 +27,7 @@ SCENARIO("TCP", "[NETWORK][TCP]") REQUIRE(client.Connect(serverIP) == Nz::SocketState_Connecting); Nz::IpAddress clientIP = client.GetRemoteAddress(); - REQUIRE(clientIP.IsValid()); + CHECK(clientIP.IsValid()); Nz::Thread::Sleep(100); @@ -45,9 +45,11 @@ SCENARIO("TCP", "[NETWORK][TCP]") { Nz::NetPacket resultPacket; REQUIRE(serverToClient.ReceivePacket(&resultPacket)); + Nz::Vector3f result; resultPacket >> result; - REQUIRE(result == vector123); + + CHECK(result == vector123); } } } diff --git a/tests/Engine/Utility/EventHandler.cpp b/tests/Engine/Utility/EventHandler.cpp new file mode 100644 index 000000000..dedf3fc31 --- /dev/null +++ b/tests/Engine/Utility/EventHandler.cpp @@ -0,0 +1,82 @@ +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "EventHandler/StateContext.hpp" +#include "EventHandler/StateFactory.hpp" + +#include + +Ndk::EntityHandle AddCamera(Ndk::World& world, Nz::RenderWindow& window); + +/*! + Known issues on Linux: + + - There is no real double click event in X11 + - Should always the key be repeated in key pressed mode ? + - No smooth wheel, only 1.f or -1.f + - Modify dimension of window updates position (which is not wrong) + - Text entered is never repeated +*/ + +SCENARIO("EventHandler", "[UTILITY][EVENTHANDLER][INTERACTIVE][.]") +{ + GIVEN("An application") + { + Ndk::Application& app = *Ndk::Application::Instance(); + auto& window = app.AddWindow(); + if (!window.Create(Nz::VideoMode(1024, 768, 32), "EventHandler")) + { + NazaraError("Failed to create window. See NazaraLog.log for further informations"); + REQUIRE(false); + } + window.EnableVerticalSync(true); + + auto& world = app.AddWorld(); + + auto camera = AddCamera(world, window); + + StateContext context(window, world); + + StateFactory::Initialize(context); + Ndk::StateMachine fsm(StateFactory::Get(EventStatus::Menu)); + + Nz::Clock elapsedTimeClock; + while (app.Run()) + { + window.Display(); + float elapsedTime = elapsedTimeClock.GetSeconds(); + elapsedTimeClock.Restart(); + + if (!fsm.Update(elapsedTime)) + { + NazaraError("Failed to update state machine."); + REQUIRE(false); + } + } + + StateFactory::Uninitialize(); + REQUIRE(true); + } +} + +Ndk::EntityHandle AddCamera(Ndk::World& world, Nz::RenderWindow& window) +{ + Ndk::EntityHandle view = world.CreateEntity(); + auto& node = view->AddComponent(); + node.SetPosition(Nz::Vector3f::Zero()); + auto& cam = view->AddComponent(); + cam.SetProjectionType(Nz::ProjectionType_Orthogonal); // 2D + cam.SetTarget(&window); + + world.GetSystem().SetGlobalUp(Nz::Vector3f::Down()); + world.GetSystem().SetDefaultBackground(Nz::ColorBackground::New(Nz::Color::Black)); + + return view; +} diff --git a/tests/Engine/Utility/EventHandler/EventState.cpp b/tests/Engine/Utility/EventHandler/EventState.cpp new file mode 100644 index 000000000..4f74e3000 --- /dev/null +++ b/tests/Engine/Utility/EventHandler/EventState.cpp @@ -0,0 +1,106 @@ +#include "EventState.hpp" + +#include "StateContext.hpp" +#include "StateFactory.hpp" + +#include +#include + +EventState::EventState(StateContext& context) : +State(), +m_context(context), +m_text(context), +m_count(0) +{ +} + +void EventState::Enter(Ndk::StateMachine& fsm) +{ + m_text.SetVisible(true); + DrawMenu(); + + Nz::EventHandler& eventHandler = m_context.window.GetEventHandler(); + m_keyPressedSlot.Connect(eventHandler.OnKeyPressed, [&] (const Nz::EventHandler*, const Nz::WindowEvent::KeyEvent& key) + { + if (key.code == Nz::Keyboard::Key::M && key.shift) + { + fsm.ChangeState(StateFactory::Get(EventStatus::Menu)); + } + }); + + m_eventSlot.Connect(eventHandler.OnEvent, [&] (const Nz::EventHandler*, const Nz::WindowEvent& event) + { + AddEvent(event); + ++m_count; + }); +} + +void EventState::Leave(Ndk::StateMachine& /*fsm*/) +{ + m_text.SetVisible(false); +} + +bool EventState::Update(Ndk::StateMachine& /*fsm*/, float /*elapsedTime*/) +{ + return true; +} + +void EventState::AddEvent(const Nz::WindowEvent& event) +{ + if (m_events.size() > 9) + m_events.pop_front(); + + m_events.push_back(Nz::String::Number(m_count) + " - " + ToString(event)); + + Nz::String content; + for (auto&& event : m_events) + { + content += event + "\n"; + } + content += "\nM for Menu"; + m_text.SetContent(content, 36); +} + +void EventState::DrawMenu() +{ + m_text.SetContent("Do whathever you want, this text should change !\nM for Menu"); +} + +Nz::String EventState::ToString(const Nz::WindowEvent& event) const +{ + switch (event.type) + { + case Nz::WindowEventType_GainedFocus: + return "WindowEventType_GainedFocus"; + case Nz::WindowEventType_LostFocus: + return "WindowEventType_LostFocus"; + case Nz::WindowEventType_KeyPressed: + return "WindowEventType_KeyPressed"; + case Nz::WindowEventType_KeyReleased: + return "WindowEventType_KeyReleased"; + case Nz::WindowEventType_MouseButtonDoubleClicked: + return "WindowEventType_MouseButtonDoubleClicked"; + case Nz::WindowEventType_MouseButtonPressed: + return "WindowEventType_MouseButtonPressed"; + case Nz::WindowEventType_MouseButtonReleased: + return "WindowEventType_MouseButtonReleased"; + case Nz::WindowEventType_MouseEntered: + return "WindowEventType_MouseEntered"; + case Nz::WindowEventType_MouseLeft: + return "WindowEventType_MouseLeft"; + case Nz::WindowEventType_MouseMoved: + return "WindowEventType_MouseMoved"; + case Nz::WindowEventType_MouseWheelMoved: + return "WindowEventType_MouseWheelMoved"; + case Nz::WindowEventType_Moved: + return "WindowEventType_Moved"; + case Nz::WindowEventType_Quit: + return "WindowEventType_Quit"; + case Nz::WindowEventType_Resized: + return "WindowEventType_Resized"; + case Nz::WindowEventType_TextEntered: + return "WindowEventType_TextEntered"; + default: + return "Not handled"; + } +} \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/EventState.hpp b/tests/Engine/Utility/EventHandler/EventState.hpp new file mode 100644 index 000000000..7b1cc63d7 --- /dev/null +++ b/tests/Engine/Utility/EventHandler/EventState.hpp @@ -0,0 +1,36 @@ +#ifndef __EVENTSTATE_HPP__ +#define __EVENTSTATE_HPP__ + +#include "Text.hpp" + +#include + +#include + +#include + +class StateContext; + +class EventState : public Ndk::State +{ + public: + EventState(StateContext& stateContext); + + void Enter(Ndk::StateMachine& fsm) override; + void Leave(Ndk::StateMachine& fsm) override; + bool Update(Ndk::StateMachine& fsm, float elapsedTime) override; + + private: + void AddEvent(const Nz::WindowEvent& event); + void DrawMenu(); + Nz::String ToString(const Nz::WindowEvent& event) const; + + StateContext& m_context; + Text m_text; + std::deque m_events; + int m_count; + NazaraSlot(Nz::EventHandler, OnEvent, m_eventSlot); + NazaraSlot(Nz::EventHandler, OnKeyPressed, m_keyPressedSlot); +}; + +#endif // __EVENTSTATE_HPP__ \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/FocusState.cpp b/tests/Engine/Utility/EventHandler/FocusState.cpp new file mode 100644 index 000000000..bc9c77ab5 --- /dev/null +++ b/tests/Engine/Utility/EventHandler/FocusState.cpp @@ -0,0 +1,54 @@ +#include "FocusState.hpp" + +#include "StateContext.hpp" +#include "StateFactory.hpp" + +#include +#include + +FocusState::FocusState(StateContext& context) : +State(), +m_context(context), +m_text(context) +{ +} + +void FocusState::Enter(Ndk::StateMachine& fsm) +{ + m_text.SetVisible(true); + DrawMenu(); + + Nz::EventHandler& eventHandler = m_context.window.GetEventHandler(); + m_keyPressedSlot.Connect(eventHandler.OnKeyPressed, [&] (const Nz::EventHandler*, const Nz::WindowEvent::KeyEvent& key) + { + if (key.code == Nz::Keyboard::Key::M && key.shift) + { + fsm.ChangeState(StateFactory::Get(EventStatus::Menu)); + } + }); + + m_gainedFocusSlot.Connect(eventHandler.OnGainedFocus, [&] (const Nz::EventHandler*) + { + m_text.SetContent("GAINED\nM for Menu"); + }); + + m_lostFocusSlot.Connect(eventHandler.OnLostFocus, [&] (const Nz::EventHandler*) + { + m_text.SetContent("LOST\nM for Menu"); + }); +} + +void FocusState::Leave(Ndk::StateMachine& /*fsm*/) +{ + m_text.SetVisible(false); +} + +bool FocusState::Update(Ndk::StateMachine& /*fsm*/, float /*elapsedTime*/) +{ + return true; +} + +void FocusState::DrawMenu() +{ + m_text.SetContent("Click outside the windows, this text should change !\nM for Menu"); +} \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/FocusState.hpp b/tests/Engine/Utility/EventHandler/FocusState.hpp new file mode 100644 index 000000000..9287722ab --- /dev/null +++ b/tests/Engine/Utility/EventHandler/FocusState.hpp @@ -0,0 +1,31 @@ +#ifndef __FOCUSSTATE_HPP__ +#define __FOCUSSTATE_HPP__ + +#include "Text.hpp" + +#include + +#include + +class StateContext; + +class FocusState : public Ndk::State +{ + public: + FocusState(StateContext& stateContext); + + void Enter(Ndk::StateMachine& fsm) override; + void Leave(Ndk::StateMachine& fsm) override; + bool Update(Ndk::StateMachine& fsm, float elapsedTime) override; + + private: + void DrawMenu(); + + StateContext& m_context; + Text m_text; + NazaraSlot(Nz::EventHandler, OnGainedFocus, m_gainedFocusSlot); + NazaraSlot(Nz::EventHandler, OnLostFocus, m_lostFocusSlot); + NazaraSlot(Nz::EventHandler, OnKeyPressed, m_keyPressedSlot); +}; + +#endif // __FOCUSSTATE_HPP__ \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/KeyState.cpp b/tests/Engine/Utility/EventHandler/KeyState.cpp new file mode 100644 index 000000000..043dc5837 --- /dev/null +++ b/tests/Engine/Utility/EventHandler/KeyState.cpp @@ -0,0 +1,90 @@ +#include "KeyState.hpp" + +#include "StateContext.hpp" +#include "StateFactory.hpp" + +#include +#include + +KeyState::KeyState(StateContext& context) : +State(), +m_context(context), +m_text(context), +m_keyStatus(KeyStatus::Pressed) +{ +} + +void KeyState::Enter(Ndk::StateMachine& fsm) +{ + m_text.SetVisible(true); + DrawMenu(); + + Nz::EventHandler& eventHandler = m_context.window.GetEventHandler(); + m_keyPressedSlot.Connect(eventHandler.OnKeyPressed, [&] (const Nz::EventHandler*, const Nz::WindowEvent::KeyEvent& key) + { + ManageInput(KeyStatus::Pressed, key, fsm); + }); + + m_keyReleasedSlot.Connect(eventHandler.OnKeyReleased, [&] (const Nz::EventHandler*, const Nz::WindowEvent::KeyEvent& key) + { + ManageInput(KeyStatus::Released, key, fsm); + }); +} + +void KeyState::Leave(Ndk::StateMachine& /*fsm*/) +{ + m_text.SetVisible(false); +} + +bool KeyState::Update(Ndk::StateMachine& /*fsm*/, float /*elapsedTime*/) +{ + return true; +} + +void KeyState::DrawMenu() +{ + m_text.SetContent("Clic on a key, this text should change !\nN for alternating event\nM for Menu"); +} + +void KeyState::ManageInput(KeyStatus isKeyPressed, const Nz::WindowEvent::KeyEvent& key, Ndk::StateMachine& fsm) +{ + if (key.code == Nz::Keyboard::Key::M && key.shift) + fsm.ChangeState(StateFactory::Get(EventStatus::Menu)); + else if (key.code == Nz::Keyboard::Key::N && key.shift) + { + if (m_keyStatus == KeyStatus::Pressed) + m_keyStatus = KeyStatus::Released; + else + m_keyStatus = KeyStatus::Pressed; + } + else + { + Nz::String content; + if (m_keyStatus == KeyStatus::Pressed) + content = "Pressed: "; + else + content = "Released: "; + + Nz::String keyName = Nz::Keyboard::GetKeyName(key.code); + if (keyName.IsEmpty()) + { + m_text.SetContent("Unknown\nM for Menu"); + } + else + { + content += keyName; + if (key.alt) + content += " alt"; + if (key.control) + content += " control"; + if (key.repeated) + content += " repeated"; + if (key.shift) + content += " shift"; + if (key.system) + content += " system"; + + m_text.SetContent(content + "\nM for Menu"); + } + } +} \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/KeyState.hpp b/tests/Engine/Utility/EventHandler/KeyState.hpp new file mode 100644 index 000000000..9b0fb1fcd --- /dev/null +++ b/tests/Engine/Utility/EventHandler/KeyState.hpp @@ -0,0 +1,38 @@ +#ifndef __KEYSTATE_HPP__ +#define __KEYSTATE_HPP__ + +#include "Text.hpp" + +#include + +#include + +class StateContext; + +enum class KeyStatus +{ + Pressed, + Released +}; + +class KeyState : public Ndk::State +{ + public: + KeyState(StateContext& stateContext); + + void Enter(Ndk::StateMachine& fsm) override; + void Leave(Ndk::StateMachine& fsm) override; + bool Update(Ndk::StateMachine& fsm, float elapsedTime) override; + + private: + void DrawMenu(); + void ManageInput(KeyStatus isKeyPressed, const Nz::WindowEvent::KeyEvent& key, Ndk::StateMachine& fsm); + + StateContext& m_context; + Text m_text; + KeyStatus m_keyStatus; + NazaraSlot(Nz::EventHandler, OnKeyPressed, m_keyPressedSlot); + NazaraSlot(Nz::EventHandler, OnKeyReleased, m_keyReleasedSlot); +}; + +#endif // __KEYSTATE_HPP__ \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/MenuState.cpp b/tests/Engine/Utility/EventHandler/MenuState.cpp new file mode 100644 index 000000000..b659f51b2 --- /dev/null +++ b/tests/Engine/Utility/EventHandler/MenuState.cpp @@ -0,0 +1,50 @@ +#include "MenuState.hpp" + +#include "StateContext.hpp" +#include "StateFactory.hpp" + +#include +#include + +MenuState::MenuState(StateContext& context) : +State(), +m_context(context), +m_text(context), +m_selectedNextState(-1) +{ +} + +void MenuState::Enter(Ndk::StateMachine& /*fsm*/) +{ + m_text.SetVisible(true); + DrawMenu(); + + Nz::EventHandler& eventHandler = m_context.window.GetEventHandler(); + m_keyPressedSlot.Connect(eventHandler.OnKeyPressed, [this] (const Nz::EventHandler*, const Nz::WindowEvent::KeyEvent& key) + { + if (key.code >= Nz::Keyboard::Key::A && key.code < (Nz::Keyboard::Key::A + static_cast(EventStatus::Max) - 1)) + { + m_selectedNextState = key.code - static_cast(Nz::Keyboard::Key::A); + } + }); +} + +void MenuState::Leave(Ndk::StateMachine& /*fsm*/) +{ + m_text.SetVisible(false); + m_selectedNextState = -1; +} + +bool MenuState::Update(Ndk::StateMachine& fsm, float /*elapsedTime*/) +{ + if (m_selectedNextState != -1) { + fsm.ChangeState(StateFactory::Get(m_selectedNextState + 1)); + } + + return true; +} + +void MenuState::DrawMenu() +{ + m_text.SetContent("a. Event\nb. Focus\nc. Key\nd. Mouse click\ne. Mouse enter\nf. Mouse move\ng. Text enter\nh. Window modification"); +} \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/MenuState.hpp b/tests/Engine/Utility/EventHandler/MenuState.hpp new file mode 100644 index 000000000..356a12a72 --- /dev/null +++ b/tests/Engine/Utility/EventHandler/MenuState.hpp @@ -0,0 +1,30 @@ +#ifndef __MENUSTATE_HPP__ +#define __MENUSTATE_HPP__ + +#include "Text.hpp" + +#include + +#include + +class StateContext; + +class MenuState : public Ndk::State +{ + public: + MenuState(StateContext& stateContext); + + void Enter(Ndk::StateMachine& fsm) override; + void Leave(Ndk::StateMachine& fsm) override; + bool Update(Ndk::StateMachine& fsm, float elapsedTime) override; + + private: + void DrawMenu(); + + StateContext& m_context; + Text m_text; + NazaraSlot(Nz::EventHandler, OnKeyPressed, m_keyPressedSlot); + int m_selectedNextState; +}; + +#endif // __MENUSTATE_HPP__ diff --git a/tests/Engine/Utility/EventHandler/MouseClickState.cpp b/tests/Engine/Utility/EventHandler/MouseClickState.cpp new file mode 100644 index 000000000..1de923bd4 --- /dev/null +++ b/tests/Engine/Utility/EventHandler/MouseClickState.cpp @@ -0,0 +1,94 @@ +#include "MouseClickState.hpp" + +#include "StateContext.hpp" +#include "StateFactory.hpp" + +#include +#include + +MouseClickState::MouseClickState(StateContext& context) : +State(), +m_context(context), +m_text(context) +{ +} + +void MouseClickState::Enter(Ndk::StateMachine& fsm) +{ + m_text.SetVisible(true); + DrawMenu(); + + Nz::EventHandler& eventHandler = m_context.window.GetEventHandler(); + m_keyPressedSlot.Connect(eventHandler.OnKeyPressed, [&] (const Nz::EventHandler*, const Nz::WindowEvent::KeyEvent& key) + { + if (key.code == Nz::Keyboard::Key::M && key.shift) + { + fsm.ChangeState(StateFactory::Get(EventStatus::Menu)); + } + }); + + m_mouseButtonDoubleClickedSlot.Connect(eventHandler.OnMouseButtonDoubleClicked, [&] (const Nz::EventHandler*, const Nz::WindowEvent::MouseButtonEvent& mouse) + { + ManageInput(MouseStatus::DoubleClick, mouse, fsm); + }); + + m_mouseButtonPressedSlot.Connect(eventHandler.OnMouseButtonPressed, [&] (const Nz::EventHandler*, const Nz::WindowEvent::MouseButtonEvent& mouse) + { + ManageInput(MouseStatus::Pressed, mouse, fsm); + }); + + m_mouseButtonReleasedSlot.Connect(eventHandler.OnMouseButtonReleased, [&] (const Nz::EventHandler*, const Nz::WindowEvent::MouseButtonEvent& mouse) + { + ManageInput(MouseStatus::Released, mouse, fsm); + }); +} + +void MouseClickState::Leave(Ndk::StateMachine& /*fsm*/) +{ + m_text.SetVisible(false); +} + +bool MouseClickState::Update(Ndk::StateMachine& /*fsm*/, float /*elapsedTime*/) +{ + return true; +} + +void MouseClickState::DrawMenu() +{ + m_text.SetContent("Click in the windows, this text should change !\nM for Menu"); +} + +void MouseClickState::ManageInput(MouseStatus mouseStatus, const Nz::WindowEvent::MouseButtonEvent& mouse, Ndk::StateMachine& fsm) +{ + Nz::String content; + if (mouseStatus == MouseStatus::Pressed) + content = "Pressed: "; + else if (mouseStatus == MouseStatus::Released) + content = "Released: "; + else + content = "Double clicked: "; + + switch (mouse.button) + { + case Nz::Mouse::Left: + content += "Left"; + break; + case Nz::Mouse::Middle: + content += "Middle"; + break; + case Nz::Mouse::Right: + content += "Right"; + break; + case Nz::Mouse::XButton1: + content += "XButton1"; + break; + case Nz::Mouse::XButton2: + content += "XButton2"; + break; + default: + content += "Unknown"; + break; + } + + m_text.SetContent(content + "\nM for Menu"); +} \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/MouseClickState.hpp b/tests/Engine/Utility/EventHandler/MouseClickState.hpp new file mode 100644 index 000000000..28c4203a9 --- /dev/null +++ b/tests/Engine/Utility/EventHandler/MouseClickState.hpp @@ -0,0 +1,40 @@ +#ifndef __MOUSECLICKSTATE_HPP__ +#define __MOUSECLICKSTATE_HPP__ + +#include "Text.hpp" + +#include + +#include + +class StateContext; + +enum class MouseStatus +{ + DoubleClick, + Pressed, + Released +}; + +class MouseClickState : public Ndk::State +{ + public: + MouseClickState(StateContext& stateContext); + + void Enter(Ndk::StateMachine& fsm) override; + void Leave(Ndk::StateMachine& fsm) override; + bool Update(Ndk::StateMachine& fsm, float elapsedTime) override; + + private: + void DrawMenu(); + void ManageInput(MouseStatus mouseStatus, const Nz::WindowEvent::MouseButtonEvent& mouse, Ndk::StateMachine& fsm); + + StateContext& m_context; + Text m_text; + NazaraSlot(Nz::EventHandler, OnKeyPressed, m_keyPressedSlot); + NazaraSlot(Nz::EventHandler, OnMouseButtonDoubleClicked, m_mouseButtonDoubleClickedSlot); + NazaraSlot(Nz::EventHandler, OnMouseButtonPressed, m_mouseButtonPressedSlot); + NazaraSlot(Nz::EventHandler, OnMouseButtonReleased, m_mouseButtonReleasedSlot); +}; + +#endif // __MOUSECLICKSTATE_HPP__ \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/MouseEnterState.cpp b/tests/Engine/Utility/EventHandler/MouseEnterState.cpp new file mode 100644 index 000000000..2a13f1c1e --- /dev/null +++ b/tests/Engine/Utility/EventHandler/MouseEnterState.cpp @@ -0,0 +1,54 @@ +#include "MouseEnterState.hpp" + +#include "StateContext.hpp" +#include "StateFactory.hpp" + +#include +#include + +MouseEnterState::MouseEnterState(StateContext& context) : +State(), +m_context(context), +m_text(context) +{ +} + +void MouseEnterState::Enter(Ndk::StateMachine& fsm) +{ + m_text.SetVisible(true); + DrawMenu(); + + Nz::EventHandler& eventHandler = m_context.window.GetEventHandler(); + m_keyPressedSlot.Connect(eventHandler.OnKeyPressed, [&] (const Nz::EventHandler*, const Nz::WindowEvent::KeyEvent& key) + { + if (key.code == Nz::Keyboard::Key::M && key.shift) + { + fsm.ChangeState(StateFactory::Get(EventStatus::Menu)); + } + }); + + m_mouseEnteredSlot.Connect(eventHandler.OnMouseEntered, [&] (const Nz::EventHandler*) + { + m_text.SetContent("Entered\nM for Menu"); + }); + + m_mouseLeftSlot.Connect(eventHandler.OnMouseLeft, [&] (const Nz::EventHandler*) + { + m_text.SetContent("Left\nM for Menu"); + }); +} + +void MouseEnterState::Leave(Ndk::StateMachine& /*fsm*/) +{ + m_text.SetVisible(false); +} + +bool MouseEnterState::Update(Ndk::StateMachine& /*fsm*/, float /*elapsedTime*/) +{ + return true; +} + +void MouseEnterState::DrawMenu() +{ + m_text.SetContent("Move your mouse outside the windows, this text should change !\nM for Menu"); +} \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/MouseEnterState.hpp b/tests/Engine/Utility/EventHandler/MouseEnterState.hpp new file mode 100644 index 000000000..b5c7a72be --- /dev/null +++ b/tests/Engine/Utility/EventHandler/MouseEnterState.hpp @@ -0,0 +1,31 @@ +#ifndef __MOUSEENTERSTATE_HPP__ +#define __MOUSEENTERSTATE_HPP__ + +#include "Text.hpp" + +#include + +#include + +class StateContext; + +class MouseEnterState : public Ndk::State +{ + public: + MouseEnterState(StateContext& stateContext); + + void Enter(Ndk::StateMachine& fsm) override; + void Leave(Ndk::StateMachine& fsm) override; + bool Update(Ndk::StateMachine& fsm, float elapsedTime) override; + + private: + void DrawMenu(); + + StateContext& m_context; + Text m_text; + NazaraSlot(Nz::EventHandler, OnKeyPressed, m_keyPressedSlot); + NazaraSlot(Nz::EventHandler, OnMouseEntered, m_mouseEnteredSlot); + NazaraSlot(Nz::EventHandler, OnMouseLeft, m_mouseLeftSlot); +}; + +#endif // __MOUSEENTERSTATE_HPP__ \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/MouseMoveState.cpp b/tests/Engine/Utility/EventHandler/MouseMoveState.cpp new file mode 100644 index 000000000..6a2cbd947 --- /dev/null +++ b/tests/Engine/Utility/EventHandler/MouseMoveState.cpp @@ -0,0 +1,54 @@ +#include "MouseMoveState.hpp" + +#include "StateContext.hpp" +#include "StateFactory.hpp" + +#include +#include + +MouseMoveState::MouseMoveState(StateContext& context) : +State(), +m_context(context), +m_text(context) +{ +} + +void MouseMoveState::Enter(Ndk::StateMachine& fsm) +{ + m_text.SetVisible(true); + DrawMenu(); + + Nz::EventHandler& eventHandler = m_context.window.GetEventHandler(); + m_keyPressedSlot.Connect(eventHandler.OnKeyPressed, [&] (const Nz::EventHandler*, const Nz::WindowEvent::KeyEvent& key) + { + if (key.code == Nz::Keyboard::Key::M && key.shift) + { + fsm.ChangeState(StateFactory::Get(EventStatus::Menu)); + } + }); + + m_mouseMovedSlot.Connect(eventHandler.OnMouseMoved, [&] (const Nz::EventHandler*, const Nz::WindowEvent::MouseMoveEvent& event) + { + m_text.SetContent("Position(" + Nz::String::Number(event.x) + ", " + Nz::String::Number(event.y) + ") delta: (" + Nz::String::Number(event.deltaX) + ", " + Nz::String::Number(event.deltaY) + ") \nM for Menu"); + }); + + m_mouseWheelMovedSlot.Connect(eventHandler.OnMouseWheelMoved, [&] (const Nz::EventHandler*, const Nz::WindowEvent::MouseWheelEvent& event) + { + m_text.SetContent("Wheel delta: " + Nz::String::Number(event.delta) + "\nM for Menu"); + }); +} + +void MouseMoveState::Leave(Ndk::StateMachine& /*fsm*/) +{ + m_text.SetVisible(false); +} + +bool MouseMoveState::Update(Ndk::StateMachine& /*fsm*/, float /*elapsedTime*/) +{ + return true; +} + +void MouseMoveState::DrawMenu() +{ + m_text.SetContent("Move your mouse or your wheel, this text should change !\nM for Menu"); +} \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/MouseMoveState.hpp b/tests/Engine/Utility/EventHandler/MouseMoveState.hpp new file mode 100644 index 000000000..f94dc0998 --- /dev/null +++ b/tests/Engine/Utility/EventHandler/MouseMoveState.hpp @@ -0,0 +1,31 @@ +#ifndef __MOUSEMOVESTATE_HPP__ +#define __MOUSEMOVESTATE_HPP__ + +#include "Text.hpp" + +#include + +#include + +class StateContext; + +class MouseMoveState : public Ndk::State +{ + public: + MouseMoveState(StateContext& stateContext); + + void Enter(Ndk::StateMachine& fsm) override; + void Leave(Ndk::StateMachine& fsm) override; + bool Update(Ndk::StateMachine& fsm, float elapsedTime) override; + + private: + void DrawMenu(); + + StateContext& m_context; + Text m_text; + NazaraSlot(Nz::EventHandler, OnKeyPressed, m_keyPressedSlot); + NazaraSlot(Nz::EventHandler, OnMouseMoved, m_mouseMovedSlot); + NazaraSlot(Nz::EventHandler, OnMouseWheelMoved, m_mouseWheelMovedSlot); +}; + +#endif // __MOUSEMOVESTATE_HPP__ \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/StateContext.cpp b/tests/Engine/Utility/EventHandler/StateContext.cpp new file mode 100644 index 000000000..69739a616 --- /dev/null +++ b/tests/Engine/Utility/EventHandler/StateContext.cpp @@ -0,0 +1,7 @@ +#include "StateContext.hpp" + +StateContext::StateContext(Nz::RenderWindow& windowContext, Ndk::World& worldContext) : +window(windowContext), +world(worldContext) +{ +} diff --git a/tests/Engine/Utility/EventHandler/StateContext.hpp b/tests/Engine/Utility/EventHandler/StateContext.hpp new file mode 100644 index 000000000..62614e073 --- /dev/null +++ b/tests/Engine/Utility/EventHandler/StateContext.hpp @@ -0,0 +1,23 @@ +#ifndef __STATECONTEXT_HPP__ +#define __STATECONTEXT_HPP__ + +namespace Ndk +{ + class World; +} + +namespace Nz +{ + class RenderWindow; +} + +class StateContext +{ + public: + StateContext(Nz::RenderWindow& window, Ndk::World& world); + + Nz::RenderWindow& window; + Ndk::World& world; +}; + +#endif // __STATECONTEXT_HPP__ diff --git a/tests/Engine/Utility/EventHandler/StateFactory.cpp b/tests/Engine/Utility/EventHandler/StateFactory.cpp new file mode 100644 index 000000000..8086dea6b --- /dev/null +++ b/tests/Engine/Utility/EventHandler/StateFactory.cpp @@ -0,0 +1,46 @@ +#include "StateFactory.hpp" + +#include "MenuState.hpp" +#include "EventState.hpp" +#include "FocusState.hpp" +#include "KeyState.hpp" +#include "MouseClickState.hpp" +#include "MouseEnterState.hpp" +#include "MouseMoveState.hpp" +#include "TextEnterState.hpp" +#include "WindowModificationState.hpp" + +std::shared_ptr StateFactory::Get(EventStatus state) +{ + return s_states[state]; +} + +std::shared_ptr StateFactory::Get(unsigned int state) +{ + NazaraAssert(state < s_states.size(), "State out of range"); + auto it = s_states.begin(); + std::advance(it, state); + return it->second; +} + +bool StateFactory::Initialize(StateContext& context) +{ + s_states.emplace(std::make_pair(EventStatus::Menu, std::make_shared(context))); + s_states.emplace(std::make_pair(EventStatus::Event, std::make_shared(context))); + s_states.emplace(std::make_pair(EventStatus::Focus, std::make_shared(context))); + s_states.emplace(std::make_pair(EventStatus::Key, std::make_shared(context))); + s_states.emplace(std::make_pair(EventStatus::MouseClick, std::make_shared(context))); + s_states.emplace(std::make_pair(EventStatus::MouseEnter, std::make_shared(context))); + s_states.emplace(std::make_pair(EventStatus::MouseMove, std::make_shared(context))); + s_states.emplace(std::make_pair(EventStatus::TextEnter, std::make_shared(context))); + s_states.emplace(std::make_pair(EventStatus::WindowModification, std::make_shared(context))); + + return true; +} + +void StateFactory::Uninitialize() +{ + s_states.clear(); +} + +std::map> StateFactory::s_states; \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/StateFactory.hpp b/tests/Engine/Utility/EventHandler/StateFactory.hpp new file mode 100644 index 000000000..a17965d9d --- /dev/null +++ b/tests/Engine/Utility/EventHandler/StateFactory.hpp @@ -0,0 +1,42 @@ +#ifndef __STATEFACTORY_HPP__ +#define __STATEFACTORY_HPP__ + +#include + +#include +#include + +class StateContext; + +enum class EventStatus +{ + Min = 0, + Menu, + Event, + Focus, + Key, + MouseClick, + MouseEnter, + MouseMove, + TextEnter, + WindowModification, + Max = WindowModification +}; + +class StateFactory +{ + public: + + static std::shared_ptr Get(EventStatus state); + static std::shared_ptr Get(unsigned int state); + + static bool Initialize(StateContext& stateContext); + + static void Uninitialize(); + + private: + + static std::map> s_states; +}; + +#endif // __STATEFACTORY_HPP__ diff --git a/tests/Engine/Utility/EventHandler/Text.cpp b/tests/Engine/Utility/EventHandler/Text.cpp new file mode 100644 index 000000000..75cece5b9 --- /dev/null +++ b/tests/Engine/Utility/EventHandler/Text.cpp @@ -0,0 +1,35 @@ +#include "Text.hpp" + +#include +#include +#include +#include +#include +#include + +Text::Text(StateContext& stateContext) : +m_context(stateContext) +{ + m_text = m_context.world.CreateEntity(); + Ndk::NodeComponent& nodeComponent = m_text->AddComponent(); + Ndk::GraphicsComponent& graphicsComponent = m_text->AddComponent(); + + m_textSprite = Nz::TextSprite::New(); + graphicsComponent.Attach(m_textSprite); +} + +Text::~Text() +{ + m_textSprite->Clear(); + m_text->Kill(); +} + +void Text::SetContent(const Nz::String& string, unsigned int size) +{ + m_textSprite->Update(Nz::SimpleTextDrawer::Draw(string, size)); +} + +void Text::SetVisible(bool shouldBeVisible) +{ + m_text->Enable(shouldBeVisible); +} \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/Text.hpp b/tests/Engine/Utility/EventHandler/Text.hpp new file mode 100644 index 000000000..a804b4baa --- /dev/null +++ b/tests/Engine/Utility/EventHandler/Text.hpp @@ -0,0 +1,23 @@ +#ifndef __TEXT_HPP__ +#define __TEXT_HPP__ + +#include +#include +#include "StateContext.hpp" + +class Text +{ + public: + Text(StateContext& context); + ~Text(); + + void SetContent(const Nz::String& string, unsigned int size = 36); + void SetVisible(bool shouldBeVisible = true); + + private: + StateContext& m_context; + Ndk::EntityHandle m_text; + Nz::TextSpriteRef m_textSprite; +}; + +#endif // __TEXT_HPP__ \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/TextEnterState.cpp b/tests/Engine/Utility/EventHandler/TextEnterState.cpp new file mode 100644 index 000000000..1a0516f29 --- /dev/null +++ b/tests/Engine/Utility/EventHandler/TextEnterState.cpp @@ -0,0 +1,52 @@ +#include "TextEnterState.hpp" + +#include "StateContext.hpp" +#include "StateFactory.hpp" + +#include +#include + +TextEnterState::TextEnterState(StateContext& context) : +State(), +m_context(context), +m_text(context) +{ +} + +void TextEnterState::Enter(Ndk::StateMachine& fsm) +{ + m_text.SetVisible(true); + DrawMenu(); + + Nz::EventHandler& eventHandler = m_context.window.GetEventHandler(); + m_keyPressedSlot.Connect(eventHandler.OnKeyPressed, [&] (const Nz::EventHandler*, const Nz::WindowEvent::KeyEvent& key) + { + if (key.code == Nz::Keyboard::Key::M && key.shift) + { + fsm.ChangeState(StateFactory::Get(EventStatus::Menu)); + } + }); + + m_textEnteredSlot.Connect(eventHandler.OnTextEntered, [&] (const Nz::EventHandler*, const Nz::WindowEvent::TextEvent& event) + { + Nz::String content = "Character: " + Nz::String::Unicode(event.character); + if (event.repeated) + content += " repeated"; + m_text.SetContent(content + "\nM for Menu"); + }); +} + +void TextEnterState::Leave(Ndk::StateMachine& /*fsm*/) +{ + m_text.SetVisible(false); +} + +bool TextEnterState::Update(Ndk::StateMachine& /*fsm*/, float /*elapsedTime*/) +{ + return true; +} + +void TextEnterState::DrawMenu() +{ + m_text.SetContent("Enter some text, this text should change !\nM for Menu"); +} \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/TextEnterState.hpp b/tests/Engine/Utility/EventHandler/TextEnterState.hpp new file mode 100644 index 000000000..c9137c51d --- /dev/null +++ b/tests/Engine/Utility/EventHandler/TextEnterState.hpp @@ -0,0 +1,30 @@ +#ifndef __TEXTENTERSTATE_HPP__ +#define __TEXTENTERSTATE_HPP__ + +#include "Text.hpp" + +#include + +#include + +class StateContext; + +class TextEnterState : public Ndk::State +{ + public: + TextEnterState(StateContext& stateContext); + + void Enter(Ndk::StateMachine& fsm) override; + void Leave(Ndk::StateMachine& fsm) override; + bool Update(Ndk::StateMachine& fsm, float elapsedTime) override; + + private: + void DrawMenu(); + + StateContext& m_context; + Text m_text; + NazaraSlot(Nz::EventHandler, OnKeyPressed, m_keyPressedSlot); + NazaraSlot(Nz::EventHandler, OnTextEntered, m_textEnteredSlot); +}; + +#endif // __TEXTENTERSTATE_HPP__ \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/WindowModificationState.cpp b/tests/Engine/Utility/EventHandler/WindowModificationState.cpp new file mode 100644 index 000000000..e50d94f51 --- /dev/null +++ b/tests/Engine/Utility/EventHandler/WindowModificationState.cpp @@ -0,0 +1,54 @@ +#include "WindowModificationState.hpp" + +#include "StateContext.hpp" +#include "StateFactory.hpp" + +#include +#include + +WindowModificationState::WindowModificationState(StateContext& context) : +State(), +m_context(context), +m_text(context) +{ +} + +void WindowModificationState::Enter(Ndk::StateMachine& fsm) +{ + m_text.SetVisible(true); + DrawMenu(); + + Nz::EventHandler& eventHandler = m_context.window.GetEventHandler(); + m_keyPressedSlot.Connect(eventHandler.OnKeyPressed, [&] (const Nz::EventHandler*, const Nz::WindowEvent::KeyEvent& key) + { + if (key.code == Nz::Keyboard::Key::M && key.shift) + { + fsm.ChangeState(StateFactory::Get(EventStatus::Menu)); + } + }); + + m_movedSlot.Connect(eventHandler.OnMoved, [&] (const Nz::EventHandler*, const Nz::WindowEvent::PositionEvent& event) + { + m_text.SetContent("Position(" + Nz::String::Number(event.x) + ", " + Nz::String::Number(event.y) + ")\nM for Menu"); + }); + + m_resizedSlot.Connect(eventHandler.OnResized, [&] (const Nz::EventHandler*, const Nz::WindowEvent::SizeEvent& event) + { + m_text.SetContent("Size(" + Nz::String::Number(event.width) + ", " + Nz::String::Number(event.height) + ")\nM for Menu"); + }); +} + +void WindowModificationState::Leave(Ndk::StateMachine& /*fsm*/) +{ + m_text.SetVisible(false); +} + +bool WindowModificationState::Update(Ndk::StateMachine& /*fsm*/, float /*elapsedTime*/) +{ + return true; +} + +void WindowModificationState::DrawMenu() +{ + m_text.SetContent("Move the window or resize it, this text should change !\nM for Menu"); +} \ No newline at end of file diff --git a/tests/Engine/Utility/EventHandler/WindowModificationState.hpp b/tests/Engine/Utility/EventHandler/WindowModificationState.hpp new file mode 100644 index 000000000..4fb84188d --- /dev/null +++ b/tests/Engine/Utility/EventHandler/WindowModificationState.hpp @@ -0,0 +1,31 @@ +#ifndef __WINDOWMODIFICATIONSTATE_HPP__ +#define __WINDOWMODIFICATIONSTATE_HPP__ + +#include "Text.hpp" + +#include + +#include + +class StateContext; + +class WindowModificationState : public Ndk::State +{ + public: + WindowModificationState(StateContext& stateContext); + + void Enter(Ndk::StateMachine& fsm) override; + void Leave(Ndk::StateMachine& fsm) override; + bool Update(Ndk::StateMachine& fsm, float elapsedTime) override; + + private: + void DrawMenu(); + + StateContext& m_context; + Text m_text; + NazaraSlot(Nz::EventHandler, OnKeyPressed, m_keyPressedSlot); + NazaraSlot(Nz::EventHandler, OnMoved, m_movedSlot); + NazaraSlot(Nz::EventHandler, OnResized, m_resizedSlot); +}; + +#endif // __WINDOWMODIFICATIONSTATE_HPP__ \ No newline at end of file diff --git a/tests/SDK/NDK/BaseSystem.cpp b/tests/SDK/NDK/BaseSystem.cpp index e4ca2e1c9..a202c1f70 100644 --- a/tests/SDK/NDK/BaseSystem.cpp +++ b/tests/SDK/NDK/BaseSystem.cpp @@ -20,7 +20,7 @@ namespace static Ndk::SystemIndex systemIndex; private: - void OnUpdate(float elapsedTime) override + void OnUpdate(float /*elapsedTime*/) override { } }; diff --git a/tests/SDK/NDK/Entity.cpp b/tests/SDK/NDK/Entity.cpp index d784e28ad..cf02370ec 100644 --- a/tests/SDK/NDK/Entity.cpp +++ b/tests/SDK/NDK/Entity.cpp @@ -38,7 +38,7 @@ namespace static Ndk::SystemIndex systemIndex; private: - void OnUpdate(float elapsedTime) override + void OnUpdate(float /*elapsedTime*/) override { for (const Ndk::EntityHandle& entity : GetEntities()) { diff --git a/tests/SDK/NDK/StateMachine.cpp b/tests/SDK/NDK/StateMachine.cpp index 44b0e0dfd..1c14b1e76 100644 --- a/tests/SDK/NDK/StateMachine.cpp +++ b/tests/SDK/NDK/StateMachine.cpp @@ -4,7 +4,7 @@ class TestState : public Ndk::State { public: - void Enter(Ndk::StateMachine& fsm) override + void Enter(Ndk::StateMachine& /*fsm*/) override { m_isUpdated = false; } @@ -14,11 +14,11 @@ class TestState : public Ndk::State return m_isUpdated; } - void Leave(Ndk::StateMachine& fsm) override + void Leave(Ndk::StateMachine& /*fsm*/) override { } - bool Update(Ndk::StateMachine& fsm, float elapsedTime) override + bool Update(Ndk::StateMachine& /*fsm*/, float /*elapsedTime*/) override { m_isUpdated = true; return true; diff --git a/tests/SDK/NDK/System.cpp b/tests/SDK/NDK/System.cpp index 623b4a96f..d965e37f3 100644 --- a/tests/SDK/NDK/System.cpp +++ b/tests/SDK/NDK/System.cpp @@ -23,7 +23,7 @@ namespace private: int m_value; - void OnUpdate(float elapsedTime) override + void OnUpdate(float /*elapsedTime*/) override { } }; diff --git a/tests/SDK/NDK/Systems/PhysicsSystem.cpp b/tests/SDK/NDK/Systems/PhysicsSystem3D.cpp similarity index 73% rename from tests/SDK/NDK/Systems/PhysicsSystem.cpp rename to tests/SDK/NDK/Systems/PhysicsSystem3D.cpp index 2aa3c313e..3cb0d6bdb 100644 --- a/tests/SDK/NDK/Systems/PhysicsSystem.cpp +++ b/tests/SDK/NDK/Systems/PhysicsSystem3D.cpp @@ -1,8 +1,8 @@ -#include +#include #include -#include +#include #include -#include +#include #include SCENARIO("PhysicsSystem", "[NDK][PHYSICSSYSTEM]") @@ -11,12 +11,12 @@ SCENARIO("PhysicsSystem", "[NDK][PHYSICSSYSTEM]") { Ndk::World world; const Ndk::EntityHandle& staticEntity = world.CreateEntity(); - Ndk::CollisionComponent& collisionComponentStatic = staticEntity->AddComponent(); + Ndk::CollisionComponent3D& collisionComponentStatic = staticEntity->AddComponent(); Ndk::NodeComponent& nodeComponentStatic = staticEntity->AddComponent(); const Ndk::EntityHandle& dynamicEntity = world.CreateEntity(); Ndk::NodeComponent& nodeComponentDynamic = dynamicEntity->AddComponent(); - Ndk::PhysicsComponent& physicsComponentDynamic = dynamicEntity->AddComponent(); + Ndk::PhysicsComponent3D& physicsComponentDynamic = dynamicEntity->AddComponent(); WHEN("We make collide these two entities") { diff --git a/tests/SDK/NDK/World.cpp b/tests/SDK/NDK/World.cpp index 431490490..85ee241b4 100644 --- a/tests/SDK/NDK/World.cpp +++ b/tests/SDK/NDK/World.cpp @@ -38,7 +38,7 @@ namespace static Ndk::SystemIndex systemIndex; private: - void OnUpdate(float elapsedTime) override + void OnUpdate(float /*elapsedTime*/) override { for (const Ndk::EntityHandle& entity : GetEntities()) {