From f5ade0f52d2bc27c461fc19d8cc4514fc9148eb9 Mon Sep 17 00:00:00 2001
From: Daniel Chappuis <chappuis.daniel@gmail.com>
Date: Fri, 8 Jul 2016 07:25:37 +0200
Subject: [PATCH] Fix virtual constructors, use c++11 scoped enums, use c++11
 delete methods instead of private constructors

---
 src/body/Body.h                               | 14 ++++-----
 src/body/CollisionBody.cpp                    |  2 +-
 src/body/CollisionBody.h                      | 16 +++++-----
 src/body/RigidBody.cpp                        | 18 +++++------
 src/body/RigidBody.h                          | 18 +++++------
 src/collision/CollisionDetection.cpp          | 14 +++++----
 src/collision/CollisionDetection.h            | 14 ++++-----
 src/collision/ContactManifold.h               | 12 ++++----
 src/collision/ProxyShape.h                    | 16 +++++-----
 src/collision/RaycastInfo.h                   | 14 ++++-----
 src/collision/TriangleVertexArray.h           |  4 +--
 .../broadphase/BroadPhaseAlgorithm.h          | 17 ++++++-----
 src/collision/broadphase/DynamicAABBTree.h    |  5 ++++
 .../narrowphase/ConcaveVsConvexAlgorithm.cpp  |  6 ++--
 .../narrowphase/ConcaveVsConvexAlgorithm.h    |  3 ++
 .../narrowphase/DefaultCollisionDispatch.cpp  |  2 +-
 src/collision/narrowphase/EPA/EPAAlgorithm.h  | 12 ++++----
 src/collision/narrowphase/EPA/TriangleEPA.h   | 14 ++++-----
 .../narrowphase/EPA/TrianglesStore.h          | 16 +++++-----
 src/collision/narrowphase/GJK/GJKAlgorithm.h  | 12 ++++----
 src/collision/narrowphase/GJK/Simplex.h       | 12 ++++----
 .../narrowphase/NarrowPhaseAlgorithm.h        | 16 +++++-----
 .../narrowphase/SphereVsSphereAlgorithm.h     | 14 ++++-----
 src/collision/shapes/BoxShape.cpp             |  2 +-
 src/collision/shapes/BoxShape.h               | 12 ++++----
 src/collision/shapes/CapsuleShape.cpp         |  2 +-
 src/collision/shapes/CapsuleShape.h           | 12 ++++----
 src/collision/shapes/CollisionShape.h         | 16 +++++-----
 src/collision/shapes/ConcaveMeshShape.cpp     | 20 ++++++-------
 src/collision/shapes/ConcaveMeshShape.h       | 14 ++++-----
 src/collision/shapes/ConcaveShape.cpp         |  2 +-
 src/collision/shapes/ConcaveShape.h           | 15 ++++++----
 src/collision/shapes/ConeShape.cpp            |  2 +-
 src/collision/shapes/ConeShape.h              | 12 ++++----
 src/collision/shapes/ConvexMeshShape.cpp      | 14 ++++-----
 src/collision/shapes/ConvexMeshShape.h        | 12 ++++----
 src/collision/shapes/ConvexShape.h            | 12 ++++----
 src/collision/shapes/CylinderShape.cpp        |  2 +-
 src/collision/shapes/CylinderShape.h          | 12 ++++----
 src/collision/shapes/HeightFieldShape.cpp     |  2 +-
 src/collision/shapes/HeightFieldShape.h       | 22 +++++++-------
 src/collision/shapes/SphereShape.cpp          |  2 +-
 src/collision/shapes/SphereShape.h            | 12 ++++----
 src/collision/shapes/TriangleShape.cpp        | 20 ++++++-------
 src/collision/shapes/TriangleShape.h          | 14 ++++-----
 src/configuration.h                           |  4 +--
 src/constraint/BallAndSocketJoint.cpp         |  8 ++---
 src/constraint/BallAndSocketJoint.h           | 14 ++++-----
 src/constraint/ContactPoint.h                 | 14 ++++-----
 src/constraint/FixedJoint.cpp                 | 14 ++++-----
 src/constraint/FixedJoint.h                   | 14 ++++-----
 src/constraint/HingeJoint.cpp                 | 18 +++++------
 src/constraint/HingeJoint.h                   | 18 +++++------
 src/constraint/Joint.h                        | 18 +++++------
 src/constraint/SliderJoint.cpp                | 18 +++++------
 src/constraint/SliderJoint.h                  | 18 +++++------
 src/engine/CollisionWorld.h                   | 12 ++++----
 src/engine/ContactSolver.cpp                  |  4 +--
 src/engine/DynamicsWorld.cpp                  | 16 +++++-----
 src/engine/DynamicsWorld.h                    | 16 +++++-----
 src/engine/EventListener.h                    |  2 +-
 src/engine/Impulse.h                          |  8 ++---
 src/engine/Island.h                           | 14 ++++-----
 src/engine/OverlappingPair.h                  | 14 ++++-----
 src/engine/Timer.h                            | 16 +++++-----
 test/tests/collision/TestRaycast.h            | 30 +++++++++----------
 testbed/common/ConcaveMesh.cpp                |  8 ++---
 testbed/common/ConvexMesh.cpp                 |  8 ++---
 testbed/common/HeightField.cpp                |  4 +--
 .../collisionshapes/CollisionShapesScene.cpp  |  2 +-
 .../scenes/concavemesh/ConcaveMeshScene.cpp   |  2 +-
 testbed/scenes/cubes/CubesScene.cpp           |  2 +-
 .../scenes/heightfield/HeightFieldScene.cpp   |  2 +-
 testbed/scenes/joints/JointsScene.cpp         |  6 ++--
 74 files changed, 412 insertions(+), 416 deletions(-)

diff --git a/src/body/Body.h b/src/body/Body.h
index 4d1f9bf4..c5f011fb 100644
--- a/src/body/Body.h
+++ b/src/body/Body.h
@@ -75,14 +75,6 @@ class Body {
         /// Pointer that can be used to attach user data to the body
         void* mUserData;
 
-        // -------------------- Methods -------------------- //
-
-        /// Private copy-constructor
-        Body(const Body& body);
-
-        /// Private assignment operator
-        Body& operator=(const Body& body);
-
     public :
 
         // -------------------- Methods -------------------- //
@@ -90,6 +82,12 @@ class Body {
         /// Constructor
         Body(bodyindex id);
 
+        /// Deleted copy-constructor
+        Body(const Body& body) = delete;
+
+        /// Deleted assignment operator
+        Body& operator=(const Body& body) = delete;
+
         /// Destructor
         virtual ~Body();
 
diff --git a/src/body/CollisionBody.cpp b/src/body/CollisionBody.cpp
index 83052131..daa4a71e 100644
--- a/src/body/CollisionBody.cpp
+++ b/src/body/CollisionBody.cpp
@@ -38,7 +38,7 @@ using namespace reactphysics3d;
  * @param id ID of the body
  */
 CollisionBody::CollisionBody(const Transform& transform, CollisionWorld& world, bodyindex id)
-              : Body(id), mType(DYNAMIC), mTransform(transform), mProxyCollisionShapes(nullptr),
+              : Body(id), mType(BodyType::DYNAMIC), mTransform(transform), mProxyCollisionShapes(nullptr),
                 mNbCollisionShapes(0), mContactManifoldsList(nullptr), mWorld(world) {
 
 }
diff --git a/src/body/CollisionBody.h b/src/body/CollisionBody.h
index 2c88d155..c5658b58 100644
--- a/src/body/CollisionBody.h
+++ b/src/body/CollisionBody.h
@@ -54,7 +54,7 @@ class CollisionWorld;
 /// DYNAMIC : A dynamic body has non-zero mass, non-zero velocity determined by forces and its
 ///           position is determined by the physics engine. A dynamic body can collide with other
 ///           dynamic, static or kinematic bodies.
-enum BodyType {STATIC, KINEMATIC, DYNAMIC};
+enum class BodyType {STATIC, KINEMATIC, DYNAMIC};
 
 // Class CollisionBody
 /**
@@ -87,12 +87,6 @@ class CollisionBody : public Body {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        CollisionBody(const CollisionBody& body);
-
-        /// Private assignment operator
-        CollisionBody& operator=(const CollisionBody& body);
-
         /// Reset the contact manifold lists
         void resetContactManifoldsList();
 
@@ -122,6 +116,12 @@ class CollisionBody : public Body {
         /// Destructor
         virtual ~CollisionBody();
 
+        /// Deleted copy-constructor
+        CollisionBody(const CollisionBody& body) = delete;
+
+        /// Deleted assignment operator
+        CollisionBody& operator=(const CollisionBody& body) = delete;
+
         /// Return the type of the body
         BodyType getType() const;
 
@@ -208,7 +208,7 @@ inline BodyType CollisionBody::getType() const {
 inline void CollisionBody::setType(BodyType type) {
     mType = type;
 
-    if (mType == STATIC) {
+    if (mType == BodyType::STATIC) {
 
         // Update the broad-phase state of the body
         updateBroadPhaseState();
diff --git a/src/body/RigidBody.cpp b/src/body/RigidBody.cpp
index ff7fc8dd..a34df2bd 100644
--- a/src/body/RigidBody.cpp
+++ b/src/body/RigidBody.cpp
@@ -76,7 +76,7 @@ void RigidBody::setType(BodyType type) {
     recomputeMassInformation();
 
     // If it is a static body
-    if (mType == STATIC) {
+    if (mType == BodyType::STATIC) {
 
         // Reset the velocity to zero
         mLinearVelocity.setToZero();
@@ -84,7 +84,7 @@ void RigidBody::setType(BodyType type) {
     }
 
     // If it is a static or a kinematic body
-    if (mType == STATIC || mType == KINEMATIC) {
+    if (mType == BodyType::STATIC || mType == BodyType::KINEMATIC) {
 
         // Reset the inverse mass and inverse inertia tensor to zero
         mMassInverse = decimal(0.0);
@@ -119,7 +119,7 @@ void RigidBody::setType(BodyType type) {
  */
 void RigidBody::setInertiaTensorLocal(const Matrix3x3& inertiaTensorLocal) {
 
-    if (mType != DYNAMIC) return;
+    if (mType != BodyType::DYNAMIC) return;
 
     mInertiaTensorLocal = inertiaTensorLocal;
 
@@ -134,7 +134,7 @@ void RigidBody::setInertiaTensorLocal(const Matrix3x3& inertiaTensorLocal) {
  */
 void RigidBody::setCenterOfMassLocal(const Vector3& centerOfMassLocal) {
 
-    if (mType != DYNAMIC) return;
+    if (mType != BodyType::DYNAMIC) return;
 
     const Vector3 oldCenterOfMass = mCenterOfMassWorld;
     mCenterOfMassLocal = centerOfMassLocal;
@@ -152,7 +152,7 @@ void RigidBody::setCenterOfMassLocal(const Vector3& centerOfMassLocal) {
  */
 void RigidBody::setMass(decimal mass) {
 
-    if (mType != DYNAMIC) return;
+    if (mType != BodyType::DYNAMIC) return;
 
     mInitMass = mass;
 
@@ -267,7 +267,7 @@ void RigidBody::removeCollisionShape(const ProxyShape* proxyShape) {
 void RigidBody::setLinearVelocity(const Vector3& linearVelocity) {
 
     // If it is a static body, we do nothing
-    if (mType == STATIC) return;
+    if (mType == BodyType::STATIC) return;
 
     // Update the linear velocity of the current body state
     mLinearVelocity = linearVelocity;
@@ -285,7 +285,7 @@ void RigidBody::setLinearVelocity(const Vector3& linearVelocity) {
 void RigidBody::setAngularVelocity(const Vector3& angularVelocity) {
 
     // If it is a static body, we do nothing
-    if (mType == STATIC) return;
+    if (mType == BodyType::STATIC) return;
 
     // Set the angular velocity
     mAngularVelocity = angularVelocity;
@@ -329,12 +329,12 @@ void RigidBody::recomputeMassInformation() {
     mCenterOfMassLocal.setToZero();
 
     // If it is STATIC or KINEMATIC body
-    if (mType == STATIC || mType == KINEMATIC) {
+    if (mType == BodyType::STATIC || mType == BodyType::KINEMATIC) {
         mCenterOfMassWorld = mTransform.getPosition();
         return;
     }
 
-    assert(mType == DYNAMIC);
+    assert(mType == BodyType::DYNAMIC);
 
     // Compute the total mass of the body
     for (ProxyShape* shape = mProxyCollisionShapes; shape != nullptr; shape = shape->mNext) {
diff --git a/src/body/RigidBody.h b/src/body/RigidBody.h
index fd1c18b7..b3c96c52 100644
--- a/src/body/RigidBody.h
+++ b/src/body/RigidBody.h
@@ -103,12 +103,6 @@ class RigidBody : public CollisionBody {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        RigidBody(const RigidBody& body);
-
-        /// Private assignment operator
-        RigidBody& operator=(const RigidBody& body);
-
         /// Remove a joint from the joints list
         void removeJointFromJointsList(MemoryAllocator& memoryAllocator, const Joint* joint);
 
@@ -128,6 +122,12 @@ class RigidBody : public CollisionBody {
         /// Destructor
         virtual ~RigidBody();
 
+        /// Deleted copy-constructor
+        RigidBody(const RigidBody& body) = delete;
+
+        /// Deleted assignment operator
+        RigidBody& operator=(const RigidBody& body) = delete;
+
         /// Set the type of the body (static, kinematic or dynamic)
         void setType(BodyType type);
 
@@ -407,7 +407,7 @@ inline void RigidBody::setIsSleeping(bool isSleeping) {
 inline void RigidBody::applyForceToCenterOfMass(const Vector3& force) {
 
     // If it is not a dynamic body, we do nothing
-    if (mType != DYNAMIC) return;
+    if (mType != BodyType::DYNAMIC) return;
 
     // Awake the body if it was sleeping
     if (mIsSleeping) {
@@ -432,7 +432,7 @@ inline void RigidBody::applyForceToCenterOfMass(const Vector3& force) {
 inline void RigidBody::applyForce(const Vector3& force, const Vector3& point) {
 
     // If it is not a dynamic body, we do nothing
-    if (mType != DYNAMIC) return;
+    if (mType != BodyType::DYNAMIC) return;
 
     // Awake the body if it was sleeping
     if (mIsSleeping) {
@@ -455,7 +455,7 @@ inline void RigidBody::applyForce(const Vector3& force, const Vector3& point) {
 inline void RigidBody::applyTorque(const Vector3& torque) {
 
     // If it is not a dynamic body, we do nothing
-    if (mType != DYNAMIC) return;
+    if (mType != BodyType::DYNAMIC) return;
 
     // Awake the body if it was sleeping
     if (mIsSleeping) {
diff --git a/src/collision/CollisionDetection.cpp b/src/collision/CollisionDetection.cpp
index 5e895c7f..ed721343 100644
--- a/src/collision/CollisionDetection.cpp
+++ b/src/collision/CollisionDetection.cpp
@@ -209,8 +209,8 @@ void CollisionDetection::computeNarrowPhase() {
         pair->update();
 
         // Check that at least one body is awake and not static
-        bool isBody1Active = !body1->isSleeping() && body1->getType() != STATIC;
-        bool isBody2Active = !body2->isSleeping() && body2->getType() != STATIC;
+        bool isBody1Active = !body1->isSleeping() && body1->getType() != BodyType::STATIC;
+        bool isBody2Active = !body2->isSleeping() && body2->getType() != BodyType::STATIC;
         if (!isBody1Active && !isBody2Active) continue;
 
         // Check if the bodies are in the set of bodies that cannot collide between each other
@@ -220,7 +220,9 @@ void CollisionDetection::computeNarrowPhase() {
         // Select the narrow phase algorithm to use according to the two collision shapes
         const CollisionShapeType shape1Type = shape1->getCollisionShape()->getType();
         const CollisionShapeType shape2Type = shape2->getCollisionShape()->getType();
-        NarrowPhaseAlgorithm* narrowPhaseAlgorithm = mCollisionMatrix[shape1Type][shape2Type];
+        const int shape1Index = static_cast<int>(shape1Type);
+        const int shape2Index = static_cast<int>(shape2Type);
+        NarrowPhaseAlgorithm* narrowPhaseAlgorithm = mCollisionMatrix[shape1Index][shape2Index];
 
         // If there is no collision algorithm between those two kinds of shapes
         if (narrowPhaseAlgorithm == nullptr) continue;
@@ -312,7 +314,7 @@ void CollisionDetection::computeNarrowPhaseBetweenShapes(CollisionCallback* call
         pair->update();
 
         // Check if the two bodies are allowed to collide, otherwise, we do not test for collision
-        if (body1->getType() != DYNAMIC && body2->getType() != DYNAMIC) continue;
+        if (body1->getType() != BodyType::DYNAMIC && body2->getType() != BodyType::DYNAMIC) continue;
         bodyindexpair bodiesIndex = OverlappingPair::computeBodiesIndexPair(body1, body2);
         if (mNoCollisionPairs.count(bodiesIndex) > 0) continue;
 
@@ -322,7 +324,9 @@ void CollisionDetection::computeNarrowPhaseBetweenShapes(CollisionCallback* call
         // Select the narrow phase algorithm to use according to the two collision shapes
         const CollisionShapeType shape1Type = shape1->getCollisionShape()->getType();
         const CollisionShapeType shape2Type = shape2->getCollisionShape()->getType();
-        NarrowPhaseAlgorithm* narrowPhaseAlgorithm = mCollisionMatrix[shape1Type][shape2Type];
+        const int shape1Index = static_cast<int>(shape1Type);
+        const int shape2Index = static_cast<int>(shape2Type);
+        NarrowPhaseAlgorithm* narrowPhaseAlgorithm = mCollisionMatrix[shape1Index][shape2Index];
 
         // If there is no collision algorithm between those two kinds of shapes
         if (narrowPhaseAlgorithm == nullptr) continue;
diff --git a/src/collision/CollisionDetection.h b/src/collision/CollisionDetection.h
index 4bc4f319..e02b129f 100644
--- a/src/collision/CollisionDetection.h
+++ b/src/collision/CollisionDetection.h
@@ -116,12 +116,6 @@ class CollisionDetection : public NarrowPhaseCallback {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        CollisionDetection(const CollisionDetection& collisionDetection);
-
-        /// Private assignment operator
-        CollisionDetection& operator=(const CollisionDetection& collisionDetection);
-
         /// Compute the broad-phase collision detection
         void computeBroadPhase();
 
@@ -151,6 +145,12 @@ class CollisionDetection : public NarrowPhaseCallback {
         /// Destructor
         ~CollisionDetection();
 
+        /// Deleted copy-constructor
+        CollisionDetection(const CollisionDetection& collisionDetection) = delete;
+
+        /// Deleted assignment operator
+        CollisionDetection& operator=(const CollisionDetection& collisionDetection) = delete;
+
         /// Set the collision dispatch configuration
         void setCollisionDispatch(CollisionDispatch* collisionDispatch);
 
@@ -234,7 +234,7 @@ class CollisionDetection : public NarrowPhaseCallback {
 // Return the Narrow-phase collision detection algorithm to use between two types of shapes
 inline NarrowPhaseAlgorithm* CollisionDetection::getCollisionAlgorithm(CollisionShapeType shape1Type,
                                                                        CollisionShapeType shape2Type) const {
-    return mCollisionMatrix[shape1Type][shape2Type];
+    return mCollisionMatrix[static_cast<int>(shape1Type)][static_cast<int>(shape2Type)];
 }
 
 // Set the collision dispatch configuration
diff --git a/src/collision/ContactManifold.h b/src/collision/ContactManifold.h
index e34bb449..eb7716df 100644
--- a/src/collision/ContactManifold.h
+++ b/src/collision/ContactManifold.h
@@ -130,12 +130,6 @@ class ContactManifold {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        ContactManifold(const ContactManifold& contactManifold);
-
-        /// Private assignment operator
-        ContactManifold& operator=(const ContactManifold& contactManifold);
-
         /// Return the index of maximum area
         int getMaxArea(decimal area0, decimal area1, decimal area2, decimal area3) const;
 
@@ -162,6 +156,12 @@ class ContactManifold {
         /// Destructor
         ~ContactManifold();
 
+        /// Deleted copy-constructor
+        ContactManifold(const ContactManifold& contactManifold) = delete;
+
+        /// Deleted assignment operator
+        ContactManifold& operator=(const ContactManifold& contactManifold) = delete;
+
         /// Return a pointer to the first proxy shape of the contact
         ProxyShape* getShape1() const;
 
diff --git a/src/collision/ProxyShape.h b/src/collision/ProxyShape.h
index b91252de..d7c81621 100644
--- a/src/collision/ProxyShape.h
+++ b/src/collision/ProxyShape.h
@@ -85,14 +85,6 @@ class ProxyShape {
         /// proxy shape will collide with every collision categories by default.
         unsigned short mCollideWithMaskBits;
 
-        // -------------------- Methods -------------------- //
-
-        /// Private copy-constructor
-        ProxyShape(const ProxyShape& proxyShape);
-
-        /// Private assignment operator
-        ProxyShape& operator=(const ProxyShape& proxyShape);
-
     public:
 
         // -------------------- Methods -------------------- //
@@ -102,7 +94,13 @@ class ProxyShape {
                    const Transform& transform, decimal mass);
 
         /// Destructor
-        ~ProxyShape();
+        virtual ~ProxyShape();
+
+        /// Deleted copy-constructor
+        ProxyShape(const ProxyShape& proxyShape) = delete;
+
+        /// Deleted assignment operator
+        ProxyShape& operator=(const ProxyShape& proxyShape) = delete;
 
         /// Return the collision shape
         const CollisionShape* getCollisionShape() const;
diff --git a/src/collision/RaycastInfo.h b/src/collision/RaycastInfo.h
index 753353f3..d693f02c 100644
--- a/src/collision/RaycastInfo.h
+++ b/src/collision/RaycastInfo.h
@@ -46,14 +46,6 @@ struct RaycastInfo {
 
     private:
 
-        // -------------------- Methods -------------------- //
-
-        /// Private copy constructor
-        RaycastInfo(const RaycastInfo& raycastInfo);
-
-        /// Private assignment operator
-        RaycastInfo& operator=(const RaycastInfo& raycastInfo);
-
     public:
 
         // -------------------- Attributes -------------------- //
@@ -91,6 +83,12 @@ struct RaycastInfo {
         ~RaycastInfo() {
 
         }
+
+        /// Deleted copy constructor
+        RaycastInfo(const RaycastInfo& raycastInfo) = delete;
+
+        /// Deleted assignment operator
+        RaycastInfo& operator=(const RaycastInfo& raycastInfo) = delete;
 };
 
 // Class RaycastCallback
diff --git a/src/collision/TriangleVertexArray.h b/src/collision/TriangleVertexArray.h
index 3cf45723..f4403092 100644
--- a/src/collision/TriangleVertexArray.h
+++ b/src/collision/TriangleVertexArray.h
@@ -46,10 +46,10 @@ class TriangleVertexArray {
     public:
 
         /// Data type for the vertices in the array
-        enum VertexDataType {VERTEX_FLOAT_TYPE, VERTEX_DOUBLE_TYPE};
+        enum class VertexDataType {VERTEX_FLOAT_TYPE, VERTEX_DOUBLE_TYPE};
 
         /// Data type for the indices in the array
-        enum IndexDataType {INDEX_INTEGER_TYPE, INDEX_SHORT_TYPE};
+        enum class IndexDataType {INDEX_INTEGER_TYPE, INDEX_SHORT_TYPE};
 
     protected:
 
diff --git a/src/collision/broadphase/BroadPhaseAlgorithm.h b/src/collision/broadphase/BroadPhaseAlgorithm.h
index 7f48f8fd..413a3d47 100644
--- a/src/collision/broadphase/BroadPhaseAlgorithm.h
+++ b/src/collision/broadphase/BroadPhaseAlgorithm.h
@@ -109,6 +109,9 @@ class BroadPhaseRaycastCallback : public DynamicAABBTreeRaycastCallback {
 
         }
 
+        // Destructor
+        virtual ~BroadPhaseRaycastCallback() {}
+
         // Called for a broad-phase shape that has to be tested for raycast
         virtual decimal raycastBroadPhaseShape(int32 nodeId, const Ray& ray);
 
@@ -159,14 +162,6 @@ class BroadPhaseAlgorithm {
 
         /// Reference to the collision detection object
         CollisionDetection& mCollisionDetection;
-        
-        // -------------------- Methods -------------------- //
-
-        /// Private copy-constructor
-        BroadPhaseAlgorithm(const BroadPhaseAlgorithm& algorithm);
-
-        /// Private assignment operator
-        BroadPhaseAlgorithm& operator=(const BroadPhaseAlgorithm& algorithm);
 
     public :
 
@@ -177,6 +172,12 @@ class BroadPhaseAlgorithm {
 
         /// Destructor
         ~BroadPhaseAlgorithm();
+
+        /// Deleted copy-constructor
+        BroadPhaseAlgorithm(const BroadPhaseAlgorithm& algorithm) = delete;
+
+        /// Deleted assignment operator
+        BroadPhaseAlgorithm& operator=(const BroadPhaseAlgorithm& algorithm) = delete;
         
         /// Add a proxy collision shape into the broad-phase collision detection
         void addProxyCollisionShape(ProxyShape* proxyShape, const AABB& aabb);
diff --git a/src/collision/broadphase/DynamicAABBTree.h b/src/collision/broadphase/DynamicAABBTree.h
index e8232e96..67999d0a 100644
--- a/src/collision/broadphase/DynamicAABBTree.h
+++ b/src/collision/broadphase/DynamicAABBTree.h
@@ -101,6 +101,9 @@ class DynamicAABBTreeOverlapCallback {
         // Called when a overlapping node has been found during the call to
         // DynamicAABBTree:reportAllShapesOverlappingWithAABB()
         virtual void notifyOverlappingNode(int nodeId)=0;
+
+        // Destructor
+        virtual ~DynamicAABBTreeOverlapCallback() {}
 };
 
 // Class DynamicAABBTreeRaycastCallback
@@ -115,6 +118,8 @@ class DynamicAABBTreeRaycastCallback {
         // Called when the AABB of a leaf node is hit by a ray
         virtual decimal raycastBroadPhaseShape(int32 nodeId, const Ray& ray)=0;
 
+        virtual ~DynamicAABBTreeRaycastCallback() {}
+
 };
 
 // Class DynamicAABBTree
diff --git a/src/collision/narrowphase/ConcaveVsConvexAlgorithm.cpp b/src/collision/narrowphase/ConcaveVsConvexAlgorithm.cpp
index 96c67531..ab07c629 100644
--- a/src/collision/narrowphase/ConcaveVsConvexAlgorithm.cpp
+++ b/src/collision/narrowphase/ConcaveVsConvexAlgorithm.cpp
@@ -263,8 +263,8 @@ void SmoothCollisionNarrowPhaseCallback::notifyContact(OverlappingPair* overlapp
     bool isFirstShapeTriangle;
 
     // If the collision shape 1 is the triangle
-    if (contactInfo.collisionShape1->getType() == TRIANGLE) {
-        assert(contactInfo.collisionShape2->getType() != TRIANGLE);
+    if (contactInfo.collisionShape1->getType() == CollisionShapeType::TRIANGLE) {
+        assert(contactInfo.collisionShape2->getType() != CollisionShapeType::TRIANGLE);
 
         const TriangleShape* triangleShape = static_cast<const TriangleShape*>(contactInfo.collisionShape1);
         triangleVertices[0] = triangleShape->getVertex(0);
@@ -274,7 +274,7 @@ void SmoothCollisionNarrowPhaseCallback::notifyContact(OverlappingPair* overlapp
         isFirstShapeTriangle = true;
     }
     else {  // If the collision shape 2 is the triangle
-        assert(contactInfo.collisionShape2->getType() == TRIANGLE);
+        assert(contactInfo.collisionShape2->getType() == CollisionShapeType::TRIANGLE);
 
         const TriangleShape* triangleShape = static_cast<const TriangleShape*>(contactInfo.collisionShape2);
         triangleVertices[0] = triangleShape->getVertex(0);
diff --git a/src/collision/narrowphase/ConcaveVsConvexAlgorithm.h b/src/collision/narrowphase/ConcaveVsConvexAlgorithm.h
index e44b71c2..4fe2aec0 100644
--- a/src/collision/narrowphase/ConcaveVsConvexAlgorithm.h
+++ b/src/collision/narrowphase/ConcaveVsConvexAlgorithm.h
@@ -72,6 +72,9 @@ class ConvexVsTriangleCallback : public TriangleCallback {
 
     public:
 
+        /// Destructor
+        virtual ~ConvexVsTriangleCallback() {}
+
         /// Set the collision detection pointer
         void setCollisionDetection(CollisionDetection* collisionDetection) {
             mCollisionDetection = collisionDetection;
diff --git a/src/collision/narrowphase/DefaultCollisionDispatch.cpp b/src/collision/narrowphase/DefaultCollisionDispatch.cpp
index 0b0df8d7..bc48c001 100644
--- a/src/collision/narrowphase/DefaultCollisionDispatch.cpp
+++ b/src/collision/narrowphase/DefaultCollisionDispatch.cpp
@@ -57,7 +57,7 @@ NarrowPhaseAlgorithm* DefaultCollisionDispatch::selectAlgorithm(int type1, int t
     CollisionShapeType shape2Type = static_cast<CollisionShapeType>(type2);
 
     // Sphere vs Sphere algorithm
-    if (shape1Type == SPHERE && shape2Type == SPHERE) {
+    if (shape1Type == CollisionShapeType::SPHERE && shape2Type == CollisionShapeType::SPHERE) {
         return &mSphereVsSphereAlgorithm;
     }
     // Concave vs Convex algorithm
diff --git a/src/collision/narrowphase/EPA/EPAAlgorithm.h b/src/collision/narrowphase/EPA/EPAAlgorithm.h
index 1d4b527a..3461f466 100644
--- a/src/collision/narrowphase/EPA/EPAAlgorithm.h
+++ b/src/collision/narrowphase/EPA/EPAAlgorithm.h
@@ -95,12 +95,6 @@ class EPAAlgorithm {
         
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        EPAAlgorithm(const EPAAlgorithm& algorithm);
-
-        /// Private assignment operator
-        EPAAlgorithm& operator=(const EPAAlgorithm& algorithm);
-
         /// Add a triangle face in the candidate triangle heap
         void addFaceCandidate(TriangleEPA* triangle, TriangleEPA** heap, uint& nbTriangles,
                               decimal upperBoundSquarePenDepth);
@@ -119,6 +113,12 @@ class EPAAlgorithm {
         /// Destructor
         ~EPAAlgorithm();
 
+        /// Deleted copy-constructor
+        EPAAlgorithm(const EPAAlgorithm& algorithm) = delete;
+
+        /// Deleted assignment operator
+        EPAAlgorithm& operator=(const EPAAlgorithm& algorithm) = delete;
+
         /// Initalize the algorithm
         void init(MemoryAllocator* memoryAllocator);
 
diff --git a/src/collision/narrowphase/EPA/TriangleEPA.h b/src/collision/narrowphase/EPA/TriangleEPA.h
index e2a8ce26..4cb40f38 100644
--- a/src/collision/narrowphase/EPA/TriangleEPA.h
+++ b/src/collision/narrowphase/EPA/TriangleEPA.h
@@ -74,14 +74,6 @@ class TriangleEPA {
         /// Square distance of the point closest point v to the origin
         decimal mDistSquare;
 
-        // -------------------- Methods -------------------- //
-
-        /// Private copy-constructor
-        TriangleEPA(const TriangleEPA& triangle);
-
-        /// Private assignment operator
-        TriangleEPA& operator=(const TriangleEPA& triangle);
-
     public:
 
         // -------------------- Methods -------------------- //
@@ -95,6 +87,12 @@ class TriangleEPA {
         /// Destructor
         ~TriangleEPA();
 
+        /// Deleted copy-constructor
+        TriangleEPA(const TriangleEPA& triangle) = delete;
+
+        /// Deleted assignment operator
+        TriangleEPA& operator=(const TriangleEPA& triangle) = delete;
+
         /// Return an adjacent edge of the triangle
         EdgeEPA& getAdjacentEdge(int index);
 
diff --git a/src/collision/narrowphase/EPA/TrianglesStore.h b/src/collision/narrowphase/EPA/TrianglesStore.h
index 82f6b6a9..840fdcbc 100644
--- a/src/collision/narrowphase/EPA/TrianglesStore.h
+++ b/src/collision/narrowphase/EPA/TrianglesStore.h
@@ -52,15 +52,7 @@ class TrianglesStore {
         TriangleEPA mTriangles[MAX_TRIANGLES];
 
         /// Number of triangles
-        int mNbTriangles;
-
-        // -------------------- Methods -------------------- //
-
-        /// Private copy-constructor
-        TrianglesStore(const TrianglesStore& triangleStore);
-
-        /// Private assignment operator
-        TrianglesStore& operator=(const TrianglesStore& triangleStore);
+        int mNbTriangles;        
         
     public:
 
@@ -72,6 +64,12 @@ class TrianglesStore {
         /// Destructor
         ~TrianglesStore();
 
+        /// Deleted copy-constructor
+        TrianglesStore(const TrianglesStore& triangleStore) = delete;
+
+        /// Deleted assignment operator
+        TrianglesStore& operator=(const TrianglesStore& triangleStore) = delete;
+
         /// Clear all the storage
         void clear();
 
diff --git a/src/collision/narrowphase/GJK/GJKAlgorithm.h b/src/collision/narrowphase/GJK/GJKAlgorithm.h
index 23ebc789..96cdbf8a 100644
--- a/src/collision/narrowphase/GJK/GJKAlgorithm.h
+++ b/src/collision/narrowphase/GJK/GJKAlgorithm.h
@@ -68,12 +68,6 @@ class GJKAlgorithm : public NarrowPhaseAlgorithm {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        GJKAlgorithm(const GJKAlgorithm& algorithm);
-
-        /// Private assignment operator
-        GJKAlgorithm& operator=(const GJKAlgorithm& algorithm);
-
         /// Compute the penetration depth for enlarged objects.
         void computePenetrationDepthForEnlargedObjects(const CollisionShapeInfo& shape1Info,
                                                        const Transform& transform1,
@@ -92,6 +86,12 @@ class GJKAlgorithm : public NarrowPhaseAlgorithm {
         /// Destructor
         ~GJKAlgorithm();
 
+        /// Deleted copy-constructor
+        GJKAlgorithm(const GJKAlgorithm& algorithm) = delete;
+
+        /// Deleted assignment operator
+        GJKAlgorithm& operator=(const GJKAlgorithm& algorithm) = delete;
+
         /// Initalize the algorithm
         virtual void init(CollisionDetection* collisionDetection,
                           MemoryAllocator* memoryAllocator);
diff --git a/src/collision/narrowphase/GJK/Simplex.h b/src/collision/narrowphase/GJK/Simplex.h
index 1388a161..f55213fb 100644
--- a/src/collision/narrowphase/GJK/Simplex.h
+++ b/src/collision/narrowphase/GJK/Simplex.h
@@ -90,12 +90,6 @@ class Simplex {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        Simplex(const Simplex& simplex);
-
-        /// Private assignment operator
-        Simplex& operator=(const Simplex& simplex);
-
         /// Return true if some bits of "a" overlap with bits of "b"
         bool overlap(Bits a, Bits b) const;
 
@@ -127,6 +121,12 @@ class Simplex {
         /// Destructor
         ~Simplex();
 
+        /// Deleted copy-constructor
+        Simplex(const Simplex& simplex) = delete;
+
+        /// Deleted assignment operator
+        Simplex& operator=(const Simplex& simplex) = delete;
+
         /// Return true if the simplex contains 4 points
         bool isFull() const;
 
diff --git a/src/collision/narrowphase/NarrowPhaseAlgorithm.h b/src/collision/narrowphase/NarrowPhaseAlgorithm.h
index e8efaaa6..b765dbf3 100644
--- a/src/collision/narrowphase/NarrowPhaseAlgorithm.h
+++ b/src/collision/narrowphase/NarrowPhaseAlgorithm.h
@@ -47,6 +47,8 @@ class NarrowPhaseCallback {
 
     public:
 
+        virtual ~NarrowPhaseCallback() {}
+
         /// Called by a narrow-phase collision algorithm when a new contact has been found
         virtual void notifyContact(OverlappingPair* overlappingPair,
                                    const ContactPointInfo& contactInfo)=0;
@@ -73,14 +75,6 @@ class NarrowPhaseAlgorithm {
 
         /// Overlapping pair of the bodies currently tested for collision
         OverlappingPair* mCurrentOverlappingPair;
-        
-        // -------------------- Methods -------------------- //
-
-        /// Private copy-constructor
-        NarrowPhaseAlgorithm(const NarrowPhaseAlgorithm& algorithm);
-
-        /// Private assignment operator
-        NarrowPhaseAlgorithm& operator=(const NarrowPhaseAlgorithm& algorithm);
 
     public :
 
@@ -92,6 +86,12 @@ class NarrowPhaseAlgorithm {
         /// Destructor
         virtual ~NarrowPhaseAlgorithm();
 
+        /// Deleted copy-constructor
+        NarrowPhaseAlgorithm(const NarrowPhaseAlgorithm& algorithm) = delete;
+
+        /// Deleted assignment operator
+        NarrowPhaseAlgorithm& operator=(const NarrowPhaseAlgorithm& algorithm) = delete;
+
         /// Initalize the algorithm
         virtual void init(CollisionDetection* collisionDetection, MemoryAllocator* memoryAllocator);
         
diff --git a/src/collision/narrowphase/SphereVsSphereAlgorithm.h b/src/collision/narrowphase/SphereVsSphereAlgorithm.h
index 0c73d57a..44190a22 100644
--- a/src/collision/narrowphase/SphereVsSphereAlgorithm.h
+++ b/src/collision/narrowphase/SphereVsSphereAlgorithm.h
@@ -44,14 +44,6 @@ class SphereVsSphereAlgorithm : public NarrowPhaseAlgorithm {
 
     protected :
 
-        // -------------------- Methods -------------------- //
-
-        /// Private copy-constructor
-        SphereVsSphereAlgorithm(const SphereVsSphereAlgorithm& algorithm);
-
-        /// Private assignment operator
-        SphereVsSphereAlgorithm& operator=(const SphereVsSphereAlgorithm& algorithm);
-        
     public :
 
         // -------------------- Methods -------------------- //
@@ -62,6 +54,12 @@ class SphereVsSphereAlgorithm : public NarrowPhaseAlgorithm {
         /// Destructor
         virtual ~SphereVsSphereAlgorithm();
 
+        /// Deleted copy-constructor
+        SphereVsSphereAlgorithm(const SphereVsSphereAlgorithm& algorithm) = delete;
+
+        /// Deleted assignment operator
+        SphereVsSphereAlgorithm& operator=(const SphereVsSphereAlgorithm& algorithm) = delete;
+
         /// Compute a contact info if the two bounding volume collide
         virtual void testCollision(const CollisionShapeInfo& shape1Info,
                                    const CollisionShapeInfo& shape2Info,
diff --git a/src/collision/shapes/BoxShape.cpp b/src/collision/shapes/BoxShape.cpp
index fe1f5693..764918c7 100644
--- a/src/collision/shapes/BoxShape.cpp
+++ b/src/collision/shapes/BoxShape.cpp
@@ -38,7 +38,7 @@ using namespace reactphysics3d;
  * @param margin The collision margin (in meters) around the collision shape
  */
 BoxShape::BoxShape(const Vector3& extent, decimal margin)
-         : ConvexShape(BOX, margin), mExtent(extent - Vector3(margin, margin, margin)) {
+         : ConvexShape(CollisionShapeType::BOX, margin), mExtent(extent - Vector3(margin, margin, margin)) {
     assert(extent.x > decimal(0.0) && extent.x > margin);
     assert(extent.y > decimal(0.0) && extent.y > margin);
     assert(extent.z > decimal(0.0) && extent.z > margin);
diff --git a/src/collision/shapes/BoxShape.h b/src/collision/shapes/BoxShape.h
index f581baa0..bfe702fb 100644
--- a/src/collision/shapes/BoxShape.h
+++ b/src/collision/shapes/BoxShape.h
@@ -61,12 +61,6 @@ class BoxShape : public ConvexShape {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        BoxShape(const BoxShape& shape);
-
-        /// Private assignment operator
-        BoxShape& operator=(const BoxShape& shape);
-
         /// Return a local support point in a given direction without the object margin
         virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction,
                                                           void** cachedCollisionData) const;
@@ -90,6 +84,12 @@ class BoxShape : public ConvexShape {
         /// Destructor
         virtual ~BoxShape();
 
+        /// Deleted copy-constructor
+        BoxShape(const BoxShape& shape) = delete;
+
+        /// Deleted assignment operator
+        BoxShape& operator=(const BoxShape& shape) = delete;
+
         /// Return the extents of the box
         Vector3 getExtent() const;
 
diff --git a/src/collision/shapes/CapsuleShape.cpp b/src/collision/shapes/CapsuleShape.cpp
index 110fbd30..a8b231f5 100644
--- a/src/collision/shapes/CapsuleShape.cpp
+++ b/src/collision/shapes/CapsuleShape.cpp
@@ -37,7 +37,7 @@ using namespace reactphysics3d;
  * @param height The height of the capsule (in meters)
  */
 CapsuleShape::CapsuleShape(decimal radius, decimal height)
-            : ConvexShape(CAPSULE, radius), mHalfHeight(height * decimal(0.5)) {
+            : ConvexShape(CollisionShapeType::CAPSULE, radius), mHalfHeight(height * decimal(0.5)) {
     assert(radius > decimal(0.0));
     assert(height > decimal(0.0));
 }
diff --git a/src/collision/shapes/CapsuleShape.h b/src/collision/shapes/CapsuleShape.h
index 56269d04..b4d4755b 100644
--- a/src/collision/shapes/CapsuleShape.h
+++ b/src/collision/shapes/CapsuleShape.h
@@ -55,12 +55,6 @@ class CapsuleShape : public ConvexShape {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        CapsuleShape(const CapsuleShape& shape);
-
-        /// Private assignment operator
-        CapsuleShape& operator=(const CapsuleShape& shape);
-
         /// Return a local support point in a given direction without the object margin
         virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction,
                                                           void** cachedCollisionData) const;
@@ -89,6 +83,12 @@ class CapsuleShape : public ConvexShape {
         /// Destructor
         virtual ~CapsuleShape();
 
+        /// Deleted copy-constructor
+        CapsuleShape(const CapsuleShape& shape) = delete;
+
+        /// Deleted assignment operator
+        CapsuleShape& operator=(const CapsuleShape& shape) = delete;
+
         /// Return the radius of the capsule
         decimal getRadius() const;
 
diff --git a/src/collision/shapes/CollisionShape.h b/src/collision/shapes/CollisionShape.h
index cd89255d..2c50dac9 100644
--- a/src/collision/shapes/CollisionShape.h
+++ b/src/collision/shapes/CollisionShape.h
@@ -40,7 +40,7 @@
 namespace reactphysics3d {
     
 /// Type of the collision shape
-enum CollisionShapeType {TRIANGLE, BOX, SPHERE, CONE, CYLINDER,
+enum class CollisionShapeType {TRIANGLE, BOX, SPHERE, CONE, CYLINDER,
                          CAPSULE, CONVEX_MESH, CONCAVE_MESH, HEIGHTFIELD};
 const int NB_COLLISION_SHAPE_TYPES = 9;
 
@@ -67,12 +67,6 @@ class CollisionShape {
         
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        CollisionShape(const CollisionShape& shape);
-
-        /// Private assignment operator
-        CollisionShape& operator=(const CollisionShape& shape);
-
         /// Return true if a point is inside the collision shape
         virtual bool testPointInside(const Vector3& worldPoint, ProxyShape* proxyShape) const=0;
 
@@ -92,6 +86,12 @@ class CollisionShape {
         /// Destructor
         virtual ~CollisionShape();
 
+        /// Deleted copy-constructor
+        CollisionShape(const CollisionShape& shape) = delete;
+
+        /// Deleted assignment operator
+        CollisionShape& operator=(const CollisionShape& shape) = delete;
+
         /// Return the type of the collision shapes
         CollisionShapeType getType() const;
 
@@ -136,7 +136,7 @@ inline CollisionShapeType CollisionShape::getType() const {
 
 // Return true if the collision shape type is a convex shape
 inline bool CollisionShape::isConvex(CollisionShapeType shapeType) {
-    return shapeType != CONCAVE_MESH && shapeType != HEIGHTFIELD;
+    return shapeType != CollisionShapeType::CONCAVE_MESH && shapeType != CollisionShapeType::HEIGHTFIELD;
 }
 
 // Return the scaling vector of the collision shape
diff --git a/src/collision/shapes/ConcaveMeshShape.cpp b/src/collision/shapes/ConcaveMeshShape.cpp
index 317a1c65..dfec3ba2 100644
--- a/src/collision/shapes/ConcaveMeshShape.cpp
+++ b/src/collision/shapes/ConcaveMeshShape.cpp
@@ -30,9 +30,9 @@ using namespace reactphysics3d;
 
 // Constructor
 ConcaveMeshShape::ConcaveMeshShape(TriangleMesh* triangleMesh)
-                 : ConcaveShape(CONCAVE_MESH) {
+                 : ConcaveShape(CollisionShapeType::CONCAVE_MESH) {
     mTriangleMesh = triangleMesh;
-    mRaycastTestType = FRONT;
+    mRaycastTestType = TriangleRaycastSide::FRONT;
 
     // Insert all the triangles into the dynamic AABB tree
     initBVHTree();
@@ -72,10 +72,10 @@ void ConcaveMeshShape::initBVHTree() {
 
                 // Get the index of the current vertex in the triangle
                 int vertexIndex = 0;
-                if (indexType == TriangleVertexArray::INDEX_INTEGER_TYPE) {
+                if (indexType == TriangleVertexArray::IndexDataType::INDEX_INTEGER_TYPE) {
                     vertexIndex = ((uint*)vertexIndexPointer)[k];
                 }
-                else if (indexType == TriangleVertexArray::INDEX_SHORT_TYPE) {
+                else if (indexType == TriangleVertexArray::IndexDataType::INDEX_SHORT_TYPE) {
                     vertexIndex = ((unsigned short*)vertexIndexPointer)[k];
                 }
                 else {
@@ -83,13 +83,13 @@ void ConcaveMeshShape::initBVHTree() {
                 }
 
                 // Get the vertices components of the triangle
-                if (vertexType == TriangleVertexArray::VERTEX_FLOAT_TYPE) {
+                if (vertexType == TriangleVertexArray::VertexDataType::VERTEX_FLOAT_TYPE) {
                     const float* vertices = (float*)(verticesStart + vertexIndex * vertexStride);
                     trianglePoints[k][0] = decimal(vertices[0]) * mScaling.x;
                     trianglePoints[k][1] = decimal(vertices[1]) * mScaling.y;
                     trianglePoints[k][2] = decimal(vertices[2]) * mScaling.z;
                 }
-                else if (vertexType == TriangleVertexArray::VERTEX_DOUBLE_TYPE) {
+                else if (vertexType == TriangleVertexArray::VertexDataType::VERTEX_DOUBLE_TYPE) {
                     const double* vertices = (double*)(verticesStart + vertexIndex * vertexStride);
                     trianglePoints[k][0] = decimal(vertices[0]) * mScaling.x;
                     trianglePoints[k][1] = decimal(vertices[1]) * mScaling.y;
@@ -132,10 +132,10 @@ void ConcaveMeshShape::getTriangleVerticesWithIndexPointer(int32 subPart, int32
 
         // Get the index of the current vertex in the triangle
         int vertexIndex = 0;
-        if (indexType == TriangleVertexArray::INDEX_INTEGER_TYPE) {
+        if (indexType == TriangleVertexArray::IndexDataType::INDEX_INTEGER_TYPE) {
             vertexIndex = ((uint*)vertexIndexPointer)[k];
         }
-        else if (indexType == TriangleVertexArray::INDEX_SHORT_TYPE) {
+        else if (indexType == TriangleVertexArray::IndexDataType::INDEX_SHORT_TYPE) {
             vertexIndex = ((unsigned short*)vertexIndexPointer)[k];
         }
         else {
@@ -143,13 +143,13 @@ void ConcaveMeshShape::getTriangleVerticesWithIndexPointer(int32 subPart, int32
         }
 
         // Get the vertices components of the triangle
-        if (vertexType == TriangleVertexArray::VERTEX_FLOAT_TYPE) {
+        if (vertexType == TriangleVertexArray::VertexDataType::VERTEX_FLOAT_TYPE) {
             const float* vertices = (float*)(verticesStart + vertexIndex * vertexStride);
             outTriangleVertices[k][0] = decimal(vertices[0]) * mScaling.x;
             outTriangleVertices[k][1] = decimal(vertices[1]) * mScaling.y;
             outTriangleVertices[k][2] = decimal(vertices[2]) * mScaling.z;
         }
-        else if (vertexType == TriangleVertexArray::VERTEX_DOUBLE_TYPE) {
+        else if (vertexType == TriangleVertexArray::VertexDataType::VERTEX_DOUBLE_TYPE) {
             const double* vertices = (double*)(verticesStart + vertexIndex * vertexStride);
             outTriangleVertices[k][0] = decimal(vertices[0]) * mScaling.x;
             outTriangleVertices[k][1] = decimal(vertices[1]) * mScaling.y;
diff --git a/src/collision/shapes/ConcaveMeshShape.h b/src/collision/shapes/ConcaveMeshShape.h
index 015c8159..f440f4b2 100644
--- a/src/collision/shapes/ConcaveMeshShape.h
+++ b/src/collision/shapes/ConcaveMeshShape.h
@@ -120,12 +120,6 @@ class ConcaveMeshShape : public ConcaveShape {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        ConcaveMeshShape(const ConcaveMeshShape& shape);
-
-        /// Private assignment operator
-        ConcaveMeshShape& operator=(const ConcaveMeshShape& shape);
-
         /// Raycast method with feedback information
         virtual bool raycast(const Ray& ray, RaycastInfo& raycastInfo, ProxyShape* proxyShape) const;
 
@@ -146,7 +140,13 @@ class ConcaveMeshShape : public ConcaveShape {
         ConcaveMeshShape(TriangleMesh* triangleMesh);
 
         /// Destructor
-        ~ConcaveMeshShape();
+        virtual ~ConcaveMeshShape();
+
+        /// Deleted copy-constructor
+        ConcaveMeshShape(const ConcaveMeshShape& shape) = delete;
+
+        /// Deleted assignment operator
+        ConcaveMeshShape& operator=(const ConcaveMeshShape& shape) = delete;
 
         /// Return the local bounds of the shape in x, y and z directions.
         virtual void getLocalBounds(Vector3& min, Vector3& max) const;
diff --git a/src/collision/shapes/ConcaveShape.cpp b/src/collision/shapes/ConcaveShape.cpp
index 65a0c8b4..017a277a 100644
--- a/src/collision/shapes/ConcaveShape.cpp
+++ b/src/collision/shapes/ConcaveShape.cpp
@@ -33,7 +33,7 @@ using namespace reactphysics3d;
 // Constructor
 ConcaveShape::ConcaveShape(CollisionShapeType type)
              : CollisionShape(type), mIsSmoothMeshCollisionEnabled(false),
-               mTriangleMargin(0), mRaycastTestType(FRONT) {
+               mTriangleMargin(0), mRaycastTestType(TriangleRaycastSide::FRONT) {
 
 }
 
diff --git a/src/collision/shapes/ConcaveShape.h b/src/collision/shapes/ConcaveShape.h
index 9c1418df..1476e4b0 100644
--- a/src/collision/shapes/ConcaveShape.h
+++ b/src/collision/shapes/ConcaveShape.h
@@ -42,6 +42,9 @@ class TriangleCallback {
 
     public:
 
+        /// Destructor
+        virtual ~TriangleCallback() {}
+
         /// Report a triangle
         virtual void testTriangle(const Vector3* trianglePoints)=0;
 
@@ -70,12 +73,6 @@ class ConcaveShape : public CollisionShape {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        ConcaveShape(const ConcaveShape& shape);
-
-        /// Private assignment operator
-        ConcaveShape& operator=(const ConcaveShape& shape);
-
         /// Return true if a point is inside the collision shape
         virtual bool testPointInside(const Vector3& localPoint, ProxyShape* proxyShape) const;
 
@@ -89,6 +86,12 @@ class ConcaveShape : public CollisionShape {
         /// Destructor
         virtual ~ConcaveShape();
 
+        /// Deleted copy-constructor
+        ConcaveShape(const ConcaveShape& shape) = delete;
+
+        /// Deleted assignment operator
+        ConcaveShape& operator=(const ConcaveShape& shape) = delete;
+
         /// Return the triangle margin
         decimal getTriangleMargin() const;
 
diff --git a/src/collision/shapes/ConeShape.cpp b/src/collision/shapes/ConeShape.cpp
index cc956c73..fc166895 100644
--- a/src/collision/shapes/ConeShape.cpp
+++ b/src/collision/shapes/ConeShape.cpp
@@ -38,7 +38,7 @@ using namespace reactphysics3d;
  * @param margin Collision margin (in meters) around the collision shape
  */
 ConeShape::ConeShape(decimal radius, decimal height, decimal margin)
-          : ConvexShape(CONE, margin), mRadius(radius), mHalfHeight(height * decimal(0.5)) {
+          : ConvexShape(CollisionShapeType::CONE, margin), mRadius(radius), mHalfHeight(height * decimal(0.5)) {
     assert(mRadius > decimal(0.0));
     assert(mHalfHeight > decimal(0.0));
     
diff --git a/src/collision/shapes/ConeShape.h b/src/collision/shapes/ConeShape.h
index b693f386..d9499823 100644
--- a/src/collision/shapes/ConeShape.h
+++ b/src/collision/shapes/ConeShape.h
@@ -66,12 +66,6 @@ class ConeShape : public ConvexShape {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        ConeShape(const ConeShape& shape);
-
-        /// Private assignment operator
-        ConeShape& operator=(const ConeShape& shape);
-
         /// Return a local support point in a given direction without the object margin
         virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction,
                                                           void** cachedCollisionData) const;
@@ -95,6 +89,12 @@ class ConeShape : public ConvexShape {
         /// Destructor
         virtual ~ConeShape();
 
+        /// Deleted copy-constructor
+        ConeShape(const ConeShape& shape) = delete;
+
+        /// Deleted assignment operator
+        ConeShape& operator=(const ConeShape& shape) = delete;
+
         /// Return the radius
         decimal getRadius() const;
 
diff --git a/src/collision/shapes/ConvexMeshShape.cpp b/src/collision/shapes/ConvexMeshShape.cpp
index 5d0b651c..aedab6d1 100644
--- a/src/collision/shapes/ConvexMeshShape.cpp
+++ b/src/collision/shapes/ConvexMeshShape.cpp
@@ -39,7 +39,7 @@ using namespace reactphysics3d;
  * @param margin Collision margin (in meters) around the collision shape
  */
 ConvexMeshShape::ConvexMeshShape(const decimal* arrayVertices, uint nbVertices, int stride, decimal margin)
-                : ConvexShape(CONVEX_MESH, margin), mNbVertices(nbVertices), mMinBounds(0, 0, 0),
+                : ConvexShape(CollisionShapeType::CONVEX_MESH, margin), mNbVertices(nbVertices), mMinBounds(0, 0, 0),
                   mMaxBounds(0, 0, 0), mIsEdgesInformationUsed(false) {
     assert(nbVertices > 0);
     assert(stride > 0);
@@ -65,7 +65,7 @@ ConvexMeshShape::ConvexMeshShape(const decimal* arrayVertices, uint nbVertices,
  * @param margin Collision margin (in meters) around the collision shape
  */
 ConvexMeshShape::ConvexMeshShape(TriangleVertexArray* triangleVertexArray, bool isEdgesInformationUsed, decimal margin)
-                : ConvexShape(CONVEX_MESH, margin), mMinBounds(0, 0, 0),
+                : ConvexShape(CollisionShapeType::CONVEX_MESH, margin), mMinBounds(0, 0, 0),
                   mMaxBounds(0, 0, 0), mIsEdgesInformationUsed(isEdgesInformationUsed) {
 
     TriangleVertexArray::VertexDataType vertexType = triangleVertexArray->getVertexDataType();
@@ -79,14 +79,14 @@ ConvexMeshShape::ConvexMeshShape(TriangleVertexArray* triangleVertexArray, bool
     for (uint v = 0; v < triangleVertexArray->getNbVertices(); v++) {
 
         // Get the vertices components of the triangle
-        if (vertexType == TriangleVertexArray::VERTEX_FLOAT_TYPE) {
+        if (vertexType == TriangleVertexArray::VertexDataType::VERTEX_FLOAT_TYPE) {
             const float* vertices = (float*)(verticesStart + v * vertexStride);
 
             Vector3 vertex(vertices[0], vertices[1], vertices[2] );
             vertex = vertex * mScaling;
             mVertices.push_back(vertex);
         }
-        else if (vertexType == TriangleVertexArray::VERTEX_DOUBLE_TYPE) {
+        else if (vertexType == TriangleVertexArray::VertexDataType::VERTEX_DOUBLE_TYPE) {
             const double* vertices = (double*)(verticesStart + v * vertexStride);
 
             Vector3 vertex(vertices[0], vertices[1], vertices[2] );
@@ -109,10 +109,10 @@ ConvexMeshShape::ConvexMeshShape(TriangleVertexArray* triangleVertexArray, bool
             for (int k=0; k < 3; k++) {
 
                 // Get the index of the current vertex in the triangle
-                if (indexType == TriangleVertexArray::INDEX_INTEGER_TYPE) {
+                if (indexType == TriangleVertexArray::IndexDataType::INDEX_INTEGER_TYPE) {
                     vertexIndex[k] = ((uint*)vertexIndexPointer)[k];
                 }
-                else if (indexType == TriangleVertexArray::INDEX_SHORT_TYPE) {
+                else if (indexType == TriangleVertexArray::IndexDataType::INDEX_SHORT_TYPE) {
                     vertexIndex[k] = ((unsigned short*)vertexIndexPointer)[k];
                 }
                 else {
@@ -135,7 +135,7 @@ ConvexMeshShape::ConvexMeshShape(TriangleVertexArray* triangleVertexArray, bool
 /// If you use this constructor, you will need to set the vertices manually one by one using
 /// the addVertex() method.
 ConvexMeshShape::ConvexMeshShape(decimal margin)
-                : ConvexShape(CONVEX_MESH, margin), mNbVertices(0), mMinBounds(0, 0, 0),
+                : ConvexShape(CollisionShapeType::CONVEX_MESH, margin), mNbVertices(0), mMinBounds(0, 0, 0),
                   mMaxBounds(0, 0, 0), mIsEdgesInformationUsed(false) {
 
 }
diff --git a/src/collision/shapes/ConvexMeshShape.h b/src/collision/shapes/ConvexMeshShape.h
index d23e91b0..cd309f9a 100644
--- a/src/collision/shapes/ConvexMeshShape.h
+++ b/src/collision/shapes/ConvexMeshShape.h
@@ -85,12 +85,6 @@ class ConvexMeshShape : public ConvexShape {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        ConvexMeshShape(const ConvexMeshShape& shape);
-
-        /// Private assignment operator
-        ConvexMeshShape& operator=(const ConvexMeshShape& shape);
-
         /// Recompute the bounds of the mesh
         void recalculateBounds();
 
@@ -128,6 +122,12 @@ class ConvexMeshShape : public ConvexShape {
         /// Destructor
         virtual ~ConvexMeshShape();
 
+        /// Deleted copy-constructor
+        ConvexMeshShape(const ConvexMeshShape& shape) = delete;
+
+        /// Deleted assignment operator
+        ConvexMeshShape& operator=(const ConvexMeshShape& shape) = delete;
+
         /// Return the local bounds of the shape in x, y and z directions
         virtual void getLocalBounds(Vector3& min, Vector3& max) const;
 
diff --git a/src/collision/shapes/ConvexShape.h b/src/collision/shapes/ConvexShape.h
index a3cd3131..93a11b81 100644
--- a/src/collision/shapes/ConvexShape.h
+++ b/src/collision/shapes/ConvexShape.h
@@ -48,12 +48,6 @@ class ConvexShape : public CollisionShape {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        ConvexShape(const ConvexShape& shape);
-
-        /// Private assignment operator
-        ConvexShape& operator=(const ConvexShape& shape);
-
         // Return a local support point in a given direction with the object margin
         Vector3 getLocalSupportPointWithMargin(const Vector3& direction,
                                                void** cachedCollisionData) const;
@@ -75,6 +69,12 @@ class ConvexShape : public CollisionShape {
         /// Destructor
         virtual ~ConvexShape();
 
+        /// Deleted copy-constructor
+        ConvexShape(const ConvexShape& shape) = delete;
+
+        /// Deleted assignment operator
+        ConvexShape& operator=(const ConvexShape& shape) = delete;
+
         /// Return the current object margin
         decimal getMargin() const;
 
diff --git a/src/collision/shapes/CylinderShape.cpp b/src/collision/shapes/CylinderShape.cpp
index fd3da01c..c65047e8 100644
--- a/src/collision/shapes/CylinderShape.cpp
+++ b/src/collision/shapes/CylinderShape.cpp
@@ -37,7 +37,7 @@ using namespace reactphysics3d;
  * @param margin Collision margin (in meters) around the collision shape
  */
 CylinderShape::CylinderShape(decimal radius, decimal height, decimal margin)
-              : ConvexShape(CYLINDER, margin), mRadius(radius),
+              : ConvexShape(CollisionShapeType::CYLINDER, margin), mRadius(radius),
                 mHalfHeight(height/decimal(2.0)) {
     assert(radius > decimal(0.0));
     assert(height > decimal(0.0));
diff --git a/src/collision/shapes/CylinderShape.h b/src/collision/shapes/CylinderShape.h
index 71e4f9ae..819a1154 100644
--- a/src/collision/shapes/CylinderShape.h
+++ b/src/collision/shapes/CylinderShape.h
@@ -63,12 +63,6 @@ class CylinderShape : public ConvexShape {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        CylinderShape(const CylinderShape& shape);
-
-        /// Private assignment operator
-        CylinderShape& operator=(const CylinderShape& shape);
-
         /// Return a local support point in a given direction without the object margin
         virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction,
                                                           void** cachedCollisionData) const;
@@ -92,6 +86,12 @@ class CylinderShape : public ConvexShape {
         /// Destructor
         virtual ~CylinderShape();
 
+        /// Deleted copy-constructor
+        CylinderShape(const CylinderShape& shape) = delete;
+
+        /// Deleted assignment operator
+        CylinderShape& operator=(const CylinderShape& shape) = delete;
+
         /// Return the radius
         decimal getRadius() const;
 
diff --git a/src/collision/shapes/HeightFieldShape.cpp b/src/collision/shapes/HeightFieldShape.cpp
index 88224e2d..720619e8 100644
--- a/src/collision/shapes/HeightFieldShape.cpp
+++ b/src/collision/shapes/HeightFieldShape.cpp
@@ -42,7 +42,7 @@ using namespace reactphysics3d;
 HeightFieldShape::HeightFieldShape(int nbGridColumns, int nbGridRows, decimal minHeight, decimal maxHeight,
                                    const void* heightFieldData, HeightDataType dataType, int upAxis,
                                    decimal integerHeightScale)
-                 : ConcaveShape(HEIGHTFIELD), mNbColumns(nbGridColumns), mNbRows(nbGridRows),
+                 : ConcaveShape(CollisionShapeType::HEIGHTFIELD), mNbColumns(nbGridColumns), mNbRows(nbGridRows),
                    mWidth(nbGridColumns - 1), mLength(nbGridRows - 1), mMinHeight(minHeight),
                    mMaxHeight(maxHeight), mUpAxis(upAxis), mIntegerHeightScale(integerHeightScale),
                    mHeightDataType(dataType) {
diff --git a/src/collision/shapes/HeightFieldShape.h b/src/collision/shapes/HeightFieldShape.h
index 49adff48..ae7b4c62 100644
--- a/src/collision/shapes/HeightFieldShape.h
+++ b/src/collision/shapes/HeightFieldShape.h
@@ -84,7 +84,7 @@ class HeightFieldShape : public ConcaveShape {
     public:
 
         /// Data type for the height data of the height field
-        enum HeightDataType {HEIGHT_FLOAT_TYPE, HEIGHT_DOUBLE_TYPE, HEIGHT_INT_TYPE};
+        enum class HeightDataType {HEIGHT_FLOAT_TYPE, HEIGHT_DOUBLE_TYPE, HEIGHT_INT_TYPE};
 
     protected:
 
@@ -125,12 +125,6 @@ class HeightFieldShape : public ConcaveShape {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        HeightFieldShape(const HeightFieldShape& shape);
-
-        /// Private assignment operator
-        HeightFieldShape& operator=(const HeightFieldShape& shape);
-
         /// Raycast method with feedback information
         virtual bool raycast(const Ray& ray, RaycastInfo& raycastInfo, ProxyShape* proxyShape) const;
 
@@ -165,7 +159,13 @@ class HeightFieldShape : public ConcaveShape {
                          int upAxis = 1, decimal integerHeightScale = 1.0f);
 
         /// Destructor
-        ~HeightFieldShape();
+        virtual ~HeightFieldShape();
+
+        /// Deleted copy-constructor
+        HeightFieldShape(const HeightFieldShape& shape) = delete;
+
+        /// Deleted assignment operator
+        HeightFieldShape& operator=(const HeightFieldShape& shape) = delete;
 
         /// Return the number of rows in the height field
         int getNbRows() const;
@@ -223,9 +223,9 @@ inline void HeightFieldShape::setLocalScaling(const Vector3& scaling) {
 inline decimal HeightFieldShape::getHeightAt(int x, int y) const {
 
     switch(mHeightDataType) {
-        case HEIGHT_FLOAT_TYPE : return ((float*)mHeightFieldData)[y * mNbColumns + x];
-        case HEIGHT_DOUBLE_TYPE : return ((double*)mHeightFieldData)[y * mNbColumns + x];
-        case HEIGHT_INT_TYPE : return ((int*)mHeightFieldData)[y * mNbColumns + x] * mIntegerHeightScale;
+        case HeightDataType::HEIGHT_FLOAT_TYPE : return ((float*)mHeightFieldData)[y * mNbColumns + x];
+        case HeightDataType::HEIGHT_DOUBLE_TYPE : return ((double*)mHeightFieldData)[y * mNbColumns + x];
+        case HeightDataType::HEIGHT_INT_TYPE : return ((int*)mHeightFieldData)[y * mNbColumns + x] * mIntegerHeightScale;
         default: assert(false); return 0;
     }
 }
diff --git a/src/collision/shapes/SphereShape.cpp b/src/collision/shapes/SphereShape.cpp
index 549a6359..50c2e94d 100644
--- a/src/collision/shapes/SphereShape.cpp
+++ b/src/collision/shapes/SphereShape.cpp
@@ -35,7 +35,7 @@ using namespace reactphysics3d;
 /**
  * @param radius Radius of the sphere (in meters)
  */
-SphereShape::SphereShape(decimal radius) : ConvexShape(SPHERE, radius) {
+SphereShape::SphereShape(decimal radius) : ConvexShape(CollisionShapeType::SPHERE, radius) {
     assert(radius > decimal(0.0));
 }
 
diff --git a/src/collision/shapes/SphereShape.h b/src/collision/shapes/SphereShape.h
index a1316ae0..c8157952 100644
--- a/src/collision/shapes/SphereShape.h
+++ b/src/collision/shapes/SphereShape.h
@@ -51,12 +51,6 @@ class SphereShape : public ConvexShape {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        SphereShape(const SphereShape& shape);
-
-        /// Private assignment operator
-        SphereShape& operator=(const SphereShape& shape);
-
         /// Return a local support point in a given direction without the object margin
         virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction,
                                                           void** cachedCollisionData) const;
@@ -80,6 +74,12 @@ class SphereShape : public ConvexShape {
         /// Destructor
         virtual ~SphereShape();
 
+        /// Deleted copy-constructor
+        SphereShape(const SphereShape& shape) = delete;
+
+        /// Deleted assignment operator
+        SphereShape& operator=(const SphereShape& shape) = delete;
+
         /// Return the radius of the sphere
         decimal getRadius() const;
 
diff --git a/src/collision/shapes/TriangleShape.cpp b/src/collision/shapes/TriangleShape.cpp
index 24bd3fda..065b7526 100644
--- a/src/collision/shapes/TriangleShape.cpp
+++ b/src/collision/shapes/TriangleShape.cpp
@@ -40,11 +40,11 @@ using namespace reactphysics3d;
  * @param margin The collision margin (in meters) around the collision shape
  */
 TriangleShape::TriangleShape(const Vector3& point1, const Vector3& point2, const Vector3& point3, decimal margin)
-              : ConvexShape(TRIANGLE, margin) {
+              : ConvexShape(CollisionShapeType::TRIANGLE, margin) {
     mPoints[0] = point1;
     mPoints[1] = point2;
     mPoints[2] = point3;
-    mRaycastTestType = FRONT;
+    mRaycastTestType = TriangleRaycastSide::FRONT;
 }
 
 // Destructor
@@ -68,32 +68,32 @@ bool TriangleShape::raycast(const Ray& ray, RaycastInfo& raycastInfo, ProxyShape
     // product for this test.
     const Vector3 m = pq.cross(pc);
     decimal u = pb.dot(m);
-    if (mRaycastTestType == FRONT) {
+    if (mRaycastTestType == TriangleRaycastSide::FRONT) {
         if (u < decimal(0.0)) return false;
     }
-    else if (mRaycastTestType == BACK) {
+    else if (mRaycastTestType == TriangleRaycastSide::BACK) {
         if (u > decimal(0.0)) return false;
     }
 
     decimal v = -pa.dot(m);
-    if (mRaycastTestType == FRONT) {
+    if (mRaycastTestType == TriangleRaycastSide::FRONT) {
         if (v < decimal(0.0)) return false;
     }
-    else if (mRaycastTestType == BACK) {
+    else if (mRaycastTestType == TriangleRaycastSide::BACK) {
         if (v > decimal(0.0)) return false;
     }
-    else if (mRaycastTestType == FRONT_AND_BACK) {
+    else if (mRaycastTestType == TriangleRaycastSide::FRONT_AND_BACK) {
         if (!sameSign(u, v)) return false;
     }
 
     decimal w = pa.dot(pq.cross(pb));
-    if (mRaycastTestType == FRONT) {
+    if (mRaycastTestType == TriangleRaycastSide::FRONT) {
         if (w < decimal(0.0)) return false;
     }
-    else if (mRaycastTestType == BACK) {
+    else if (mRaycastTestType == TriangleRaycastSide::BACK) {
         if (w > decimal(0.0)) return false;
     }
-    else if (mRaycastTestType == FRONT_AND_BACK) {
+    else if (mRaycastTestType == TriangleRaycastSide::FRONT_AND_BACK) {
         if (!sameSign(u, w)) return false;
     }
 
diff --git a/src/collision/shapes/TriangleShape.h b/src/collision/shapes/TriangleShape.h
index 1b9f3681..02757b88 100644
--- a/src/collision/shapes/TriangleShape.h
+++ b/src/collision/shapes/TriangleShape.h
@@ -34,7 +34,7 @@
 namespace reactphysics3d {
 
 /// Raycast test side for the triangle
-enum TriangleRaycastSide {
+enum class TriangleRaycastSide {
 
     /// Raycast against front triangle
     FRONT,
@@ -65,12 +65,6 @@ class TriangleShape : public ConvexShape {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        TriangleShape(const TriangleShape& shape);
-
-        /// Private assignment operator
-        TriangleShape& operator=(const TriangleShape& shape);
-
         /// Return a local support point in a given direction without the object margin
         virtual Vector3 getLocalSupportPointWithoutMargin(const Vector3& direction,
                                                           void** cachedCollisionData) const;
@@ -95,6 +89,12 @@ class TriangleShape : public ConvexShape {
         /// Destructor
         virtual ~TriangleShape();
 
+        /// Deleted copy-constructor
+        TriangleShape(const TriangleShape& shape) = delete;
+
+        /// Deleted assignment operator
+        TriangleShape& operator=(const TriangleShape& shape) = delete;
+
         /// Return the local bounds of the shape in x, y and z directions.
         virtual void getLocalBounds(Vector3& min, Vector3& max) const;
 
diff --git a/src/configuration.h b/src/configuration.h
index a39117cc..731071fd 100644
--- a/src/configuration.h
+++ b/src/configuration.h
@@ -61,7 +61,7 @@ using uint32 = unsigned int;
 /// Position correction technique used in the constraint solver (for joints).
 /// BAUMGARTE_JOINTS : Faster but can be innacurate in some situations.
 /// NON_LINEAR_GAUSS_SEIDEL : Slower but more precise. This is the option used by default.
-enum JointsPositionCorrectionTechnique {BAUMGARTE_JOINTS, NON_LINEAR_GAUSS_SEIDEL};
+enum class JointsPositionCorrectionTechnique {BAUMGARTE_JOINTS, NON_LINEAR_GAUSS_SEIDEL};
 
 /// Position correction technique used in the contact solver (for contacts)
 /// BAUMGARTE_CONTACTS : Faster but can be innacurate and can lead to unexpected bounciness
@@ -69,7 +69,7 @@ enum JointsPositionCorrectionTechnique {BAUMGARTE_JOINTS, NON_LINEAR_GAUSS_SEIDE
 ///                      the bodies momentum).
 /// SPLIT_IMPULSES : A bit slower but the error correction factor is not added to the
 ///                 bodies momentum. This is the option used by default.
-enum ContactsPositionCorrectionTechnique {BAUMGARTE_CONTACTS, SPLIT_IMPULSES};
+enum class ContactsPositionCorrectionTechnique {BAUMGARTE_CONTACTS, SPLIT_IMPULSES};
 
 // ------------------- Constants ------------------- //
 
diff --git a/src/constraint/BallAndSocketJoint.cpp b/src/constraint/BallAndSocketJoint.cpp
index 275b5643..8883d3e7 100644
--- a/src/constraint/BallAndSocketJoint.cpp
+++ b/src/constraint/BallAndSocketJoint.cpp
@@ -81,13 +81,13 @@ void BallAndSocketJoint::initBeforeSolve(const ConstraintSolverData& constraintS
 
     // Compute the inverse mass matrix K^-1
     mInverseMassMatrix.setToZero();
-    if (mBody1->getType() == DYNAMIC || mBody2->getType() == DYNAMIC) {
+    if (mBody1->getType() == BodyType::DYNAMIC || mBody2->getType() == BodyType::DYNAMIC) {
         mInverseMassMatrix = massMatrix.getInverse();
     }
 
     // Compute the bias "b" of the constraint
     mBiasVector.setToZero();
-    if (mPositionCorrectionTechnique == BAUMGARTE_JOINTS) {
+    if (mPositionCorrectionTechnique == JointsPositionCorrectionTechnique::BAUMGARTE_JOINTS) {
         decimal biasFactor = (BETA / constraintSolverData.timeStep);
         mBiasVector = biasFactor * (x2 + mR2World - x1 - mR1World);
     }
@@ -162,7 +162,7 @@ void BallAndSocketJoint::solvePositionConstraint(const ConstraintSolverData& con
 
     // If the error position correction technique is not the non-linear-gauss-seidel, we do
     // do not execute this method
-    if (mPositionCorrectionTechnique != NON_LINEAR_GAUSS_SEIDEL) return;
+    if (mPositionCorrectionTechnique != JointsPositionCorrectionTechnique::NON_LINEAR_GAUSS_SEIDEL) return;
 
     // Get the bodies center of mass and orientations
     Vector3& x1 = constraintSolverData.positions[mIndexBody1];
@@ -194,7 +194,7 @@ void BallAndSocketJoint::solvePositionConstraint(const ConstraintSolverData& con
                            skewSymmetricMatrixU1 * mI1 * skewSymmetricMatrixU1.getTranspose() +
                            skewSymmetricMatrixU2 * mI2 * skewSymmetricMatrixU2.getTranspose();
     mInverseMassMatrix.setToZero();
-    if (mBody1->getType() == DYNAMIC || mBody2->getType() == DYNAMIC) {
+    if (mBody1->getType() == BodyType::DYNAMIC || mBody2->getType() == BodyType::DYNAMIC) {
         mInverseMassMatrix = massMatrix.getInverse();
     }
 
diff --git a/src/constraint/BallAndSocketJoint.h b/src/constraint/BallAndSocketJoint.h
index f4671e87..bc37b63e 100644
--- a/src/constraint/BallAndSocketJoint.h
+++ b/src/constraint/BallAndSocketJoint.h
@@ -55,7 +55,7 @@ struct BallAndSocketJointInfo : public JointInfo {
          */
         BallAndSocketJointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2,
                                const Vector3& initAnchorPointWorldSpace)
-                              : JointInfo(rigidBody1, rigidBody2, BALLSOCKETJOINT),
+                              : JointInfo(rigidBody1, rigidBody2, JointType::BALLSOCKETJOINT),
                                 anchorPointWorldSpace(initAnchorPointWorldSpace) {}
 };
 
@@ -105,12 +105,6 @@ class BallAndSocketJoint : public Joint {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        BallAndSocketJoint(const BallAndSocketJoint& constraint);
-
-        /// Private assignment operator
-        BallAndSocketJoint& operator=(const BallAndSocketJoint& constraint);
-
         /// Return the number of bytes used by the joint
         virtual size_t getSizeInBytes() const;
 
@@ -135,6 +129,12 @@ class BallAndSocketJoint : public Joint {
 
         /// Destructor
         virtual ~BallAndSocketJoint();
+
+        /// Deleted copy-constructor
+        BallAndSocketJoint(const BallAndSocketJoint& constraint) = delete;
+
+        /// Deleted assignment operator
+        BallAndSocketJoint& operator=(const BallAndSocketJoint& constraint) = delete;
 };
 
 // Return the number of bytes used by the joint
diff --git a/src/constraint/ContactPoint.h b/src/constraint/ContactPoint.h
index 9b172e6c..b7fef547 100644
--- a/src/constraint/ContactPoint.h
+++ b/src/constraint/ContactPoint.h
@@ -142,14 +142,6 @@ class ContactPoint {
 
         /// Cached rolling resistance impulse
         Vector3 mRollingResistanceImpulse;
-        
-        // -------------------- Methods -------------------- //
-
-        /// Private copy-constructor
-        ContactPoint(const ContactPoint& contact);
-
-        /// Private assignment operator
-        ContactPoint& operator=(const ContactPoint& contact);
 
     public :
 
@@ -161,6 +153,12 @@ class ContactPoint {
         /// Destructor
         ~ContactPoint();
 
+        /// Deleted copy-constructor
+        ContactPoint(const ContactPoint& contact) = delete;
+
+        /// Deleted assignment operator
+        ContactPoint& operator=(const ContactPoint& contact) = delete;
+
         /// Return the reference to the body 1
         CollisionBody* getBody1() const;
 
diff --git a/src/constraint/FixedJoint.cpp b/src/constraint/FixedJoint.cpp
index 57c8d8c6..f17d0b9e 100644
--- a/src/constraint/FixedJoint.cpp
+++ b/src/constraint/FixedJoint.cpp
@@ -89,27 +89,27 @@ void FixedJoint::initBeforeSolve(const ConstraintSolverData& constraintSolverDat
 
     // Compute the inverse mass matrix K^-1 for the 3 translation constraints
     mInverseMassMatrixTranslation.setToZero();
-    if (mBody1->getType() == DYNAMIC || mBody2->getType() == DYNAMIC) {
+    if (mBody1->getType() == BodyType::DYNAMIC || mBody2->getType() == BodyType::DYNAMIC) {
         mInverseMassMatrixTranslation = massMatrix.getInverse();
     }
 
     // Compute the bias "b" of the constraint for the 3 translation constraints
     decimal biasFactor = (BETA / constraintSolverData.timeStep);
     mBiasTranslation.setToZero();
-    if (mPositionCorrectionTechnique == BAUMGARTE_JOINTS) {
+    if (mPositionCorrectionTechnique == JointsPositionCorrectionTechnique::BAUMGARTE_JOINTS) {
         mBiasTranslation = biasFactor * (x2 + mR2World - x1 - mR1World);
     }
 
     // Compute the inverse of the mass matrix K=JM^-1J^t for the 3 rotation
     // contraints (3x3 matrix)
     mInverseMassMatrixRotation = mI1 + mI2;
-    if (mBody1->getType() == DYNAMIC || mBody2->getType() == DYNAMIC) {
+    if (mBody1->getType() == BodyType::DYNAMIC || mBody2->getType() == BodyType::DYNAMIC) {
         mInverseMassMatrixRotation = mInverseMassMatrixRotation.getInverse();
     }
 
     // Compute the bias "b" for the 3 rotation constraints
     mBiasRotation.setToZero();
-    if (mPositionCorrectionTechnique == BAUMGARTE_JOINTS) {
+    if (mPositionCorrectionTechnique == JointsPositionCorrectionTechnique::BAUMGARTE_JOINTS) {
         Quaternion currentOrientationDifference = orientationBody2 * orientationBody1.getInverse();
         currentOrientationDifference.normalize();
         const Quaternion qError = currentOrientationDifference * mInitOrientationDifferenceInv;
@@ -222,7 +222,7 @@ void FixedJoint::solvePositionConstraint(const ConstraintSolverData& constraintS
 
     // If the error position correction technique is not the non-linear-gauss-seidel, we do
     // do not execute this method
-    if (mPositionCorrectionTechnique != NON_LINEAR_GAUSS_SEIDEL) return;
+    if (mPositionCorrectionTechnique != JointsPositionCorrectionTechnique::NON_LINEAR_GAUSS_SEIDEL) return;
 
     // Get the bodies positions and orientations
     Vector3& x1 = constraintSolverData.positions[mIndexBody1];
@@ -256,7 +256,7 @@ void FixedJoint::solvePositionConstraint(const ConstraintSolverData& constraintS
                            skewSymmetricMatrixU1 * mI1 * skewSymmetricMatrixU1.getTranspose() +
                            skewSymmetricMatrixU2 * mI2 * skewSymmetricMatrixU2.getTranspose();
     mInverseMassMatrixTranslation.setToZero();
-    if (mBody1->getType() == DYNAMIC || mBody2->getType() == DYNAMIC) {
+    if (mBody1->getType() == BodyType::DYNAMIC || mBody2->getType() == BodyType::DYNAMIC) {
         mInverseMassMatrixTranslation = massMatrix.getInverse();
     }
 
@@ -296,7 +296,7 @@ void FixedJoint::solvePositionConstraint(const ConstraintSolverData& constraintS
     // Compute the inverse of the mass matrix K=JM^-1J^t for the 3 rotation
     // contraints (3x3 matrix)
     mInverseMassMatrixRotation = mI1 + mI2;
-    if (mBody1->getType() == DYNAMIC || mBody2->getType() == DYNAMIC) {
+    if (mBody1->getType() == BodyType::DYNAMIC || mBody2->getType() == BodyType::DYNAMIC) {
         mInverseMassMatrixRotation = mInverseMassMatrixRotation.getInverse();
     }
 
diff --git a/src/constraint/FixedJoint.h b/src/constraint/FixedJoint.h
index aa9f2798..974f1b79 100644
--- a/src/constraint/FixedJoint.h
+++ b/src/constraint/FixedJoint.h
@@ -55,7 +55,7 @@ struct FixedJointInfo : public JointInfo {
          */
         FixedJointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2,
                        const Vector3& initAnchorPointWorldSpace)
-                       : JointInfo(rigidBody1, rigidBody2, FIXEDJOINT),
+                       : JointInfo(rigidBody1, rigidBody2, JointType::FIXEDJOINT),
                          anchorPointWorldSpace(initAnchorPointWorldSpace){}
 };
 
@@ -116,12 +116,6 @@ class FixedJoint : public Joint {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        FixedJoint(const FixedJoint& constraint);
-
-        /// Private assignment operator
-        FixedJoint& operator=(const FixedJoint& constraint);
-
         /// Return the number of bytes used by the joint
         virtual size_t getSizeInBytes() const;
 
@@ -146,6 +140,12 @@ class FixedJoint : public Joint {
 
         /// Destructor
         virtual ~FixedJoint();
+
+        /// Deleted copy-constructor
+        FixedJoint(const FixedJoint& constraint) = delete;
+
+        /// Deleted assignment operator
+        FixedJoint& operator=(const FixedJoint& constraint) = delete;
 };
 
 // Return the number of bytes used by the joint
diff --git a/src/constraint/HingeJoint.cpp b/src/constraint/HingeJoint.cpp
index e64cbde8..01563de4 100644
--- a/src/constraint/HingeJoint.cpp
+++ b/src/constraint/HingeJoint.cpp
@@ -129,14 +129,14 @@ void HingeJoint::initBeforeSolve(const ConstraintSolverData& constraintSolverDat
                            skewSymmetricMatrixU1 * mI1 * skewSymmetricMatrixU1.getTranspose() +
                            skewSymmetricMatrixU2 * mI2 * skewSymmetricMatrixU2.getTranspose();
     mInverseMassMatrixTranslation.setToZero();
-    if (mBody1->getType() == DYNAMIC || mBody2->getType() == DYNAMIC) {
+    if (mBody1->getType() == BodyType::DYNAMIC || mBody2->getType() == BodyType::DYNAMIC) {
         mInverseMassMatrixTranslation = massMatrix.getInverse();
     }
 
     // Compute the bias "b" of the translation constraints
     mBTranslation.setToZero();
     decimal biasFactor = (BETA / constraintSolverData.timeStep);
-    if (mPositionCorrectionTechnique == BAUMGARTE_JOINTS) {
+    if (mPositionCorrectionTechnique == JointsPositionCorrectionTechnique::BAUMGARTE_JOINTS) {
         mBTranslation = biasFactor * (x2 + mR2World - x1 - mR1World);
     }
 
@@ -155,13 +155,13 @@ void HingeJoint::initBeforeSolve(const ConstraintSolverData& constraintSolverDat
                          mC2CrossA1.dot(I2C2CrossA1);
     const Matrix2x2 matrixKRotation(el11, el12, el21, el22);
     mInverseMassMatrixRotation.setToZero();
-    if (mBody1->getType() == DYNAMIC || mBody2->getType() == DYNAMIC) {
+    if (mBody1->getType() == BodyType::DYNAMIC || mBody2->getType() == BodyType::DYNAMIC) {
         mInverseMassMatrixRotation = matrixKRotation.getInverse();
     }
 
     // Compute the bias "b" of the rotation constraints
     mBRotation.setToZero();
-    if (mPositionCorrectionTechnique == BAUMGARTE_JOINTS) {
+    if (mPositionCorrectionTechnique == JointsPositionCorrectionTechnique::BAUMGARTE_JOINTS) {
         mBRotation = biasFactor * Vector2(mA1.dot(b2), mA1.dot(c2));
     }
 
@@ -188,13 +188,13 @@ void HingeJoint::initBeforeSolve(const ConstraintSolverData& constraintSolverDat
 
             // Compute the bias "b" of the lower limit constraint
             mBLowerLimit = 0.0;
-            if (mPositionCorrectionTechnique == BAUMGARTE_JOINTS) {
+            if (mPositionCorrectionTechnique == JointsPositionCorrectionTechnique::BAUMGARTE_JOINTS) {
                 mBLowerLimit = biasFactor * lowerLimitError;
             }
 
             // Compute the bias "b" of the upper limit constraint
             mBUpperLimit = 0.0;
-            if (mPositionCorrectionTechnique == BAUMGARTE_JOINTS) {
+            if (mPositionCorrectionTechnique == JointsPositionCorrectionTechnique::BAUMGARTE_JOINTS) {
                 mBUpperLimit = biasFactor * upperLimitError;
             }
         }
@@ -408,7 +408,7 @@ void HingeJoint::solvePositionConstraint(const ConstraintSolverData& constraintS
 
     // If the error position correction technique is not the non-linear-gauss-seidel, we do
     // do not execute this method
-    if (mPositionCorrectionTechnique != NON_LINEAR_GAUSS_SEIDEL) return;
+    if (mPositionCorrectionTechnique != JointsPositionCorrectionTechnique::NON_LINEAR_GAUSS_SEIDEL) return;
 
     // Get the bodies positions and orientations
     Vector3& x1 = constraintSolverData.positions[mIndexBody1];
@@ -461,7 +461,7 @@ void HingeJoint::solvePositionConstraint(const ConstraintSolverData& constraintS
                            skewSymmetricMatrixU1 * mI1 * skewSymmetricMatrixU1.getTranspose() +
                            skewSymmetricMatrixU2 * mI2 * skewSymmetricMatrixU2.getTranspose();
     mInverseMassMatrixTranslation.setToZero();
-    if (mBody1->getType() == DYNAMIC || mBody2->getType() == DYNAMIC) {
+    if (mBody1->getType() == BodyType::DYNAMIC || mBody2->getType() == BodyType::DYNAMIC) {
         mInverseMassMatrixTranslation = massMatrix.getInverse();
     }
 
@@ -513,7 +513,7 @@ void HingeJoint::solvePositionConstraint(const ConstraintSolverData& constraintS
                          mC2CrossA1.dot(I2C2CrossA1);
     const Matrix2x2 matrixKRotation(el11, el12, el21, el22);
     mInverseMassMatrixRotation.setToZero();
-    if (mBody1->getType() == DYNAMIC || mBody2->getType() == DYNAMIC) {
+    if (mBody1->getType() == BodyType::DYNAMIC || mBody2->getType() == BodyType::DYNAMIC) {
         mInverseMassMatrixRotation = matrixKRotation.getInverse();
     }
 
diff --git a/src/constraint/HingeJoint.h b/src/constraint/HingeJoint.h
index 662c7e5c..bebd19c8 100644
--- a/src/constraint/HingeJoint.h
+++ b/src/constraint/HingeJoint.h
@@ -82,7 +82,7 @@ struct HingeJointInfo : public JointInfo {
         HingeJointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2,
                                const Vector3& initAnchorPointWorldSpace,
                                const Vector3& initRotationAxisWorld)
-                              : JointInfo(rigidBody1, rigidBody2, HINGEJOINT),
+                              : JointInfo(rigidBody1, rigidBody2, JointType::HINGEJOINT),
                                 anchorPointWorldSpace(initAnchorPointWorldSpace),
                                 rotationAxisWorld(initRotationAxisWorld), isLimitEnabled(false),
                                 isMotorEnabled(false), minAngleLimit(-1), maxAngleLimit(1),
@@ -101,7 +101,7 @@ struct HingeJointInfo : public JointInfo {
                                const Vector3& initAnchorPointWorldSpace,
                                const Vector3& initRotationAxisWorld,
                                decimal initMinAngleLimit, decimal initMaxAngleLimit)
-                              : JointInfo(rigidBody1, rigidBody2, HINGEJOINT),
+                              : JointInfo(rigidBody1, rigidBody2, JointType::HINGEJOINT),
                                 anchorPointWorldSpace(initAnchorPointWorldSpace),
                                 rotationAxisWorld(initRotationAxisWorld), isLimitEnabled(true),
                                 isMotorEnabled(false), minAngleLimit(initMinAngleLimit),
@@ -124,7 +124,7 @@ struct HingeJointInfo : public JointInfo {
                                const Vector3& initRotationAxisWorld,
                                decimal initMinAngleLimit, decimal initMaxAngleLimit,
                                decimal initMotorSpeed, decimal initMaxMotorTorque)
-                              : JointInfo(rigidBody1, rigidBody2, HINGEJOINT),
+                              : JointInfo(rigidBody1, rigidBody2, JointType::HINGEJOINT),
                                 anchorPointWorldSpace(initAnchorPointWorldSpace),
                                 rotationAxisWorld(initRotationAxisWorld), isLimitEnabled(true),
                                 isMotorEnabled(false), minAngleLimit(initMinAngleLimit),
@@ -250,12 +250,6 @@ class HingeJoint : public Joint {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        HingeJoint(const HingeJoint& constraint);
-
-        /// Private assignment operator
-        HingeJoint& operator=(const HingeJoint& constraint);
-
         /// Reset the limits
         void resetLimits();
 
@@ -298,6 +292,12 @@ class HingeJoint : public Joint {
         /// Destructor
         virtual ~HingeJoint();
 
+        /// Deleted copy-constructor
+        HingeJoint(const HingeJoint& constraint) = delete;
+
+        /// Deleted assignment operator
+        HingeJoint& operator=(const HingeJoint& constraint) = delete;
+
         /// Return true if the limits or the joint are enabled
         bool isLimitEnabled() const;
 
diff --git a/src/constraint/Joint.h b/src/constraint/Joint.h
index 66ed1f28..eb73f87f 100644
--- a/src/constraint/Joint.h
+++ b/src/constraint/Joint.h
@@ -35,7 +35,7 @@
 namespace reactphysics3d {
 
 /// Enumeration for the type of a constraint
-enum JointType {BALLSOCKETJOINT, SLIDERJOINT, HINGEJOINT, FIXEDJOINT};
+enum class JointType {BALLSOCKETJOINT, SLIDERJOINT, HINGEJOINT, FIXEDJOINT};
 
 // Class declarations
 struct ConstraintSolverData;
@@ -95,13 +95,13 @@ struct JointInfo {
         /// Constructor
         JointInfo(JointType constraintType)
                       : body1(nullptr), body2(nullptr), type(constraintType),
-                        positionCorrectionTechnique(NON_LINEAR_GAUSS_SEIDEL),
+                        positionCorrectionTechnique(JointsPositionCorrectionTechnique::NON_LINEAR_GAUSS_SEIDEL),
                         isCollisionEnabled(true) {}
 
         /// Constructor
         JointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2, JointType constraintType)
                       : body1(rigidBody1), body2(rigidBody2), type(constraintType),
-                        positionCorrectionTechnique(NON_LINEAR_GAUSS_SEIDEL),
+                        positionCorrectionTechnique(JointsPositionCorrectionTechnique::NON_LINEAR_GAUSS_SEIDEL),
                         isCollisionEnabled(true) {
         }
 
@@ -146,12 +146,6 @@ class Joint {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        Joint(const Joint& constraint);
-
-        /// Private assignment operator
-        Joint& operator=(const Joint& constraint);
-
         /// Return true if the joint has already been added into an island
         bool isAlreadyInIsland() const;
 
@@ -180,6 +174,12 @@ class Joint {
         /// Destructor
         virtual ~Joint();
 
+        /// Deleted copy-constructor
+        Joint(const Joint& constraint) = delete;
+
+        /// Deleted assignment operator
+        Joint& operator=(const Joint& constraint) = delete;
+
         /// Return the reference to the body 1
         RigidBody* getBody1() const;
 
diff --git a/src/constraint/SliderJoint.cpp b/src/constraint/SliderJoint.cpp
index 99a5c834..a1904174 100644
--- a/src/constraint/SliderJoint.cpp
+++ b/src/constraint/SliderJoint.cpp
@@ -139,14 +139,14 @@ void SliderJoint::initBeforeSolve(const ConstraintSolverData& constraintSolverDa
                          mR2CrossN2.dot(I2R2CrossN2);
     Matrix2x2 matrixKTranslation(el11, el12, el21, el22);
     mInverseMassMatrixTranslationConstraint.setToZero();
-    if (mBody1->getType() == DYNAMIC || mBody2->getType() == DYNAMIC) {
+    if (mBody1->getType() == BodyType::DYNAMIC || mBody2->getType() == BodyType::DYNAMIC) {
         mInverseMassMatrixTranslationConstraint = matrixKTranslation.getInverse();
     }
 
     // Compute the bias "b" of the translation constraint
     mBTranslation.setToZero();
     decimal biasFactor = (BETA / constraintSolverData.timeStep);
-    if (mPositionCorrectionTechnique == BAUMGARTE_JOINTS) {
+    if (mPositionCorrectionTechnique == JointsPositionCorrectionTechnique::BAUMGARTE_JOINTS) {
         mBTranslation.x = u.dot(mN1);
         mBTranslation.y = u.dot(mN2);
         mBTranslation *= biasFactor;
@@ -155,13 +155,13 @@ void SliderJoint::initBeforeSolve(const ConstraintSolverData& constraintSolverDa
     // Compute the inverse of the mass matrix K=JM^-1J^t for the 3 rotation
     // contraints (3x3 matrix)
     mInverseMassMatrixRotationConstraint = mI1 + mI2;
-    if (mBody1->getType() == DYNAMIC || mBody2->getType() == DYNAMIC) {
+    if (mBody1->getType() == BodyType::DYNAMIC || mBody2->getType() == BodyType::DYNAMIC) {
         mInverseMassMatrixRotationConstraint = mInverseMassMatrixRotationConstraint.getInverse();
     }
 
     // Compute the bias "b" of the rotation constraint
     mBRotation.setToZero();
-    if (mPositionCorrectionTechnique == BAUMGARTE_JOINTS) {
+    if (mPositionCorrectionTechnique == JointsPositionCorrectionTechnique::BAUMGARTE_JOINTS) {
         Quaternion currentOrientationDifference = orientationBody2 * orientationBody1.getInverse();
         currentOrientationDifference.normalize();
         const Quaternion qError = currentOrientationDifference * mInitOrientationDifferenceInv;
@@ -180,13 +180,13 @@ void SliderJoint::initBeforeSolve(const ConstraintSolverData& constraintSolverDa
 
         // Compute the bias "b" of the lower limit constraint
         mBLowerLimit = 0.0;
-        if (mPositionCorrectionTechnique == BAUMGARTE_JOINTS) {
+        if (mPositionCorrectionTechnique == JointsPositionCorrectionTechnique::BAUMGARTE_JOINTS) {
             mBLowerLimit = biasFactor * lowerLimitError;
         }
 
         // Compute the bias "b" of the upper limit constraint
         mBUpperLimit = 0.0;
-        if (mPositionCorrectionTechnique == BAUMGARTE_JOINTS) {
+        if (mPositionCorrectionTechnique == JointsPositionCorrectionTechnique::BAUMGARTE_JOINTS) {
             mBUpperLimit = biasFactor * upperLimitError;
         }
     }
@@ -433,7 +433,7 @@ void SliderJoint::solvePositionConstraint(const ConstraintSolverData& constraint
 
     // If the error position correction technique is not the non-linear-gauss-seidel, we do
     // do not execute this method
-    if (mPositionCorrectionTechnique != NON_LINEAR_GAUSS_SEIDEL) return;
+    if (mPositionCorrectionTechnique != JointsPositionCorrectionTechnique::NON_LINEAR_GAUSS_SEIDEL) return;
 
     // Get the bodies positions and orientations
     Vector3& x1 = constraintSolverData.positions[mIndexBody1];
@@ -497,7 +497,7 @@ void SliderJoint::solvePositionConstraint(const ConstraintSolverData& constraint
                          mR2CrossN2.dot(I2R2CrossN2);
     Matrix2x2 matrixKTranslation(el11, el12, el21, el22);
     mInverseMassMatrixTranslationConstraint.setToZero();
-    if (mBody1->getType() == DYNAMIC || mBody2->getType() == DYNAMIC) {
+    if (mBody1->getType() == BodyType::DYNAMIC || mBody2->getType() == BodyType::DYNAMIC) {
         mInverseMassMatrixTranslationConstraint = matrixKTranslation.getInverse();
     }
 
@@ -540,7 +540,7 @@ void SliderJoint::solvePositionConstraint(const ConstraintSolverData& constraint
     // Compute the inverse of the mass matrix K=JM^-1J^t for the 3 rotation
     // contraints (3x3 matrix)
     mInverseMassMatrixRotationConstraint = mI1 + mI2;
-    if (mBody1->getType() == DYNAMIC || mBody2->getType() == DYNAMIC) {
+    if (mBody1->getType() == BodyType::DYNAMIC || mBody2->getType() == BodyType::DYNAMIC) {
         mInverseMassMatrixRotationConstraint = mInverseMassMatrixRotationConstraint.getInverse();
     }
 
diff --git a/src/constraint/SliderJoint.h b/src/constraint/SliderJoint.h
index c40526d4..a4f359da 100644
--- a/src/constraint/SliderJoint.h
+++ b/src/constraint/SliderJoint.h
@@ -77,7 +77,7 @@ struct SliderJointInfo : public JointInfo {
         SliderJointInfo(RigidBody* rigidBody1, RigidBody* rigidBody2,
                         const Vector3& initAnchorPointWorldSpace,
                         const Vector3& initSliderAxisWorldSpace)
-                       : JointInfo(rigidBody1, rigidBody2, SLIDERJOINT),
+                       : JointInfo(rigidBody1, rigidBody2, JointType::SLIDERJOINT),
                          anchorPointWorldSpace(initAnchorPointWorldSpace),
                          sliderAxisWorldSpace(initSliderAxisWorldSpace),
                          isLimitEnabled(false), isMotorEnabled(false), minTranslationLimit(-1.0),
@@ -96,7 +96,7 @@ struct SliderJointInfo : public JointInfo {
                         const Vector3& initAnchorPointWorldSpace,
                         const Vector3& initSliderAxisWorldSpace,
                         decimal initMinTranslationLimit, decimal initMaxTranslationLimit)
-                       : JointInfo(rigidBody1, rigidBody2, SLIDERJOINT),
+                       : JointInfo(rigidBody1, rigidBody2, JointType::SLIDERJOINT),
                          anchorPointWorldSpace(initAnchorPointWorldSpace),
                          sliderAxisWorldSpace(initSliderAxisWorldSpace),
                          isLimitEnabled(true), isMotorEnabled(false),
@@ -120,7 +120,7 @@ struct SliderJointInfo : public JointInfo {
                         const Vector3& initSliderAxisWorldSpace,
                         decimal initMinTranslationLimit, decimal initMaxTranslationLimit,
                         decimal initMotorSpeed, decimal initMaxMotorForce)
-                       : JointInfo(rigidBody1, rigidBody2, SLIDERJOINT),
+                       : JointInfo(rigidBody1, rigidBody2, JointType::SLIDERJOINT),
                          anchorPointWorldSpace(initAnchorPointWorldSpace),
                          sliderAxisWorldSpace(initSliderAxisWorldSpace),
                          isLimitEnabled(true), isMotorEnabled(true),
@@ -262,12 +262,6 @@ class SliderJoint : public Joint {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        SliderJoint(const SliderJoint& constraint);
-
-        /// Private assignment operator
-        SliderJoint& operator=(const SliderJoint& constraint);
-
         /// Reset the limits
         void resetLimits();
 
@@ -296,6 +290,12 @@ class SliderJoint : public Joint {
         /// Destructor
         virtual ~SliderJoint();
 
+        /// Deleted copy-constructor
+        SliderJoint(const SliderJoint& constraint) = delete;
+
+        /// Deleted assignment operator
+        SliderJoint& operator=(const SliderJoint& constraint) = delete;
+
         /// Return true if the limits or the joint are enabled
         bool isLimitEnabled() const;
 
diff --git a/src/engine/CollisionWorld.h b/src/engine/CollisionWorld.h
index 91560935..77189e89 100644
--- a/src/engine/CollisionWorld.h
+++ b/src/engine/CollisionWorld.h
@@ -80,12 +80,6 @@ class CollisionWorld {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        CollisionWorld(const CollisionWorld& world);
-
-        /// Private assignment operator
-        CollisionWorld& operator=(const CollisionWorld& world);
-
         /// Return the next available body ID
         bodyindex computeNextAvailableBodyID();
 
@@ -102,6 +96,12 @@ class CollisionWorld {
         /// Destructor
         virtual ~CollisionWorld();
 
+        /// Deleted copy-constructor
+        CollisionWorld(const CollisionWorld& world) = delete;
+
+        /// Deleted assignment operator
+        CollisionWorld& operator=(const CollisionWorld& world) = delete;
+
         /// Return an iterator to the beginning of the bodies of the physics world
         std::set<CollisionBody*>::iterator getBodiesBeginIterator();
 
diff --git a/src/engine/ContactSolver.cpp b/src/engine/ContactSolver.cpp
index f2ee0ef2..c3a0d0ef 100644
--- a/src/engine/ContactSolver.cpp
+++ b/src/engine/ContactSolver.cpp
@@ -105,8 +105,8 @@ void ContactSolver::initializeForIsland(decimal dt, Island* island) {
         internalManifold.frictionCoefficient = computeMixedFrictionCoefficient(body1, body2);
         internalManifold.rollingResistanceFactor = computeMixedRollingResistance(body1, body2);
         internalManifold.externalContactManifold = externalManifold;
-        internalManifold.isBody1DynamicType = body1->getType() == DYNAMIC;
-        internalManifold.isBody2DynamicType = body2->getType() == DYNAMIC;
+        internalManifold.isBody1DynamicType = body1->getType() == BodyType::DYNAMIC;
+        internalManifold.isBody2DynamicType = body2->getType() == BodyType::DYNAMIC;
 
         // If we solve the friction constraints at the center of the contact manifold
         if (mIsSolveFrictionAtContactManifoldCenterActive) {
diff --git a/src/engine/DynamicsWorld.cpp b/src/engine/DynamicsWorld.cpp
index b52e2378..2f601edd 100644
--- a/src/engine/DynamicsWorld.cpp
+++ b/src/engine/DynamicsWorld.cpp
@@ -503,7 +503,7 @@ Joint* DynamicsWorld::createJoint(const JointInfo& jointInfo) {
     switch(jointInfo.type) {
 
         // Ball-and-Socket joint
-        case BALLSOCKETJOINT:
+        case JointType::BALLSOCKETJOINT:
         {
             void* allocatedMemory = mMemoryAllocator.allocate(sizeof(BallAndSocketJoint));
             const BallAndSocketJointInfo& info = static_cast<const BallAndSocketJointInfo&>(
@@ -513,7 +513,7 @@ Joint* DynamicsWorld::createJoint(const JointInfo& jointInfo) {
         }
 
         // Slider joint
-        case SLIDERJOINT:
+        case JointType::SLIDERJOINT:
         {
             void* allocatedMemory = mMemoryAllocator.allocate(sizeof(SliderJoint));
             const SliderJointInfo& info = static_cast<const SliderJointInfo&>(jointInfo);
@@ -522,7 +522,7 @@ Joint* DynamicsWorld::createJoint(const JointInfo& jointInfo) {
         }
 
         // Hinge joint
-        case HINGEJOINT:
+        case JointType::HINGEJOINT:
         {
             void* allocatedMemory = mMemoryAllocator.allocate(sizeof(HingeJoint));
             const HingeJointInfo& info = static_cast<const HingeJointInfo&>(jointInfo);
@@ -531,7 +531,7 @@ Joint* DynamicsWorld::createJoint(const JointInfo& jointInfo) {
         }
 
         // Fixed joint
-        case FIXEDJOINT:
+        case JointType::FIXEDJOINT:
         {
             void* allocatedMemory = mMemoryAllocator.allocate(sizeof(FixedJoint));
             const FixedJointInfo& info = static_cast<const FixedJointInfo&>(jointInfo);
@@ -673,7 +673,7 @@ void DynamicsWorld::computeIslands() {
         if (body->mIsAlreadyInIsland) continue;
 
         // If the body is static, we go to the next body
-        if (body->getType() == STATIC) continue;
+        if (body->getType() == BodyType::STATIC) continue;
 
         // If the body is sleeping or inactive, we go to the next body
         if (body->isSleeping() || !body->isActive()) continue;
@@ -706,7 +706,7 @@ void DynamicsWorld::computeIslands() {
 
             // If the current body is static, we do not want to perform the DFS
             // search across that body
-            if (bodyToVisit->getType() == STATIC) continue;
+            if (bodyToVisit->getType() == BodyType::STATIC) continue;
 
             // For each contact manifold in which the current body is involded
             ContactManifoldListElement* contactElement;
@@ -771,7 +771,7 @@ void DynamicsWorld::computeIslands() {
         // can also be included in the other islands
         for (uint i=0; i < mIslands[mNbIslands]->mNbBodies; i++) {
 
-            if (mIslands[mNbIslands]->mBodies[i]->getType() == STATIC) {
+            if (mIslands[mNbIslands]->mBodies[i]->getType() == BodyType::STATIC) {
                 mIslands[mNbIslands]->mBodies[i]->mIsAlreadyInIsland = false;
             }
         }
@@ -803,7 +803,7 @@ void DynamicsWorld::updateSleepingBodies() {
         for (uint b=0; b < mIslands[i]->getNbBodies(); b++) {
 
             // Skip static bodies
-            if (bodies[b]->getType() == STATIC) continue;
+            if (bodies[b]->getType() == BodyType::STATIC) continue;
 
             // If the body is velocity is large enough to stay awake
             if (bodies[b]->getLinearVelocity().lengthSquare() > sleepLinearVelocitySquare ||
diff --git a/src/engine/DynamicsWorld.h b/src/engine/DynamicsWorld.h
index 71a5336a..a9bfc9d8 100644
--- a/src/engine/DynamicsWorld.h
+++ b/src/engine/DynamicsWorld.h
@@ -127,12 +127,6 @@ class DynamicsWorld : public CollisionWorld {
 
         // -------------------- Methods -------------------- //
 
-        /// Private copy-constructor
-        DynamicsWorld(const DynamicsWorld& world);
-
-        /// Private assignment operator
-        DynamicsWorld& operator=(const DynamicsWorld& world);
-
         /// Integrate the positions and orientations of rigid bodies.
         void integrateRigidBodiesPositions();
 
@@ -186,6 +180,12 @@ class DynamicsWorld : public CollisionWorld {
         /// Destructor
         virtual ~DynamicsWorld();
 
+        /// Deleted copy-constructor
+        DynamicsWorld(const DynamicsWorld& world) = delete;
+
+        /// Deleted assignment operator
+        DynamicsWorld& operator=(const DynamicsWorld& world) = delete;
+
         /// Update the physics simulation
         void update(decimal timeStep);
 
@@ -348,7 +348,7 @@ inline void DynamicsWorld::setNbIterationsPositionSolver(uint nbIterations) {
  */
 inline void DynamicsWorld::setContactsPositionCorrectionTechnique(
                               ContactsPositionCorrectionTechnique technique) {
-    if (technique == BAUMGARTE_CONTACTS) {
+    if (technique == ContactsPositionCorrectionTechnique::BAUMGARTE_CONTACTS) {
         mContactSolver.setIsSplitImpulseActive(false);
     }
     else {
@@ -362,7 +362,7 @@ inline void DynamicsWorld::setContactsPositionCorrectionTechnique(
  */
 inline void DynamicsWorld::setJointsPositionCorrectionTechnique(
                               JointsPositionCorrectionTechnique technique) {
-    if (technique == BAUMGARTE_JOINTS) {
+    if (technique == JointsPositionCorrectionTechnique::BAUMGARTE_JOINTS) {
         mConstraintSolver.setIsNonLinearGaussSeidelPositionCorrectionActive(false);
     }
     else {
diff --git a/src/engine/EventListener.h b/src/engine/EventListener.h
index 4df79259..a2e9d868 100644
--- a/src/engine/EventListener.h
+++ b/src/engine/EventListener.h
@@ -53,7 +53,7 @@ class EventListener {
         /**
          * @param contact Information about the contact
          */
-        virtual void beginContact(const ContactPointInfo& contact) {};
+        virtual void beginContact(const ContactPointInfo& contact) {}
 
         /// Called when a new contact point is found between two bodies
         /**
diff --git a/src/engine/Impulse.h b/src/engine/Impulse.h
index 8c2bef33..89e36429 100644
--- a/src/engine/Impulse.h
+++ b/src/engine/Impulse.h
@@ -41,9 +41,6 @@ struct Impulse {
 
         // -------------------- Methods -------------------- //
 
-        /// Private assignment operator
-        Impulse& operator=(const Impulse& impulse);
-
     public:
 
         // -------------------- Attributes -------------------- //
@@ -78,8 +75,11 @@ struct Impulse {
                 angularImpulseBody1(impulse.angularImpulseBody1),
                 linearImpulseBody2(impulse.linearImpulseBody2),
                 angularImpulseBody2(impulse.angularImpulseBody2) {
-;
+
         }
+
+        /// Deleted assignment operator
+        Impulse& operator=(const Impulse& impulse) = delete;
 };
 
 }
diff --git a/src/engine/Island.h b/src/engine/Island.h
index 6be38d5e..1b086939 100644
--- a/src/engine/Island.h
+++ b/src/engine/Island.h
@@ -75,14 +75,6 @@ class Island {
         /// Number of bytes allocated for the joints array
         size_t mNbAllocatedBytesJoints;
 
-        // -------------------- Methods -------------------- //
-
-        /// Private assignment operator
-        Island& operator=(const Island& island);
-
-        /// Private copy-constructor
-        Island(const Island& island);
-
     public:
 
         // -------------------- Methods -------------------- //
@@ -94,6 +86,12 @@ class Island {
         /// Destructor
         ~Island();
 
+        /// Deleted assignment operator
+        Island& operator=(const Island& island) = delete;
+
+        /// Deleted copy-constructor
+        Island(const Island& island) = delete;
+
         /// Add a body into the island
         void addBody(RigidBody* body);
 
diff --git a/src/engine/OverlappingPair.h b/src/engine/OverlappingPair.h
index 995546c5..e40814ca 100644
--- a/src/engine/OverlappingPair.h
+++ b/src/engine/OverlappingPair.h
@@ -56,14 +56,6 @@ class OverlappingPair {
 
         /// Cached previous separating axis
         Vector3 mCachedSeparatingAxis;
-        
-        // -------------------- Methods -------------------- //
-
-        /// Private copy-constructor
-        OverlappingPair(const OverlappingPair& pair);
-
-        /// Private assignment operator
-        OverlappingPair& operator=(const OverlappingPair& pair);
 
     public:
 
@@ -75,6 +67,12 @@ class OverlappingPair {
 
         /// Destructor
         ~OverlappingPair();
+
+        /// Deleted copy-constructor
+        OverlappingPair(const OverlappingPair& pair) = delete;
+
+        /// Deleted assignment operator
+        OverlappingPair& operator=(const OverlappingPair& pair) = delete;
         
         /// Return the pointer to first proxy collision shape
         ProxyShape* getShape1() const;
diff --git a/src/engine/Timer.h b/src/engine/Timer.h
index ec673b67..9c59d033 100644
--- a/src/engine/Timer.h
+++ b/src/engine/Timer.h
@@ -71,14 +71,6 @@ class Timer {
         /// True if the timer is running
         bool mIsRunning;
 
-        // -------------------- Methods -------------------- //
-
-        /// Private copy-constructor
-        Timer(const Timer& timer);
-
-        /// Private assignment operator
-        Timer& operator=(const Timer& timer);
-
     public :
 
         // -------------------- Methods -------------------- //
@@ -87,7 +79,13 @@ class Timer {
         Timer(double timeStep);
 
         /// Destructor
-        virtual ~Timer();
+        ~Timer();
+
+        /// Deleted copy-constructor
+        Timer(const Timer& timer) = delete;
+
+        /// Deleted assignment operator
+        Timer& operator=(const Timer& timer) = delete;
 
         /// Return the timestep of the physics engine
         double getTimeStep() const;
diff --git a/test/tests/collision/TestRaycast.h b/test/tests/collision/TestRaycast.h
index 89b38110..09e3ebd8 100644
--- a/test/tests/collision/TestRaycast.h
+++ b/test/tests/collision/TestRaycast.h
@@ -288,13 +288,13 @@ class TestRaycast : public Test {
             mConcaveMeshIndices.push_back(1); mConcaveMeshIndices.push_back(4); mConcaveMeshIndices.push_back(5);
             mConcaveMeshIndices.push_back(5); mConcaveMeshIndices.push_back(7); mConcaveMeshIndices.push_back(6);
             mConcaveMeshIndices.push_back(4); mConcaveMeshIndices.push_back(7); mConcaveMeshIndices.push_back(5);
-            TriangleVertexArray::VertexDataType vertexType = sizeof(decimal) == 4 ? TriangleVertexArray::VERTEX_FLOAT_TYPE :
-                                                                                    TriangleVertexArray::VERTEX_DOUBLE_TYPE;
+            TriangleVertexArray::VertexDataType vertexType = sizeof(decimal) == 4 ? TriangleVertexArray::VertexDataType::VERTEX_FLOAT_TYPE :
+                                                                                    TriangleVertexArray::VertexDataType::VERTEX_DOUBLE_TYPE;
             mConcaveMeshVertexArray =
                     new TriangleVertexArray(8, &(mConcaveMeshVertices[0]), sizeof(Vector3),
                                                   12, &(mConcaveMeshIndices[0]), sizeof(uint),
                                                   vertexType,
-                                                  TriangleVertexArray::INDEX_INTEGER_TYPE);
+                                                  TriangleVertexArray::IndexDataType::INDEX_INTEGER_TYPE);
 
 
             // Add the triangle vertex array of the subpart to the triangle mesh
@@ -305,7 +305,7 @@ class TestRaycast : public Test {
 
             // Heightfield shape (plane height field at height=4)
             for (int i=0; i<100; i++) mHeightFieldData[i] = 4;
-            mHeightFieldShape = new HeightFieldShape(10, 10, 0, 4, mHeightFieldData, HeightFieldShape::HEIGHT_FLOAT_TYPE);
+            mHeightFieldShape = new HeightFieldShape(10, 10, 0, 4, mHeightFieldData, HeightFieldShape::HeightDataType::HEIGHT_FLOAT_TYPE);
             mHeightFieldProxyShape = mHeightFieldBody->addCollisionShape(mHeightFieldShape, mShapeTransform);
 
             // Assign proxy shapes to the different categories
@@ -1032,7 +1032,7 @@ class TestRaycast : public Test {
 
             // CollisionWorld::raycast()
             mCallback.reset();
-            mTriangleShape->setRaycastTestType(FRONT);
+            mTriangleShape->setRaycastTestType(TriangleRaycastSide::FRONT);
             mWorld->raycast(ray, &mCallback);
             test(mCallback.isHit);
             test(mCallback.raycastInfo.body == mTriangleBody);
@@ -1046,7 +1046,7 @@ class TestRaycast : public Test {
             test(approxEqual(mCallback.raycastInfo.worldNormal.z, hitNormal.z, epsilon));
 
             mCallback.reset();
-            mTriangleShape->setRaycastTestType(BACK);
+            mTriangleShape->setRaycastTestType(TriangleRaycastSide::BACK);
             mWorld->raycast(rayBackward, &mCallback);
             test(mCallback.isHit);
             test(mCallback.raycastInfo.body == mTriangleBody);
@@ -1060,7 +1060,7 @@ class TestRaycast : public Test {
             test(approxEqual(mCallback.raycastInfo.worldNormal.z, -hitNormal.z, epsilon));
 
             mCallback.reset();
-            mTriangleShape->setRaycastTestType(FRONT_AND_BACK);
+            mTriangleShape->setRaycastTestType(TriangleRaycastSide::FRONT_AND_BACK);
             mWorld->raycast(ray, &mCallback);
             test(mCallback.isHit);
             test(mCallback.raycastInfo.body == mTriangleBody);
@@ -1074,7 +1074,7 @@ class TestRaycast : public Test {
             test(approxEqual(mCallback.raycastInfo.worldNormal.z, hitNormal.z, epsilon));
 
             mCallback.reset();
-            mTriangleShape->setRaycastTestType(FRONT_AND_BACK);
+            mTriangleShape->setRaycastTestType(TriangleRaycastSide::FRONT_AND_BACK);
             mWorld->raycast(rayBackward, &mCallback);
             test(mCallback.isHit);
             test(mCallback.raycastInfo.body == mTriangleBody);
@@ -1087,7 +1087,7 @@ class TestRaycast : public Test {
             test(approxEqual(mCallback.raycastInfo.worldNormal.y, -hitNormal.y, epsilon));
             test(approxEqual(mCallback.raycastInfo.worldNormal.z, -hitNormal.z, epsilon));
 
-            mTriangleShape->setRaycastTestType(FRONT);
+            mTriangleShape->setRaycastTestType(TriangleRaycastSide::FRONT);
 
             // Correct category filter mask
             mCallback.reset();
@@ -1157,7 +1157,7 @@ class TestRaycast : public Test {
             test(!mCallback.isHit);
 
             // Test backward ray against front triangles (not hit should occur)
-            mTriangleShape->setRaycastTestType(FRONT);
+            mTriangleShape->setRaycastTestType(TriangleRaycastSide::FRONT);
 
             test(!mTriangleBody->raycast(ray4Back, raycastInfo3));
             test(!mTriangleProxyShape->raycast(ray4Back, raycastInfo3));
@@ -1178,7 +1178,7 @@ class TestRaycast : public Test {
             test(!mCallback.isHit);
 
             // Test front ray against back triangles (not hit should occur)
-            mTriangleShape->setRaycastTestType(BACK);
+            mTriangleShape->setRaycastTestType(TriangleRaycastSide::BACK);
 
             test(!mTriangleBody->raycast(ray4, raycastInfo3));
             test(!mTriangleProxyShape->raycast(ray4, raycastInfo3));
@@ -1201,7 +1201,7 @@ class TestRaycast : public Test {
             // ----- Test raycast hits ----- //
 
             // Test front ray against front triangles
-            mTriangleShape->setRaycastTestType(FRONT);
+            mTriangleShape->setRaycastTestType(TriangleRaycastSide::FRONT);
 
             test(mTriangleBody->raycast(ray4, raycastInfo3));
             test(mTriangleProxyShape->raycast(ray4, raycastInfo3));
@@ -1229,7 +1229,7 @@ class TestRaycast : public Test {
             mWorld->raycast(Ray(ray6.point1, ray6.point2, decimal(0.8)), &mCallback);
 
             // Test back ray against back triangles
-            mTriangleShape->setRaycastTestType(BACK);
+            mTriangleShape->setRaycastTestType(TriangleRaycastSide::BACK);
 
             test(mTriangleBody->raycast(ray4Back, raycastInfo3));
             test(mTriangleProxyShape->raycast(ray4Back, raycastInfo3));
@@ -1257,7 +1257,7 @@ class TestRaycast : public Test {
             mWorld->raycast(Ray(ray6Back.point1, ray6Back.point2, decimal(0.8)), &mCallback);
 
             // Test front ray against front-back triangles
-            mTriangleShape->setRaycastTestType(FRONT_AND_BACK);
+            mTriangleShape->setRaycastTestType(TriangleRaycastSide::FRONT_AND_BACK);
 
             test(mTriangleBody->raycast(ray4, raycastInfo3));
             test(mTriangleProxyShape->raycast(ray4, raycastInfo3));
@@ -1285,7 +1285,7 @@ class TestRaycast : public Test {
             mWorld->raycast(Ray(ray6.point1, ray6.point2, decimal(0.8)), &mCallback);
 
             // Test back ray against front-back triangles
-            mTriangleShape->setRaycastTestType(FRONT_AND_BACK);
+            mTriangleShape->setRaycastTestType(TriangleRaycastSide::FRONT_AND_BACK);
 
             test(mTriangleBody->raycast(ray4Back, raycastInfo3));
             test(mTriangleProxyShape->raycast(ray4Back, raycastInfo3));
diff --git a/testbed/common/ConcaveMesh.cpp b/testbed/common/ConcaveMesh.cpp
index 0f8d7cb1..68f7a56e 100644
--- a/testbed/common/ConcaveMesh.cpp
+++ b/testbed/common/ConcaveMesh.cpp
@@ -53,8 +53,8 @@ ConcaveMesh::ConcaveMesh(const openglframework::Vector3 &position,
         rp3d::TriangleVertexArray* vertexArray =
                 new rp3d::TriangleVertexArray(getNbVertices(), &(mVertices[0]), sizeof(openglframework::Vector3),
                                               getNbFaces(i), &(mIndices[i][0]), sizeof(int),
-                                              rp3d::TriangleVertexArray::VERTEX_FLOAT_TYPE,
-                                              rp3d::TriangleVertexArray::INDEX_INTEGER_TYPE);
+                                              rp3d::TriangleVertexArray::VertexDataType::VERTEX_FLOAT_TYPE,
+                                              rp3d::TriangleVertexArray::IndexDataType::INDEX_INTEGER_TYPE);
 
         // Add the triangle vertex array of the subpart to the triangle mesh
         mPhysicsTriangleMesh.addSubpart(vertexArray);
@@ -110,8 +110,8 @@ ConcaveMesh::ConcaveMesh(const openglframework::Vector3 &position, float mass,
         rp3d::TriangleVertexArray* vertexArray =
                 new rp3d::TriangleVertexArray(getNbVertices(), &(mVertices[0]), sizeof(openglframework::Vector3),
                                               getNbFaces(i), &(mIndices[i][0]), sizeof(int),
-                                              rp3d::TriangleVertexArray::VERTEX_FLOAT_TYPE,
-                                              rp3d::TriangleVertexArray::INDEX_INTEGER_TYPE);
+                                              rp3d::TriangleVertexArray::VertexDataType::VERTEX_FLOAT_TYPE,
+                                              rp3d::TriangleVertexArray::IndexDataType::INDEX_INTEGER_TYPE);
 
         // Add the triangle vertex array of the subpart to the triangle mesh
         mPhysicsTriangleMesh.addSubpart(vertexArray);
diff --git a/testbed/common/ConvexMesh.cpp b/testbed/common/ConvexMesh.cpp
index ffdbca04..1ded48a2 100644
--- a/testbed/common/ConvexMesh.cpp
+++ b/testbed/common/ConvexMesh.cpp
@@ -51,8 +51,8 @@ ConvexMesh::ConvexMesh(const openglframework::Vector3 &position,
     mPhysicsTriangleVertexArray =
             new rp3d::TriangleVertexArray(getNbVertices(), &(mVertices[0]), sizeof(openglframework::Vector3),
                                           getNbFaces(0), &(mIndices[0][0]), sizeof(int),
-                                          rp3d::TriangleVertexArray::VERTEX_FLOAT_TYPE,
-                                          rp3d::TriangleVertexArray::INDEX_INTEGER_TYPE);
+                                          rp3d::TriangleVertexArray::VertexDataType::VERTEX_FLOAT_TYPE,
+                                          rp3d::TriangleVertexArray::IndexDataType::INDEX_INTEGER_TYPE);
 
     // Create the collision shape for the rigid body (convex mesh shape) and
     // do not forget to delete it at the end
@@ -101,8 +101,8 @@ ConvexMesh::ConvexMesh(const openglframework::Vector3 &position, float mass,
     mPhysicsTriangleVertexArray =
             new rp3d::TriangleVertexArray(getNbVertices(), &(mVertices[0]), sizeof(openglframework::Vector3),
                                           getNbFaces(0), &(mIndices[0][0]), sizeof(int),
-                                          rp3d::TriangleVertexArray::VERTEX_FLOAT_TYPE,
-                                          rp3d::TriangleVertexArray::INDEX_INTEGER_TYPE);
+                                          rp3d::TriangleVertexArray::VertexDataType::VERTEX_FLOAT_TYPE,
+                                          rp3d::TriangleVertexArray::IndexDataType::INDEX_INTEGER_TYPE);
 
     // Create the collision shape for the rigid body (convex mesh shape) and do
     // not forget to delete it at the end
diff --git a/testbed/common/HeightField.cpp b/testbed/common/HeightField.cpp
index e230c365..f65123ee 100644
--- a/testbed/common/HeightField.cpp
+++ b/testbed/common/HeightField.cpp
@@ -49,7 +49,7 @@ HeightField::HeightField(const openglframework::Vector3 &position,
     // Create the collision shape for the rigid body (convex mesh shape) and
     // do not forget to delete it at the end
     mHeightFieldShape = new rp3d::HeightFieldShape(NB_POINTS_WIDTH, NB_POINTS_LENGTH, mMinHeight, mMaxHeight,
-                                               mHeightData, rp3d::HeightFieldShape::HEIGHT_FLOAT_TYPE);
+                                               mHeightData, rp3d::HeightFieldShape::HeightDataType::HEIGHT_FLOAT_TYPE);
 
     // Initial position and orientation of the rigid body
     rp3d::Vector3 initPosition(position.x, position.y, position.z);
@@ -92,7 +92,7 @@ HeightField::HeightField(const openglframework::Vector3 &position, float mass,
     // Create the collision shape for the rigid body (convex mesh shape) and
     // do not forget to delete it at the end
     mHeightFieldShape = new rp3d::HeightFieldShape(NB_POINTS_WIDTH, NB_POINTS_LENGTH, mMinHeight, mMaxHeight,
-                                                   mHeightData, rp3d::HeightFieldShape::HEIGHT_FLOAT_TYPE);
+                                                   mHeightData, rp3d::HeightFieldShape::HeightDataType::HEIGHT_FLOAT_TYPE);
 
     // Initial position and orientation of the rigid body
     rp3d::Vector3 initPosition(position.x, position.y, position.z);
diff --git a/testbed/scenes/collisionshapes/CollisionShapesScene.cpp b/testbed/scenes/collisionshapes/CollisionShapesScene.cpp
index bcf7c836..b1778398 100644
--- a/testbed/scenes/collisionshapes/CollisionShapesScene.cpp
+++ b/testbed/scenes/collisionshapes/CollisionShapesScene.cpp
@@ -245,7 +245,7 @@ CollisionShapesScene::CollisionShapesScene(const std::string& name)
     mFloor->setSleepingColor(mGreyColorDemo);
 
     // The floor must be a static rigid body
-    mFloor->getRigidBody()->setType(rp3d::STATIC);
+    mFloor->getRigidBody()->setType(rp3d::BodyType::STATIC);
 
     // Change the material properties of the rigid body
     rp3d::Material& material = mFloor->getRigidBody()->getMaterial();
diff --git a/testbed/scenes/concavemesh/ConcaveMeshScene.cpp b/testbed/scenes/concavemesh/ConcaveMeshScene.cpp
index d8309cde..c8396712 100644
--- a/testbed/scenes/concavemesh/ConcaveMeshScene.cpp
+++ b/testbed/scenes/concavemesh/ConcaveMeshScene.cpp
@@ -83,7 +83,7 @@ ConcaveMeshScene::ConcaveMeshScene(const std::string& name)
     mConcaveMesh = new ConcaveMesh(position, mass, mDynamicsWorld, meshFolderPath + "city.obj");
 
     // Set the mesh as beeing static
-    mConcaveMesh->getRigidBody()->setType(rp3d::STATIC);
+    mConcaveMesh->getRigidBody()->setType(rp3d::BodyType::STATIC);
 
     // Set the box color
     mConcaveMesh->setColor(mGreyColorDemo);
diff --git a/testbed/scenes/cubes/CubesScene.cpp b/testbed/scenes/cubes/CubesScene.cpp
index 2de04857..e0a04cee 100644
--- a/testbed/scenes/cubes/CubesScene.cpp
+++ b/testbed/scenes/cubes/CubesScene.cpp
@@ -82,7 +82,7 @@ CubesScene::CubesScene(const std::string& name)
     mFloor->setSleepingColor(mGreyColorDemo);
 
     // The floor must be a static rigid body
-    mFloor->getRigidBody()->setType(rp3d::STATIC);
+    mFloor->getRigidBody()->setType(rp3d::BodyType::STATIC);
 
     // Change the material properties of the floor rigid body
     rp3d::Material& material = mFloor->getRigidBody()->getMaterial();
diff --git a/testbed/scenes/heightfield/HeightFieldScene.cpp b/testbed/scenes/heightfield/HeightFieldScene.cpp
index ab168b13..fd72c9bb 100644
--- a/testbed/scenes/heightfield/HeightFieldScene.cpp
+++ b/testbed/scenes/heightfield/HeightFieldScene.cpp
@@ -78,7 +78,7 @@ HeightFieldScene::HeightFieldScene(const std::string& name) : SceneDemo(name, SC
     mHeightField = new HeightField(position, mass, mDynamicsWorld);
 
     // Set the mesh as beeing static
-    mHeightField->getRigidBody()->setType(rp3d::STATIC);
+    mHeightField->getRigidBody()->setType(rp3d::BodyType::STATIC);
 
     // Set the color
     mHeightField->setColor(mGreyColorDemo);
diff --git a/testbed/scenes/joints/JointsScene.cpp b/testbed/scenes/joints/JointsScene.cpp
index ae006573..4b96096c 100644
--- a/testbed/scenes/joints/JointsScene.cpp
+++ b/testbed/scenes/joints/JointsScene.cpp
@@ -274,7 +274,7 @@ void JointsScene::createBallAndSocketJoints() {
 
         // The fist box cannot move (static body)
         if (i == 0) {
-            mBallAndSocketJointChainBoxes[i]->getRigidBody()->setType(rp3d::STATIC);
+            mBallAndSocketJointChainBoxes[i]->getRigidBody()->setType(rp3d::BodyType::STATIC);
         }
 
         // Add some angular velocity damping
@@ -322,7 +322,7 @@ void JointsScene::createSliderJoint() {
     mSliderJointBottomBox->setSleepingColor(mRedColorDemo);
 
     // The fist box cannot move
-    mSliderJointBottomBox->getRigidBody()->setType(rp3d::STATIC);
+    mSliderJointBottomBox->getRigidBody()->setType(rp3d::BodyType::STATIC);
 
     // Change the material properties of the rigid body
     rp3d::Material& material1 = mSliderJointBottomBox->getRigidBody()->getMaterial();
@@ -476,7 +476,7 @@ void JointsScene::createFloor() {
     mFloor->setSleepingColor(mGreyColorDemo);
 
     // The floor must be a static rigid body
-    mFloor->getRigidBody()->setType(rp3d::STATIC);
+    mFloor->getRigidBody()->setType(rp3d::BodyType::STATIC);
 
     // Change the material properties of the rigid body
     rp3d::Material& material = mFloor->getRigidBody()->getMaterial();