diff --git a/include/reactphysics3d/body/CollisionBody.h b/include/reactphysics3d/body/CollisionBody.h
index 9b77bec6..98c22c4a 100644
--- a/include/reactphysics3d/body/CollisionBody.h
+++ b/include/reactphysics3d/body/CollisionBody.h
@@ -178,7 +178,7 @@ class CollisionBody {
 * @param worldAABB The AABB (in world-space coordinates) that will be used to test overlap
 * @return True if the given AABB overlaps with the AABB of the collision body
 */
-inline bool CollisionBody::testAABBOverlap(const AABB& worldAABB) const {
+RP3D_FORCE_INLINE bool CollisionBody::testAABBOverlap(const AABB& worldAABB) const {
     return worldAABB.testCollision(getAABB());
 }
 
@@ -186,14 +186,14 @@ inline bool CollisionBody::testAABBOverlap(const AABB& worldAABB) const {
 /**
  * @return The entity of the body
  */
-inline Entity CollisionBody::getEntity() const {
+RP3D_FORCE_INLINE Entity CollisionBody::getEntity() const {
     return mEntity;
 }
 
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void CollisionBody::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void CollisionBody::setProfiler(Profiler* profiler) {
 	mProfiler = profiler;
 }
 
diff --git a/include/reactphysics3d/collision/Collider.h b/include/reactphysics3d/collision/Collider.h
index 9fee33da..ae590d9f 100644
--- a/include/reactphysics3d/collision/Collider.h
+++ b/include/reactphysics3d/collision/Collider.h
@@ -188,7 +188,7 @@ class Collider {
 /**
  * @return The entity of the collider
  */
-inline Entity Collider::getEntity() const {
+RP3D_FORCE_INLINE Entity Collider::getEntity() const {
     return mEntity;
 }
 
@@ -196,7 +196,7 @@ inline Entity Collider::getEntity() const {
 /**
  * @return Pointer to the parent body
  */
-inline CollisionBody* Collider::getBody() const {
+RP3D_FORCE_INLINE CollisionBody* Collider::getBody() const {
     return mBody;
 }
 
@@ -204,7 +204,7 @@ inline CollisionBody* Collider::getBody() const {
 /**
  * @return A pointer to the user data stored into the collider
  */
-inline void* Collider::getUserData() const {
+RP3D_FORCE_INLINE void* Collider::getUserData() const {
     return mUserData;
 }
 
@@ -212,7 +212,7 @@ inline void* Collider::getUserData() const {
 /**
  * @param userData Pointer to the user data you want to store within the collider
  */
-inline void Collider::setUserData(void* userData) {
+RP3D_FORCE_INLINE void Collider::setUserData(void* userData) {
     mUserData = userData;
 }
 
@@ -221,7 +221,7 @@ inline void Collider::setUserData(void* userData) {
 * @param worldAABB The AABB (in world-space coordinates) that will be used to test overlap
 * @return True if the given AABB overlaps with the AABB of the collision body
 */
-inline bool Collider::testAABBOverlap(const AABB& worldAABB) const {
+RP3D_FORCE_INLINE bool Collider::testAABBOverlap(const AABB& worldAABB) const {
     return worldAABB.testCollision(getWorldAABB());
 }
 
@@ -229,7 +229,7 @@ inline bool Collider::testAABBOverlap(const AABB& worldAABB) const {
 /**
  * @return A reference to the material of the body
  */
-inline Material& Collider::getMaterial() {
+RP3D_FORCE_INLINE Material& Collider::getMaterial() {
     return mMaterial;
 }
 
diff --git a/include/reactphysics3d/collision/CollisionCallback.h b/include/reactphysics3d/collision/CollisionCallback.h
index f3f2b41d..716de01f 100644
--- a/include/reactphysics3d/collision/CollisionCallback.h
+++ b/include/reactphysics3d/collision/CollisionCallback.h
@@ -296,7 +296,7 @@ class CollisionCallback {
 /**
  * @return The number of contact pairs
  */
-inline uint CollisionCallback::CallbackData::getNbContactPairs() const {
+RP3D_FORCE_INLINE uint CollisionCallback::CallbackData::getNbContactPairs() const {
     return mContactPairsIndices.size() + mLostContactPairsIndices.size();
 }
 
@@ -304,7 +304,7 @@ inline uint CollisionCallback::CallbackData::getNbContactPairs() const {
 /**
  * @return The number of contact points
  */
-inline uint CollisionCallback::ContactPair::getNbContactPoints() const {
+RP3D_FORCE_INLINE uint CollisionCallback::ContactPair::getNbContactPoints() const {
    return mContactPair.nbToTalContactPoints;
 }
 
@@ -312,7 +312,7 @@ inline uint CollisionCallback::ContactPair::getNbContactPoints() const {
 /**
  * @return The penetration depth (larger than zero)
  */
-inline decimal CollisionCallback::ContactPoint::getPenetrationDepth() const {
+RP3D_FORCE_INLINE decimal CollisionCallback::ContactPoint::getPenetrationDepth() const {
    return mContactPoint.getPenetrationDepth();
 }
 
@@ -320,7 +320,7 @@ inline decimal CollisionCallback::ContactPoint::getPenetrationDepth() const {
 /**
  * @return The contact normal direction at the contact point (in world-space)
  */
-inline const Vector3& CollisionCallback::ContactPoint::getWorldNormal() const {
+RP3D_FORCE_INLINE const Vector3& CollisionCallback::ContactPoint::getWorldNormal() const {
    return mContactPoint.getNormal();
 }
 
@@ -328,7 +328,7 @@ inline const Vector3& CollisionCallback::ContactPoint::getWorldNormal() const {
 /**
  * @return The contact point in the local-space of the first collider (from body1) in contact
  */
-inline const Vector3& CollisionCallback::ContactPoint::getLocalPointOnCollider1() const {
+RP3D_FORCE_INLINE const Vector3& CollisionCallback::ContactPoint::getLocalPointOnCollider1() const {
    return mContactPoint.getLocalPointOnShape1();
 }
 
@@ -336,7 +336,7 @@ inline const Vector3& CollisionCallback::ContactPoint::getLocalPointOnCollider1(
 /**
  * @return The contact point in the local-space of the second collider (from body2) in contact
  */
-inline const Vector3& CollisionCallback::ContactPoint::getLocalPointOnCollider2() const {
+RP3D_FORCE_INLINE const Vector3& CollisionCallback::ContactPoint::getLocalPointOnCollider2() const {
    return mContactPoint.getLocalPointOnShape2();
 }
 
diff --git a/include/reactphysics3d/collision/HalfEdgeStructure.h b/include/reactphysics3d/collision/HalfEdgeStructure.h
index d0d915df..ca68064a 100644
--- a/include/reactphysics3d/collision/HalfEdgeStructure.h
+++ b/include/reactphysics3d/collision/HalfEdgeStructure.h
@@ -129,7 +129,7 @@ class HalfEdgeStructure {
 /**
  * @param vertexPointIndex Index of the vertex in the vertex data array
  */
-inline uint HalfEdgeStructure::addVertex(uint vertexPointIndex) {
+RP3D_FORCE_INLINE uint HalfEdgeStructure::addVertex(uint vertexPointIndex) {
     Vertex vertex(vertexPointIndex);
     mVertices.add(vertex);
     return mVertices.size() - 1;
@@ -140,7 +140,7 @@ inline uint HalfEdgeStructure::addVertex(uint vertexPointIndex) {
  * @param faceVertices List of the vertices in a face (ordered in CCW order as seen from outside
  *                     the polyhedron
  */
-inline void HalfEdgeStructure::addFace(List<uint> faceVertices) {
+RP3D_FORCE_INLINE void HalfEdgeStructure::addFace(List<uint> faceVertices) {
 
     // Create a new face
     Face face(faceVertices);
@@ -151,7 +151,7 @@ inline void HalfEdgeStructure::addFace(List<uint> faceVertices) {
 /**
  * @return The number of faces in the polyhedron
  */
-inline uint HalfEdgeStructure::getNbFaces() const {
+RP3D_FORCE_INLINE uint HalfEdgeStructure::getNbFaces() const {
     return static_cast<uint>(mFaces.size());
 }
 
@@ -159,7 +159,7 @@ inline uint HalfEdgeStructure::getNbFaces() const {
 /**
  * @return The number of edges in the polyhedron
  */
-inline uint HalfEdgeStructure::getNbHalfEdges() const {
+RP3D_FORCE_INLINE uint HalfEdgeStructure::getNbHalfEdges() const {
     return static_cast<uint>(mEdges.size());
 }
 
@@ -167,7 +167,7 @@ inline uint HalfEdgeStructure::getNbHalfEdges() const {
 /**
  * @return The number of vertices in the polyhedron
  */
-inline uint HalfEdgeStructure::getNbVertices() const {
+RP3D_FORCE_INLINE uint HalfEdgeStructure::getNbVertices() const {
     return static_cast<uint>(mVertices.size());
 }
 
@@ -175,7 +175,7 @@ inline uint HalfEdgeStructure::getNbVertices() const {
 /**
  * @return A given face of the polyhedron
  */
-inline const HalfEdgeStructure::Face& HalfEdgeStructure::getFace(uint index) const {
+RP3D_FORCE_INLINE const HalfEdgeStructure::Face& HalfEdgeStructure::getFace(uint index) const {
     assert(index < mFaces.size());
     return mFaces[index];
 }
@@ -184,7 +184,7 @@ inline const HalfEdgeStructure::Face& HalfEdgeStructure::getFace(uint index) con
 /**
  * @return A given edge of the polyhedron
  */
-inline const HalfEdgeStructure::Edge& HalfEdgeStructure::getHalfEdge(uint index) const {
+RP3D_FORCE_INLINE const HalfEdgeStructure::Edge& HalfEdgeStructure::getHalfEdge(uint index) const {
     assert(index < mEdges.size());
     return mEdges[index];
 }
@@ -193,7 +193,7 @@ inline const HalfEdgeStructure::Edge& HalfEdgeStructure::getHalfEdge(uint index)
 /**
  * @return A given vertex of the polyhedron
  */
-inline const HalfEdgeStructure::Vertex& HalfEdgeStructure::getVertex(uint index) const {
+RP3D_FORCE_INLINE const HalfEdgeStructure::Vertex& HalfEdgeStructure::getVertex(uint index) const {
     assert(index < mVertices.size());
     return mVertices[index];
 }
diff --git a/include/reactphysics3d/collision/OverlapCallback.h b/include/reactphysics3d/collision/OverlapCallback.h
index 1fb99660..6601b879 100644
--- a/include/reactphysics3d/collision/OverlapCallback.h
+++ b/include/reactphysics3d/collision/OverlapCallback.h
@@ -185,7 +185,7 @@ class OverlapCallback {
 };
 
 // Return the number of overlapping pairs of bodies
-inline uint OverlapCallback::CallbackData::getNbOverlappingPairs() const {
+RP3D_FORCE_INLINE uint OverlapCallback::CallbackData::getNbOverlappingPairs() const {
     return mContactPairsIndices.size() + mLostContactPairsIndices.size();
 }
 
@@ -193,7 +193,7 @@ inline uint OverlapCallback::CallbackData::getNbOverlappingPairs() const {
 /// Note that the returned OverlapPair object is only valid during the call of the CollisionCallback::onOverlap()
 /// method. Therefore, you need to get contact data from it and make a copy. Do not make a copy of the OverlapPair
 /// object itself because it won't be valid after the CollisionCallback::onOverlap() call.
-inline OverlapCallback::OverlapPair OverlapCallback::CallbackData::getOverlappingPair(uint index) const {
+RP3D_FORCE_INLINE OverlapCallback::OverlapPair OverlapCallback::CallbackData::getOverlappingPair(uint index) const {
 
     assert(index < getNbOverlappingPairs());
 
diff --git a/include/reactphysics3d/collision/PolygonVertexArray.h b/include/reactphysics3d/collision/PolygonVertexArray.h
index fe97d146..4512bc15 100644
--- a/include/reactphysics3d/collision/PolygonVertexArray.h
+++ b/include/reactphysics3d/collision/PolygonVertexArray.h
@@ -140,7 +140,7 @@ class PolygonVertexArray {
 /**
  * @return The data type of the vertices in the array
  */
-inline PolygonVertexArray::VertexDataType PolygonVertexArray::getVertexDataType() const {
+RP3D_FORCE_INLINE PolygonVertexArray::VertexDataType PolygonVertexArray::getVertexDataType() const {
     return mVertexDataType;
 }
 
@@ -148,7 +148,7 @@ inline PolygonVertexArray::VertexDataType PolygonVertexArray::getVertexDataType(
 /**
  * @return The data type of the indices in the array
  */
-inline PolygonVertexArray::IndexDataType PolygonVertexArray::getIndexDataType() const {
+RP3D_FORCE_INLINE PolygonVertexArray::IndexDataType PolygonVertexArray::getIndexDataType() const {
    return mIndexDataType;
 }
 
@@ -156,7 +156,7 @@ inline PolygonVertexArray::IndexDataType PolygonVertexArray::getIndexDataType()
 /**
  * @return The number of vertices in the array
  */
-inline uint PolygonVertexArray::getNbVertices() const {
+RP3D_FORCE_INLINE uint PolygonVertexArray::getNbVertices() const {
     return mNbVertices;
 }
 
@@ -164,7 +164,7 @@ inline uint PolygonVertexArray::getNbVertices() const {
 /**
  * @return The number of faces in the array
  */
-inline uint PolygonVertexArray::getNbFaces() const {
+RP3D_FORCE_INLINE uint PolygonVertexArray::getNbFaces() const {
     return mNbFaces;
 }
 
@@ -172,7 +172,7 @@ inline uint PolygonVertexArray::getNbFaces() const {
 /**
  * @return The number of bytes between two vertices
  */
-inline int PolygonVertexArray::getVerticesStride() const {
+RP3D_FORCE_INLINE int PolygonVertexArray::getVerticesStride() const {
     return mVerticesStride;
 }
 
@@ -180,7 +180,7 @@ inline int PolygonVertexArray::getVerticesStride() const {
 /**
  * @return The number of bytes between two consecutive face indices
  */
-inline int PolygonVertexArray::getIndicesStride() const {
+RP3D_FORCE_INLINE int PolygonVertexArray::getIndicesStride() const {
     return mIndicesStride;
 }
 
@@ -189,7 +189,7 @@ inline int PolygonVertexArray::getIndicesStride() const {
  * @param faceIndex Index of a given face
  * @return A polygon face
  */
-inline PolygonVertexArray::PolygonFace* PolygonVertexArray::getPolygonFace(uint faceIndex) const {
+RP3D_FORCE_INLINE PolygonVertexArray::PolygonFace* PolygonVertexArray::getPolygonFace(uint faceIndex) const {
     assert(faceIndex < mNbFaces);
     return &mPolygonFacesStart[faceIndex];
 }
@@ -198,7 +198,7 @@ inline PolygonVertexArray::PolygonFace* PolygonVertexArray::getPolygonFace(uint
 /**
  * @return A pointer to the start of the vertex array of the polyhedron
  */
-inline const unsigned char* PolygonVertexArray::getVerticesStart() const {
+RP3D_FORCE_INLINE const unsigned char* PolygonVertexArray::getVerticesStart() const {
     return mVerticesStart;
 }
 
@@ -206,7 +206,7 @@ inline const unsigned char* PolygonVertexArray::getVerticesStart() const {
 /**
  * @return A pointer to the start of the face indices array of the polyhedron
  */
-inline const unsigned char* PolygonVertexArray::getIndicesStart() const {
+RP3D_FORCE_INLINE const unsigned char* PolygonVertexArray::getIndicesStart() const {
     return mIndicesStart;
 }
 
diff --git a/include/reactphysics3d/collision/PolyhedronMesh.h b/include/reactphysics3d/collision/PolyhedronMesh.h
index e7fd932f..f4e57bc9 100644
--- a/include/reactphysics3d/collision/PolyhedronMesh.h
+++ b/include/reactphysics3d/collision/PolyhedronMesh.h
@@ -117,7 +117,7 @@ class PolyhedronMesh {
 /**
  * @return The number of vertices in the mesh
  */
-inline uint PolyhedronMesh::getNbVertices() const {
+RP3D_FORCE_INLINE uint PolyhedronMesh::getNbVertices() const {
     return mHalfEdgeStructure.getNbVertices();
 }
 
@@ -125,7 +125,7 @@ inline uint PolyhedronMesh::getNbVertices() const {
 /**
  * @return The number of faces in the mesh
  */
-inline uint PolyhedronMesh::getNbFaces() const {
+RP3D_FORCE_INLINE uint PolyhedronMesh::getNbFaces() const {
    return mHalfEdgeStructure.getNbFaces();
 }
 
@@ -134,7 +134,7 @@ inline uint PolyhedronMesh::getNbFaces() const {
  * @param faceIndex The index of a given face of the mesh
  * @return The normal vector of a given face of the mesh
  */
-inline Vector3 PolyhedronMesh::getFaceNormal(uint faceIndex) const {
+RP3D_FORCE_INLINE Vector3 PolyhedronMesh::getFaceNormal(uint faceIndex) const {
     assert(faceIndex < mHalfEdgeStructure.getNbFaces());
     return mFacesNormals[faceIndex];
 }
@@ -143,7 +143,7 @@ inline Vector3 PolyhedronMesh::getFaceNormal(uint faceIndex) const {
 /**
  * @return The Half-Edge structure of the mesh
  */
-inline const HalfEdgeStructure& PolyhedronMesh::getHalfEdgeStructure() const {
+RP3D_FORCE_INLINE const HalfEdgeStructure& PolyhedronMesh::getHalfEdgeStructure() const {
     return mHalfEdgeStructure;
 }
 
@@ -151,7 +151,7 @@ inline const HalfEdgeStructure& PolyhedronMesh::getHalfEdgeStructure() const {
 /**
  * @return The centroid of the mesh
  */
-inline Vector3 PolyhedronMesh::getCentroid() const {
+RP3D_FORCE_INLINE Vector3 PolyhedronMesh::getCentroid() const {
     return mCentroid;
 }
 
diff --git a/include/reactphysics3d/collision/TriangleMesh.h b/include/reactphysics3d/collision/TriangleMesh.h
index 155f7a44..1cb4d516 100644
--- a/include/reactphysics3d/collision/TriangleMesh.h
+++ b/include/reactphysics3d/collision/TriangleMesh.h
@@ -78,7 +78,7 @@ class TriangleMesh {
 /**
  * @param triangleVertexArray Pointer to the TriangleVertexArray to add into the mesh
  */
-inline void TriangleMesh::addSubpart(TriangleVertexArray* triangleVertexArray) {
+RP3D_FORCE_INLINE void TriangleMesh::addSubpart(TriangleVertexArray* triangleVertexArray) {
     mTriangleArrays.add(triangleVertexArray );
 }
 
@@ -87,7 +87,7 @@ inline void TriangleMesh::addSubpart(TriangleVertexArray* triangleVertexArray) {
  * @param indexSubpart The index of the sub-part of the mesh
  * @return A pointer to the triangle vertex array of a given sub-part of the mesh
  */
-inline TriangleVertexArray* TriangleMesh::getSubpart(uint indexSubpart) const {
+RP3D_FORCE_INLINE TriangleVertexArray* TriangleMesh::getSubpart(uint indexSubpart) const {
    assert(indexSubpart < mTriangleArrays.size());
    return mTriangleArrays[indexSubpart];
 }
@@ -96,7 +96,7 @@ inline TriangleVertexArray* TriangleMesh::getSubpart(uint indexSubpart) const {
 /**
  * @return The number of sub-parts of the mesh
  */
-inline uint TriangleMesh::getNbSubparts() const {
+RP3D_FORCE_INLINE uint TriangleMesh::getNbSubparts() const {
     return mTriangleArrays.size();
 }
 
diff --git a/include/reactphysics3d/collision/TriangleVertexArray.h b/include/reactphysics3d/collision/TriangleVertexArray.h
index b5002be5..f68c8e22 100644
--- a/include/reactphysics3d/collision/TriangleVertexArray.h
+++ b/include/reactphysics3d/collision/TriangleVertexArray.h
@@ -182,7 +182,7 @@ class TriangleVertexArray {
 /**
  * @return The data type of the vertices in the array
  */
-inline TriangleVertexArray::VertexDataType TriangleVertexArray::getVertexDataType() const {
+RP3D_FORCE_INLINE TriangleVertexArray::VertexDataType TriangleVertexArray::getVertexDataType() const {
     return mVertexDataType;
 }
 
@@ -190,7 +190,7 @@ inline TriangleVertexArray::VertexDataType TriangleVertexArray::getVertexDataTyp
 /**
  * @return The data type of the normals in the array
  */
-inline TriangleVertexArray::NormalDataType TriangleVertexArray::getVertexNormalDataType() const {
+RP3D_FORCE_INLINE TriangleVertexArray::NormalDataType TriangleVertexArray::getVertexNormalDataType() const {
     return mVertexNormaldDataType;
 }
 
@@ -198,7 +198,7 @@ inline TriangleVertexArray::NormalDataType TriangleVertexArray::getVertexNormalD
 /**
  * @return The data type of the face indices in the array
  */
-inline TriangleVertexArray::IndexDataType TriangleVertexArray::getIndexDataType() const {
+RP3D_FORCE_INLINE TriangleVertexArray::IndexDataType TriangleVertexArray::getIndexDataType() const {
    return mIndexDataType;
 }
 
@@ -206,7 +206,7 @@ inline TriangleVertexArray::IndexDataType TriangleVertexArray::getIndexDataType(
 /**
  * @return The number of vertices in the array
  */
-inline uint TriangleVertexArray::getNbVertices() const {
+RP3D_FORCE_INLINE uint TriangleVertexArray::getNbVertices() const {
     return mNbVertices;
 }
 
@@ -214,7 +214,7 @@ inline uint TriangleVertexArray::getNbVertices() const {
 /**
  * @return The number of triangles in the array
  */
-inline uint TriangleVertexArray::getNbTriangles() const {
+RP3D_FORCE_INLINE uint TriangleVertexArray::getNbTriangles() const {
     return mNbTriangles;
 }
 
@@ -222,7 +222,7 @@ inline uint TriangleVertexArray::getNbTriangles() const {
 /**
  * @return The number of bytes separating two consecutive vertices in the array
  */
-inline uint TriangleVertexArray::getVerticesStride() const {
+RP3D_FORCE_INLINE uint TriangleVertexArray::getVerticesStride() const {
     return mVerticesStride;
 }
 
@@ -230,7 +230,7 @@ inline uint TriangleVertexArray::getVerticesStride() const {
 /**
  * @return The number of bytes separating two consecutive normals in the array
  */
-inline uint TriangleVertexArray::getVerticesNormalsStride() const {
+RP3D_FORCE_INLINE uint TriangleVertexArray::getVerticesNormalsStride() const {
     return mVerticesNormalsStride;
 }
 
@@ -238,7 +238,7 @@ inline uint TriangleVertexArray::getVerticesNormalsStride() const {
 /**
  * @return The number of bytes separating two consecutive face indices in the array
  */
-inline uint TriangleVertexArray::getIndicesStride() const {
+RP3D_FORCE_INLINE uint TriangleVertexArray::getIndicesStride() const {
     return mIndicesStride;
 }
 
@@ -246,7 +246,7 @@ inline uint TriangleVertexArray::getIndicesStride() const {
 /**
  * @return A pointer to the start of the vertices data in the array
  */
-inline const void* TriangleVertexArray::getVerticesStart() const {
+RP3D_FORCE_INLINE const void* TriangleVertexArray::getVerticesStart() const {
     return mVerticesStart;
 }
 
@@ -254,7 +254,7 @@ inline const void* TriangleVertexArray::getVerticesStart() const {
 /**
  * @return A pointer to the start of the normals data in the array
  */
-inline const void* TriangleVertexArray::getVerticesNormalsStart() const {
+RP3D_FORCE_INLINE const void* TriangleVertexArray::getVerticesNormalsStart() const {
     return mVerticesNormalsStart;
 }
 
@@ -262,7 +262,7 @@ inline const void* TriangleVertexArray::getVerticesNormalsStart() const {
 /**
  * @return A pointer to the start of the face indices data in the array
  */
-inline const void* TriangleVertexArray::getIndicesStart() const {
+RP3D_FORCE_INLINE const void* TriangleVertexArray::getIndicesStart() const {
     return mIndicesStart;
 }
 
diff --git a/include/reactphysics3d/collision/broadphase/DynamicAABBTree.h b/include/reactphysics3d/collision/broadphase/DynamicAABBTree.h
index 315d54d1..1ff0aa67 100644
--- a/include/reactphysics3d/collision/broadphase/DynamicAABBTree.h
+++ b/include/reactphysics3d/collision/broadphase/DynamicAABBTree.h
@@ -264,38 +264,38 @@ class DynamicAABBTree {
 };
 
 // Return true if the node is a leaf of the tree
-inline bool TreeNode::isLeaf() const {
+RP3D_FORCE_INLINE bool TreeNode::isLeaf() const {
     return (height == 0);
 }
 
 // Return the fat AABB corresponding to a given node ID
-inline const AABB& DynamicAABBTree::getFatAABB(int32 nodeID) const {
+RP3D_FORCE_INLINE const AABB& DynamicAABBTree::getFatAABB(int32 nodeID) const {
     assert(nodeID >= 0 && nodeID < mNbAllocatedNodes);
     return mNodes[nodeID].aabb;
 }
 
 // Return the pointer to the data array of a given leaf node of the tree
-inline int32* DynamicAABBTree::getNodeDataInt(int32 nodeID) const {
+RP3D_FORCE_INLINE int32* DynamicAABBTree::getNodeDataInt(int32 nodeID) const {
     assert(nodeID >= 0 && nodeID < mNbAllocatedNodes);
     assert(mNodes[nodeID].isLeaf());
     return mNodes[nodeID].dataInt;
 }
 
 // Return the pointer to the data pointer of a given leaf node of the tree
-inline void* DynamicAABBTree::getNodeDataPointer(int32 nodeID) const {
+RP3D_FORCE_INLINE void* DynamicAABBTree::getNodeDataPointer(int32 nodeID) const {
     assert(nodeID >= 0 && nodeID < mNbAllocatedNodes);
     assert(mNodes[nodeID].isLeaf());
     return mNodes[nodeID].dataPointer;
 }
 
 // Return the root AABB of the tree
-inline AABB DynamicAABBTree::getRootAABB() const {
+RP3D_FORCE_INLINE AABB DynamicAABBTree::getRootAABB() const {
     return getFatAABB(mRootNodeID);
 }
 
 // Add an object into the tree. This method creates a new leaf node in the tree and
 // returns the ID of the corresponding node.
-inline int32 DynamicAABBTree::addObject(const AABB& aabb, int32 data1, int32 data2) {
+RP3D_FORCE_INLINE int32 DynamicAABBTree::addObject(const AABB& aabb, int32 data1, int32 data2) {
 
     int32 nodeId = addObjectInternal(aabb);
 
@@ -307,7 +307,7 @@ inline int32 DynamicAABBTree::addObject(const AABB& aabb, int32 data1, int32 dat
 
 // Add an object into the tree. This method creates a new leaf node in the tree and
 // returns the ID of the corresponding node.
-inline int32 DynamicAABBTree::addObject(const AABB& aabb, void* data) {
+RP3D_FORCE_INLINE int32 DynamicAABBTree::addObject(const AABB& aabb, void* data) {
 
     int32 nodeId = addObjectInternal(aabb);
 
@@ -319,7 +319,7 @@ inline int32 DynamicAABBTree::addObject(const AABB& aabb, void* data) {
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void DynamicAABBTree::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void DynamicAABBTree::setProfiler(Profiler* profiler) {
 	mProfiler = profiler;
 }
 
diff --git a/include/reactphysics3d/collision/narrowphase/CollisionDispatch.h b/include/reactphysics3d/collision/narrowphase/CollisionDispatch.h
index 8b77f8d9..95bfb990 100644
--- a/include/reactphysics3d/collision/narrowphase/CollisionDispatch.h
+++ b/include/reactphysics3d/collision/narrowphase/CollisionDispatch.h
@@ -173,39 +173,39 @@ class CollisionDispatch {
 };
 
 // Get the Sphere vs Sphere narrow-phase collision detection algorithm
-inline SphereVsSphereAlgorithm* CollisionDispatch::getSphereVsSphereAlgorithm() {
+RP3D_FORCE_INLINE SphereVsSphereAlgorithm* CollisionDispatch::getSphereVsSphereAlgorithm() {
     return mSphereVsSphereAlgorithm;
 }
 
 // Get the Sphere vs Capsule narrow-phase collision detection algorithm
-inline SphereVsCapsuleAlgorithm* CollisionDispatch::getSphereVsCapsuleAlgorithm() {
+RP3D_FORCE_INLINE SphereVsCapsuleAlgorithm* CollisionDispatch::getSphereVsCapsuleAlgorithm() {
     return mSphereVsCapsuleAlgorithm;
 }
 
 // Get the Capsule vs Capsule narrow-phase collision detection algorithm
-inline CapsuleVsCapsuleAlgorithm* CollisionDispatch::getCapsuleVsCapsuleAlgorithm() {
+RP3D_FORCE_INLINE CapsuleVsCapsuleAlgorithm* CollisionDispatch::getCapsuleVsCapsuleAlgorithm() {
     return mCapsuleVsCapsuleAlgorithm;
 }
 
 // Get the Sphere vs Convex Polyhedron narrow-phase collision detection algorithm
-inline SphereVsConvexPolyhedronAlgorithm* CollisionDispatch::getSphereVsConvexPolyhedronAlgorithm() {
+RP3D_FORCE_INLINE SphereVsConvexPolyhedronAlgorithm* CollisionDispatch::getSphereVsConvexPolyhedronAlgorithm() {
     return mSphereVsConvexPolyhedronAlgorithm;
 }
 
 // Get the Capsule vs Convex Polyhedron narrow-phase collision detection algorithm
-inline CapsuleVsConvexPolyhedronAlgorithm* CollisionDispatch::getCapsuleVsConvexPolyhedronAlgorithm() {
+RP3D_FORCE_INLINE CapsuleVsConvexPolyhedronAlgorithm* CollisionDispatch::getCapsuleVsConvexPolyhedronAlgorithm() {
    return mCapsuleVsConvexPolyhedronAlgorithm;
 }
 
 // Get the Convex Polyhedron vs Convex Polyhedron narrow-phase collision detection algorithm
-inline ConvexPolyhedronVsConvexPolyhedronAlgorithm* CollisionDispatch::getConvexPolyhedronVsConvexPolyhedronAlgorithm() {
+RP3D_FORCE_INLINE ConvexPolyhedronVsConvexPolyhedronAlgorithm* CollisionDispatch::getConvexPolyhedronVsConvexPolyhedronAlgorithm() {
     return mConvexPolyhedronVsConvexPolyhedronAlgorithm;
 }
 
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void CollisionDispatch::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void CollisionDispatch::setProfiler(Profiler* profiler) {
 
     mProfiler = profiler;
     mSphereVsSphereAlgorithm->setProfiler(profiler);
diff --git a/include/reactphysics3d/collision/narrowphase/GJK/GJKAlgorithm.h b/include/reactphysics3d/collision/narrowphase/GJK/GJKAlgorithm.h
index 7b727920..2aba4e73 100644
--- a/include/reactphysics3d/collision/narrowphase/GJK/GJKAlgorithm.h
+++ b/include/reactphysics3d/collision/narrowphase/GJK/GJKAlgorithm.h
@@ -112,7 +112,7 @@ class GJKAlgorithm {
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void GJKAlgorithm::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void GJKAlgorithm::setProfiler(Profiler* profiler) {
 	mProfiler = profiler;
 }
 
diff --git a/include/reactphysics3d/collision/narrowphase/GJK/VoronoiSimplex.h b/include/reactphysics3d/collision/narrowphase/GJK/VoronoiSimplex.h
index 4d721b0d..fb9ddc8d 100644
--- a/include/reactphysics3d/collision/narrowphase/GJK/VoronoiSimplex.h
+++ b/include/reactphysics3d/collision/narrowphase/GJK/VoronoiSimplex.h
@@ -171,17 +171,17 @@ class VoronoiSimplex {
 };
 
 // Return true if the simplex contains 4 points
-inline bool VoronoiSimplex::isFull() const {
+RP3D_FORCE_INLINE bool VoronoiSimplex::isFull() const {
     return mNbPoints == 4;
 }
 
 // Return true if the simple is empty
-inline bool VoronoiSimplex::isEmpty() const {
+RP3D_FORCE_INLINE bool VoronoiSimplex::isEmpty() const {
     return mNbPoints == 0;
 }
 
 // Set the barycentric coordinates of the closest point
-inline void VoronoiSimplex::setBarycentricCoords(decimal a, decimal b, decimal c, decimal d) {
+RP3D_FORCE_INLINE void VoronoiSimplex::setBarycentricCoords(decimal a, decimal b, decimal c, decimal d) {
     mBarycentricCoords[0] = a;
     mBarycentricCoords[1] = b;
     mBarycentricCoords[2] = c;
@@ -189,7 +189,7 @@ inline void VoronoiSimplex::setBarycentricCoords(decimal a, decimal b, decimal c
 }
 
 // Compute the closest point "v" to the origin of the current simplex.
-inline bool VoronoiSimplex::computeClosestPoint(Vector3& v) {
+RP3D_FORCE_INLINE bool VoronoiSimplex::computeClosestPoint(Vector3& v) {
 
     bool isValid = recomputeClosestPoint();
     v = mClosestPoint;
@@ -197,7 +197,7 @@ inline bool VoronoiSimplex::computeClosestPoint(Vector3& v) {
 }
 
 // Return true if the
-inline bool VoronoiSimplex::checkClosestPointValid() const {
+RP3D_FORCE_INLINE bool VoronoiSimplex::checkClosestPointValid() const {
     return mBarycentricCoords[0] >= decimal(0.0) && mBarycentricCoords[1] >= decimal(0.0) &&
            mBarycentricCoords[2] >= decimal(0.0) && mBarycentricCoords[3] >= decimal(0.0);
 }
diff --git a/include/reactphysics3d/collision/narrowphase/NarrowPhaseAlgorithm.h b/include/reactphysics3d/collision/narrowphase/NarrowPhaseAlgorithm.h
index c360b2bc..444b1744 100644
--- a/include/reactphysics3d/collision/narrowphase/NarrowPhaseAlgorithm.h
+++ b/include/reactphysics3d/collision/narrowphase/NarrowPhaseAlgorithm.h
@@ -106,7 +106,7 @@ class NarrowPhaseAlgorithm {
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void NarrowPhaseAlgorithm::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void NarrowPhaseAlgorithm::setProfiler(Profiler* profiler) {
 	mProfiler = profiler;
 }
 
diff --git a/include/reactphysics3d/collision/narrowphase/NarrowPhaseInfoBatch.h b/include/reactphysics3d/collision/narrowphase/NarrowPhaseInfoBatch.h
index 06b8e0cc..bcad2c5b 100644
--- a/include/reactphysics3d/collision/narrowphase/NarrowPhaseInfoBatch.h
+++ b/include/reactphysics3d/collision/narrowphase/NarrowPhaseInfoBatch.h
@@ -29,6 +29,7 @@
 // Libraries
 #include <reactphysics3d/engine/OverlappingPairs.h>
 #include <reactphysics3d/collision/ContactPointInfo.h>
+#include <reactphysics3d/configuration.h>
 
 /// Namespace ReactPhysics3D
 namespace reactphysics3d {
@@ -145,10 +146,46 @@ struct NarrowPhaseInfoBatch {
 };
 
 /// Return the number of objects in the batch
-inline uint NarrowPhaseInfoBatch::getNbObjects() const {
+RP3D_FORCE_INLINE uint NarrowPhaseInfoBatch::getNbObjects() const {
     return narrowPhaseInfos.size();
 }
 
+// Add shapes to be tested during narrow-phase collision detection into the batch
+RP3D_FORCE_INLINE void NarrowPhaseInfoBatch::addNarrowPhaseInfo(uint64 pairId, uint64 pairIndex, Entity collider1, Entity collider2, CollisionShape* shape1,
+                                              CollisionShape* shape2, const Transform& shape1Transform, const Transform& shape2Transform,
+                                              bool needToReportContacts, MemoryAllocator& shapeAllocator) {
+
+    // Add a collision info for the two collision shapes into the overlapping pair (if not present yet)
+    // TODO OPTI : Can we better manage this
+    LastFrameCollisionInfo* lastFrameInfo = mOverlappingPairs.addLastFrameInfoIfNecessary(pairIndex, shape1->getId(), shape2->getId());
+
+    // Create a meta data object
+    narrowPhaseInfos.emplace(pairId, collider1, collider2, lastFrameInfo, shapeAllocator, shape1Transform, shape2Transform, shape1, shape2, needToReportContacts);
+}
+
+// Add a new contact point
+RP3D_FORCE_INLINE void NarrowPhaseInfoBatch::addContactPoint(uint index, const Vector3& contactNormal, decimal penDepth, const Vector3& localPt1, const Vector3& localPt2) {
+
+    assert(penDepth > decimal(0.0));
+
+    if (narrowPhaseInfos[index].nbContactPoints < NB_MAX_CONTACT_POINTS_IN_NARROWPHASE_INFO) {
+
+        assert(contactNormal.length() > 0.8f);
+
+        // Add it into the array of contact points
+        narrowPhaseInfos[index].contactPoints[narrowPhaseInfos[index].nbContactPoints].normal = contactNormal;
+        narrowPhaseInfos[index].contactPoints[narrowPhaseInfos[index].nbContactPoints].penetrationDepth = penDepth;
+        narrowPhaseInfos[index].contactPoints[narrowPhaseInfos[index].nbContactPoints].localPoint1 = localPt1;
+        narrowPhaseInfos[index].contactPoints[narrowPhaseInfos[index].nbContactPoints].localPoint2 = localPt2;
+        narrowPhaseInfos[index].nbContactPoints++;
+    }
+}
+
+// Reset the remaining contact points
+RP3D_FORCE_INLINE void NarrowPhaseInfoBatch::resetContactPoints(uint index) {
+    narrowPhaseInfos[index].nbContactPoints = 0;
+}
+
 }
 
 #endif
diff --git a/include/reactphysics3d/collision/narrowphase/NarrowPhaseInput.h b/include/reactphysics3d/collision/narrowphase/NarrowPhaseInput.h
index 4ad189da..639117a7 100644
--- a/include/reactphysics3d/collision/narrowphase/NarrowPhaseInput.h
+++ b/include/reactphysics3d/collision/narrowphase/NarrowPhaseInput.h
@@ -29,6 +29,7 @@
 // Libraries
 #include <reactphysics3d/containers/List.h>
 #include <reactphysics3d/collision/narrowphase/NarrowPhaseInfoBatch.h>
+#include <reactphysics3d/collision/narrowphase/CollisionDispatch.h>
 
 /// Namespace ReactPhysics3D
 namespace reactphysics3d {
@@ -97,34 +98,64 @@ class NarrowPhaseInput {
 
 
 // Get a reference to the sphere vs sphere batch contacts
-inline NarrowPhaseInfoBatch& NarrowPhaseInput::getSphereVsSphereBatch() {
+RP3D_FORCE_INLINE NarrowPhaseInfoBatch& NarrowPhaseInput::getSphereVsSphereBatch() {
     return mSphereVsSphereBatch;
 }
 
 // Get a reference to the sphere vs capsule batch contacts
-inline NarrowPhaseInfoBatch& NarrowPhaseInput::getSphereVsCapsuleBatch() {
+RP3D_FORCE_INLINE NarrowPhaseInfoBatch& NarrowPhaseInput::getSphereVsCapsuleBatch() {
    return mSphereVsCapsuleBatch;
 }
 
 // Get a reference to the capsule vs capsule batch contacts
-inline NarrowPhaseInfoBatch& NarrowPhaseInput::getCapsuleVsCapsuleBatch() {
+RP3D_FORCE_INLINE NarrowPhaseInfoBatch& NarrowPhaseInput::getCapsuleVsCapsuleBatch() {
    return mCapsuleVsCapsuleBatch;
 }
 
 // Get a reference to the sphere vs convex polyhedron batch contacts
-inline NarrowPhaseInfoBatch& NarrowPhaseInput::getSphereVsConvexPolyhedronBatch() {
+RP3D_FORCE_INLINE NarrowPhaseInfoBatch& NarrowPhaseInput::getSphereVsConvexPolyhedronBatch() {
    return mSphereVsConvexPolyhedronBatch;
 }
 
 // Get a reference to the capsule vs convex polyhedron batch contacts
-inline NarrowPhaseInfoBatch& NarrowPhaseInput::getCapsuleVsConvexPolyhedronBatch() {
+RP3D_FORCE_INLINE NarrowPhaseInfoBatch& NarrowPhaseInput::getCapsuleVsConvexPolyhedronBatch() {
    return mCapsuleVsConvexPolyhedronBatch;
 }
 
 // Get a reference to the convex polyhedron vs convex polyhedron batch contacts
-inline NarrowPhaseInfoBatch &NarrowPhaseInput::getConvexPolyhedronVsConvexPolyhedronBatch() {
+RP3D_FORCE_INLINE NarrowPhaseInfoBatch &NarrowPhaseInput::getConvexPolyhedronVsConvexPolyhedronBatch() {
    return mConvexPolyhedronVsConvexPolyhedronBatch;
 }
 
+// Add shapes to be tested during narrow-phase collision detection into the batch
+RP3D_FORCE_INLINE void NarrowPhaseInput::addNarrowPhaseTest(uint64 pairId, uint64 pairIndex, Entity collider1, Entity collider2, CollisionShape* shape1, CollisionShape* shape2,
+                                          const Transform& shape1Transform, const Transform& shape2Transform,
+                                          NarrowPhaseAlgorithmType narrowPhaseAlgorithmType, bool reportContacts, MemoryAllocator& shapeAllocator) {
+
+    switch (narrowPhaseAlgorithmType) {
+        case NarrowPhaseAlgorithmType::SphereVsSphere:
+            mSphereVsSphereBatch.addNarrowPhaseInfo(pairId, pairIndex, collider1, collider2, shape1, shape2, shape1Transform, shape2Transform, reportContacts, shapeAllocator);
+            break;
+        case NarrowPhaseAlgorithmType::SphereVsCapsule:
+            mSphereVsCapsuleBatch.addNarrowPhaseInfo(pairId, pairIndex, collider1, collider2, shape1, shape2, shape1Transform, shape2Transform, reportContacts, shapeAllocator);
+            break;
+        case NarrowPhaseAlgorithmType::CapsuleVsCapsule:
+            mCapsuleVsCapsuleBatch.addNarrowPhaseInfo(pairId, pairIndex, collider1, collider2, shape1, shape2, shape1Transform, shape2Transform, reportContacts, shapeAllocator);
+            break;
+        case NarrowPhaseAlgorithmType::SphereVsConvexPolyhedron:
+            mSphereVsConvexPolyhedronBatch.addNarrowPhaseInfo(pairId, pairIndex, collider1, collider2, shape1, shape2, shape1Transform, shape2Transform, reportContacts, shapeAllocator);
+            break;
+        case NarrowPhaseAlgorithmType::CapsuleVsConvexPolyhedron:
+            mCapsuleVsConvexPolyhedronBatch.addNarrowPhaseInfo(pairId, pairIndex, collider1, collider2, shape1, shape2, shape1Transform, shape2Transform, reportContacts, shapeAllocator);
+            break;
+        case NarrowPhaseAlgorithmType::ConvexPolyhedronVsConvexPolyhedron:
+            mConvexPolyhedronVsConvexPolyhedronBatch.addNarrowPhaseInfo(pairId, pairIndex, collider1, collider2, shape1, shape2, shape1Transform, shape2Transform, reportContacts, shapeAllocator);
+            break;
+        case NarrowPhaseAlgorithmType::None:
+            // Must never happen
+            assert(false);
+            break;
+    }
+}
 }
 #endif
diff --git a/include/reactphysics3d/collision/narrowphase/SAT/SATAlgorithm.h b/include/reactphysics3d/collision/narrowphase/SAT/SATAlgorithm.h
index 9f8a4bef..9f486013 100644
--- a/include/reactphysics3d/collision/narrowphase/SAT/SATAlgorithm.h
+++ b/include/reactphysics3d/collision/narrowphase/SAT/SATAlgorithm.h
@@ -185,7 +185,7 @@ class SATAlgorithm {
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void SATAlgorithm::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void SATAlgorithm::setProfiler(Profiler* profiler) {
 
 	mProfiler = profiler;
 }
diff --git a/include/reactphysics3d/collision/shapes/AABB.h b/include/reactphysics3d/collision/shapes/AABB.h
index 17aea61c..5dbcb6f1 100644
--- a/include/reactphysics3d/collision/shapes/AABB.h
+++ b/include/reactphysics3d/collision/shapes/AABB.h
@@ -127,44 +127,44 @@ class AABB {
 };
 
 // Return the center point of the AABB in world coordinates
-inline Vector3 AABB::getCenter() const {
+RP3D_FORCE_INLINE Vector3 AABB::getCenter() const {
     return (mMinCoordinates + mMaxCoordinates) * decimal(0.5);
 }
 
 // Return the minimum coordinates of the AABB
-inline const Vector3& AABB::getMin() const {
+RP3D_FORCE_INLINE const Vector3& AABB::getMin() const {
     return mMinCoordinates;
 }
 
 // Set the minimum coordinates of the AABB
-inline void AABB::setMin(const Vector3& min) {
+RP3D_FORCE_INLINE void AABB::setMin(const Vector3& min) {
     mMinCoordinates = min;
 }
 
 // Return the maximum coordinates of the AABB
-inline const Vector3& AABB::getMax() const {
+RP3D_FORCE_INLINE const Vector3& AABB::getMax() const {
     return mMaxCoordinates;
 }
 
 // Set the maximum coordinates of the AABB
-inline void AABB::setMax(const Vector3& max) {
+RP3D_FORCE_INLINE void AABB::setMax(const Vector3& max) {
     mMaxCoordinates = max;
 }
 
 // Return the size of the AABB in the three dimension x, y and z
-inline Vector3 AABB::getExtent() const {
+RP3D_FORCE_INLINE Vector3 AABB::getExtent() const {
   return  mMaxCoordinates - mMinCoordinates;
 }
 
 // Inflate each side of the AABB by a given size
-inline void AABB::inflate(decimal dx, decimal dy, decimal dz) {
+RP3D_FORCE_INLINE void AABB::inflate(decimal dx, decimal dy, decimal dz) {
     mMaxCoordinates += Vector3(dx, dy, dz);
     mMinCoordinates -= Vector3(dx, dy, dz);
 }
 
 // Return true if the current AABB is overlapping with the AABB in argument.
 /// Two AABBs overlap if they overlap in the three x, y and z axis at the same time
-inline bool AABB::testCollision(const AABB& aabb) const {
+RP3D_FORCE_INLINE bool AABB::testCollision(const AABB& aabb) const {
     if (mMaxCoordinates.x < aabb.mMinCoordinates.x ||
         aabb.mMaxCoordinates.x < mMinCoordinates.x) return false;
     if (mMaxCoordinates.y < aabb.mMinCoordinates.y ||
@@ -175,13 +175,13 @@ inline bool AABB::testCollision(const AABB& aabb) const {
 }
 
 // Return the volume of the AABB
-inline decimal AABB::getVolume() const {
+RP3D_FORCE_INLINE decimal AABB::getVolume() const {
     const Vector3 diff = mMaxCoordinates - mMinCoordinates;
     return (diff.x * diff.y * diff.z);
 }
 
 // Return true if the AABB of a triangle intersects the AABB
-inline bool AABB::testCollisionTriangleAABB(const Vector3* trianglePoints) const {
+RP3D_FORCE_INLINE bool AABB::testCollisionTriangleAABB(const Vector3* trianglePoints) const {
 
     if (min3(trianglePoints[0].x, trianglePoints[1].x, trianglePoints[2].x) > mMaxCoordinates.x) return false;
     if (min3(trianglePoints[0].y, trianglePoints[1].y, trianglePoints[2].y) > mMaxCoordinates.y) return false;
@@ -195,7 +195,7 @@ inline bool AABB::testCollisionTriangleAABB(const Vector3* trianglePoints) const
 }
 
 // Return true if a point is inside the AABB
-inline bool AABB::contains(const Vector3& point) const {
+RP3D_FORCE_INLINE bool AABB::contains(const Vector3& point) const {
 
     return (point.x >= mMinCoordinates.x - MACHINE_EPSILON && point.x <= mMaxCoordinates.x + MACHINE_EPSILON &&
             point.y >= mMinCoordinates.y - MACHINE_EPSILON && point.y <= mMaxCoordinates.y + MACHINE_EPSILON &&
@@ -203,13 +203,13 @@ inline bool AABB::contains(const Vector3& point) const {
 }
 
 // Apply a scale factor to the AABB
-inline void AABB::applyScale(const Vector3& scale) {
+RP3D_FORCE_INLINE void AABB::applyScale(const Vector3& scale) {
     mMinCoordinates = mMinCoordinates * scale;
     mMaxCoordinates = mMaxCoordinates * scale;
 }
 
 // Assignment operator
-inline AABB& AABB::operator=(const AABB& aabb) {
+RP3D_FORCE_INLINE AABB& AABB::operator=(const AABB& aabb) {
     if (this != &aabb) {
         mMinCoordinates = aabb.mMinCoordinates;
         mMaxCoordinates = aabb.mMaxCoordinates;
diff --git a/include/reactphysics3d/collision/shapes/BoxShape.h b/include/reactphysics3d/collision/shapes/BoxShape.h
index fc78c353..c54def68 100644
--- a/include/reactphysics3d/collision/shapes/BoxShape.h
+++ b/include/reactphysics3d/collision/shapes/BoxShape.h
@@ -140,7 +140,7 @@ class BoxShape : public ConvexPolyhedronShape {
 /**
  * @return The vector with the three half-extents of the box shape
  */
-inline Vector3 BoxShape::getHalfExtents() const {
+RP3D_FORCE_INLINE Vector3 BoxShape::getHalfExtents() const {
     return mHalfExtents;
 }
 
@@ -150,7 +150,7 @@ inline Vector3 BoxShape::getHalfExtents() const {
 /**
  * @param halfExtents The vector with the three half-extents of the box
  */
-inline void BoxShape::setHalfExtents(const Vector3& halfExtents) {
+RP3D_FORCE_INLINE void BoxShape::setHalfExtents(const Vector3& halfExtents) {
     mHalfExtents = halfExtents;
 
     notifyColliderAboutChangedSize();
@@ -162,7 +162,7 @@ inline void BoxShape::setHalfExtents(const Vector3& halfExtents) {
  * @param min The minimum bounds of the shape in local-space coordinates
  * @param max The maximum bounds of the shape in local-space coordinates
  */
-inline void BoxShape::getLocalBounds(Vector3& min, Vector3& max) const {
+RP3D_FORCE_INLINE void BoxShape::getLocalBounds(Vector3& min, Vector3& max) const {
 
     // Maximum bounds
     max = mHalfExtents;
@@ -172,12 +172,12 @@ inline void BoxShape::getLocalBounds(Vector3& min, Vector3& max) const {
 }
 
 // Return the number of bytes used by the collision shape
-inline size_t BoxShape::getSizeInBytes() const {
+RP3D_FORCE_INLINE size_t BoxShape::getSizeInBytes() const {
     return sizeof(BoxShape);
 }
 
 // Return a local support point in a given direction without the object margin
-inline Vector3 BoxShape::getLocalSupportPointWithoutMargin(const Vector3& direction) const {
+RP3D_FORCE_INLINE Vector3 BoxShape::getLocalSupportPointWithoutMargin(const Vector3& direction) const {
 
     return Vector3(direction.x < decimal(0.0) ? -mHalfExtents.x : mHalfExtents.x,
                    direction.y < decimal(0.0) ? -mHalfExtents.y : mHalfExtents.y,
@@ -185,36 +185,36 @@ inline Vector3 BoxShape::getLocalSupportPointWithoutMargin(const Vector3& direct
 }
 
 // Return true if a point is inside the collision shape
-inline bool BoxShape::testPointInside(const Vector3& localPoint, Collider* collider) const {
+RP3D_FORCE_INLINE bool BoxShape::testPointInside(const Vector3& localPoint, Collider* collider) const {
     return (localPoint.x < mHalfExtents[0] && localPoint.x > -mHalfExtents[0] &&
             localPoint.y < mHalfExtents[1] && localPoint.y > -mHalfExtents[1] &&
             localPoint.z < mHalfExtents[2] && localPoint.z > -mHalfExtents[2]);
 }
 
 // Return the number of faces of the polyhedron
-inline uint BoxShape::getNbFaces() const {
+RP3D_FORCE_INLINE uint BoxShape::getNbFaces() const {
     return 6;
 }
 
 // Return a given face of the polyhedron
-inline const HalfEdgeStructure::Face& BoxShape::getFace(uint faceIndex) const {
+RP3D_FORCE_INLINE const HalfEdgeStructure::Face& BoxShape::getFace(uint faceIndex) const {
     assert(faceIndex < mHalfEdgeStructure.getNbFaces());
     return mHalfEdgeStructure.getFace(faceIndex);
 }
 
 // Return the number of vertices of the polyhedron
-inline uint BoxShape::getNbVertices() const {
+RP3D_FORCE_INLINE uint BoxShape::getNbVertices() const {
     return 8;
 }
 
 // Return a given vertex of the polyhedron
-inline HalfEdgeStructure::Vertex BoxShape::getVertex(uint vertexIndex) const {
+RP3D_FORCE_INLINE HalfEdgeStructure::Vertex BoxShape::getVertex(uint vertexIndex) const {
     assert(vertexIndex < getNbVertices());
     return mHalfEdgeStructure.getVertex(vertexIndex);
 }
 
 // Return the position of a given vertex
-inline Vector3 BoxShape::getVertexPosition(uint vertexIndex) const {
+RP3D_FORCE_INLINE Vector3 BoxShape::getVertexPosition(uint vertexIndex) const {
     assert(vertexIndex < getNbVertices());
 
     Vector3 extent = getHalfExtents();
@@ -235,7 +235,7 @@ inline Vector3 BoxShape::getVertexPosition(uint vertexIndex) const {
 }
 
 // Return the normal vector of a given face of the polyhedron
-inline Vector3 BoxShape::getFaceNormal(uint faceIndex) const {
+RP3D_FORCE_INLINE Vector3 BoxShape::getFaceNormal(uint faceIndex) const {
     assert(faceIndex < getNbFaces());
 
     switch(faceIndex) {
@@ -252,27 +252,27 @@ inline Vector3 BoxShape::getFaceNormal(uint faceIndex) const {
 }
 
 // Return the centroid of the box
-inline Vector3 BoxShape::getCentroid() const {
+RP3D_FORCE_INLINE Vector3 BoxShape::getCentroid() const {
     return Vector3::zero();
 }
 
 // Compute and return the volume of the collision shape
-inline decimal BoxShape::getVolume() const {
+RP3D_FORCE_INLINE decimal BoxShape::getVolume() const {
     return 8 * mHalfExtents.x * mHalfExtents.y * mHalfExtents.z;
 }
 
 // Return the string representation of the shape
-inline std::string BoxShape::to_string() const {
+RP3D_FORCE_INLINE std::string BoxShape::to_string() const {
     return "BoxShape{extents=" + mHalfExtents.to_string() + "}";
 }
 
 // Return the number of half-edges of the polyhedron
-inline uint BoxShape::getNbHalfEdges() const {
+RP3D_FORCE_INLINE uint BoxShape::getNbHalfEdges() const {
     return 24;
 }
 
 // Return a given half-edge of the polyhedron
-inline const HalfEdgeStructure::Edge& BoxShape::getHalfEdge(uint edgeIndex) const {
+RP3D_FORCE_INLINE const HalfEdgeStructure::Edge& BoxShape::getHalfEdge(uint edgeIndex) const {
     assert(edgeIndex < getNbHalfEdges());
     return mHalfEdgeStructure.getHalfEdge(edgeIndex);
 }
diff --git a/include/reactphysics3d/collision/shapes/CapsuleShape.h b/include/reactphysics3d/collision/shapes/CapsuleShape.h
index b9cfbc63..f8a54643 100644
--- a/include/reactphysics3d/collision/shapes/CapsuleShape.h
+++ b/include/reactphysics3d/collision/shapes/CapsuleShape.h
@@ -126,7 +126,7 @@ class CapsuleShape : public ConvexShape {
 /**
  * @return The radius of the capsule shape (in meters)
  */
-inline decimal CapsuleShape::getRadius() const {
+RP3D_FORCE_INLINE decimal CapsuleShape::getRadius() const {
     return mMargin;
 }
 
@@ -136,7 +136,7 @@ inline decimal CapsuleShape::getRadius() const {
 /**
  * @param radius The radius of the capsule (in meters)
  */
-inline void CapsuleShape::setRadius(decimal radius) {
+RP3D_FORCE_INLINE void CapsuleShape::setRadius(decimal radius) {
 
     assert(radius > decimal(0.0));
     mMargin = radius;
@@ -148,7 +148,7 @@ inline void CapsuleShape::setRadius(decimal radius) {
 /**
  * @return The height of the capsule shape (in meters)
  */
-inline decimal CapsuleShape::getHeight() const {
+RP3D_FORCE_INLINE decimal CapsuleShape::getHeight() const {
     return mHalfHeight + mHalfHeight;
 }
 
@@ -158,7 +158,7 @@ inline decimal CapsuleShape::getHeight() const {
 /**
  * @param height The height of the capsule (in meters)
  */
-inline void CapsuleShape::setHeight(decimal height) {
+RP3D_FORCE_INLINE void CapsuleShape::setHeight(decimal height) {
 
     assert(height > decimal(0.0));
     mHalfHeight = height * decimal(0.5);
@@ -167,7 +167,7 @@ inline void CapsuleShape::setHeight(decimal height) {
 }
 
 // Return the number of bytes used by the collision shape
-inline size_t CapsuleShape::getSizeInBytes() const {
+RP3D_FORCE_INLINE size_t CapsuleShape::getSizeInBytes() const {
     return sizeof(CapsuleShape);
 }
 
@@ -177,7 +177,7 @@ inline size_t CapsuleShape::getSizeInBytes() const {
  * @param min The minimum bounds of the shape in local-space coordinates
  * @param max The maximum bounds of the shape in local-space coordinates
  */
-inline void CapsuleShape::getLocalBounds(Vector3& min, Vector3& max) const {
+RP3D_FORCE_INLINE void CapsuleShape::getLocalBounds(Vector3& min, Vector3& max) const {
 
     // Maximum bounds
     max.x = mMargin;
@@ -191,12 +191,12 @@ inline void CapsuleShape::getLocalBounds(Vector3& min, Vector3& max) const {
 }
 
 // Compute and return the volume of the collision shape
-inline decimal CapsuleShape::getVolume() const {
+RP3D_FORCE_INLINE decimal CapsuleShape::getVolume() const {
     return reactphysics3d::PI_RP3D * mMargin * mMargin * (decimal(4.0) * mMargin / decimal(3.0) + decimal(2.0) * mHalfHeight);
 }
 
 // Return true if the collision shape is a polyhedron
-inline bool CapsuleShape::isPolyhedron() const {
+RP3D_FORCE_INLINE bool CapsuleShape::isPolyhedron() const {
     return false;
 }
 
@@ -207,7 +207,7 @@ inline bool CapsuleShape::isPolyhedron() const {
 /// Therefore, in this method, we compute the support points of both top and bottom spheres of
 /// the capsule and return the point with the maximum dot product with the direction vector. Note
 /// that the object margin is implicitly the radius and height of the capsule.
-inline Vector3 CapsuleShape::getLocalSupportPointWithoutMargin(const Vector3& direction) const {
+RP3D_FORCE_INLINE Vector3 CapsuleShape::getLocalSupportPointWithoutMargin(const Vector3& direction) const {
 
     // Support point top sphere
     decimal dotProductTop = mHalfHeight * direction.y;
@@ -225,7 +225,7 @@ inline Vector3 CapsuleShape::getLocalSupportPointWithoutMargin(const Vector3& di
 }
 
 // Return the string representation of the shape
-inline std::string CapsuleShape::to_string() const {
+RP3D_FORCE_INLINE std::string CapsuleShape::to_string() const {
     return "CapsuleShape{halfHeight=" + std::to_string(mHalfHeight) + ", radius=" + std::to_string(getRadius()) + "}";
 }
 
diff --git a/include/reactphysics3d/collision/shapes/CollisionShape.h b/include/reactphysics3d/collision/shapes/CollisionShape.h
index 0fdca0b4..beca8bcb 100644
--- a/include/reactphysics3d/collision/shapes/CollisionShape.h
+++ b/include/reactphysics3d/collision/shapes/CollisionShape.h
@@ -172,7 +172,7 @@ class CollisionShape {
 /**
 * @return The name of the collision shape (box, sphere, triangle, ...)
 */
-inline CollisionShapeName CollisionShape::getName() const {
+RP3D_FORCE_INLINE CollisionShapeName CollisionShape::getName() const {
 	return mName;
 }
 
@@ -180,29 +180,29 @@ inline CollisionShapeName CollisionShape::getName() const {
 /**
  * @return The type of the collision shape (sphere, capsule, convex polyhedron, concave mesh)
  */
-inline CollisionShapeType CollisionShape::getType() const {
+RP3D_FORCE_INLINE CollisionShapeType CollisionShape::getType() const {
     return mType;
 }
 
 // Return the id of the shape
-inline uint32 CollisionShape::getId() const {
+RP3D_FORCE_INLINE uint32 CollisionShape::getId() const {
    return mId;
 }
 
 // Assign a new collider to the collision shape
-inline void CollisionShape::addCollider(Collider* collider) {
+RP3D_FORCE_INLINE void CollisionShape::addCollider(Collider* collider) {
     mColliders.add(collider);
 }
 
 // Remove an assigned collider from the collision shape
-inline void CollisionShape::removeCollider(Collider* collider) {
+RP3D_FORCE_INLINE void CollisionShape::removeCollider(Collider* collider) {
     mColliders.remove(collider);
 }
 
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void CollisionShape::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void CollisionShape::setProfiler(Profiler* profiler) {
 
 	mProfiler = profiler;
 }
diff --git a/include/reactphysics3d/collision/shapes/ConcaveMeshShape.h b/include/reactphysics3d/collision/shapes/ConcaveMeshShape.h
index 3ecfc5e0..dab3b9dd 100644
--- a/include/reactphysics3d/collision/shapes/ConcaveMeshShape.h
+++ b/include/reactphysics3d/collision/shapes/ConcaveMeshShape.h
@@ -212,7 +212,7 @@ class ConcaveMeshShape : public ConcaveShape {
 };
 
 // Return the number of bytes used by the collision shape
-inline size_t ConcaveMeshShape::getSizeInBytes() const {
+RP3D_FORCE_INLINE size_t ConcaveMeshShape::getSizeInBytes() const {
     return sizeof(ConcaveMeshShape);
 }
 
@@ -222,7 +222,7 @@ inline size_t ConcaveMeshShape::getSizeInBytes() const {
  * @param min The minimum bounds of the shape in local-space coordinates
  * @param max The maximum bounds of the shape in local-space coordinates
  */
-inline void ConcaveMeshShape::getLocalBounds(Vector3& min, Vector3& max) const {
+RP3D_FORCE_INLINE void ConcaveMeshShape::getLocalBounds(Vector3& min, Vector3& max) const {
 
     // Get the AABB of the whole tree
     AABB treeAABB = mDynamicAABBTree.getRootAABB();
@@ -233,7 +233,7 @@ inline void ConcaveMeshShape::getLocalBounds(Vector3& min, Vector3& max) const {
 
 // Called when a overlapping node has been found during the call to
 // DynamicAABBTree:reportAllShapesOverlappingWithAABB()
-inline void ConvexTriangleAABBOverlapCallback::notifyOverlappingNode(int nodeId) {
+RP3D_FORCE_INLINE void ConvexTriangleAABBOverlapCallback::notifyOverlappingNode(int nodeId) {
 
     // Get the node data (triangle index and mesh subpart index)
     int32* data = mDynamicAABBTree.getNodeDataInt(nodeId);
@@ -253,7 +253,7 @@ inline void ConvexTriangleAABBOverlapCallback::notifyOverlappingNode(int nodeId)
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void ConcaveMeshShape::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void ConcaveMeshShape::setProfiler(Profiler* profiler) {
 
     CollisionShape::setProfiler(profiler);
 
diff --git a/include/reactphysics3d/collision/shapes/ConcaveShape.h b/include/reactphysics3d/collision/shapes/ConcaveShape.h
index d4ec18eb..3ee13b42 100644
--- a/include/reactphysics3d/collision/shapes/ConcaveShape.h
+++ b/include/reactphysics3d/collision/shapes/ConcaveShape.h
@@ -120,22 +120,22 @@ class ConcaveShape : public CollisionShape {
 };
 
 // Return true if the collision shape is convex, false if it is concave
-inline bool ConcaveShape::isConvex() const {
+RP3D_FORCE_INLINE bool ConcaveShape::isConvex() const {
     return false;
 }
 
 // Return true if the collision shape is a polyhedron
-inline bool ConcaveShape::isPolyhedron() const {
+RP3D_FORCE_INLINE bool ConcaveShape::isPolyhedron() const {
     return true;
 }
 
 // Return true if a point is inside the collision shape
-inline bool ConcaveShape::testPointInside(const Vector3& localPoint, Collider* collider) const {
+RP3D_FORCE_INLINE bool ConcaveShape::testPointInside(const Vector3& localPoint, Collider* collider) const {
     return false;
 }
 
 // Return the raycast test type (front, back, front-back)
-inline TriangleRaycastSide ConcaveShape::getRaycastTestType() const {
+RP3D_FORCE_INLINE TriangleRaycastSide ConcaveShape::getRaycastTestType() const {
     return mRaycastTestType;
 }
 
@@ -143,19 +143,19 @@ inline TriangleRaycastSide ConcaveShape::getRaycastTestType() const {
 /**
  * @param testType Raycast test type for the triangle (front, back, front-back)
  */
-inline void ConcaveShape::setRaycastTestType(TriangleRaycastSide testType) {
+RP3D_FORCE_INLINE void ConcaveShape::setRaycastTestType(TriangleRaycastSide testType) {
     mRaycastTestType = testType;
 }
 
 // Return the scale of the shape
-inline const Vector3& ConcaveShape::getScale() const {
+RP3D_FORCE_INLINE const Vector3& ConcaveShape::getScale() const {
     return mScale;
 }
 
 // Set the scale of the shape
 /// Note that you might want to recompute the inertia tensor and center of mass of the body
 /// after changing the scale of a collision shape
-inline void ConcaveShape::setScale(const Vector3& scale) {
+RP3D_FORCE_INLINE void ConcaveShape::setScale(const Vector3& scale) {
     mScale = scale;
 
     notifyColliderAboutChangedSize();
@@ -165,7 +165,7 @@ inline void ConcaveShape::setScale(const Vector3& scale) {
 /**
  * @param mass Mass to use to compute the inertia tensor of the collision shape
  */
-inline Vector3 ConcaveShape::getLocalInertiaTensor(decimal mass) const {
+RP3D_FORCE_INLINE Vector3 ConcaveShape::getLocalInertiaTensor(decimal mass) const {
 
     // Default inertia tensor
     // Note that this is not very realistic for a concave triangle mesh.
diff --git a/include/reactphysics3d/collision/shapes/ConvexMeshShape.h b/include/reactphysics3d/collision/shapes/ConvexMeshShape.h
index 0cbb5c43..f8a629e0 100644
--- a/include/reactphysics3d/collision/shapes/ConvexMeshShape.h
+++ b/include/reactphysics3d/collision/shapes/ConvexMeshShape.h
@@ -147,19 +147,19 @@ class ConvexMeshShape : public ConvexPolyhedronShape {
 };
 
 // Return the number of bytes used by the collision shape
-inline size_t ConvexMeshShape::getSizeInBytes() const {
+RP3D_FORCE_INLINE size_t ConvexMeshShape::getSizeInBytes() const {
     return sizeof(ConvexMeshShape);
 }
 
 // Return the scaling vector
-inline const Vector3& ConvexMeshShape::getScale() const {
+RP3D_FORCE_INLINE const Vector3& ConvexMeshShape::getScale() const {
     return mScale;
 }
 
 // Set the scale
 /// Note that you might want to recompute the inertia tensor and center of mass of the body
 /// after changing the scale of a collision shape
-inline void ConvexMeshShape::setScale(const Vector3& scale) {
+RP3D_FORCE_INLINE void ConvexMeshShape::setScale(const Vector3& scale) {
     mScale = scale;
     recalculateBounds();
     notifyColliderAboutChangedSize();
@@ -170,7 +170,7 @@ inline void ConvexMeshShape::setScale(const Vector3& scale) {
  * @param min The minimum bounds of the shape in local-space coordinates
  * @param max The maximum bounds of the shape in local-space coordinates
  */
-inline void ConvexMeshShape::getLocalBounds(Vector3& min, Vector3& max) const {
+RP3D_FORCE_INLINE void ConvexMeshShape::getLocalBounds(Vector3& min, Vector3& max) const {
     min = mMinBounds;
     max = mMaxBounds;
 }
@@ -181,7 +181,7 @@ inline void ConvexMeshShape::getLocalBounds(Vector3& min, Vector3& max) const {
 /**
 * @param mass Mass to use to compute the inertia tensor of the collision shape
 */
-inline Vector3 ConvexMeshShape::getLocalInertiaTensor(decimal mass) const {
+RP3D_FORCE_INLINE Vector3 ConvexMeshShape::getLocalInertiaTensor(decimal mass) const {
     const decimal factor = (decimal(1.0) / decimal(3.0)) * mass;
     const Vector3 realExtent = decimal(0.5) * (mMaxBounds - mMinBounds);
     assert(realExtent.x > 0 && realExtent.y > 0 && realExtent.z > 0);
@@ -192,58 +192,58 @@ inline Vector3 ConvexMeshShape::getLocalInertiaTensor(decimal mass) const {
 }
 
 // Return the number of faces of the polyhedron
-inline uint ConvexMeshShape::getNbFaces() const {
+RP3D_FORCE_INLINE uint ConvexMeshShape::getNbFaces() const {
     return mPolyhedronMesh->getHalfEdgeStructure().getNbFaces();
 }
 
 // Return a given face of the polyhedron
-inline const HalfEdgeStructure::Face& ConvexMeshShape::getFace(uint faceIndex) const {
+RP3D_FORCE_INLINE const HalfEdgeStructure::Face& ConvexMeshShape::getFace(uint faceIndex) const {
     assert(faceIndex < getNbFaces());
     return mPolyhedronMesh->getHalfEdgeStructure().getFace(faceIndex);
 }
 
 // Return the number of vertices of the polyhedron
-inline uint ConvexMeshShape::getNbVertices() const {
+RP3D_FORCE_INLINE uint ConvexMeshShape::getNbVertices() const {
     return mPolyhedronMesh->getHalfEdgeStructure().getNbVertices();
 }
 
 // Return a given vertex of the polyhedron
-inline HalfEdgeStructure::Vertex ConvexMeshShape::getVertex(uint vertexIndex) const {
+RP3D_FORCE_INLINE HalfEdgeStructure::Vertex ConvexMeshShape::getVertex(uint vertexIndex) const {
     assert(vertexIndex < getNbVertices());
     return mPolyhedronMesh->getHalfEdgeStructure().getVertex(vertexIndex);
 }
 
 // Return the number of half-edges of the polyhedron
-inline uint ConvexMeshShape::getNbHalfEdges() const {
+RP3D_FORCE_INLINE uint ConvexMeshShape::getNbHalfEdges() const {
     return mPolyhedronMesh->getHalfEdgeStructure().getNbHalfEdges();
 }
 
 // Return a given half-edge of the polyhedron
-inline const HalfEdgeStructure::Edge& ConvexMeshShape::getHalfEdge(uint edgeIndex) const {
+RP3D_FORCE_INLINE const HalfEdgeStructure::Edge& ConvexMeshShape::getHalfEdge(uint edgeIndex) const {
     assert(edgeIndex < getNbHalfEdges());
     return mPolyhedronMesh->getHalfEdgeStructure().getHalfEdge(edgeIndex);
 }
 
 // Return the position of a given vertex
-inline Vector3 ConvexMeshShape::getVertexPosition(uint vertexIndex) const {
+RP3D_FORCE_INLINE Vector3 ConvexMeshShape::getVertexPosition(uint vertexIndex) const {
     assert(vertexIndex < getNbVertices());
     return mPolyhedronMesh->getVertex(vertexIndex) * mScale;
 }
 
 // Return the normal vector of a given face of the polyhedron
-inline Vector3 ConvexMeshShape::getFaceNormal(uint faceIndex) const {
+RP3D_FORCE_INLINE Vector3 ConvexMeshShape::getFaceNormal(uint faceIndex) const {
     assert(faceIndex < getNbFaces());
     return mPolyhedronMesh->getFaceNormal(faceIndex);
 }
 
 // Return the centroid of the polyhedron
-inline Vector3 ConvexMeshShape::getCentroid() const {
+RP3D_FORCE_INLINE Vector3 ConvexMeshShape::getCentroid() const {
     return mPolyhedronMesh->getCentroid() * mScale;
 }
 
 
 // Compute and return the volume of the collision shape
-inline decimal ConvexMeshShape::getVolume() const {
+RP3D_FORCE_INLINE decimal ConvexMeshShape::getVolume() const {
     return mPolyhedronMesh->getVolume();
 }
 
diff --git a/include/reactphysics3d/collision/shapes/ConvexPolyhedronShape.h b/include/reactphysics3d/collision/shapes/ConvexPolyhedronShape.h
index 6a037cf8..d723d28a 100644
--- a/include/reactphysics3d/collision/shapes/ConvexPolyhedronShape.h
+++ b/include/reactphysics3d/collision/shapes/ConvexPolyhedronShape.h
@@ -94,7 +94,7 @@ class ConvexPolyhedronShape : public ConvexShape {
 };
 
 // Return true if the collision shape is a polyhedron
-inline bool ConvexPolyhedronShape::isPolyhedron() const {
+RP3D_FORCE_INLINE bool ConvexPolyhedronShape::isPolyhedron() const {
     return true;
 }
 
diff --git a/include/reactphysics3d/collision/shapes/ConvexShape.h b/include/reactphysics3d/collision/shapes/ConvexShape.h
index 9335d662..ddb1c467 100644
--- a/include/reactphysics3d/collision/shapes/ConvexShape.h
+++ b/include/reactphysics3d/collision/shapes/ConvexShape.h
@@ -83,7 +83,7 @@ class ConvexShape : public CollisionShape {
 };
 
 // Return true if the collision shape is convex, false if it is concave
-inline bool ConvexShape::isConvex() const {
+RP3D_FORCE_INLINE bool ConvexShape::isConvex() const {
     return true;
 }
 
@@ -91,7 +91,7 @@ inline bool ConvexShape::isConvex() const {
 /**
  * @return The margin (in meters) around the collision shape
  */
-inline decimal ConvexShape::getMargin() const {
+RP3D_FORCE_INLINE decimal ConvexShape::getMargin() const {
     return mMargin;
 }
 
diff --git a/include/reactphysics3d/collision/shapes/HeightFieldShape.h b/include/reactphysics3d/collision/shapes/HeightFieldShape.h
index adb4c947..a6405334 100644
--- a/include/reactphysics3d/collision/shapes/HeightFieldShape.h
+++ b/include/reactphysics3d/collision/shapes/HeightFieldShape.h
@@ -167,27 +167,27 @@ class HeightFieldShape : public ConcaveShape {
 };
 
 // Return the number of rows in the height field
-inline int HeightFieldShape::getNbRows() const {
+RP3D_FORCE_INLINE int HeightFieldShape::getNbRows() const {
     return mNbRows;
 }
 
 // Return the number of columns in the height field
-inline int HeightFieldShape::getNbColumns() const {
+RP3D_FORCE_INLINE int HeightFieldShape::getNbColumns() const {
     return mNbColumns;
 }
 
 // Return the type of height value in the height field
-inline HeightFieldShape::HeightDataType HeightFieldShape::getHeightDataType() const {
+RP3D_FORCE_INLINE HeightFieldShape::HeightDataType HeightFieldShape::getHeightDataType() const {
     return mHeightDataType;
 }
 
 // Return the number of bytes used by the collision shape
-inline size_t HeightFieldShape::getSizeInBytes() const {
+RP3D_FORCE_INLINE size_t HeightFieldShape::getSizeInBytes() const {
     return sizeof(HeightFieldShape);
 }
 
 // Return the height of a given (x,y) point in the height field
-inline decimal HeightFieldShape::getHeightAt(int x, int y) const {
+RP3D_FORCE_INLINE decimal HeightFieldShape::getHeightAt(int x, int y) const {
 
     assert(x >= 0 && x < mNbColumns);
     assert(y >= 0 && y < mNbRows);
@@ -201,12 +201,12 @@ inline decimal HeightFieldShape::getHeightAt(int x, int y) const {
 }
 
 // Return the closest inside integer grid value of a given floating grid value
-inline int HeightFieldShape::computeIntegerGridValue(decimal value) const {
+RP3D_FORCE_INLINE int HeightFieldShape::computeIntegerGridValue(decimal value) const {
     return (value < decimal(0.0)) ? value - decimal(0.5) : value + decimal(0.5);
 }
 
 // Compute the shape Id for a given triangle
-inline uint HeightFieldShape::computeTriangleShapeId(uint iIndex, uint jIndex, uint secondTriangleIncrement) const {
+RP3D_FORCE_INLINE uint HeightFieldShape::computeTriangleShapeId(uint iIndex, uint jIndex, uint secondTriangleIncrement) const {
 
     return (jIndex * (mNbColumns - 1) + iIndex) * 2 + secondTriangleIncrement;
 }
diff --git a/include/reactphysics3d/collision/shapes/SphereShape.h b/include/reactphysics3d/collision/shapes/SphereShape.h
index 97126eec..6db4d4cd 100644
--- a/include/reactphysics3d/collision/shapes/SphereShape.h
+++ b/include/reactphysics3d/collision/shapes/SphereShape.h
@@ -111,7 +111,7 @@ class SphereShape : public ConvexShape {
 /**
  * @return Radius of the sphere
  */
-inline decimal SphereShape::getRadius() const {
+RP3D_FORCE_INLINE decimal SphereShape::getRadius() const {
     return mMargin;
 }
 
@@ -121,7 +121,7 @@ inline decimal SphereShape::getRadius() const {
 /**
  * @param radius Radius of the sphere
  */
-inline void SphereShape::setRadius(decimal radius) {
+RP3D_FORCE_INLINE void SphereShape::setRadius(decimal radius) {
    assert(radius > decimal(0.0));
    mMargin = radius;
 
@@ -132,7 +132,7 @@ inline void SphereShape::setRadius(decimal radius) {
 /**
  * @return False because the sphere shape is not a polyhedron
  */
-inline bool SphereShape::isPolyhedron() const {
+RP3D_FORCE_INLINE bool SphereShape::isPolyhedron() const {
     return false;
 }
 
@@ -140,12 +140,12 @@ inline bool SphereShape::isPolyhedron() const {
 /**
  * @return The size (in bytes) of the sphere shape
  */
-inline size_t SphereShape::getSizeInBytes() const {
+RP3D_FORCE_INLINE size_t SphereShape::getSizeInBytes() const {
     return sizeof(SphereShape);
 }
 
 // Return a local support point in a given direction without the object margin
-inline Vector3 SphereShape::getLocalSupportPointWithoutMargin(const Vector3& direction) const {
+RP3D_FORCE_INLINE Vector3 SphereShape::getLocalSupportPointWithoutMargin(const Vector3& direction) const {
 
     // Return the center of the sphere (the radius is taken into account in the object margin)
     return Vector3(0.0, 0.0, 0.0);
@@ -157,7 +157,7 @@ inline Vector3 SphereShape::getLocalSupportPointWithoutMargin(const Vector3& dir
  * @param min The minimum bounds of the shape in local-space coordinates
  * @param max The maximum bounds of the shape in local-space coordinates
  */
-inline void SphereShape::getLocalBounds(Vector3& min, Vector3& max) const {
+RP3D_FORCE_INLINE void SphereShape::getLocalBounds(Vector3& min, Vector3& max) const {
 
     // Maximum bounds
     max.x = mMargin;
@@ -174,23 +174,23 @@ inline void SphereShape::getLocalBounds(Vector3& min, Vector3& max) const {
 /**
  * @param mass Mass to use to compute the inertia tensor of the collision shape
  */
-inline Vector3 SphereShape::getLocalInertiaTensor(decimal mass) const {
+RP3D_FORCE_INLINE Vector3 SphereShape::getLocalInertiaTensor(decimal mass) const {
     decimal diag = decimal(0.4) * mass * mMargin * mMargin;
     return Vector3(diag, diag, diag);
 }
 
 // Compute and return the volume of the collision shape
-inline decimal SphereShape::getVolume() const {
+RP3D_FORCE_INLINE decimal SphereShape::getVolume() const {
     return decimal(4.0) / decimal(3.0) * reactphysics3d::PI_RP3D * mMargin * mMargin * mMargin;
 }
 
 // Return true if a point is inside the collision shape
-inline bool SphereShape::testPointInside(const Vector3& localPoint, Collider* collider) const {
+RP3D_FORCE_INLINE bool SphereShape::testPointInside(const Vector3& localPoint, Collider* collider) const {
     return (localPoint.lengthSquare() < mMargin * mMargin);
 }
 
 // Return the string representation of the shape
-inline std::string SphereShape::to_string() const {
+RP3D_FORCE_INLINE std::string SphereShape::to_string() const {
     return "SphereShape{radius=" + std::to_string(getRadius()) + "}";
 }
 
diff --git a/include/reactphysics3d/collision/shapes/TriangleShape.h b/include/reactphysics3d/collision/shapes/TriangleShape.h
index 9bfc754d..823f33bd 100644
--- a/include/reactphysics3d/collision/shapes/TriangleShape.h
+++ b/include/reactphysics3d/collision/shapes/TriangleShape.h
@@ -188,12 +188,12 @@ class TriangleShape : public ConvexPolyhedronShape {
 };
 
 // Return the number of bytes used by the collision shape
-inline size_t TriangleShape::getSizeInBytes() const {
+RP3D_FORCE_INLINE size_t TriangleShape::getSizeInBytes() const {
     return sizeof(TriangleShape);
 }
 
 // Return a local support point in a given direction without the object margin
-inline Vector3 TriangleShape::getLocalSupportPointWithoutMargin(const Vector3& direction) const {
+RP3D_FORCE_INLINE Vector3 TriangleShape::getLocalSupportPointWithoutMargin(const Vector3& direction) const {
     Vector3 dotProducts(direction.dot(mPoints[0]), direction.dot(mPoints[1]), direction.dot(mPoints[2]));
     return mPoints[dotProducts.getMaxAxis()];
 }
@@ -204,7 +204,7 @@ inline Vector3 TriangleShape::getLocalSupportPointWithoutMargin(const Vector3& d
  * @param min The minimum bounds of the shape in local-space coordinates
  * @param max The maximum bounds of the shape in local-space coordinates
  */
-inline void TriangleShape::getLocalBounds(Vector3& min, Vector3& max) const {
+RP3D_FORCE_INLINE void TriangleShape::getLocalBounds(Vector3& min, Vector3& max) const {
 
     const Vector3 xAxis(mPoints[0].x, mPoints[1].x, mPoints[2].x);
     const Vector3 yAxis(mPoints[0].y, mPoints[1].y, mPoints[2].y);
@@ -222,33 +222,33 @@ inline void TriangleShape::getLocalBounds(Vector3& min, Vector3& max) const {
  *                    coordinates
  * @param mass Mass to use to compute the inertia tensor of the collision shape
  */
-inline Vector3 TriangleShape::getLocalInertiaTensor(decimal mass) const {
+RP3D_FORCE_INLINE Vector3 TriangleShape::getLocalInertiaTensor(decimal mass) const {
     return Vector3(0, 0, 0);
 }
 
 // Return true if a point is inside the collision shape
-inline bool TriangleShape::testPointInside(const Vector3& localPoint, Collider* collider) const {
+RP3D_FORCE_INLINE bool TriangleShape::testPointInside(const Vector3& localPoint, Collider* collider) const {
     return false;
 }
 
 // Return the number of faces of the polyhedron
-inline uint TriangleShape::getNbFaces() const {
+RP3D_FORCE_INLINE uint TriangleShape::getNbFaces() const {
     return 2;
 }
 
 // Return a given face of the polyhedron
-inline const HalfEdgeStructure::Face& TriangleShape::getFace(uint faceIndex) const {
+RP3D_FORCE_INLINE const HalfEdgeStructure::Face& TriangleShape::getFace(uint faceIndex) const {
     assert(faceIndex < 2);
     return mFaces[faceIndex];
 }
 
 // Return the number of vertices of the polyhedron
-inline uint TriangleShape::getNbVertices() const {
+RP3D_FORCE_INLINE uint TriangleShape::getNbVertices() const {
     return 3;
 }
 
 // Return a given vertex of the polyhedron
-inline HalfEdgeStructure::Vertex TriangleShape::getVertex(uint vertexIndex) const {
+RP3D_FORCE_INLINE HalfEdgeStructure::Vertex TriangleShape::getVertex(uint vertexIndex) const {
     assert(vertexIndex < 3);
 
     HalfEdgeStructure::Vertex vertex(vertexIndex);
@@ -261,35 +261,35 @@ inline HalfEdgeStructure::Vertex TriangleShape::getVertex(uint vertexIndex) cons
 }
 
 // Return a given half-edge of the polyhedron
-inline const HalfEdgeStructure::Edge& TriangleShape::getHalfEdge(uint edgeIndex) const {
+RP3D_FORCE_INLINE const HalfEdgeStructure::Edge& TriangleShape::getHalfEdge(uint edgeIndex) const {
     assert(edgeIndex < getNbHalfEdges());
     return mEdges[edgeIndex];
 }
 
 // Return the position of a given vertex
-inline Vector3 TriangleShape::getVertexPosition(uint vertexIndex) const {
+RP3D_FORCE_INLINE Vector3 TriangleShape::getVertexPosition(uint vertexIndex) const {
     assert(vertexIndex < 3);
     return mPoints[vertexIndex];
 }
 
 // Return the normal vector of a given face of the polyhedron
-inline Vector3 TriangleShape::getFaceNormal(uint faceIndex) const {
+RP3D_FORCE_INLINE Vector3 TriangleShape::getFaceNormal(uint faceIndex) const {
     assert(faceIndex < 2);
     return faceIndex == 0 ? mNormal : -mNormal;
 }
 
 // Return the centroid of the box
-inline Vector3 TriangleShape::getCentroid() const {
+RP3D_FORCE_INLINE Vector3 TriangleShape::getCentroid() const {
     return (mPoints[0] + mPoints[1] + mPoints[2]) / decimal(3.0);
 }
 
 // Return the number of half-edges of the polyhedron
-inline uint TriangleShape::getNbHalfEdges() const {
+RP3D_FORCE_INLINE uint TriangleShape::getNbHalfEdges() const {
     return 6;
 }
 
 // Return the raycast test type (front, back, front-back)
-inline TriangleRaycastSide TriangleShape::getRaycastTestType() const {
+RP3D_FORCE_INLINE TriangleRaycastSide TriangleShape::getRaycastTestType() const {
     return mRaycastTestType;
 }
 
@@ -297,18 +297,18 @@ inline TriangleRaycastSide TriangleShape::getRaycastTestType() const {
 /**
  * @param testType Raycast test type for the triangle (front, back, front-back)
  */
-inline void TriangleShape::setRaycastTestType(TriangleRaycastSide testType) {
+RP3D_FORCE_INLINE void TriangleShape::setRaycastTestType(TriangleRaycastSide testType) {
     mRaycastTestType = testType;
 }
 
 // Return the string representation of the shape
-inline std::string TriangleShape::to_string() const {
+RP3D_FORCE_INLINE std::string TriangleShape::to_string() const {
     return "TriangleShape{v1=" + mPoints[0].to_string() + ", v2=" + mPoints[1].to_string() + "," +
             "v3=" + mPoints[2].to_string() + "}";
 }
 
 // Compute and return the volume of the collision shape
-inline decimal TriangleShape::getVolume() const {
+RP3D_FORCE_INLINE decimal TriangleShape::getVolume() const {
     return decimal(0.0);
 }
 
diff --git a/include/reactphysics3d/components/BallAndSocketJointComponents.h b/include/reactphysics3d/components/BallAndSocketJointComponents.h
index 7778bf10..75ec4081 100644
--- a/include/reactphysics3d/components/BallAndSocketJointComponents.h
+++ b/include/reactphysics3d/components/BallAndSocketJointComponents.h
@@ -188,140 +188,140 @@ class BallAndSocketJointComponents : public Components {
 };
 
 // Return a pointer to a given joint
-inline BallAndSocketJoint* BallAndSocketJointComponents::getJoint(Entity jointEntity) const {
+RP3D_FORCE_INLINE BallAndSocketJoint* BallAndSocketJointComponents::getJoint(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mJoints[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the joint pointer to a given joint
-inline void BallAndSocketJointComponents::setJoint(Entity jointEntity, BallAndSocketJoint* joint) const {
+RP3D_FORCE_INLINE void BallAndSocketJointComponents::setJoint(Entity jointEntity, BallAndSocketJoint* joint) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mJoints[mMapEntityToComponentIndex[jointEntity]] = joint;
 }
 
 // Return the local anchor point of body 1 for a given joint
-inline const Vector3& BallAndSocketJointComponents::getLocalAnchorPointBody1(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Vector3& BallAndSocketJointComponents::getLocalAnchorPointBody1(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mLocalAnchorPointBody1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the local anchor point of body 1 for a given joint
-inline void BallAndSocketJointComponents::setLocalAnchorPointBody1(Entity jointEntity, const Vector3& localAnchoirPointBody1) {
+RP3D_FORCE_INLINE void BallAndSocketJointComponents::setLocalAnchorPointBody1(Entity jointEntity, const Vector3& localAnchoirPointBody1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mLocalAnchorPointBody1[mMapEntityToComponentIndex[jointEntity]] = localAnchoirPointBody1;
 }
 
 // Return the local anchor point of body 2 for a given joint
-inline const Vector3& BallAndSocketJointComponents::getLocalAnchorPointBody2(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Vector3& BallAndSocketJointComponents::getLocalAnchorPointBody2(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mLocalAnchorPointBody2[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the local anchor point of body 2 for a given joint
-inline void BallAndSocketJointComponents::setLocalAnchorPointBody2(Entity jointEntity, const Vector3& localAnchoirPointBody2) {
+RP3D_FORCE_INLINE void BallAndSocketJointComponents::setLocalAnchorPointBody2(Entity jointEntity, const Vector3& localAnchoirPointBody2) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mLocalAnchorPointBody2[mMapEntityToComponentIndex[jointEntity]] = localAnchoirPointBody2;
 }
 
 // Return the vector from center of body 1 to anchor point in world-space
-inline const Vector3& BallAndSocketJointComponents::getR1World(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Vector3& BallAndSocketJointComponents::getR1World(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mR1World[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the vector from center of body 1 to anchor point in world-space
-inline void BallAndSocketJointComponents::setR1World(Entity jointEntity, const Vector3& r1World) {
+RP3D_FORCE_INLINE void BallAndSocketJointComponents::setR1World(Entity jointEntity, const Vector3& r1World) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mR1World[mMapEntityToComponentIndex[jointEntity]] = r1World;
 }
 
 // Return the vector from center of body 2 to anchor point in world-space
-inline const Vector3& BallAndSocketJointComponents::getR2World(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Vector3& BallAndSocketJointComponents::getR2World(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mR2World[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the vector from center of body 2 to anchor point in world-space
-inline void BallAndSocketJointComponents::setR2World(Entity jointEntity, const Vector3& r2World) {
+RP3D_FORCE_INLINE void BallAndSocketJointComponents::setR2World(Entity jointEntity, const Vector3& r2World) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mR2World[mMapEntityToComponentIndex[jointEntity]] = r2World;
 }
 
 // Return the inertia tensor of body 1 (in world-space coordinates)
-inline const Matrix3x3& BallAndSocketJointComponents::getI1(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Matrix3x3& BallAndSocketJointComponents::getI1(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mI1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the inertia tensor of body 1 (in world-space coordinates)
-inline void BallAndSocketJointComponents::setI1(Entity jointEntity, const Matrix3x3& i1) {
+RP3D_FORCE_INLINE void BallAndSocketJointComponents::setI1(Entity jointEntity, const Matrix3x3& i1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mI1[mMapEntityToComponentIndex[jointEntity]] = i1;
 }
 
 // Return the inertia tensor of body 2 (in world-space coordinates)
-inline const Matrix3x3& BallAndSocketJointComponents::getI2(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Matrix3x3& BallAndSocketJointComponents::getI2(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mI2[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the inertia tensor of body 2 (in world-space coordinates)
-inline void BallAndSocketJointComponents::setI2(Entity jointEntity, const Matrix3x3& i2) {
+RP3D_FORCE_INLINE void BallAndSocketJointComponents::setI2(Entity jointEntity, const Matrix3x3& i2) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mI2[mMapEntityToComponentIndex[jointEntity]] = i2;
 }
 
 // Return the bias vector for the constraint
-inline Vector3 &BallAndSocketJointComponents::getBiasVector(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3 &BallAndSocketJointComponents::getBiasVector(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mBiasVector[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the bias vector for the constraint
-inline void BallAndSocketJointComponents::setBiasVector(Entity jointEntity, const Vector3& biasVector) {
+RP3D_FORCE_INLINE void BallAndSocketJointComponents::setBiasVector(Entity jointEntity, const Vector3& biasVector) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mBiasVector[mMapEntityToComponentIndex[jointEntity]] = biasVector;
 }
 
 // Return the inverse mass matrix K=JM^-1J^-t of the constraint
-inline Matrix3x3& BallAndSocketJointComponents::getInverseMassMatrix(Entity jointEntity) {
+RP3D_FORCE_INLINE Matrix3x3& BallAndSocketJointComponents::getInverseMassMatrix(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mInverseMassMatrix[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the inverse mass matrix K=JM^-1J^-t of the constraint
-inline void BallAndSocketJointComponents::setInverseMassMatrix(Entity jointEntity, const Matrix3x3& inverseMassMatrix) {
+RP3D_FORCE_INLINE void BallAndSocketJointComponents::setInverseMassMatrix(Entity jointEntity, const Matrix3x3& inverseMassMatrix) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mInverseMassMatrix[mMapEntityToComponentIndex[jointEntity]] = inverseMassMatrix;
 }
 
 // Return the accumulated impulse
-inline Vector3 &BallAndSocketJointComponents::getImpulse(Entity jointEntity)  {
+RP3D_FORCE_INLINE Vector3 &BallAndSocketJointComponents::getImpulse(Entity jointEntity)  {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mImpulse[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the accumulated impulse
-inline void BallAndSocketJointComponents::setImpulse(Entity jointEntity, const Vector3& impulse) {
+RP3D_FORCE_INLINE void BallAndSocketJointComponents::setImpulse(Entity jointEntity, const Vector3& impulse) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mImpulse[mMapEntityToComponentIndex[jointEntity]] = impulse;
diff --git a/include/reactphysics3d/components/ColliderComponents.h b/include/reactphysics3d/components/ColliderComponents.h
index 86c6c5af..8dfa5bf3 100644
--- a/include/reactphysics3d/components/ColliderComponents.h
+++ b/include/reactphysics3d/components/ColliderComponents.h
@@ -213,7 +213,7 @@ class ColliderComponents : public Components {
 };
 
 // Return the body entity of a given collider
-inline Entity ColliderComponents::getBody(Entity colliderEntity) const {
+RP3D_FORCE_INLINE Entity ColliderComponents::getBody(Entity colliderEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -221,7 +221,7 @@ inline Entity ColliderComponents::getBody(Entity colliderEntity) const {
 }
 
 // Return a pointer to a given collider
-inline Collider *ColliderComponents::getCollider(Entity colliderEntity) const {
+RP3D_FORCE_INLINE Collider *ColliderComponents::getCollider(Entity colliderEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -229,7 +229,7 @@ inline Collider *ColliderComponents::getCollider(Entity colliderEntity) const {
 }
 
 // Return the local-to-body transform of a collider
-inline const Transform& ColliderComponents::getLocalToBodyTransform(Entity colliderEntity) const {
+RP3D_FORCE_INLINE const Transform& ColliderComponents::getLocalToBodyTransform(Entity colliderEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -237,7 +237,7 @@ inline const Transform& ColliderComponents::getLocalToBodyTransform(Entity colli
 }
 
 // Set the local-to-body transform of a collider
-inline void ColliderComponents::setLocalToBodyTransform(Entity colliderEntity, const Transform& transform) {
+RP3D_FORCE_INLINE void ColliderComponents::setLocalToBodyTransform(Entity colliderEntity, const Transform& transform) {
 
    assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -245,7 +245,7 @@ inline void ColliderComponents::setLocalToBodyTransform(Entity colliderEntity, c
 }
 
 // Return a pointer to the collision shape of a collider
-inline CollisionShape* ColliderComponents::getCollisionShape(Entity colliderEntity) const {
+RP3D_FORCE_INLINE CollisionShape* ColliderComponents::getCollisionShape(Entity colliderEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -253,7 +253,7 @@ inline CollisionShape* ColliderComponents::getCollisionShape(Entity colliderEnti
 }
 
 // Return the broad-phase id of a given collider
-inline int32 ColliderComponents::getBroadPhaseId(Entity colliderEntity) const {
+RP3D_FORCE_INLINE int32 ColliderComponents::getBroadPhaseId(Entity colliderEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -261,7 +261,7 @@ inline int32 ColliderComponents::getBroadPhaseId(Entity colliderEntity) const {
 }
 
 // Set the broad-phase id of a given collider
-inline void ColliderComponents::setBroadPhaseId(Entity colliderEntity, int32 broadPhaseId) {
+RP3D_FORCE_INLINE void ColliderComponents::setBroadPhaseId(Entity colliderEntity, int32 broadPhaseId) {
 
     assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -269,7 +269,7 @@ inline void ColliderComponents::setBroadPhaseId(Entity colliderEntity, int32 bro
 }
 
 // Return the collision category bits of a given collider
-inline unsigned short ColliderComponents::getCollisionCategoryBits(Entity colliderEntity) const {
+RP3D_FORCE_INLINE unsigned short ColliderComponents::getCollisionCategoryBits(Entity colliderEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -277,7 +277,7 @@ inline unsigned short ColliderComponents::getCollisionCategoryBits(Entity collid
 }
 
 // Return the "collide with" mask bits of a given collider
-inline unsigned short ColliderComponents::getCollideWithMaskBits(Entity colliderEntity) const {
+RP3D_FORCE_INLINE unsigned short ColliderComponents::getCollideWithMaskBits(Entity colliderEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -285,7 +285,7 @@ inline unsigned short ColliderComponents::getCollideWithMaskBits(Entity collider
 }
 
 // Set the collision category bits of a given collider
-inline void ColliderComponents::setCollisionCategoryBits(Entity colliderEntity, unsigned short collisionCategoryBits) {
+RP3D_FORCE_INLINE void ColliderComponents::setCollisionCategoryBits(Entity colliderEntity, unsigned short collisionCategoryBits) {
 
     assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -293,7 +293,7 @@ inline void ColliderComponents::setCollisionCategoryBits(Entity colliderEntity,
 }
 
 // Set the "collide with" mask bits of a given collider
-inline void ColliderComponents::setCollideWithMaskBits(Entity colliderEntity, unsigned short collideWithMaskBits) {
+RP3D_FORCE_INLINE void ColliderComponents::setCollideWithMaskBits(Entity colliderEntity, unsigned short collideWithMaskBits) {
 
     assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -301,7 +301,7 @@ inline void ColliderComponents::setCollideWithMaskBits(Entity colliderEntity, un
 }
 
 // Return the local-to-world transform of a collider
-inline const Transform& ColliderComponents::getLocalToWorldTransform(Entity colliderEntity) const {
+RP3D_FORCE_INLINE const Transform& ColliderComponents::getLocalToWorldTransform(Entity colliderEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -309,7 +309,7 @@ inline const Transform& ColliderComponents::getLocalToWorldTransform(Entity coll
 }
 
 // Set the local-to-world transform of a collider
-inline void ColliderComponents::setLocalToWorldTransform(Entity colliderEntity, const Transform& transform) {
+RP3D_FORCE_INLINE void ColliderComponents::setLocalToWorldTransform(Entity colliderEntity, const Transform& transform) {
 
    assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -317,7 +317,7 @@ inline void ColliderComponents::setLocalToWorldTransform(Entity colliderEntity,
 }
 
 // Return a reference to the list of overlapping pairs for a given collider
-inline List<uint64>& ColliderComponents::getOverlappingPairs(Entity colliderEntity) {
+RP3D_FORCE_INLINE List<uint64>& ColliderComponents::getOverlappingPairs(Entity colliderEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -325,7 +325,7 @@ inline List<uint64>& ColliderComponents::getOverlappingPairs(Entity colliderEnti
 }
 
 // Return true if the size of collision shape of the collider has been changed by the user
-inline bool ColliderComponents::getHasCollisionShapeChangedSize(Entity colliderEntity) const {
+RP3D_FORCE_INLINE bool ColliderComponents::getHasCollisionShapeChangedSize(Entity colliderEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -333,7 +333,7 @@ inline bool ColliderComponents::getHasCollisionShapeChangedSize(Entity colliderE
 }
 
 // Return true if the size of collision shape of the collider has been changed by the user
-inline void ColliderComponents::setHasCollisionShapeChangedSize(Entity colliderEntity, bool hasCollisionShapeChangedSize) {
+RP3D_FORCE_INLINE void ColliderComponents::setHasCollisionShapeChangedSize(Entity colliderEntity, bool hasCollisionShapeChangedSize) {
 
     assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -342,7 +342,7 @@ inline void ColliderComponents::setHasCollisionShapeChangedSize(Entity colliderE
 
 
 // Return true if a collider is a trigger
-inline bool ColliderComponents::getIsTrigger(Entity colliderEntity) const {
+RP3D_FORCE_INLINE bool ColliderComponents::getIsTrigger(Entity colliderEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
@@ -350,7 +350,7 @@ inline bool ColliderComponents::getIsTrigger(Entity colliderEntity) const {
 }
 
 // Set whether a collider is a trigger
-inline void ColliderComponents::setIsTrigger(Entity colliderEntity, bool isTrigger) {
+RP3D_FORCE_INLINE void ColliderComponents::setIsTrigger(Entity colliderEntity, bool isTrigger) {
 
     assert(mMapEntityToComponentIndex.containsKey(colliderEntity));
 
diff --git a/include/reactphysics3d/components/CollisionBodyComponents.h b/include/reactphysics3d/components/CollisionBodyComponents.h
index c97414d5..08141341 100644
--- a/include/reactphysics3d/components/CollisionBodyComponents.h
+++ b/include/reactphysics3d/components/CollisionBodyComponents.h
@@ -130,7 +130,7 @@ class CollisionBodyComponents : public Components {
 };
 
 // Add a collider to a body component
-inline void CollisionBodyComponents::addColliderToBody(Entity bodyEntity, Entity colliderEntity) {
+RP3D_FORCE_INLINE void CollisionBodyComponents::addColliderToBody(Entity bodyEntity, Entity colliderEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -138,7 +138,7 @@ inline void CollisionBodyComponents::addColliderToBody(Entity bodyEntity, Entity
 }
 
 // Remove a collider from a body component
-inline void CollisionBodyComponents::removeColliderFromBody(Entity bodyEntity, Entity colliderEntity) {
+RP3D_FORCE_INLINE void CollisionBodyComponents::removeColliderFromBody(Entity bodyEntity, Entity colliderEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -146,7 +146,7 @@ inline void CollisionBodyComponents::removeColliderFromBody(Entity bodyEntity, E
 }
 
 // Return a pointer to a body
-inline CollisionBody *CollisionBodyComponents::getBody(Entity bodyEntity) {
+RP3D_FORCE_INLINE CollisionBody *CollisionBodyComponents::getBody(Entity bodyEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -154,7 +154,7 @@ inline CollisionBody *CollisionBodyComponents::getBody(Entity bodyEntity) {
 }
 
 // Return the list of colliders of a body
-inline const List<Entity>& CollisionBodyComponents::getColliders(Entity bodyEntity) const {
+RP3D_FORCE_INLINE const List<Entity>& CollisionBodyComponents::getColliders(Entity bodyEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -162,7 +162,7 @@ inline const List<Entity>& CollisionBodyComponents::getColliders(Entity bodyEnti
 }
 
 // Return true if the body is active
-inline bool CollisionBodyComponents::getIsActive(Entity bodyEntity) const {
+RP3D_FORCE_INLINE bool CollisionBodyComponents::getIsActive(Entity bodyEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -170,7 +170,7 @@ inline bool CollisionBodyComponents::getIsActive(Entity bodyEntity) const {
 }
 
 // Set the value to know if the body is active
-inline void CollisionBodyComponents::setIsActive(Entity bodyEntity, bool isActive) const {
+RP3D_FORCE_INLINE void CollisionBodyComponents::setIsActive(Entity bodyEntity, bool isActive) const {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -178,7 +178,7 @@ inline void CollisionBodyComponents::setIsActive(Entity bodyEntity, bool isActiv
 }
 
 // Return the user data associated with the body
-inline void* CollisionBodyComponents::getUserData(Entity bodyEntity) const {
+RP3D_FORCE_INLINE void* CollisionBodyComponents::getUserData(Entity bodyEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -186,7 +186,7 @@ inline void* CollisionBodyComponents::getUserData(Entity bodyEntity) const {
 }
 
 // Set the user data associated with the body
-inline void CollisionBodyComponents::setUserData(Entity bodyEntity, void* userData) const {
+RP3D_FORCE_INLINE void CollisionBodyComponents::setUserData(Entity bodyEntity, void* userData) const {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
diff --git a/include/reactphysics3d/components/Components.h b/include/reactphysics3d/components/Components.h
index ba0c15f1..3470ff96 100644
--- a/include/reactphysics3d/components/Components.h
+++ b/include/reactphysics3d/components/Components.h
@@ -127,18 +127,18 @@ class Components {
 };
 
 // Return true if an entity is sleeping
-inline bool Components::getIsEntityDisabled(Entity entity) const {
+RP3D_FORCE_INLINE bool Components::getIsEntityDisabled(Entity entity) const {
     assert(hasComponent(entity));
     return mMapEntityToComponentIndex[entity] >= mDisabledStartIndex;
 }
 
 // Return true if there is a component for a given entity
-inline bool Components::hasComponent(Entity entity) const {
+RP3D_FORCE_INLINE bool Components::hasComponent(Entity entity) const {
     return mMapEntityToComponentIndex.containsKey(entity);
 }
 
 // Return true if there is a component for a given entiy and if so set the entity index
-inline bool Components::hasComponentGetIndex(Entity entity, uint32& entityIndex) const {
+RP3D_FORCE_INLINE bool Components::hasComponentGetIndex(Entity entity, uint32& entityIndex) const {
 
     auto it = mMapEntityToComponentIndex.find(entity);
 
@@ -151,17 +151,17 @@ inline bool Components::hasComponentGetIndex(Entity entity, uint32& entityIndex)
 }
 
 // Return the number of components
-inline uint32 Components::getNbComponents() const {
+RP3D_FORCE_INLINE uint32 Components::getNbComponents() const {
     return mNbComponents;
 }
 
 // Return the number of enabled components
-inline uint32 Components::getNbEnabledComponents() const {
+RP3D_FORCE_INLINE uint32 Components::getNbEnabledComponents() const {
     return mDisabledStartIndex;
 }
 
 // Return the index in the arrays for a given entity
-inline uint32 Components::getEntityIndex(Entity entity) const {
+RP3D_FORCE_INLINE uint32 Components::getEntityIndex(Entity entity) const {
     assert(hasComponent(entity));
     return mMapEntityToComponentIndex[entity];
 }
diff --git a/include/reactphysics3d/components/FixedJointComponents.h b/include/reactphysics3d/components/FixedJointComponents.h
index 990a4ba0..a6751d68 100644
--- a/include/reactphysics3d/components/FixedJointComponents.h
+++ b/include/reactphysics3d/components/FixedJointComponents.h
@@ -224,133 +224,133 @@ class FixedJointComponents : public Components {
 };
 
 // Return a pointer to a given joint
-inline FixedJoint* FixedJointComponents::getJoint(Entity jointEntity) const {
+RP3D_FORCE_INLINE FixedJoint* FixedJointComponents::getJoint(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mJoints[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the joint pointer to a given joint
-inline void FixedJointComponents::setJoint(Entity jointEntity, FixedJoint* joint) const {
+RP3D_FORCE_INLINE void FixedJointComponents::setJoint(Entity jointEntity, FixedJoint* joint) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mJoints[mMapEntityToComponentIndex[jointEntity]] = joint;
 }
 
 // Return the local anchor point of body 1 for a given joint
-inline const Vector3& FixedJointComponents::getLocalAnchorPointBody1(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Vector3& FixedJointComponents::getLocalAnchorPointBody1(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mLocalAnchorPointBody1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the local anchor point of body 1 for a given joint
-inline void FixedJointComponents::setLocalAnchorPointBody1(Entity jointEntity, const Vector3& localAnchorPointBody1) {
+RP3D_FORCE_INLINE void FixedJointComponents::setLocalAnchorPointBody1(Entity jointEntity, const Vector3& localAnchorPointBody1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mLocalAnchorPointBody1[mMapEntityToComponentIndex[jointEntity]] = localAnchorPointBody1;
 }
 
 // Return the local anchor point of body 2 for a given joint
-inline const Vector3& FixedJointComponents::getLocalAnchorPointBody2(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Vector3& FixedJointComponents::getLocalAnchorPointBody2(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mLocalAnchorPointBody2[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the local anchor point of body 2 for a given joint
-inline void FixedJointComponents::setLocalAnchorPointBody2(Entity jointEntity, const Vector3& localAnchorPointBody2) {
+RP3D_FORCE_INLINE void FixedJointComponents::setLocalAnchorPointBody2(Entity jointEntity, const Vector3& localAnchorPointBody2) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mLocalAnchorPointBody2[mMapEntityToComponentIndex[jointEntity]] = localAnchorPointBody2;
 }
 
 // Return the vector from center of body 1 to anchor point in world-space
-inline const Vector3& FixedJointComponents::getR1World(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Vector3& FixedJointComponents::getR1World(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mR1World[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the vector from center of body 1 to anchor point in world-space
-inline void FixedJointComponents::setR1World(Entity jointEntity, const Vector3& r1World) {
+RP3D_FORCE_INLINE void FixedJointComponents::setR1World(Entity jointEntity, const Vector3& r1World) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mR1World[mMapEntityToComponentIndex[jointEntity]] = r1World;
 }
 
 // Return the vector from center of body 2 to anchor point in world-space
-inline const Vector3& FixedJointComponents::getR2World(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Vector3& FixedJointComponents::getR2World(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mR2World[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the vector from center of body 2 to anchor point in world-space
-inline void FixedJointComponents::setR2World(Entity jointEntity, const Vector3& r2World) {
+RP3D_FORCE_INLINE void FixedJointComponents::setR2World(Entity jointEntity, const Vector3& r2World) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mR2World[mMapEntityToComponentIndex[jointEntity]] = r2World;
 }
 
 // Return the inertia tensor of body 1 (in world-space coordinates)
-inline const Matrix3x3& FixedJointComponents::getI1(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Matrix3x3& FixedJointComponents::getI1(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mI1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the inertia tensor of body 1 (in world-space coordinates)
-inline void FixedJointComponents::setI1(Entity jointEntity, const Matrix3x3& i1) {
+RP3D_FORCE_INLINE void FixedJointComponents::setI1(Entity jointEntity, const Matrix3x3& i1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mI1[mMapEntityToComponentIndex[jointEntity]] = i1;
 }
 
 // Return the inertia tensor of body 2 (in world-space coordinates)
-inline const Matrix3x3& FixedJointComponents::getI2(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Matrix3x3& FixedJointComponents::getI2(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mI2[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the inertia tensor of body 2 (in world-space coordinates)
-inline void FixedJointComponents::setI2(Entity jointEntity, const Matrix3x3& i2) {
+RP3D_FORCE_INLINE void FixedJointComponents::setI2(Entity jointEntity, const Matrix3x3& i2) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mI2[mMapEntityToComponentIndex[jointEntity]] = i2;
 }
 
 // Return the translation impulse
-inline Vector3& FixedJointComponents::getImpulseTranslation(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& FixedJointComponents::getImpulseTranslation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mImpulseTranslation[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the translation impulse
-inline void FixedJointComponents::setImpulseTranslation(Entity jointEntity, const Vector3& impulseTranslation) {
+RP3D_FORCE_INLINE void FixedJointComponents::setImpulseTranslation(Entity jointEntity, const Vector3& impulseTranslation) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mImpulseTranslation[mMapEntityToComponentIndex[jointEntity]] = impulseTranslation;
 }
 
 // Return the translation impulse
-inline Vector3& FixedJointComponents::getImpulseRotation(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& FixedJointComponents::getImpulseRotation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mImpulseRotation[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the translation impulse
-inline void FixedJointComponents::setImpulseRotation(Entity jointEntity, const Vector3& impulseTranslation) {
+RP3D_FORCE_INLINE void FixedJointComponents::setImpulseRotation(Entity jointEntity, const Vector3& impulseTranslation) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mImpulseRotation[mMapEntityToComponentIndex[jointEntity]] = impulseTranslation;
 }
 
 // Return the translation inverse mass matrix of the constraint
-inline Matrix3x3& FixedJointComponents::getInverseMassMatrixTranslation(Entity jointEntity) {
+RP3D_FORCE_INLINE Matrix3x3& FixedJointComponents::getInverseMassMatrixTranslation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mInverseMassMatrixTranslation[mMapEntityToComponentIndex[jointEntity]];
@@ -358,63 +358,63 @@ inline Matrix3x3& FixedJointComponents::getInverseMassMatrixTranslation(Entity j
 
 
 // Set the translation inverse mass matrix of the constraint
-inline void FixedJointComponents::setInverseMassMatrixTranslation(Entity jointEntity, const Matrix3x3& inverseMassMatrix) {
+RP3D_FORCE_INLINE void FixedJointComponents::setInverseMassMatrixTranslation(Entity jointEntity, const Matrix3x3& inverseMassMatrix) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mInverseMassMatrixTranslation[mMapEntityToComponentIndex[jointEntity]] = inverseMassMatrix;
 }
 
 // Return the rotation inverse mass matrix of the constraint
-inline Matrix3x3& FixedJointComponents::getInverseMassMatrixRotation(Entity jointEntity) {
+RP3D_FORCE_INLINE Matrix3x3& FixedJointComponents::getInverseMassMatrixRotation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mInverseMassMatrixRotation[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the rotation inverse mass matrix of the constraint
-inline void FixedJointComponents::setInverseMassMatrixRotation(Entity jointEntity, const Matrix3x3& inverseMassMatrix) {
+RP3D_FORCE_INLINE void FixedJointComponents::setInverseMassMatrixRotation(Entity jointEntity, const Matrix3x3& inverseMassMatrix) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mInverseMassMatrixRotation[mMapEntityToComponentIndex[jointEntity]] = inverseMassMatrix;
 }
 
 // Return the translation bias
-inline Vector3& FixedJointComponents::getBiasTranslation(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& FixedJointComponents::getBiasTranslation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mBiasTranslation[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the translation impulse
-inline void FixedJointComponents::setBiasTranslation(Entity jointEntity, const Vector3 &impulseTranslation) {
+RP3D_FORCE_INLINE void FixedJointComponents::setBiasTranslation(Entity jointEntity, const Vector3 &impulseTranslation) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mBiasTranslation[mMapEntityToComponentIndex[jointEntity]] = impulseTranslation;
 }
 
 // Return the rotation bias
-inline Vector3& FixedJointComponents::getBiasRotation(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& FixedJointComponents::getBiasRotation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mBiasRotation[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the rotation impulse
-inline void FixedJointComponents::setBiasRotation(Entity jointEntity, const Vector3& impulseRotation) {
+RP3D_FORCE_INLINE void FixedJointComponents::setBiasRotation(Entity jointEntity, const Vector3& impulseRotation) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mBiasRotation[mMapEntityToComponentIndex[jointEntity]] = impulseRotation;
 }
 
 // Return the initial orientation difference
-inline Quaternion& FixedJointComponents::getInitOrientationDifferenceInv(Entity jointEntity) {
+RP3D_FORCE_INLINE Quaternion& FixedJointComponents::getInitOrientationDifferenceInv(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mInitOrientationDifferenceInv[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the rotation impulse
-inline void FixedJointComponents::setInitOrientationDifferenceInv(Entity jointEntity, const Quaternion& initOrientationDifferenceInv) {
+RP3D_FORCE_INLINE void FixedJointComponents::setInitOrientationDifferenceInv(Entity jointEntity, const Quaternion& initOrientationDifferenceInv) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mInitOrientationDifferenceInv[mMapEntityToComponentIndex[jointEntity]] = initOrientationDifferenceInv;
diff --git a/include/reactphysics3d/components/HingeJointComponents.h b/include/reactphysics3d/components/HingeJointComponents.h
index d50db707..4ee9402f 100644
--- a/include/reactphysics3d/components/HingeJointComponents.h
+++ b/include/reactphysics3d/components/HingeJointComponents.h
@@ -415,133 +415,133 @@ class HingeJointComponents : public Components {
 };
 
 // Return a pointer to a given joint
-inline HingeJoint* HingeJointComponents::getJoint(Entity jointEntity) const {
+RP3D_FORCE_INLINE HingeJoint* HingeJointComponents::getJoint(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mJoints[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the joint pointer to a given joint
-inline void HingeJointComponents::setJoint(Entity jointEntity, HingeJoint* joint) const {
+RP3D_FORCE_INLINE void HingeJointComponents::setJoint(Entity jointEntity, HingeJoint* joint) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mJoints[mMapEntityToComponentIndex[jointEntity]] = joint;
 }
 
 // Return the local anchor point of body 1 for a given joint
-inline const Vector3& HingeJointComponents::getLocalAnchorPointBody1(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Vector3& HingeJointComponents::getLocalAnchorPointBody1(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mLocalAnchorPointBody1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the local anchor point of body 1 for a given joint
-inline void HingeJointComponents::setLocalAnchorPointBody1(Entity jointEntity, const Vector3& localAnchoirPointBody1) {
+RP3D_FORCE_INLINE void HingeJointComponents::setLocalAnchorPointBody1(Entity jointEntity, const Vector3& localAnchoirPointBody1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mLocalAnchorPointBody1[mMapEntityToComponentIndex[jointEntity]] = localAnchoirPointBody1;
 }
 
 // Return the local anchor point of body 2 for a given joint
-inline const Vector3& HingeJointComponents::getLocalAnchorPointBody2(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Vector3& HingeJointComponents::getLocalAnchorPointBody2(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mLocalAnchorPointBody2[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the local anchor point of body 2 for a given joint
-inline void HingeJointComponents::setLocalAnchorPointBody2(Entity jointEntity, const Vector3& localAnchoirPointBody2) {
+RP3D_FORCE_INLINE void HingeJointComponents::setLocalAnchorPointBody2(Entity jointEntity, const Vector3& localAnchoirPointBody2) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mLocalAnchorPointBody2[mMapEntityToComponentIndex[jointEntity]] = localAnchoirPointBody2;
 }
 
 // Return the vector from center of body 1 to anchor point in world-space
-inline const Vector3& HingeJointComponents::getR1World(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Vector3& HingeJointComponents::getR1World(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mR1World[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the vector from center of body 1 to anchor point in world-space
-inline void HingeJointComponents::setR1World(Entity jointEntity, const Vector3& r1World) {
+RP3D_FORCE_INLINE void HingeJointComponents::setR1World(Entity jointEntity, const Vector3& r1World) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mR1World[mMapEntityToComponentIndex[jointEntity]] = r1World;
 }
 
 // Return the vector from center of body 2 to anchor point in world-space
-inline const Vector3& HingeJointComponents::getR2World(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Vector3& HingeJointComponents::getR2World(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mR2World[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the vector from center of body 2 to anchor point in world-space
-inline void HingeJointComponents::setR2World(Entity jointEntity, const Vector3& r2World) {
+RP3D_FORCE_INLINE void HingeJointComponents::setR2World(Entity jointEntity, const Vector3& r2World) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mR2World[mMapEntityToComponentIndex[jointEntity]] = r2World;
 }
 
 // Return the inertia tensor of body 1 (in world-space coordinates)
-inline const Matrix3x3& HingeJointComponents::getI1(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Matrix3x3& HingeJointComponents::getI1(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mI1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the inertia tensor of body 1 (in world-space coordinates)
-inline void HingeJointComponents::setI1(Entity jointEntity, const Matrix3x3& i1) {
+RP3D_FORCE_INLINE void HingeJointComponents::setI1(Entity jointEntity, const Matrix3x3& i1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mI1[mMapEntityToComponentIndex[jointEntity]] = i1;
 }
 
 // Return the inertia tensor of body 2 (in world-space coordinates)
-inline const Matrix3x3& HingeJointComponents::getI2(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Matrix3x3& HingeJointComponents::getI2(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mI2[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the inertia tensor of body 2 (in world-space coordinates)
-inline void HingeJointComponents::setI2(Entity jointEntity, const Matrix3x3& i2) {
+RP3D_FORCE_INLINE void HingeJointComponents::setI2(Entity jointEntity, const Matrix3x3& i2) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mI2[mMapEntityToComponentIndex[jointEntity]] = i2;
 }
 
 // Return the translation impulse
-inline Vector3& HingeJointComponents::getImpulseTranslation(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& HingeJointComponents::getImpulseTranslation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mImpulseTranslation[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the translation impulse
-inline void HingeJointComponents::setImpulseTranslation(Entity jointEntity, const Vector3& impulseTranslation) {
+RP3D_FORCE_INLINE void HingeJointComponents::setImpulseTranslation(Entity jointEntity, const Vector3& impulseTranslation) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mImpulseTranslation[mMapEntityToComponentIndex[jointEntity]] = impulseTranslation;
 }
 
 // Return the translation impulse
-inline Vector2& HingeJointComponents::getImpulseRotation(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector2& HingeJointComponents::getImpulseRotation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mImpulseRotation[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the translation impulse
-inline void HingeJointComponents::setImpulseRotation(Entity jointEntity, const Vector2& impulseTranslation) {
+RP3D_FORCE_INLINE void HingeJointComponents::setImpulseRotation(Entity jointEntity, const Vector2& impulseTranslation) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mImpulseRotation[mMapEntityToComponentIndex[jointEntity]] = impulseTranslation;
 }
 
 // Return the translation inverse mass matrix of the constraint
-inline Matrix3x3& HingeJointComponents::getInverseMassMatrixTranslation(Entity jointEntity) {
+RP3D_FORCE_INLINE Matrix3x3& HingeJointComponents::getInverseMassMatrixTranslation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mInverseMassMatrixTranslation[mMapEntityToComponentIndex[jointEntity]];
@@ -549,91 +549,91 @@ inline Matrix3x3& HingeJointComponents::getInverseMassMatrixTranslation(Entity j
 
 
 // Set the translation inverse mass matrix of the constraint
-inline void HingeJointComponents::setInverseMassMatrixTranslation(Entity jointEntity, const Matrix3x3& inverseMassMatrix) {
+RP3D_FORCE_INLINE void HingeJointComponents::setInverseMassMatrixTranslation(Entity jointEntity, const Matrix3x3& inverseMassMatrix) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mInverseMassMatrixTranslation[mMapEntityToComponentIndex[jointEntity]] = inverseMassMatrix;
 }
 
 // Return the rotation inverse mass matrix of the constraint
-inline Matrix2x2& HingeJointComponents::getInverseMassMatrixRotation(Entity jointEntity) {
+RP3D_FORCE_INLINE Matrix2x2& HingeJointComponents::getInverseMassMatrixRotation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mInverseMassMatrixRotation[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the rotation inverse mass matrix of the constraint
-inline void HingeJointComponents::setInverseMassMatrixRotation(Entity jointEntity, const Matrix2x2& inverseMassMatrix) {
+RP3D_FORCE_INLINE void HingeJointComponents::setInverseMassMatrixRotation(Entity jointEntity, const Matrix2x2& inverseMassMatrix) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mInverseMassMatrixRotation[mMapEntityToComponentIndex[jointEntity]] = inverseMassMatrix;
 }
 
 // Return the translation bias
-inline Vector3& HingeJointComponents::getBiasTranslation(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& HingeJointComponents::getBiasTranslation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mBiasTranslation[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the translation impulse
-inline void HingeJointComponents::setBiasTranslation(Entity jointEntity, const Vector3 &impulseTranslation) {
+RP3D_FORCE_INLINE void HingeJointComponents::setBiasTranslation(Entity jointEntity, const Vector3 &impulseTranslation) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mBiasTranslation[mMapEntityToComponentIndex[jointEntity]] = impulseTranslation;
 }
 
 // Return the rotation bias
-inline Vector2 &HingeJointComponents::getBiasRotation(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector2 &HingeJointComponents::getBiasRotation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mBiasRotation[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the rotation impulse
-inline void HingeJointComponents::setBiasRotation(Entity jointEntity, const Vector2& impulseRotation) {
+RP3D_FORCE_INLINE void HingeJointComponents::setBiasRotation(Entity jointEntity, const Vector2& impulseRotation) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mBiasRotation[mMapEntityToComponentIndex[jointEntity]] = impulseRotation;
 }
 
 // Return the initial orientation difference
-inline Quaternion& HingeJointComponents::getInitOrientationDifferenceInv(Entity jointEntity) {
+RP3D_FORCE_INLINE Quaternion& HingeJointComponents::getInitOrientationDifferenceInv(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mInitOrientationDifferenceInv[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the rotation impulse
-inline void HingeJointComponents::setInitOrientationDifferenceInv(Entity jointEntity, const Quaternion& initOrientationDifferenceInv) {
+RP3D_FORCE_INLINE void HingeJointComponents::setInitOrientationDifferenceInv(Entity jointEntity, const Quaternion& initOrientationDifferenceInv) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mInitOrientationDifferenceInv[mMapEntityToComponentIndex[jointEntity]] = initOrientationDifferenceInv;
 }
 
 // Return the hinge rotation axis (in local-space coordinates of body 1)
-inline Vector3& HingeJointComponents::getHingeLocalAxisBody1(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& HingeJointComponents::getHingeLocalAxisBody1(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mHingeLocalAxisBody1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the hinge rotation axis (in local-space coordinates of body 1)
-inline void HingeJointComponents::setHingeLocalAxisBody1(Entity jointEntity, const Vector3& hingeLocalAxisBody1) {
+RP3D_FORCE_INLINE void HingeJointComponents::setHingeLocalAxisBody1(Entity jointEntity, const Vector3& hingeLocalAxisBody1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mHingeLocalAxisBody1[mMapEntityToComponentIndex[jointEntity]] = hingeLocalAxisBody1;
 }
 
 // Return the hinge rotation axis (in local-space coordiantes of body 2)
-inline Vector3& HingeJointComponents::getHingeLocalAxisBody2(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& HingeJointComponents::getHingeLocalAxisBody2(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mHingeLocalAxisBody2[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the hinge rotation axis (in local-space coordiantes of body 2)
-inline void HingeJointComponents::setHingeLocalAxisBody2(Entity jointEntity, const Vector3& hingeLocalAxisBody2) {
+RP3D_FORCE_INLINE void HingeJointComponents::setHingeLocalAxisBody2(Entity jointEntity, const Vector3& hingeLocalAxisBody2) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mHingeLocalAxisBody2[mMapEntityToComponentIndex[jointEntity]] = hingeLocalAxisBody2;
@@ -641,56 +641,56 @@ inline void HingeJointComponents::setHingeLocalAxisBody2(Entity jointEntity, con
 
 
 // Return the hinge rotation axis (in world-space coordinates) computed from body 1
-inline Vector3& HingeJointComponents::getA1(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& HingeJointComponents::getA1(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mA1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the hinge rotation axis (in world-space coordinates) computed from body 1
-inline void HingeJointComponents::setA1(Entity jointEntity, const Vector3& a1) {
+RP3D_FORCE_INLINE void HingeJointComponents::setA1(Entity jointEntity, const Vector3& a1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mA1[mMapEntityToComponentIndex[jointEntity]] = a1;
 }
 
 // Return the cross product of vector b2 and a1
-inline Vector3& HingeJointComponents::getB2CrossA1(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& HingeJointComponents::getB2CrossA1(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mB2CrossA1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the cross product of vector b2 and a1
-inline void HingeJointComponents::setB2CrossA1(Entity jointEntity, const Vector3& b2CrossA1) {
+RP3D_FORCE_INLINE void HingeJointComponents::setB2CrossA1(Entity jointEntity, const Vector3& b2CrossA1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mB2CrossA1[mMapEntityToComponentIndex[jointEntity]] = b2CrossA1;
 }
 
 // Return the cross product of vector c2 and a1;
-inline Vector3& HingeJointComponents::getC2CrossA1(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& HingeJointComponents::getC2CrossA1(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mC2CrossA1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the cross product of vector c2 and a1;
-inline void HingeJointComponents::setC2CrossA1(Entity jointEntity, const Vector3& c2CrossA1) {
+RP3D_FORCE_INLINE void HingeJointComponents::setC2CrossA1(Entity jointEntity, const Vector3& c2CrossA1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mC2CrossA1[mMapEntityToComponentIndex[jointEntity]] = c2CrossA1;
 }
 
 // Return the accumulated impulse for the lower limit constraint
-inline decimal HingeJointComponents::getImpulseLowerLimit(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal HingeJointComponents::getImpulseLowerLimit(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mImpulseLowerLimit[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the accumulated impulse for the lower limit constraint
-inline void HingeJointComponents::setImpulseLowerLimit(Entity jointEntity, decimal impulseLowerLimit) {
+RP3D_FORCE_INLINE void HingeJointComponents::setImpulseLowerLimit(Entity jointEntity, decimal impulseLowerLimit) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mImpulseLowerLimit[mMapEntityToComponentIndex[jointEntity]] = impulseLowerLimit;
@@ -698,14 +698,14 @@ inline void HingeJointComponents::setImpulseLowerLimit(Entity jointEntity, decim
 
 
 // Return the accumulated impulse for the upper limit constraint
-inline decimal HingeJointComponents::getImpulseUpperLimit(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal HingeJointComponents::getImpulseUpperLimit(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mImpulseUpperLimit[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the accumulated impulse for the upper limit constraint
-inline void HingeJointComponents::setImpulseUpperLimit(Entity jointEntity, decimal impulseUpperLimit) const {
+RP3D_FORCE_INLINE void HingeJointComponents::setImpulseUpperLimit(Entity jointEntity, decimal impulseUpperLimit) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mImpulseUpperLimit[mMapEntityToComponentIndex[jointEntity]] = impulseUpperLimit;
@@ -713,182 +713,182 @@ inline void HingeJointComponents::setImpulseUpperLimit(Entity jointEntity, decim
 
 
 // Return the accumulated impulse for the motor constraint;
-inline decimal HingeJointComponents::getImpulseMotor(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal HingeJointComponents::getImpulseMotor(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mImpulseMotor[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the accumulated impulse for the motor constraint;
-inline void HingeJointComponents::setImpulseMotor(Entity jointEntity, decimal impulseMotor) {
+RP3D_FORCE_INLINE void HingeJointComponents::setImpulseMotor(Entity jointEntity, decimal impulseMotor) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mImpulseMotor[mMapEntityToComponentIndex[jointEntity]] = impulseMotor;
 }
 
 // Return the inverse of mass matrix K=JM^-1J^t for the limits and motor constraints (1x1 matrix)
-inline decimal HingeJointComponents::getInverseMassMatrixLimitMotor(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal HingeJointComponents::getInverseMassMatrixLimitMotor(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mInverseMassMatrixLimitMotor[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the inverse of mass matrix K=JM^-1J^t for the limits and motor constraints (1x1 matrix)
-inline void HingeJointComponents::setInverseMassMatrixLimitMotor(Entity jointEntity, decimal inverseMassMatrixLimitMotor) {
+RP3D_FORCE_INLINE void HingeJointComponents::setInverseMassMatrixLimitMotor(Entity jointEntity, decimal inverseMassMatrixLimitMotor) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mInverseMassMatrixLimitMotor[mMapEntityToComponentIndex[jointEntity]] = inverseMassMatrixLimitMotor;
 }
 
 // Return the inverse of mass matrix K=JM^-1J^t for the motor
-inline decimal HingeJointComponents::getInverseMassMatrixMotor(Entity jointEntity) {
+RP3D_FORCE_INLINE decimal HingeJointComponents::getInverseMassMatrixMotor(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mInverseMassMatrixMotor[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Return the inverse of mass matrix K=JM^-1J^t for the motor
-inline void HingeJointComponents::setInverseMassMatrixMotor(Entity jointEntity, decimal inverseMassMatrixMotor) {
+RP3D_FORCE_INLINE void HingeJointComponents::setInverseMassMatrixMotor(Entity jointEntity, decimal inverseMassMatrixMotor) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mInverseMassMatrixMotor[mMapEntityToComponentIndex[jointEntity]] = inverseMassMatrixMotor;
 }
 
 // Return the bias of the lower limit constraint
-inline decimal HingeJointComponents::getBLowerLimit(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal HingeJointComponents::getBLowerLimit(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mBLowerLimit[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the bias of the lower limit constraint
-inline void HingeJointComponents::setBLowerLimit(Entity jointEntity, decimal bLowerLimit) const {
+RP3D_FORCE_INLINE void HingeJointComponents::setBLowerLimit(Entity jointEntity, decimal bLowerLimit) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mBLowerLimit[mMapEntityToComponentIndex[jointEntity]] = bLowerLimit;
 }
 
 // Return the bias of the upper limit constraint
-inline decimal HingeJointComponents::getBUpperLimit(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal HingeJointComponents::getBUpperLimit(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mBUpperLimit[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the bias of the upper limit constraint
-inline void HingeJointComponents::setBUpperLimit(Entity jointEntity, decimal bUpperLimit) {
+RP3D_FORCE_INLINE void HingeJointComponents::setBUpperLimit(Entity jointEntity, decimal bUpperLimit) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mBUpperLimit[mMapEntityToComponentIndex[jointEntity]] = bUpperLimit;
 }
 
 // Return true if the joint limits are enabled
-inline bool HingeJointComponents::getIsLimitEnabled(Entity jointEntity) const {
+RP3D_FORCE_INLINE bool HingeJointComponents::getIsLimitEnabled(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mIsLimitEnabled[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set to true if the joint limits are enabled
-inline void HingeJointComponents::setIsLimitEnabled(Entity jointEntity, bool isLimitEnabled) {
+RP3D_FORCE_INLINE void HingeJointComponents::setIsLimitEnabled(Entity jointEntity, bool isLimitEnabled) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mIsLimitEnabled[mMapEntityToComponentIndex[jointEntity]] = isLimitEnabled;
 }
 
 // Return true if the motor of the joint in enabled
-inline bool HingeJointComponents::getIsMotorEnabled(Entity jointEntity) const {
+RP3D_FORCE_INLINE bool HingeJointComponents::getIsMotorEnabled(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mIsMotorEnabled[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set to true if the motor of the joint in enabled
-inline void HingeJointComponents::setIsMotorEnabled(Entity jointEntity, bool isMotorEnabled) const {
+RP3D_FORCE_INLINE void HingeJointComponents::setIsMotorEnabled(Entity jointEntity, bool isMotorEnabled) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mIsMotorEnabled[mMapEntityToComponentIndex[jointEntity]] = isMotorEnabled;
 }
 
 // Return the Lower limit (minimum allowed rotation angle in radian)
-inline decimal HingeJointComponents::getLowerLimit(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal HingeJointComponents::getLowerLimit(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mLowerLimit[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the Lower limit (minimum allowed rotation angle in radian)
-inline void HingeJointComponents::setLowerLimit(Entity jointEntity, decimal lowerLimit) const {
+RP3D_FORCE_INLINE void HingeJointComponents::setLowerLimit(Entity jointEntity, decimal lowerLimit) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mLowerLimit[mMapEntityToComponentIndex[jointEntity]] = lowerLimit;
 }
 
 // Return the upper limit (maximum translation distance)
-inline decimal HingeJointComponents::getUpperLimit(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal HingeJointComponents::getUpperLimit(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mUpperLimit[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the upper limit (maximum translation distance)
-inline void HingeJointComponents::setUpperLimit(Entity jointEntity, decimal upperLimit) {
+RP3D_FORCE_INLINE void HingeJointComponents::setUpperLimit(Entity jointEntity, decimal upperLimit) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mUpperLimit[mMapEntityToComponentIndex[jointEntity]] = upperLimit;
 }
 
 // Return true if the lower limit is violated
-inline bool HingeJointComponents::getIsLowerLimitViolated(Entity jointEntity) const {
+RP3D_FORCE_INLINE bool HingeJointComponents::getIsLowerLimitViolated(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mIsLowerLimitViolated[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set to true if the lower limit is violated
-inline void HingeJointComponents::setIsLowerLimitViolated(Entity jointEntity, bool isLowerLimitViolated) {
+RP3D_FORCE_INLINE void HingeJointComponents::setIsLowerLimitViolated(Entity jointEntity, bool isLowerLimitViolated) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mIsLowerLimitViolated[mMapEntityToComponentIndex[jointEntity]] = isLowerLimitViolated;
 }
 
 // Return true if the upper limit is violated
-inline bool HingeJointComponents::getIsUpperLimitViolated(Entity jointEntity) const {
+RP3D_FORCE_INLINE bool HingeJointComponents::getIsUpperLimitViolated(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mIsUpperLimitViolated[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set to true if the upper limit is violated
-inline void HingeJointComponents::setIsUpperLimitViolated(Entity jointEntity, bool isUpperLimitViolated) const {
+RP3D_FORCE_INLINE void HingeJointComponents::setIsUpperLimitViolated(Entity jointEntity, bool isUpperLimitViolated) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mIsUpperLimitViolated[mMapEntityToComponentIndex[jointEntity]] = isUpperLimitViolated;
 }
 
 // Return the motor speed (in rad/s)
-inline decimal HingeJointComponents::getMotorSpeed(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal HingeJointComponents::getMotorSpeed(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mMotorSpeed[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the motor speed (in rad/s)
-inline void HingeJointComponents::setMotorSpeed(Entity jointEntity, decimal motorSpeed) {
+RP3D_FORCE_INLINE void HingeJointComponents::setMotorSpeed(Entity jointEntity, decimal motorSpeed) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mMotorSpeed[mMapEntityToComponentIndex[jointEntity]] = motorSpeed;
 }
 
 // Return the maximum motor torque (in Newtons) that can be applied to reach to desired motor speed
-inline decimal HingeJointComponents::getMaxMotorTorque(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal HingeJointComponents::getMaxMotorTorque(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mMaxMotorTorque[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the maximum motor torque (in Newtons) that can be applied to reach to desired motor speed
-inline void HingeJointComponents::setMaxMotorTorque(Entity jointEntity, decimal maxMotorTorque) {
+RP3D_FORCE_INLINE void HingeJointComponents::setMaxMotorTorque(Entity jointEntity, decimal maxMotorTorque) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mMaxMotorTorque[mMapEntityToComponentIndex[jointEntity]] = maxMotorTorque;
diff --git a/include/reactphysics3d/components/JointComponents.h b/include/reactphysics3d/components/JointComponents.h
index f82744c0..e535dbd1 100644
--- a/include/reactphysics3d/components/JointComponents.h
+++ b/include/reactphysics3d/components/JointComponents.h
@@ -160,61 +160,61 @@ class JointComponents : public Components {
 };
 
 // Return the entity of the first body of a joint
-inline Entity JointComponents::getBody1Entity(Entity jointEntity) const {
+RP3D_FORCE_INLINE Entity JointComponents::getBody1Entity(Entity jointEntity) const {
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mBody1Entities[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Return the entity of the second body of a joint
-inline Entity JointComponents::getBody2Entity(Entity jointEntity) const {
+RP3D_FORCE_INLINE Entity JointComponents::getBody2Entity(Entity jointEntity) const {
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mBody2Entities[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Return a pointer to the joint
-inline Joint* JointComponents::getJoint(Entity jointEntity) const {
+RP3D_FORCE_INLINE Joint* JointComponents::getJoint(Entity jointEntity) const {
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mJoints[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Return the type of a joint
-inline JointType JointComponents::getType(Entity jointEntity) const {
+RP3D_FORCE_INLINE JointType JointComponents::getType(Entity jointEntity) const {
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mTypes[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Return the position correction technique of a joint
-inline JointsPositionCorrectionTechnique JointComponents::getPositionCorrectionTechnique(Entity jointEntity) const {
+RP3D_FORCE_INLINE JointsPositionCorrectionTechnique JointComponents::getPositionCorrectionTechnique(Entity jointEntity) const {
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mPositionCorrectionTechniques[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the position correction technique of a joint
-inline void JointComponents::getPositionCorrectionTechnique(Entity jointEntity, JointsPositionCorrectionTechnique positionCorrectionTechnique) {
+RP3D_FORCE_INLINE void JointComponents::getPositionCorrectionTechnique(Entity jointEntity, JointsPositionCorrectionTechnique positionCorrectionTechnique) {
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mPositionCorrectionTechniques[mMapEntityToComponentIndex[jointEntity]] = positionCorrectionTechnique;
 }
 
 // Return true if the collision is enabled between the two bodies of a joint
-inline bool JointComponents::getIsCollisionEnabled(Entity jointEntity) const {
+RP3D_FORCE_INLINE bool JointComponents::getIsCollisionEnabled(Entity jointEntity) const {
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mIsCollisionEnabled[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set whether the collision is enabled between the two bodies of a joint
-inline void JointComponents::setIsCollisionEnabled(Entity jointEntity, bool isCollisionEnabled) {
+RP3D_FORCE_INLINE void JointComponents::setIsCollisionEnabled(Entity jointEntity, bool isCollisionEnabled) {
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mIsCollisionEnabled[mMapEntityToComponentIndex[jointEntity]] = isCollisionEnabled;
 }
 
 // Return true if the joint has already been added into an island during island creation
-inline bool JointComponents::getIsAlreadyInIsland(Entity jointEntity) const {
+RP3D_FORCE_INLINE bool JointComponents::getIsAlreadyInIsland(Entity jointEntity) const {
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mIsAlreadyInIsland[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set to true if the joint has already been added into an island during island creation
-inline void JointComponents::setIsAlreadyInIsland(Entity jointEntity, bool isAlreadyInIsland) {
+RP3D_FORCE_INLINE void JointComponents::setIsAlreadyInIsland(Entity jointEntity, bool isAlreadyInIsland) {
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mIsAlreadyInIsland[mMapEntityToComponentIndex[jointEntity]] = isAlreadyInIsland;
 }
diff --git a/include/reactphysics3d/components/RigidBodyComponents.h b/include/reactphysics3d/components/RigidBodyComponents.h
index a78f071b..7ceb9a1d 100644
--- a/include/reactphysics3d/components/RigidBodyComponents.h
+++ b/include/reactphysics3d/components/RigidBodyComponents.h
@@ -370,7 +370,7 @@ class RigidBodyComponents : public Components {
 };
 
 // Return a pointer to a body rigid
-inline RigidBody* RigidBodyComponents::getRigidBody(Entity bodyEntity) {
+RP3D_FORCE_INLINE RigidBody* RigidBodyComponents::getRigidBody(Entity bodyEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -378,7 +378,7 @@ inline RigidBody* RigidBodyComponents::getRigidBody(Entity bodyEntity) {
 }
 
 // Return true if the body is allowed to sleep
-inline bool RigidBodyComponents::getIsAllowedToSleep(Entity bodyEntity) const {
+RP3D_FORCE_INLINE bool RigidBodyComponents::getIsAllowedToSleep(Entity bodyEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -386,7 +386,7 @@ inline bool RigidBodyComponents::getIsAllowedToSleep(Entity bodyEntity) const {
 }
 
 // Set the value to know if the body is allowed to sleep
-inline void RigidBodyComponents::setIsAllowedToSleep(Entity bodyEntity, bool isAllowedToSleep) const {
+RP3D_FORCE_INLINE void RigidBodyComponents::setIsAllowedToSleep(Entity bodyEntity, bool isAllowedToSleep) const {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -394,7 +394,7 @@ inline void RigidBodyComponents::setIsAllowedToSleep(Entity bodyEntity, bool isA
 }
 
 // Return true if the body is sleeping
-inline bool RigidBodyComponents::getIsSleeping(Entity bodyEntity) const {
+RP3D_FORCE_INLINE bool RigidBodyComponents::getIsSleeping(Entity bodyEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -402,7 +402,7 @@ inline bool RigidBodyComponents::getIsSleeping(Entity bodyEntity) const {
 }
 
 // Set the value to know if the body is sleeping
-inline void RigidBodyComponents::setIsSleeping(Entity bodyEntity, bool isSleeping) const {
+RP3D_FORCE_INLINE void RigidBodyComponents::setIsSleeping(Entity bodyEntity, bool isSleeping) const {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -410,7 +410,7 @@ inline void RigidBodyComponents::setIsSleeping(Entity bodyEntity, bool isSleepin
 }
 
 // Return the sleep time
-inline decimal RigidBodyComponents::getSleepTime(Entity bodyEntity) const {
+RP3D_FORCE_INLINE decimal RigidBodyComponents::getSleepTime(Entity bodyEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -418,7 +418,7 @@ inline decimal RigidBodyComponents::getSleepTime(Entity bodyEntity) const {
 }
 
 // Set the sleep time
-inline void RigidBodyComponents::setSleepTime(Entity bodyEntity, decimal sleepTime) const {
+RP3D_FORCE_INLINE void RigidBodyComponents::setSleepTime(Entity bodyEntity, decimal sleepTime) const {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -426,7 +426,7 @@ inline void RigidBodyComponents::setSleepTime(Entity bodyEntity, decimal sleepTi
 }
 
 // Return the body type of a body
-inline BodyType RigidBodyComponents::getBodyType(Entity bodyEntity) {
+RP3D_FORCE_INLINE BodyType RigidBodyComponents::getBodyType(Entity bodyEntity) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -434,7 +434,7 @@ inline BodyType RigidBodyComponents::getBodyType(Entity bodyEntity) {
 }
 
 // Set the body type of a body
-inline void RigidBodyComponents::setBodyType(Entity bodyEntity, BodyType bodyType) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setBodyType(Entity bodyEntity, BodyType bodyType) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -442,7 +442,7 @@ inline void RigidBodyComponents::setBodyType(Entity bodyEntity, BodyType bodyTyp
 }
 
 // Return the linear velocity of an entity
-inline const Vector3& RigidBodyComponents::getLinearVelocity(Entity bodyEntity) const {
+RP3D_FORCE_INLINE const Vector3& RigidBodyComponents::getLinearVelocity(Entity bodyEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -450,7 +450,7 @@ inline const Vector3& RigidBodyComponents::getLinearVelocity(Entity bodyEntity)
 }
 
 // Return the angular velocity of an entity
-inline const Vector3& RigidBodyComponents::getAngularVelocity(Entity bodyEntity) const {
+RP3D_FORCE_INLINE const Vector3& RigidBodyComponents::getAngularVelocity(Entity bodyEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -458,7 +458,7 @@ inline const Vector3& RigidBodyComponents::getAngularVelocity(Entity bodyEntity)
 }
 
 // Set the linear velocity of an entity
-inline void RigidBodyComponents::setLinearVelocity(Entity bodyEntity, const Vector3& linearVelocity) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setLinearVelocity(Entity bodyEntity, const Vector3& linearVelocity) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -466,7 +466,7 @@ inline void RigidBodyComponents::setLinearVelocity(Entity bodyEntity, const Vect
 }
 
 // Set the angular velocity of an entity
-inline void RigidBodyComponents::setAngularVelocity(Entity bodyEntity, const Vector3& angularVelocity) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setAngularVelocity(Entity bodyEntity, const Vector3& angularVelocity) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -474,7 +474,7 @@ inline void RigidBodyComponents::setAngularVelocity(Entity bodyEntity, const Vec
 }
 
 // Return the external force of an entity
-inline const Vector3& RigidBodyComponents::getExternalForce(Entity bodyEntity) const {
+RP3D_FORCE_INLINE const Vector3& RigidBodyComponents::getExternalForce(Entity bodyEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -482,7 +482,7 @@ inline const Vector3& RigidBodyComponents::getExternalForce(Entity bodyEntity) c
 }
 
 // Return the external torque of an entity
-inline const Vector3& RigidBodyComponents::getExternalTorque(Entity bodyEntity) const {
+RP3D_FORCE_INLINE const Vector3& RigidBodyComponents::getExternalTorque(Entity bodyEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -490,7 +490,7 @@ inline const Vector3& RigidBodyComponents::getExternalTorque(Entity bodyEntity)
 }
 
 // Return the linear damping factor of an entity
-inline decimal RigidBodyComponents::getLinearDamping(Entity bodyEntity) const {
+RP3D_FORCE_INLINE decimal RigidBodyComponents::getLinearDamping(Entity bodyEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -498,7 +498,7 @@ inline decimal RigidBodyComponents::getLinearDamping(Entity bodyEntity) const {
 }
 
 // Return the angular damping factor of an entity
-inline decimal RigidBodyComponents::getAngularDamping(Entity bodyEntity) const {
+RP3D_FORCE_INLINE decimal RigidBodyComponents::getAngularDamping(Entity bodyEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -506,7 +506,7 @@ inline decimal RigidBodyComponents::getAngularDamping(Entity bodyEntity) const {
 }
 
 // Return the mass of an entity
-inline decimal RigidBodyComponents::getMass(Entity bodyEntity) const {
+RP3D_FORCE_INLINE decimal RigidBodyComponents::getMass(Entity bodyEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -514,7 +514,7 @@ inline decimal RigidBodyComponents::getMass(Entity bodyEntity) const {
 }
 
 // Return the inverse mass of an entity
-inline decimal RigidBodyComponents::getMassInverse(Entity bodyEntity) const {
+RP3D_FORCE_INLINE decimal RigidBodyComponents::getMassInverse(Entity bodyEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -522,7 +522,7 @@ inline decimal RigidBodyComponents::getMassInverse(Entity bodyEntity) const {
 }
 
 // Return the inverse local inertia tensor of an entity
-inline const Vector3& RigidBodyComponents::getInertiaTensorLocalInverse(Entity bodyEntity) {
+RP3D_FORCE_INLINE const Vector3& RigidBodyComponents::getInertiaTensorLocalInverse(Entity bodyEntity) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -530,7 +530,7 @@ inline const Vector3& RigidBodyComponents::getInertiaTensorLocalInverse(Entity b
 }
 
 // Return the inverse world inertia tensor of an entity
-inline const Matrix3x3& RigidBodyComponents::getInertiaTensorWorldInverse(Entity bodyEntity) {
+RP3D_FORCE_INLINE const Matrix3x3& RigidBodyComponents::getInertiaTensorWorldInverse(Entity bodyEntity) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -538,7 +538,7 @@ inline const Matrix3x3& RigidBodyComponents::getInertiaTensorWorldInverse(Entity
 }
 
 // Set the external force of an entity
-inline void RigidBodyComponents::setExternalForce(Entity bodyEntity, const Vector3& externalForce) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setExternalForce(Entity bodyEntity, const Vector3& externalForce) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -546,7 +546,7 @@ inline void RigidBodyComponents::setExternalForce(Entity bodyEntity, const Vecto
 }
 
 // Set the external force of an entity
-inline void RigidBodyComponents::setExternalTorque(Entity bodyEntity, const Vector3& externalTorque) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setExternalTorque(Entity bodyEntity, const Vector3& externalTorque) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -554,7 +554,7 @@ inline void RigidBodyComponents::setExternalTorque(Entity bodyEntity, const Vect
 }
 
 // Set the linear damping factor of an entity
-inline void RigidBodyComponents::setLinearDamping(Entity bodyEntity, decimal linearDamping) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setLinearDamping(Entity bodyEntity, decimal linearDamping) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -562,7 +562,7 @@ inline void RigidBodyComponents::setLinearDamping(Entity bodyEntity, decimal lin
 }
 
 // Set the angular damping factor of an entity
-inline void RigidBodyComponents::setAngularDamping(Entity bodyEntity, decimal angularDamping) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setAngularDamping(Entity bodyEntity, decimal angularDamping) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -570,7 +570,7 @@ inline void RigidBodyComponents::setAngularDamping(Entity bodyEntity, decimal an
 }
 
 // Set the  mass of an entity
-inline void RigidBodyComponents::setMass(Entity bodyEntity, decimal mass) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setMass(Entity bodyEntity, decimal mass) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -578,7 +578,7 @@ inline void RigidBodyComponents::setMass(Entity bodyEntity, decimal mass) {
 }
 
 // Set the mass inverse of an entity
-inline void RigidBodyComponents::setMassInverse(Entity bodyEntity, decimal inverseMass) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setMassInverse(Entity bodyEntity, decimal inverseMass) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -586,7 +586,7 @@ inline void RigidBodyComponents::setMassInverse(Entity bodyEntity, decimal inver
 }
 
 // Return the local inertia tensor of an entity
-inline const Vector3& RigidBodyComponents::getLocalInertiaTensor(Entity bodyEntity) {
+RP3D_FORCE_INLINE const Vector3& RigidBodyComponents::getLocalInertiaTensor(Entity bodyEntity) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -594,7 +594,7 @@ inline const Vector3& RigidBodyComponents::getLocalInertiaTensor(Entity bodyEnti
 }
 
 // Set the local inertia tensor of an entity
-inline void RigidBodyComponents::setLocalInertiaTensor(Entity bodyEntity, const Vector3& inertiaTensorLocal) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setLocalInertiaTensor(Entity bodyEntity, const Vector3& inertiaTensorLocal) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -602,7 +602,7 @@ inline void RigidBodyComponents::setLocalInertiaTensor(Entity bodyEntity, const
 }
 
 // Set the inverse local inertia tensor of an entity
-inline void RigidBodyComponents::setInverseInertiaTensorLocal(Entity bodyEntity, const Vector3& inertiaTensorLocalInverse) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setInverseInertiaTensorLocal(Entity bodyEntity, const Vector3& inertiaTensorLocalInverse) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -610,7 +610,7 @@ inline void RigidBodyComponents::setInverseInertiaTensorLocal(Entity bodyEntity,
 }
 
 // Return the constrained linear velocity of an entity
-inline const Vector3& RigidBodyComponents::getConstrainedLinearVelocity(Entity bodyEntity) const {
+RP3D_FORCE_INLINE const Vector3& RigidBodyComponents::getConstrainedLinearVelocity(Entity bodyEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -618,7 +618,7 @@ inline const Vector3& RigidBodyComponents::getConstrainedLinearVelocity(Entity b
 }
 
 // Return the constrained angular velocity of an entity
-inline const Vector3& RigidBodyComponents::getConstrainedAngularVelocity(Entity bodyEntity) const {
+RP3D_FORCE_INLINE const Vector3& RigidBodyComponents::getConstrainedAngularVelocity(Entity bodyEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -626,7 +626,7 @@ inline const Vector3& RigidBodyComponents::getConstrainedAngularVelocity(Entity
 }
 
 // Return the split linear velocity of an entity
-inline const Vector3& RigidBodyComponents::getSplitLinearVelocity(Entity bodyEntity) const {
+RP3D_FORCE_INLINE const Vector3& RigidBodyComponents::getSplitLinearVelocity(Entity bodyEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -634,7 +634,7 @@ inline const Vector3& RigidBodyComponents::getSplitLinearVelocity(Entity bodyEnt
 }
 
 // Return the split angular velocity of an entity
-inline const Vector3& RigidBodyComponents::getSplitAngularVelocity(Entity bodyEntity) const {
+RP3D_FORCE_INLINE const Vector3& RigidBodyComponents::getSplitAngularVelocity(Entity bodyEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -642,7 +642,7 @@ inline const Vector3& RigidBodyComponents::getSplitAngularVelocity(Entity bodyEn
 }
 
 // Return the constrained position of an entity
-inline Vector3& RigidBodyComponents::getConstrainedPosition(Entity bodyEntity) {
+RP3D_FORCE_INLINE Vector3& RigidBodyComponents::getConstrainedPosition(Entity bodyEntity) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -650,7 +650,7 @@ inline Vector3& RigidBodyComponents::getConstrainedPosition(Entity bodyEntity) {
 }
 
 // Return the constrained orientation of an entity
-inline Quaternion& RigidBodyComponents::getConstrainedOrientation(Entity bodyEntity) {
+RP3D_FORCE_INLINE Quaternion& RigidBodyComponents::getConstrainedOrientation(Entity bodyEntity) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -658,7 +658,7 @@ inline Quaternion& RigidBodyComponents::getConstrainedOrientation(Entity bodyEnt
 }
 
 // Return the local center of mass of an entity
-inline const Vector3& RigidBodyComponents::getCenterOfMassLocal(Entity bodyEntity) {
+RP3D_FORCE_INLINE const Vector3& RigidBodyComponents::getCenterOfMassLocal(Entity bodyEntity) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -666,7 +666,7 @@ inline const Vector3& RigidBodyComponents::getCenterOfMassLocal(Entity bodyEntit
 }
 
 // Return the world center of mass of an entity
-inline const Vector3& RigidBodyComponents::getCenterOfMassWorld(Entity bodyEntity) {
+RP3D_FORCE_INLINE const Vector3& RigidBodyComponents::getCenterOfMassWorld(Entity bodyEntity) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -674,7 +674,7 @@ inline const Vector3& RigidBodyComponents::getCenterOfMassWorld(Entity bodyEntit
 }
 
 // Set the constrained linear velocity of an entity
-inline void RigidBodyComponents::setConstrainedLinearVelocity(Entity bodyEntity, const Vector3& constrainedLinearVelocity) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setConstrainedLinearVelocity(Entity bodyEntity, const Vector3& constrainedLinearVelocity) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -682,7 +682,7 @@ inline void RigidBodyComponents::setConstrainedLinearVelocity(Entity bodyEntity,
 }
 
 // Set the constrained angular velocity of an entity
-inline void RigidBodyComponents::setConstrainedAngularVelocity(Entity bodyEntity, const Vector3& constrainedAngularVelocity) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setConstrainedAngularVelocity(Entity bodyEntity, const Vector3& constrainedAngularVelocity) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -690,7 +690,7 @@ inline void RigidBodyComponents::setConstrainedAngularVelocity(Entity bodyEntity
 }
 
 // Set the split linear velocity of an entity
-inline void RigidBodyComponents::setSplitLinearVelocity(Entity bodyEntity, const Vector3& splitLinearVelocity) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setSplitLinearVelocity(Entity bodyEntity, const Vector3& splitLinearVelocity) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -698,7 +698,7 @@ inline void RigidBodyComponents::setSplitLinearVelocity(Entity bodyEntity, const
 }
 
 // Set the split angular velocity of an entity
-inline void RigidBodyComponents::setSplitAngularVelocity(Entity bodyEntity, const Vector3& splitAngularVelocity) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setSplitAngularVelocity(Entity bodyEntity, const Vector3& splitAngularVelocity) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -706,7 +706,7 @@ inline void RigidBodyComponents::setSplitAngularVelocity(Entity bodyEntity, cons
 }
 
 // Set the constrained position of an entity
-inline void RigidBodyComponents::setConstrainedPosition(Entity bodyEntity, const Vector3& constrainedPosition) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setConstrainedPosition(Entity bodyEntity, const Vector3& constrainedPosition) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -714,7 +714,7 @@ inline void RigidBodyComponents::setConstrainedPosition(Entity bodyEntity, const
 }
 
 // Set the constrained orientation of an entity
-inline void RigidBodyComponents::setConstrainedOrientation(Entity bodyEntity, const Quaternion& constrainedOrientation) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setConstrainedOrientation(Entity bodyEntity, const Quaternion& constrainedOrientation) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -722,7 +722,7 @@ inline void RigidBodyComponents::setConstrainedOrientation(Entity bodyEntity, co
 }
 
 // Set the local center of mass of an entity
-inline void RigidBodyComponents::setCenterOfMassLocal(Entity bodyEntity, const Vector3& centerOfMassLocal) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setCenterOfMassLocal(Entity bodyEntity, const Vector3& centerOfMassLocal) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -730,7 +730,7 @@ inline void RigidBodyComponents::setCenterOfMassLocal(Entity bodyEntity, const V
 }
 
 // Set the world center of mass of an entity
-inline void RigidBodyComponents::setCenterOfMassWorld(Entity bodyEntity, const Vector3& centerOfMassWorld) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setCenterOfMassWorld(Entity bodyEntity, const Vector3& centerOfMassWorld) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -738,7 +738,7 @@ inline void RigidBodyComponents::setCenterOfMassWorld(Entity bodyEntity, const V
 }
 
 // Return true if gravity is enabled for this entity
-inline bool RigidBodyComponents::getIsGravityEnabled(Entity bodyEntity) const {
+RP3D_FORCE_INLINE bool RigidBodyComponents::getIsGravityEnabled(Entity bodyEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -746,7 +746,7 @@ inline bool RigidBodyComponents::getIsGravityEnabled(Entity bodyEntity) const {
 }
 
 // Return true if the entity is already in an island
-inline bool RigidBodyComponents::getIsAlreadyInIsland(Entity bodyEntity) const {
+RP3D_FORCE_INLINE bool RigidBodyComponents::getIsAlreadyInIsland(Entity bodyEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -754,7 +754,7 @@ inline bool RigidBodyComponents::getIsAlreadyInIsland(Entity bodyEntity) const {
 }
 
 // Set the value to know if the gravity is enabled for this entity
-inline void RigidBodyComponents::setIsGravityEnabled(Entity bodyEntity, bool isGravityEnabled) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setIsGravityEnabled(Entity bodyEntity, bool isGravityEnabled) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
 
@@ -762,35 +762,35 @@ inline void RigidBodyComponents::setIsGravityEnabled(Entity bodyEntity, bool isG
 }
 
 // Set the value to know if the entity is already in an island
-inline void RigidBodyComponents::setIsAlreadyInIsland(Entity bodyEntity, bool isAlreadyInIsland) {
+RP3D_FORCE_INLINE void RigidBodyComponents::setIsAlreadyInIsland(Entity bodyEntity, bool isAlreadyInIsland) {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
    mIsAlreadyInIsland[mMapEntityToComponentIndex[bodyEntity]] = isAlreadyInIsland;
 }
 
 // Return the list of joints of a body
-inline const List<Entity>& RigidBodyComponents::getJoints(Entity bodyEntity) const {
+RP3D_FORCE_INLINE const List<Entity>& RigidBodyComponents::getJoints(Entity bodyEntity) const {
 
    assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
    return mJoints[mMapEntityToComponentIndex[bodyEntity]];
 }
 
 // Add a joint to a body component
-inline void RigidBodyComponents::addJointToBody(Entity bodyEntity, Entity jointEntity) {
+RP3D_FORCE_INLINE void RigidBodyComponents::addJointToBody(Entity bodyEntity, Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
     mJoints[mMapEntityToComponentIndex[bodyEntity]].add(jointEntity);
 }
 
 // Remove a joint from a body component
-inline void RigidBodyComponents::removeJointFromBody(Entity bodyEntity, Entity jointEntity) {
+RP3D_FORCE_INLINE void RigidBodyComponents::removeJointFromBody(Entity bodyEntity, Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
     mJoints[mMapEntityToComponentIndex[bodyEntity]].remove(jointEntity);
 }
 
 // A an associated contact pairs into the contact pairs array of the body
-inline void RigidBodyComponents::addContacPair(Entity bodyEntity, uint contactPairIndex) {
+RP3D_FORCE_INLINE void RigidBodyComponents::addContacPair(Entity bodyEntity, uint contactPairIndex) {
 
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
     mContactPairs[mMapEntityToComponentIndex[bodyEntity]].add(contactPairIndex);
diff --git a/include/reactphysics3d/components/SliderJointComponents.h b/include/reactphysics3d/components/SliderJointComponents.h
index f15388ed..56672259 100644
--- a/include/reactphysics3d/components/SliderJointComponents.h
+++ b/include/reactphysics3d/components/SliderJointComponents.h
@@ -460,266 +460,266 @@ class SliderJointComponents : public Components {
 };
 
 // Return a pointer to a given joint
-inline SliderJoint* SliderJointComponents::getJoint(Entity jointEntity) const {
+RP3D_FORCE_INLINE SliderJoint* SliderJointComponents::getJoint(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mJoints[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the joint pointer to a given joint
-inline void SliderJointComponents::setJoint(Entity jointEntity, SliderJoint* joint) const {
+RP3D_FORCE_INLINE void SliderJointComponents::setJoint(Entity jointEntity, SliderJoint* joint) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mJoints[mMapEntityToComponentIndex[jointEntity]] = joint;
 }
 
 // Return the local anchor point of body 1 for a given joint
-inline const Vector3& SliderJointComponents::getLocalAnchorPointBody1(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Vector3& SliderJointComponents::getLocalAnchorPointBody1(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mLocalAnchorPointBody1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the local anchor point of body 1 for a given joint
-inline void SliderJointComponents::setLocalAnchorPointBody1(Entity jointEntity, const Vector3& localAnchoirPointBody1) {
+RP3D_FORCE_INLINE void SliderJointComponents::setLocalAnchorPointBody1(Entity jointEntity, const Vector3& localAnchoirPointBody1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mLocalAnchorPointBody1[mMapEntityToComponentIndex[jointEntity]] = localAnchoirPointBody1;
 }
 
 // Return the local anchor point of body 2 for a given joint
-inline const Vector3& SliderJointComponents::getLocalAnchorPointBody2(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Vector3& SliderJointComponents::getLocalAnchorPointBody2(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mLocalAnchorPointBody2[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the local anchor point of body 2 for a given joint
-inline void SliderJointComponents::setLocalAnchorPointBody2(Entity jointEntity, const Vector3& localAnchoirPointBody2) {
+RP3D_FORCE_INLINE void SliderJointComponents::setLocalAnchorPointBody2(Entity jointEntity, const Vector3& localAnchoirPointBody2) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mLocalAnchorPointBody2[mMapEntityToComponentIndex[jointEntity]] = localAnchoirPointBody2;
 }
 
 // Return the inertia tensor of body 1 (in world-space coordinates)
-inline const Matrix3x3& SliderJointComponents::getI1(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Matrix3x3& SliderJointComponents::getI1(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mI1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the inertia tensor of body 1 (in world-space coordinates)
-inline void SliderJointComponents::setI1(Entity jointEntity, const Matrix3x3& i1) {
+RP3D_FORCE_INLINE void SliderJointComponents::setI1(Entity jointEntity, const Matrix3x3& i1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mI1[mMapEntityToComponentIndex[jointEntity]] = i1;
 }
 
 // Return the inertia tensor of body 2 (in world-space coordinates)
-inline const Matrix3x3& SliderJointComponents::getI2(Entity jointEntity) const {
+RP3D_FORCE_INLINE const Matrix3x3& SliderJointComponents::getI2(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mI2[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the inertia tensor of body 2 (in world-space coordinates)
-inline void SliderJointComponents::setI2(Entity jointEntity, const Matrix3x3& i2) {
+RP3D_FORCE_INLINE void SliderJointComponents::setI2(Entity jointEntity, const Matrix3x3& i2) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mI2[mMapEntityToComponentIndex[jointEntity]] = i2;
 }
 
 // Return the translation impulse
-inline Vector2& SliderJointComponents::getImpulseTranslation(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector2& SliderJointComponents::getImpulseTranslation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mImpulseTranslation[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the translation impulse
-inline void SliderJointComponents::setImpulseTranslation(Entity jointEntity, const Vector2& impulseTranslation) {
+RP3D_FORCE_INLINE void SliderJointComponents::setImpulseTranslation(Entity jointEntity, const Vector2& impulseTranslation) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mImpulseTranslation[mMapEntityToComponentIndex[jointEntity]] = impulseTranslation;
 }
 
 // Return the translation impulse
-inline Vector3& SliderJointComponents::getImpulseRotation(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& SliderJointComponents::getImpulseRotation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mImpulseRotation[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the translation impulse
-inline void SliderJointComponents::setImpulseRotation(Entity jointEntity, const Vector3& impulseTranslation) {
+RP3D_FORCE_INLINE void SliderJointComponents::setImpulseRotation(Entity jointEntity, const Vector3& impulseTranslation) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mImpulseRotation[mMapEntityToComponentIndex[jointEntity]] = impulseTranslation;
 }
 
 // Return the translation inverse mass matrix of the constraint
-inline Matrix2x2& SliderJointComponents::getInverseMassMatrixTranslation(Entity jointEntity) {
+RP3D_FORCE_INLINE Matrix2x2& SliderJointComponents::getInverseMassMatrixTranslation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mInverseMassMatrixTranslation[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the translation inverse mass matrix of the constraint
-inline void SliderJointComponents::setInverseMassMatrixTranslation(Entity jointEntity, const Matrix2x2& inverseMassMatrix) {
+RP3D_FORCE_INLINE void SliderJointComponents::setInverseMassMatrixTranslation(Entity jointEntity, const Matrix2x2& inverseMassMatrix) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mInverseMassMatrixTranslation[mMapEntityToComponentIndex[jointEntity]] = inverseMassMatrix;
 }
 
 // Return the rotation inverse mass matrix of the constraint
-inline Matrix3x3& SliderJointComponents::getInverseMassMatrixRotation(Entity jointEntity) {
+RP3D_FORCE_INLINE Matrix3x3& SliderJointComponents::getInverseMassMatrixRotation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mInverseMassMatrixRotation[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the rotation inverse mass matrix of the constraint
-inline void SliderJointComponents::setInverseMassMatrixRotation(Entity jointEntity, const Matrix3x3& inverseMassMatrix) {
+RP3D_FORCE_INLINE void SliderJointComponents::setInverseMassMatrixRotation(Entity jointEntity, const Matrix3x3& inverseMassMatrix) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mInverseMassMatrixRotation[mMapEntityToComponentIndex[jointEntity]] = inverseMassMatrix;
 }
 
 // Return the translation bias
-inline Vector2& SliderJointComponents::getBiasTranslation(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector2& SliderJointComponents::getBiasTranslation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mBiasTranslation[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the translation impulse
-inline void SliderJointComponents::setBiasTranslation(Entity jointEntity, const Vector2& impulseTranslation) {
+RP3D_FORCE_INLINE void SliderJointComponents::setBiasTranslation(Entity jointEntity, const Vector2& impulseTranslation) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mBiasTranslation[mMapEntityToComponentIndex[jointEntity]] = impulseTranslation;
 }
 
 // Return the rotation bias
-inline Vector3& SliderJointComponents::getBiasRotation(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& SliderJointComponents::getBiasRotation(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mBiasRotation[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the rotation impulse
-inline void SliderJointComponents::setBiasRotation(Entity jointEntity, const Vector3& impulseRotation) {
+RP3D_FORCE_INLINE void SliderJointComponents::setBiasRotation(Entity jointEntity, const Vector3& impulseRotation) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mBiasRotation[mMapEntityToComponentIndex[jointEntity]] = impulseRotation;
 }
 
 // Return the initial orientation difference
-inline Quaternion& SliderJointComponents::getInitOrientationDifferenceInv(Entity jointEntity) {
+RP3D_FORCE_INLINE Quaternion& SliderJointComponents::getInitOrientationDifferenceInv(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mInitOrientationDifferenceInv[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the rotation impulse
-inline void SliderJointComponents::setInitOrientationDifferenceInv(Entity jointEntity, const Quaternion& initOrientationDifferenceInv) {
+RP3D_FORCE_INLINE void SliderJointComponents::setInitOrientationDifferenceInv(Entity jointEntity, const Quaternion& initOrientationDifferenceInv) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mInitOrientationDifferenceInv[mMapEntityToComponentIndex[jointEntity]] = initOrientationDifferenceInv;
 }
 
 // Return the slider axis (in local-space coordinates of body 1)
-inline Vector3& SliderJointComponents::getSliderAxisBody1(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& SliderJointComponents::getSliderAxisBody1(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mSliderAxisBody1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the slider axis (in local-space coordinates of body 1)
-inline void SliderJointComponents::setSliderAxisBody1(Entity jointEntity, const Vector3& sliderAxisBody1) {
+RP3D_FORCE_INLINE void SliderJointComponents::setSliderAxisBody1(Entity jointEntity, const Vector3& sliderAxisBody1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mSliderAxisBody1[mMapEntityToComponentIndex[jointEntity]] = sliderAxisBody1;
 }
 
 // Retunr the slider axis in world-space coordinates
-inline Vector3& SliderJointComponents::getSliderAxisWorld(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& SliderJointComponents::getSliderAxisWorld(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mSliderAxisWorld[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the slider axis in world-space coordinates
-inline void SliderJointComponents::setSliderAxisWorld(Entity jointEntity, const Vector3& sliderAxisWorld) {
+RP3D_FORCE_INLINE void SliderJointComponents::setSliderAxisWorld(Entity jointEntity, const Vector3& sliderAxisWorld) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mSliderAxisWorld[mMapEntityToComponentIndex[jointEntity]] = sliderAxisWorld;
 }
 
 // Return the vector r1 in world-space coordinates
-inline Vector3& SliderJointComponents::getR1(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& SliderJointComponents::getR1(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mR1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the vector r1 in world-space coordinates
-inline void SliderJointComponents::setR1(Entity jointEntity, const Vector3& r1) {
+RP3D_FORCE_INLINE void SliderJointComponents::setR1(Entity jointEntity, const Vector3& r1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mR1[mMapEntityToComponentIndex[jointEntity]] = r1;
 }
 
 // Return the vector r2 in world-space coordinates
-inline Vector3& SliderJointComponents::getR2(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& SliderJointComponents::getR2(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mR2[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the vector r2 in world-space coordinates
-inline void SliderJointComponents::setR2(Entity jointEntity, const Vector3& r2) {
+RP3D_FORCE_INLINE void SliderJointComponents::setR2(Entity jointEntity, const Vector3& r2) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mR2[mMapEntityToComponentIndex[jointEntity]] = r2;
 }
 
 // Return the first vector orthogonal to the slider axis local-space of body 1
-inline Vector3& SliderJointComponents::getN1(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& SliderJointComponents::getN1(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mN1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the first vector orthogonal to the slider axis local-space of body 1
-inline void SliderJointComponents::setN1(Entity jointEntity, const Vector3& n1) {
+RP3D_FORCE_INLINE void SliderJointComponents::setN1(Entity jointEntity, const Vector3& n1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mN1[mMapEntityToComponentIndex[jointEntity]] = n1;
 }
 
 // Return the second vector orthogonal to the slider axis and mN1 in local-space of body 1
-inline Vector3& SliderJointComponents::getN2(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& SliderJointComponents::getN2(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mN2[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the second vector orthogonal to the slider axis and mN1 in local-space of body 1
-inline void SliderJointComponents::setN2(Entity jointEntity, const Vector3& n2) {
+RP3D_FORCE_INLINE void SliderJointComponents::setN2(Entity jointEntity, const Vector3& n2) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mN2[mMapEntityToComponentIndex[jointEntity]] = n2;
 }
 
 // Return the accumulated impulse for the lower limit constraint
-inline decimal SliderJointComponents::getImpulseLowerLimit(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal SliderJointComponents::getImpulseLowerLimit(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mImpulseLowerLimit[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the accumulated impulse for the lower limit constraint
-inline void SliderJointComponents::setImpulseLowerLimit(Entity jointEntity, decimal impulseLowerLimit) {
+RP3D_FORCE_INLINE void SliderJointComponents::setImpulseLowerLimit(Entity jointEntity, decimal impulseLowerLimit) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mImpulseLowerLimit[mMapEntityToComponentIndex[jointEntity]] = impulseLowerLimit;
@@ -727,14 +727,14 @@ inline void SliderJointComponents::setImpulseLowerLimit(Entity jointEntity, deci
 
 
 // Return the accumulated impulse for the upper limit constraint
-inline decimal SliderJointComponents::getImpulseUpperLimit(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal SliderJointComponents::getImpulseUpperLimit(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mImpulseUpperLimit[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the accumulated impulse for the upper limit constraint
-inline void SliderJointComponents::setImpulseUpperLimit(Entity jointEntity, decimal impulseUpperLimit) const {
+RP3D_FORCE_INLINE void SliderJointComponents::setImpulseUpperLimit(Entity jointEntity, decimal impulseUpperLimit) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mImpulseUpperLimit[mMapEntityToComponentIndex[jointEntity]] = impulseUpperLimit;
@@ -742,266 +742,266 @@ inline void SliderJointComponents::setImpulseUpperLimit(Entity jointEntity, deci
 
 
 // Return the accumulated impulse for the motor constraint;
-inline decimal SliderJointComponents::getImpulseMotor(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal SliderJointComponents::getImpulseMotor(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mImpulseMotor[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the accumulated impulse for the motor constraint;
-inline void SliderJointComponents::setImpulseMotor(Entity jointEntity, decimal impulseMotor) {
+RP3D_FORCE_INLINE void SliderJointComponents::setImpulseMotor(Entity jointEntity, decimal impulseMotor) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mImpulseMotor[mMapEntityToComponentIndex[jointEntity]] = impulseMotor;
 }
 
 // Return the inverse of mass matrix K=JM^-1J^t for the limits (1x1 matrix)
-inline decimal SliderJointComponents::getInverseMassMatrixLimit(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal SliderJointComponents::getInverseMassMatrixLimit(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mInverseMassMatrixLimit[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the inverse of mass matrix K=JM^-1J^t for the limits (1x1 matrix)
-inline void SliderJointComponents::setInverseMassMatrixLimit(Entity jointEntity, decimal inverseMassMatrixLimitMotor) {
+RP3D_FORCE_INLINE void SliderJointComponents::setInverseMassMatrixLimit(Entity jointEntity, decimal inverseMassMatrixLimitMotor) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mInverseMassMatrixLimit[mMapEntityToComponentIndex[jointEntity]] = inverseMassMatrixLimitMotor;
 }
 
 // Return the inverse of mass matrix K=JM^-1J^t for the motor
-inline decimal SliderJointComponents::getInverseMassMatrixMotor(Entity jointEntity) {
+RP3D_FORCE_INLINE decimal SliderJointComponents::getInverseMassMatrixMotor(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mInverseMassMatrixMotor[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Return the inverse of mass matrix K=JM^-1J^t for the motor
-inline void SliderJointComponents::setInverseMassMatrixMotor(Entity jointEntity, decimal inverseMassMatrixMotor) {
+RP3D_FORCE_INLINE void SliderJointComponents::setInverseMassMatrixMotor(Entity jointEntity, decimal inverseMassMatrixMotor) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mInverseMassMatrixMotor[mMapEntityToComponentIndex[jointEntity]] = inverseMassMatrixMotor;
 }
 
 // Return the bias of the lower limit constraint
-inline decimal SliderJointComponents::getBLowerLimit(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal SliderJointComponents::getBLowerLimit(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mBLowerLimit[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the bias of the lower limit constraint
-inline void SliderJointComponents::setBLowerLimit(Entity jointEntity, decimal bLowerLimit) const {
+RP3D_FORCE_INLINE void SliderJointComponents::setBLowerLimit(Entity jointEntity, decimal bLowerLimit) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mBLowerLimit[mMapEntityToComponentIndex[jointEntity]] = bLowerLimit;
 }
 
 // Return the bias of the upper limit constraint
-inline decimal SliderJointComponents::getBUpperLimit(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal SliderJointComponents::getBUpperLimit(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mBUpperLimit[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the bias of the upper limit constraint
-inline void SliderJointComponents::setBUpperLimit(Entity jointEntity, decimal bUpperLimit) {
+RP3D_FORCE_INLINE void SliderJointComponents::setBUpperLimit(Entity jointEntity, decimal bUpperLimit) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mBUpperLimit[mMapEntityToComponentIndex[jointEntity]] = bUpperLimit;
 }
 
 // Return true if the joint limits are enabled
-inline bool SliderJointComponents::getIsLimitEnabled(Entity jointEntity) const {
+RP3D_FORCE_INLINE bool SliderJointComponents::getIsLimitEnabled(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mIsLimitEnabled[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set to true if the joint limits are enabled
-inline void SliderJointComponents::setIsLimitEnabled(Entity jointEntity, bool isLimitEnabled) {
+RP3D_FORCE_INLINE void SliderJointComponents::setIsLimitEnabled(Entity jointEntity, bool isLimitEnabled) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mIsLimitEnabled[mMapEntityToComponentIndex[jointEntity]] = isLimitEnabled;
 }
 
 // Return true if the motor of the joint in enabled
-inline bool SliderJointComponents::getIsMotorEnabled(Entity jointEntity) const {
+RP3D_FORCE_INLINE bool SliderJointComponents::getIsMotorEnabled(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mIsMotorEnabled[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set to true if the motor of the joint in enabled
-inline void SliderJointComponents::setIsMotorEnabled(Entity jointEntity, bool isMotorEnabled) const {
+RP3D_FORCE_INLINE void SliderJointComponents::setIsMotorEnabled(Entity jointEntity, bool isMotorEnabled) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mIsMotorEnabled[mMapEntityToComponentIndex[jointEntity]] = isMotorEnabled;
 }
 
 // Return the Lower limit (minimum allowed rotation angle in radian)
-inline decimal SliderJointComponents::getLowerLimit(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal SliderJointComponents::getLowerLimit(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mLowerLimit[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the Lower limit (minimum allowed rotation angle in radian)
-inline void SliderJointComponents::setLowerLimit(Entity jointEntity, decimal lowerLimit) const {
+RP3D_FORCE_INLINE void SliderJointComponents::setLowerLimit(Entity jointEntity, decimal lowerLimit) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mLowerLimit[mMapEntityToComponentIndex[jointEntity]] = lowerLimit;
 }
 
 // Return the upper limit (maximum translation distance)
-inline decimal SliderJointComponents::getUpperLimit(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal SliderJointComponents::getUpperLimit(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mUpperLimit[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the upper limit (maximum translation distance)
-inline void SliderJointComponents::setUpperLimit(Entity jointEntity, decimal upperLimit) {
+RP3D_FORCE_INLINE void SliderJointComponents::setUpperLimit(Entity jointEntity, decimal upperLimit) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mUpperLimit[mMapEntityToComponentIndex[jointEntity]] = upperLimit;
 }
 
 // Return true if the lower limit is violated
-inline bool SliderJointComponents::getIsLowerLimitViolated(Entity jointEntity) const {
+RP3D_FORCE_INLINE bool SliderJointComponents::getIsLowerLimitViolated(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mIsLowerLimitViolated[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set to true if the lower limit is violated
-inline void SliderJointComponents::setIsLowerLimitViolated(Entity jointEntity, bool isLowerLimitViolated) {
+RP3D_FORCE_INLINE void SliderJointComponents::setIsLowerLimitViolated(Entity jointEntity, bool isLowerLimitViolated) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mIsLowerLimitViolated[mMapEntityToComponentIndex[jointEntity]] = isLowerLimitViolated;
 }
 
 // Return true if the upper limit is violated
-inline bool SliderJointComponents::getIsUpperLimitViolated(Entity jointEntity) const {
+RP3D_FORCE_INLINE bool SliderJointComponents::getIsUpperLimitViolated(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mIsUpperLimitViolated[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set to true if the upper limit is violated
-inline void SliderJointComponents::setIsUpperLimitViolated(Entity jointEntity, bool isUpperLimitViolated) const {
+RP3D_FORCE_INLINE void SliderJointComponents::setIsUpperLimitViolated(Entity jointEntity, bool isUpperLimitViolated) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mIsUpperLimitViolated[mMapEntityToComponentIndex[jointEntity]] = isUpperLimitViolated;
 }
 
 // Return the motor speed (in rad/s)
-inline decimal SliderJointComponents::getMotorSpeed(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal SliderJointComponents::getMotorSpeed(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mMotorSpeed[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the motor speed (in rad/s)
-inline void SliderJointComponents::setMotorSpeed(Entity jointEntity, decimal motorSpeed) {
+RP3D_FORCE_INLINE void SliderJointComponents::setMotorSpeed(Entity jointEntity, decimal motorSpeed) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mMotorSpeed[mMapEntityToComponentIndex[jointEntity]] = motorSpeed;
 }
 
 // Return the maximum motor torque (in Newtons) that can be applied to reach to desired motor speed
-inline decimal SliderJointComponents::getMaxMotorForce(Entity jointEntity) const {
+RP3D_FORCE_INLINE decimal SliderJointComponents::getMaxMotorForce(Entity jointEntity) const {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mMaxMotorForce[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the maximum motor torque (in Newtons) that can be applied to reach to desired motor speed
-inline void SliderJointComponents::setMaxMotorForce(Entity jointEntity, decimal maxMotorForce) {
+RP3D_FORCE_INLINE void SliderJointComponents::setMaxMotorForce(Entity jointEntity, decimal maxMotorForce) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mMaxMotorForce[mMapEntityToComponentIndex[jointEntity]] = maxMotorForce;
 }
 
 // Return the cross product of r2 and n1
-inline Vector3& SliderJointComponents::getR2CrossN1(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& SliderJointComponents::getR2CrossN1(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mR2CrossN1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the cross product of r2 and n1
-inline void SliderJointComponents::setR2CrossN1(Entity jointEntity, const Vector3& r2CrossN1) {
+RP3D_FORCE_INLINE void SliderJointComponents::setR2CrossN1(Entity jointEntity, const Vector3& r2CrossN1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mR2CrossN1[mMapEntityToComponentIndex[jointEntity]] = r2CrossN1;
 }
 
 // Return the cross product of r2 and n2
-inline Vector3& SliderJointComponents::getR2CrossN2(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& SliderJointComponents::getR2CrossN2(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mR2CrossN2[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the cross product of r2 and n2
-inline void SliderJointComponents::setR2CrossN2(Entity jointEntity, const Vector3& r2CrossN2) {
+RP3D_FORCE_INLINE void SliderJointComponents::setR2CrossN2(Entity jointEntity, const Vector3& r2CrossN2) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mR2CrossN2[mMapEntityToComponentIndex[jointEntity]] = r2CrossN2;
 }
 
 // Return the cross product of r2 and the slider axis
-inline Vector3& SliderJointComponents::getR2CrossSliderAxis(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& SliderJointComponents::getR2CrossSliderAxis(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mR2CrossSliderAxis[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the cross product of r2 and the slider axis
-inline void SliderJointComponents::setR2CrossSliderAxis(Entity jointEntity, const Vector3& r2CrossSliderAxis) {
+RP3D_FORCE_INLINE void SliderJointComponents::setR2CrossSliderAxis(Entity jointEntity, const Vector3& r2CrossSliderAxis) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mR2CrossSliderAxis[mMapEntityToComponentIndex[jointEntity]] = r2CrossSliderAxis;
 }
 
 // Return the cross product of vector (r1 + u) and n1
-inline Vector3& SliderJointComponents::getR1PlusUCrossN1(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& SliderJointComponents::getR1PlusUCrossN1(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mR1PlusUCrossN1[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the cross product of vector (r1 + u) and n1
-inline void SliderJointComponents::setR1PlusUCrossN1(Entity jointEntity, const Vector3& r1PlusUCrossN1) {
+RP3D_FORCE_INLINE void SliderJointComponents::setR1PlusUCrossN1(Entity jointEntity, const Vector3& r1PlusUCrossN1) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mR1PlusUCrossN1[mMapEntityToComponentIndex[jointEntity]] = r1PlusUCrossN1;
 }
 
 // Return the cross product of vector (r1 + u) and n2
-inline Vector3& SliderJointComponents::getR1PlusUCrossN2(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& SliderJointComponents::getR1PlusUCrossN2(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mR1PlusUCrossN2[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the cross product of vector (r1 + u) and n2
-inline void SliderJointComponents::setR1PlusUCrossN2(Entity jointEntity, const Vector3& r1PlusUCrossN2) {
+RP3D_FORCE_INLINE void SliderJointComponents::setR1PlusUCrossN2(Entity jointEntity, const Vector3& r1PlusUCrossN2) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mR1PlusUCrossN2[mMapEntityToComponentIndex[jointEntity]] = r1PlusUCrossN2;
 }
 
 // Return the cross product of vector (r1 + u) and the slider axis
-inline Vector3& SliderJointComponents::getR1PlusUCrossSliderAxis(Entity jointEntity) {
+RP3D_FORCE_INLINE Vector3& SliderJointComponents::getR1PlusUCrossSliderAxis(Entity jointEntity) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     return mR1PlusUCrossSliderAxis[mMapEntityToComponentIndex[jointEntity]];
 }
 
 // Set the cross product of vector (r1 + u) and the slider axis
-inline void SliderJointComponents::setR1PlusUCrossSliderAxis(Entity jointEntity, const Vector3& r1PlusUCrossSliderAxis) {
+RP3D_FORCE_INLINE void SliderJointComponents::setR1PlusUCrossSliderAxis(Entity jointEntity, const Vector3& r1PlusUCrossSliderAxis) {
 
     assert(mMapEntityToComponentIndex.containsKey(jointEntity));
     mR1PlusUCrossSliderAxis[mMapEntityToComponentIndex[jointEntity]] = r1PlusUCrossSliderAxis;
diff --git a/include/reactphysics3d/components/TransformComponents.h b/include/reactphysics3d/components/TransformComponents.h
index a0d5878a..011be27d 100644
--- a/include/reactphysics3d/components/TransformComponents.h
+++ b/include/reactphysics3d/components/TransformComponents.h
@@ -107,13 +107,13 @@ class TransformComponents : public Components {
 };
 
 // Return the transform of an entity
-inline Transform& TransformComponents::getTransform(Entity bodyEntity) const {
+RP3D_FORCE_INLINE Transform& TransformComponents::getTransform(Entity bodyEntity) const {
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
     return mTransforms[mMapEntityToComponentIndex[bodyEntity]];
 }
 
 // Set the transform of an entity
-inline void TransformComponents::setTransform(Entity bodyEntity, const Transform& transform) {
+RP3D_FORCE_INLINE void TransformComponents::setTransform(Entity bodyEntity, const Transform& transform) {
     assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
     mTransforms[mMapEntityToComponentIndex[bodyEntity]] = transform;
 }
diff --git a/include/reactphysics3d/configuration.h b/include/reactphysics3d/configuration.h
index 77832d0d..4aca00cf 100644
--- a/include/reactphysics3d/configuration.h
+++ b/include/reactphysics3d/configuration.h
@@ -55,7 +55,7 @@
     #define RP3D_COMPILER_UNKNOWN
 #endif
 
-// Force inline macro
+// Force RP3D_FORCE_INLINE macro
 #if defined(RP3D_COMPILER_VISUAL_STUDIO)
     #define RP3D_FORCE_INLINE __forceinline
 #elif defined(RP3D_COMPILER_GCC) || defined(RP3D_COMPILER_CLANG)
diff --git a/include/reactphysics3d/constraint/BallAndSocketJoint.h b/include/reactphysics3d/constraint/BallAndSocketJoint.h
index fe834a6b..ee671664 100644
--- a/include/reactphysics3d/constraint/BallAndSocketJoint.h
+++ b/include/reactphysics3d/constraint/BallAndSocketJoint.h
@@ -129,7 +129,7 @@ class BallAndSocketJoint : public Joint {
 };
 
 // Return the number of bytes used by the joint
-inline size_t BallAndSocketJoint::getSizeInBytes() const {
+RP3D_FORCE_INLINE size_t BallAndSocketJoint::getSizeInBytes() const {
     return sizeof(BallAndSocketJoint);
 }
 
diff --git a/include/reactphysics3d/constraint/ContactPoint.h b/include/reactphysics3d/constraint/ContactPoint.h
index 66d321a5..d8491088 100644
--- a/include/reactphysics3d/constraint/ContactPoint.h
+++ b/include/reactphysics3d/constraint/ContactPoint.h
@@ -144,7 +144,7 @@ class ContactPoint {
 /**
  * @return The contact normal
  */
-inline const Vector3& ContactPoint::getNormal() const {
+RP3D_FORCE_INLINE const Vector3& ContactPoint::getNormal() const {
     return mNormal;
 }
 
@@ -152,7 +152,7 @@ inline const Vector3& ContactPoint::getNormal() const {
 /**
  * @return The contact point on the first collider in the local-space of the collider
  */
-inline const Vector3& ContactPoint::getLocalPointOnShape1() const {
+RP3D_FORCE_INLINE const Vector3& ContactPoint::getLocalPointOnShape1() const {
     return mLocalPointOnShape1;
 }
 
@@ -160,7 +160,7 @@ inline const Vector3& ContactPoint::getLocalPointOnShape1() const {
 /**
  * @return The contact point on the second collider in the local-space of the collider
  */
-inline const Vector3& ContactPoint::getLocalPointOnShape2() const {
+RP3D_FORCE_INLINE const Vector3& ContactPoint::getLocalPointOnShape2() const {
     return mLocalPointOnShape2;
 }
 
@@ -168,12 +168,12 @@ inline const Vector3& ContactPoint::getLocalPointOnShape2() const {
 /**
  * @return The penetration impulse
  */
-inline decimal ContactPoint::getPenetrationImpulse() const {
+RP3D_FORCE_INLINE decimal ContactPoint::getPenetrationImpulse() const {
     return mPenetrationImpulse;
 }
 
 // Return true if the contact point is similar (close enougth) to another given contact point
-inline bool ContactPoint::isSimilarWithContactPoint(const ContactPointInfo* localContactPointBody1) const {
+RP3D_FORCE_INLINE bool ContactPoint::isSimilarWithContactPoint(const ContactPointInfo* localContactPointBody1) const {
     return (localContactPointBody1->localPoint1 - mLocalPointOnShape1).lengthSquare() <= (mPersistentContactDistanceThreshold *
             mPersistentContactDistanceThreshold);
 }
@@ -182,7 +182,7 @@ inline bool ContactPoint::isSimilarWithContactPoint(const ContactPointInfo* loca
 /**
  * @param impulse Penetration impulse
  */
-inline void ContactPoint::setPenetrationImpulse(decimal impulse) {
+RP3D_FORCE_INLINE void ContactPoint::setPenetrationImpulse(decimal impulse) {
     mPenetrationImpulse = impulse;
 }
 
@@ -190,7 +190,7 @@ inline void ContactPoint::setPenetrationImpulse(decimal impulse) {
 /**
  * @return True if it is a resting contact
  */
-inline bool ContactPoint::getIsRestingContact() const {
+RP3D_FORCE_INLINE bool ContactPoint::getIsRestingContact() const {
     return mIsRestingContact;
 }
 
@@ -198,7 +198,7 @@ inline bool ContactPoint::getIsRestingContact() const {
 /**
  * @param isRestingContact True if it is a resting contact
  */
-inline void ContactPoint::setIsRestingContact(bool isRestingContact) {
+RP3D_FORCE_INLINE void ContactPoint::setIsRestingContact(bool isRestingContact) {
     mIsRestingContact = isRestingContact;
 }
 
@@ -206,7 +206,7 @@ inline void ContactPoint::setIsRestingContact(bool isRestingContact) {
 /**
  * @return the penetration depth (in meters)
  */
-inline decimal ContactPoint::getPenetrationDepth() const {
+RP3D_FORCE_INLINE decimal ContactPoint::getPenetrationDepth() const {
     return mPenetrationDepth;
 }
 
@@ -214,7 +214,7 @@ inline decimal ContactPoint::getPenetrationDepth() const {
 /**
  * @return The size of the contact point in memory (in bytes)
  */
-inline size_t ContactPoint::getSizeInBytes() const {
+RP3D_FORCE_INLINE size_t ContactPoint::getSizeInBytes() const {
     return sizeof(ContactPoint);
 }
 
diff --git a/include/reactphysics3d/constraint/FixedJoint.h b/include/reactphysics3d/constraint/FixedJoint.h
index 84b7508a..fa2ac350 100644
--- a/include/reactphysics3d/constraint/FixedJoint.h
+++ b/include/reactphysics3d/constraint/FixedJoint.h
@@ -119,7 +119,7 @@ class FixedJoint : public Joint {
 };
 
 // Return the number of bytes used by the joint
-inline size_t FixedJoint::getSizeInBytes() const {
+RP3D_FORCE_INLINE size_t FixedJoint::getSizeInBytes() const {
     return sizeof(FixedJoint);
 }
 
diff --git a/include/reactphysics3d/constraint/Joint.h b/include/reactphysics3d/constraint/Joint.h
index e3856830..dc16d311 100644
--- a/include/reactphysics3d/constraint/Joint.h
+++ b/include/reactphysics3d/constraint/Joint.h
@@ -157,7 +157,7 @@ class Joint {
 /**
  * @return The entity of the joint
  */
-inline Entity Joint::getEntity() const {
+RP3D_FORCE_INLINE Entity Joint::getEntity() const {
     return mEntity;
 }
 
diff --git a/include/reactphysics3d/constraint/SliderJoint.h b/include/reactphysics3d/constraint/SliderJoint.h
index f9f4830f..517716a9 100644
--- a/include/reactphysics3d/constraint/SliderJoint.h
+++ b/include/reactphysics3d/constraint/SliderJoint.h
@@ -309,7 +309,7 @@ class SliderJoint : public Joint {
 };
 
 // Return the number of bytes used by the joint
-inline size_t SliderJoint::getSizeInBytes() const {
+RP3D_FORCE_INLINE size_t SliderJoint::getSizeInBytes() const {
     return sizeof(SliderJoint);
 }
 
diff --git a/include/reactphysics3d/containers/LinkedList.h b/include/reactphysics3d/containers/LinkedList.h
index c2221d4f..914bfaa3 100644
--- a/include/reactphysics3d/containers/LinkedList.h
+++ b/include/reactphysics3d/containers/LinkedList.h
@@ -93,20 +93,20 @@ class LinkedList {
 
 // Return the first element of the list
 template<typename T>
-inline typename LinkedList<T>::ListElement* LinkedList<T>::getListHead() const {
+RP3D_FORCE_INLINE typename LinkedList<T>::ListElement* LinkedList<T>::getListHead() const {
     return mListHead;
 }
 
 // Insert an element at the beginning of the linked list
 template<typename T>
-inline void LinkedList<T>::insert(const T& data) {
+RP3D_FORCE_INLINE void LinkedList<T>::insert(const T& data) {
     ListElement* element = new (mAllocator.allocate(sizeof(ListElement))) ListElement(data, mListHead);
     mListHead = element;
 }
 
 // Remove all the elements of the list
 template<typename T>
-inline void LinkedList<T>::reset() {
+RP3D_FORCE_INLINE void LinkedList<T>::reset() {
 
     // Release all the list elements
     ListElement* element = mListHead;
diff --git a/include/reactphysics3d/containers/containers_common.h b/include/reactphysics3d/containers/containers_common.h
index 84854f90..66b93aac 100644
--- a/include/reactphysics3d/containers/containers_common.h
+++ b/include/reactphysics3d/containers/containers_common.h
@@ -29,6 +29,7 @@
 // Libraries
 #include <cstddef>
 #include <functional>
+#include <reactphysics3d/configuration.h>
 
 namespace reactphysics3d {
 
diff --git a/include/reactphysics3d/engine/Entity.h b/include/reactphysics3d/engine/Entity.h
index 0b671349..c8eb20ee 100644
--- a/include/reactphysics3d/engine/Entity.h
+++ b/include/reactphysics3d/engine/Entity.h
@@ -107,23 +107,23 @@ struct Entity {
 };
 
 // Return the lookup index of the entity in a array
-inline uint32 Entity::getIndex() const {
+RP3D_FORCE_INLINE uint32 Entity::getIndex() const {
     return id & ENTITY_INDEX_MASK;
 }
 
 // Return the generation number of the entity
-inline uint32 Entity::getGeneration() const {
+RP3D_FORCE_INLINE uint32 Entity::getGeneration() const {
     return (id >> ENTITY_INDEX_BITS) & ENTITY_GENERATION_MASK;
 }
 
 // Equality operator
-inline bool Entity::operator==(const Entity& entity) const {
+RP3D_FORCE_INLINE bool Entity::operator==(const Entity& entity) const {
 
     return entity.id == id;
 }
 
 // Inequality operator
-inline bool Entity::operator!=(const Entity& entity) const {
+RP3D_FORCE_INLINE bool Entity::operator!=(const Entity& entity) const {
     return entity.id != id;
 }
 
diff --git a/include/reactphysics3d/engine/EntityManager.h b/include/reactphysics3d/engine/EntityManager.h
index f29ca09d..383e509b 100644
--- a/include/reactphysics3d/engine/EntityManager.h
+++ b/include/reactphysics3d/engine/EntityManager.h
@@ -71,7 +71,7 @@ class EntityManager {
 };
 
 // Return true if the entity is still valid (not destroyed)
-inline bool EntityManager::isValid(Entity entity) const {
+RP3D_FORCE_INLINE bool EntityManager::isValid(Entity entity) const {
     return mGenerations[entity.getIndex()] == entity.getGeneration();
 }
 
diff --git a/include/reactphysics3d/engine/Island.h b/include/reactphysics3d/engine/Island.h
index f1b24575..dae4ae51 100644
--- a/include/reactphysics3d/engine/Island.h
+++ b/include/reactphysics3d/engine/Island.h
@@ -105,35 +105,35 @@ class Island {
 };
 
 // Add a body into the island
-inline void Island::addBody(RigidBody* body) {
+RP3D_FORCE_INLINE void Island::addBody(RigidBody* body) {
     assert(!body->isSleeping());
     mBodies[mNbBodies] = body;
     mNbBodies++;
 }
 
 // Add a contact manifold into the island
-inline void Island::addContactManifold(ContactManifold* contactManifold) {
+RP3D_FORCE_INLINE void Island::addContactManifold(ContactManifold* contactManifold) {
     mContactManifolds[mNbContactManifolds] = contactManifold;
     mNbContactManifolds++;
 }
 
 // Return the number of bodies in the island
-inline uint Island::getNbBodies() const {
+RP3D_FORCE_INLINE uint Island::getNbBodies() const {
     return mNbBodies;
 }
 
 // Return the number of contact manifolds in the island
-inline uint Island::getNbContactManifolds() const {
+RP3D_FORCE_INLINE uint Island::getNbContactManifolds() const {
     return mNbContactManifolds;
 }
 
 // Return a pointer to the array of bodies
-inline RigidBody** Island::getBodies() {
+RP3D_FORCE_INLINE RigidBody** Island::getBodies() {
     return mBodies;
 }
 
 // Return a pointer to the array of contact manifolds
-inline ContactManifold** Island::getContactManifolds() {
+RP3D_FORCE_INLINE ContactManifold** Island::getContactManifolds() {
     return mContactManifolds;
 }
 
diff --git a/include/reactphysics3d/engine/Material.h b/include/reactphysics3d/engine/Material.h
index 0882e5b2..c4406b74 100644
--- a/include/reactphysics3d/engine/Material.h
+++ b/include/reactphysics3d/engine/Material.h
@@ -111,7 +111,7 @@ class Material {
 /**
  * @return Bounciness factor (between 0 and 1) where 1 is very bouncy
  */
-inline decimal Material::getBounciness() const {
+RP3D_FORCE_INLINE decimal Material::getBounciness() const {
     return mBounciness;
 }
 
@@ -121,7 +121,7 @@ inline decimal Material::getBounciness() const {
 /**
  * @param bounciness Bounciness factor (between 0 and 1) where 1 is very bouncy
  */
-inline void Material::setBounciness(decimal bounciness) {
+RP3D_FORCE_INLINE void Material::setBounciness(decimal bounciness) {
     assert(bounciness >= decimal(0.0) && bounciness <= decimal(1.0));
     mBounciness = bounciness;
 }
@@ -130,7 +130,7 @@ inline void Material::setBounciness(decimal bounciness) {
 /**
  * @return Friction coefficient (positive value)
  */
-inline decimal Material::getFrictionCoefficient() const {
+RP3D_FORCE_INLINE decimal Material::getFrictionCoefficient() const {
     return mFrictionCoefficient;
 }
 
@@ -140,7 +140,7 @@ inline decimal Material::getFrictionCoefficient() const {
 /**
  * @param frictionCoefficient Friction coefficient (positive value)
  */
-inline void Material::setFrictionCoefficient(decimal frictionCoefficient) {
+RP3D_FORCE_INLINE void Material::setFrictionCoefficient(decimal frictionCoefficient) {
     assert(frictionCoefficient >= decimal(0.0));
     mFrictionCoefficient = frictionCoefficient;
 }
@@ -151,7 +151,7 @@ inline void Material::setFrictionCoefficient(decimal frictionCoefficient) {
 /**
  * @return The rolling resistance factor (positive value)
  */
-inline decimal Material::getRollingResistance() const {
+RP3D_FORCE_INLINE decimal Material::getRollingResistance() const {
     return mRollingResistance;
 }
 
@@ -161,13 +161,13 @@ inline decimal Material::getRollingResistance() const {
 /**
  * @param rollingResistance The rolling resistance factor
  */
-inline void Material::setRollingResistance(decimal rollingResistance) {
+RP3D_FORCE_INLINE void Material::setRollingResistance(decimal rollingResistance) {
     assert(rollingResistance >= 0);
     mRollingResistance = rollingResistance;
 }
 
 // Return the mass density of the collider
-inline decimal Material::getMassDensity() const {
+RP3D_FORCE_INLINE decimal Material::getMassDensity() const {
    return mMassDensity;
 }
 
@@ -175,12 +175,12 @@ inline decimal Material::getMassDensity() const {
 /**
  * @param massDensity The mass density of the collider
  */
-inline void Material::setMassDensity(decimal massDensity) {
+RP3D_FORCE_INLINE void Material::setMassDensity(decimal massDensity) {
    mMassDensity = massDensity;
 }
 
 // Return a string representation for the material
-inline std::string Material::to_string() const {
+RP3D_FORCE_INLINE std::string Material::to_string() const {
 
     std::stringstream ss;
 
@@ -192,7 +192,7 @@ inline std::string Material::to_string() const {
 }
 
 // Overloaded assignment operator
-inline Material& Material::operator=(const Material& material) {
+RP3D_FORCE_INLINE Material& Material::operator=(const Material& material) {
 
     // Check for self-assignment
     if (this != &material) {
diff --git a/include/reactphysics3d/engine/OverlappingPairs.h b/include/reactphysics3d/engine/OverlappingPairs.h
index a3920148..9d65b3e0 100644
--- a/include/reactphysics3d/engine/OverlappingPairs.h
+++ b/include/reactphysics3d/engine/OverlappingPairs.h
@@ -313,21 +313,21 @@ class OverlappingPairs {
 };
 
 // Return the entity of the first collider
-inline Entity OverlappingPairs::getCollider1(uint64 pairId) const {
+RP3D_FORCE_INLINE Entity OverlappingPairs::getCollider1(uint64 pairId) const {
     assert(mMapPairIdToPairIndex.containsKey(pairId));
     assert(mMapPairIdToPairIndex[pairId] < mNbPairs);
     return mColliders1[mMapPairIdToPairIndex[pairId]];
 }
 
 // Return the entity of the second collider
-inline Entity OverlappingPairs::getCollider2(uint64 pairId) const {
+RP3D_FORCE_INLINE Entity OverlappingPairs::getCollider2(uint64 pairId) const {
     assert(mMapPairIdToPairIndex.containsKey(pairId));
     assert(mMapPairIdToPairIndex[pairId] < mNbPairs);
     return mColliders2[mMapPairIdToPairIndex[pairId]];
 }
 
 // Notify if a given pair is active or not
-inline void OverlappingPairs::setIsPairActive(uint64 pairId, bool isActive) {
+RP3D_FORCE_INLINE void OverlappingPairs::setIsPairActive(uint64 pairId, bool isActive) {
 
     assert(mMapPairIdToPairIndex.containsKey(pairId));
     assert(mMapPairIdToPairIndex[pairId] < mNbPairs);
@@ -335,13 +335,13 @@ inline void OverlappingPairs::setIsPairActive(uint64 pairId, bool isActive) {
 }
 
 // Return the index of a given overlapping pair in the internal array
-inline uint64 OverlappingPairs::getPairIndex(uint64 pairId) const {
+RP3D_FORCE_INLINE uint64 OverlappingPairs::getPairIndex(uint64 pairId) const {
     assert(mMapPairIdToPairIndex.containsKey(pairId));
     return mMapPairIdToPairIndex[pairId];
 }
 
 // Return the last frame collision info for a given shape id or nullptr if none is found
-inline LastFrameCollisionInfo* OverlappingPairs::getLastFrameCollisionInfo(uint64 pairId, uint64 shapesId) {
+RP3D_FORCE_INLINE LastFrameCollisionInfo* OverlappingPairs::getLastFrameCollisionInfo(uint64 pairId, uint64 shapesId) {
 
     assert(mMapPairIdToPairIndex.containsKey(pairId));
     const uint64 index = mMapPairIdToPairIndex[pairId];
@@ -356,7 +356,7 @@ inline LastFrameCollisionInfo* OverlappingPairs::getLastFrameCollisionInfo(uint6
 }
 
 // Return the pair of bodies index
-inline bodypair OverlappingPairs::computeBodiesIndexPair(Entity body1Entity, Entity body2Entity) {
+RP3D_FORCE_INLINE bodypair OverlappingPairs::computeBodiesIndexPair(Entity body1Entity, Entity body2Entity) {
 
     // Construct the pair of body index
     bodypair indexPair = body1Entity.id < body2Entity.id ?
@@ -367,44 +367,44 @@ inline bodypair OverlappingPairs::computeBodiesIndexPair(Entity body1Entity, Ent
 }
 
 // Return the number of pairs
-inline uint64 OverlappingPairs::getNbPairs() const {
+RP3D_FORCE_INLINE uint64 OverlappingPairs::getNbPairs() const {
     return mNbPairs;
 }
 
 // Return the number of convex vs convex pairs
-inline uint64 OverlappingPairs::getNbConvexVsConvexPairs() const {
+RP3D_FORCE_INLINE uint64 OverlappingPairs::getNbConvexVsConvexPairs() const {
    return mConcavePairsStartIndex;
 }
 
 // Return the number of convex vs concave pairs
-inline uint64 OverlappingPairs::getNbConvexVsConcavePairs() const {
+RP3D_FORCE_INLINE uint64 OverlappingPairs::getNbConvexVsConcavePairs() const {
    return mNbPairs - mConcavePairsStartIndex;
 }
 
 // Return the starting index of the convex vs concave pairs
-inline uint64 OverlappingPairs::getConvexVsConcavePairsStartIndex() const {
+RP3D_FORCE_INLINE uint64 OverlappingPairs::getConvexVsConcavePairsStartIndex() const {
    return mConcavePairsStartIndex;
 }
 
 // Return a reference to the temporary memory allocator
-inline MemoryAllocator& OverlappingPairs::getTemporaryAllocator() {
+RP3D_FORCE_INLINE MemoryAllocator& OverlappingPairs::getTemporaryAllocator() {
     return mTempMemoryAllocator;
 }
 
 // Set if we need to test a given pair for overlap
-inline void OverlappingPairs::setNeedToTestOverlap(uint64 pairId, bool needToTestOverlap) {
+RP3D_FORCE_INLINE void OverlappingPairs::setNeedToTestOverlap(uint64 pairId, bool needToTestOverlap) {
     assert(mMapPairIdToPairIndex.containsKey(pairId));
     mNeedToTestOverlap[mMapPairIdToPairIndex[pairId]] = needToTestOverlap;
 }
 
 // Return true if the two colliders of the pair were already colliding the previous frame
-inline bool OverlappingPairs::getCollidingInPreviousFrame(uint64 pairId) const {
+RP3D_FORCE_INLINE bool OverlappingPairs::getCollidingInPreviousFrame(uint64 pairId) const {
     assert(mMapPairIdToPairIndex.containsKey(pairId));
     return mCollidingInPreviousFrame[mMapPairIdToPairIndex[pairId]];
 }
 
 // Set to true if the two colliders of the pair were already colliding the previous frame
-inline void OverlappingPairs::setCollidingInPreviousFrame(uint64 pairId, bool wereCollidingInPreviousFrame) {
+RP3D_FORCE_INLINE void OverlappingPairs::setCollidingInPreviousFrame(uint64 pairId, bool wereCollidingInPreviousFrame) {
     assert(mMapPairIdToPairIndex.containsKey(pairId));
     mCollidingInPreviousFrame[mMapPairIdToPairIndex[pairId]] = wereCollidingInPreviousFrame;
 }
@@ -412,7 +412,7 @@ inline void OverlappingPairs::setCollidingInPreviousFrame(uint64 pairId, bool we
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void OverlappingPairs::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void OverlappingPairs::setProfiler(Profiler* profiler) {
     mProfiler = profiler;
 }
 
diff --git a/include/reactphysics3d/engine/PhysicsCommon.h b/include/reactphysics3d/engine/PhysicsCommon.h
index 68574f7f..939c8b39 100644
--- a/include/reactphysics3d/engine/PhysicsCommon.h
+++ b/include/reactphysics3d/engine/PhysicsCommon.h
@@ -193,7 +193,7 @@ class PhysicsCommon {
 /**
  * @return A pointer to the current logger
  */
-inline Logger* PhysicsCommon::getLogger() {
+RP3D_FORCE_INLINE Logger* PhysicsCommon::getLogger() {
     return mLogger;
 }
 
@@ -201,7 +201,7 @@ inline Logger* PhysicsCommon::getLogger() {
 /**
  * @param logger A pointer to the logger to use
  */
-inline void PhysicsCommon::setLogger(Logger* logger) {
+RP3D_FORCE_INLINE void PhysicsCommon::setLogger(Logger* logger) {
     mLogger = logger;
 }
 
diff --git a/include/reactphysics3d/engine/PhysicsWorld.h b/include/reactphysics3d/engine/PhysicsWorld.h
index 58fe99e7..ea507ef8 100644
--- a/include/reactphysics3d/engine/PhysicsWorld.h
+++ b/include/reactphysics3d/engine/PhysicsWorld.h
@@ -489,7 +489,7 @@ class PhysicsWorld {
  * @param CollisionDispatch Pointer to a collision dispatch object describing
  * which collision detection algorithm to use for two given collision shapes
  */
-inline CollisionDispatch& PhysicsWorld::getCollisionDispatch() {
+RP3D_FORCE_INLINE CollisionDispatch& PhysicsWorld::getCollisionDispatch() {
     return mCollisionDetection.getCollisionDispatch();
 }
 
@@ -500,7 +500,7 @@ inline CollisionDispatch& PhysicsWorld::getCollisionDispatch() {
  * @param raycastWithCategoryMaskBits Bits mask corresponding to the category of
  *                                    bodies to be raycasted
  */
-inline void PhysicsWorld::raycast(const Ray& ray,
+RP3D_FORCE_INLINE void PhysicsWorld::raycast(const Ray& ray,
                                     RaycastCallback* raycastCallback,
                                     unsigned short raycastWithCategoryMaskBits) const {
     mCollisionDetection.raycast(raycastCallback, ray, raycastWithCategoryMaskBits);
@@ -516,7 +516,7 @@ inline void PhysicsWorld::raycast(const Ray& ray,
  * @param body2 Pointer to the second body to test
  * @param callback Pointer to the object with the callback method
  */
-inline void PhysicsWorld::testCollision(CollisionBody* body1, CollisionBody* body2, CollisionCallback& callback) {
+RP3D_FORCE_INLINE void PhysicsWorld::testCollision(CollisionBody* body1, CollisionBody* body2, CollisionCallback& callback) {
     mCollisionDetection.testCollision(body1, body2, callback);
 }
 
@@ -529,7 +529,7 @@ inline void PhysicsWorld::testCollision(CollisionBody* body1, CollisionBody* bod
  * @param body Pointer to the body against which we need to test collision
  * @param callback Pointer to the object with the callback method to report contacts
  */
-inline void PhysicsWorld::testCollision(CollisionBody* body, CollisionCallback& callback) {
+RP3D_FORCE_INLINE void PhysicsWorld::testCollision(CollisionBody* body, CollisionCallback& callback) {
     mCollisionDetection.testCollision(body, callback);
 }
 
@@ -541,7 +541,7 @@ inline void PhysicsWorld::testCollision(CollisionBody* body, CollisionCallback&
 /**
  * @param callback Pointer to the object with the callback method to report contacts
  */
-inline void PhysicsWorld::testCollision(CollisionCallback& callback) {
+RP3D_FORCE_INLINE void PhysicsWorld::testCollision(CollisionCallback& callback) {
     mCollisionDetection.testCollision(callback);
 }
 
@@ -553,7 +553,7 @@ inline void PhysicsWorld::testCollision(CollisionCallback& callback) {
  * @param body Pointer to the collision body to test overlap with
  * @param overlapCallback Pointer to the callback class to report overlap
  */
-inline void PhysicsWorld::testOverlap(CollisionBody* body, OverlapCallback& overlapCallback) {
+RP3D_FORCE_INLINE void PhysicsWorld::testOverlap(CollisionBody* body, OverlapCallback& overlapCallback) {
     mCollisionDetection.testOverlap(body, overlapCallback);
 }
 
@@ -564,12 +564,12 @@ inline void PhysicsWorld::testOverlap(CollisionBody* body, OverlapCallback& over
 /**
  * @param overlapCallback Pointer to the callback class to report overlap
  */
-inline void PhysicsWorld::testOverlap(OverlapCallback& overlapCallback) {
+RP3D_FORCE_INLINE void PhysicsWorld::testOverlap(OverlapCallback& overlapCallback) {
     mCollisionDetection.testOverlap(overlapCallback);
 }
 
 // Return a reference to the memory manager of the world
-inline MemoryManager& PhysicsWorld::getMemoryManager() {
+RP3D_FORCE_INLINE MemoryManager& PhysicsWorld::getMemoryManager() {
     return mMemoryManager;
 }
 
@@ -577,7 +577,7 @@ inline MemoryManager& PhysicsWorld::getMemoryManager() {
 /**
  * @return Name of the world
  */
-inline const std::string& PhysicsWorld::getName() const {
+RP3D_FORCE_INLINE const std::string& PhysicsWorld::getName() const {
     return mName;
 }
 
@@ -587,7 +587,7 @@ inline const std::string& PhysicsWorld::getName() const {
 /**
  * @return A pointer to the profiler
  */
-inline Profiler* PhysicsWorld::getProfiler() {
+RP3D_FORCE_INLINE Profiler* PhysicsWorld::getProfiler() {
     return mProfiler;
 }
 
@@ -597,7 +597,7 @@ inline Profiler* PhysicsWorld::getProfiler() {
 /**
  * @return The number of iterations of the velocity constraint solver
  */
-inline uint PhysicsWorld::getNbIterationsVelocitySolver() const {
+RP3D_FORCE_INLINE uint PhysicsWorld::getNbIterationsVelocitySolver() const {
     return mNbVelocitySolverIterations;
 }
 
@@ -605,7 +605,7 @@ inline uint PhysicsWorld::getNbIterationsVelocitySolver() const {
 /**
  * @return The number of iterations of the position constraint solver
  */
-inline uint PhysicsWorld::getNbIterationsPositionSolver() const {
+RP3D_FORCE_INLINE uint PhysicsWorld::getNbIterationsPositionSolver() const {
     return mNbPositionSolverIterations;
 }
 
@@ -613,7 +613,7 @@ inline uint PhysicsWorld::getNbIterationsPositionSolver() const {
 /**
  * @param technique Technique used for the position correction (Baumgarte or Split Impulses)
  */
-inline void PhysicsWorld::setContactsPositionCorrectionTechnique(
+RP3D_FORCE_INLINE void PhysicsWorld::setContactsPositionCorrectionTechnique(
                               ContactsPositionCorrectionTechnique technique) {
     if (technique == ContactsPositionCorrectionTechnique::BAUMGARTE_CONTACTS) {
         mContactSolverSystem.setIsSplitImpulseActive(false);
@@ -627,7 +627,7 @@ inline void PhysicsWorld::setContactsPositionCorrectionTechnique(
 /**
  * @return The current gravity vector (in meter per seconds squared)
  */
-inline Vector3 PhysicsWorld::getGravity() const {
+RP3D_FORCE_INLINE Vector3 PhysicsWorld::getGravity() const {
     return mConfig.gravity;
 }
 
@@ -635,7 +635,7 @@ inline Vector3 PhysicsWorld::getGravity() const {
 /**
  * @return True if the gravity is enabled in the world
  */
-inline bool PhysicsWorld::isGravityEnabled() const {
+RP3D_FORCE_INLINE bool PhysicsWorld::isGravityEnabled() const {
     return mIsGravityEnabled;
 }
 
@@ -643,7 +643,7 @@ inline bool PhysicsWorld::isGravityEnabled() const {
 /**
  * @return True if the sleeping technique is enabled and false otherwise
  */
-inline bool PhysicsWorld::isSleepingEnabled() const {
+RP3D_FORCE_INLINE bool PhysicsWorld::isSleepingEnabled() const {
     return mIsSleepingEnabled;
 }
 
@@ -651,7 +651,7 @@ inline bool PhysicsWorld::isSleepingEnabled() const {
 /**
  * @return The sleep linear velocity (in meters per second)
  */
-inline decimal PhysicsWorld::getSleepLinearVelocity() const {
+RP3D_FORCE_INLINE decimal PhysicsWorld::getSleepLinearVelocity() const {
     return mSleepLinearVelocity;
 }
 
@@ -659,7 +659,7 @@ inline decimal PhysicsWorld::getSleepLinearVelocity() const {
 /**
  * @return The sleep angular velocity (in radian per second)
  */
-inline decimal PhysicsWorld::getSleepAngularVelocity() const {
+RP3D_FORCE_INLINE decimal PhysicsWorld::getSleepAngularVelocity() const {
     return mSleepAngularVelocity;
 }
 
@@ -667,7 +667,7 @@ inline decimal PhysicsWorld::getSleepAngularVelocity() const {
 /**
  * @return Time a body is required to stay still before sleeping (in seconds)
  */
-inline decimal PhysicsWorld::getTimeBeforeSleep() const {
+RP3D_FORCE_INLINE decimal PhysicsWorld::getTimeBeforeSleep() const {
     return mTimeBeforeSleep;
 }
 
@@ -677,7 +677,7 @@ inline decimal PhysicsWorld::getTimeBeforeSleep() const {
  * @param eventListener Pointer to the event listener object that will receive
  *                      event callbacks during the simulation
  */
-inline void PhysicsWorld::setEventListener(EventListener* eventListener) {
+RP3D_FORCE_INLINE void PhysicsWorld::setEventListener(EventListener* eventListener) {
     mEventListener = eventListener;
 }
 
@@ -686,7 +686,7 @@ inline void PhysicsWorld::setEventListener(EventListener* eventListener) {
 /**
  * @return The number of collision bodies in the physics world
  */
-inline uint PhysicsWorld::getNbCollisionBodies() const {
+RP3D_FORCE_INLINE uint PhysicsWorld::getNbCollisionBodies() const {
    return mCollisionBodies.size();
 }
 
@@ -694,7 +694,7 @@ inline uint PhysicsWorld::getNbCollisionBodies() const {
 /**
  * @return The number of rigid bodies in the physics world
  */
-inline uint PhysicsWorld::getNbRigidBodies() const {
+RP3D_FORCE_INLINE uint PhysicsWorld::getNbRigidBodies() const {
    return mRigidBodies.size();
 }
 
@@ -702,7 +702,7 @@ inline uint PhysicsWorld::getNbRigidBodies() const {
 /**
  * @return True if the debug rendering is enabled and false otherwise
  */
-inline bool PhysicsWorld::getIsDebugRenderingEnabled() const {
+RP3D_FORCE_INLINE bool PhysicsWorld::getIsDebugRenderingEnabled() const {
     return mIsDebugRenderingEnabled;
 }
 
@@ -710,7 +710,7 @@ inline bool PhysicsWorld::getIsDebugRenderingEnabled() const {
 /**
  * @param isEnabled True if you want to enable the debug rendering and false otherwise
  */
-inline void PhysicsWorld::setIsDebugRenderingEnabled(bool isEnabled) {
+RP3D_FORCE_INLINE void PhysicsWorld::setIsDebugRenderingEnabled(bool isEnabled) {
     mIsDebugRenderingEnabled = isEnabled;
 }
 
@@ -718,7 +718,7 @@ inline void PhysicsWorld::setIsDebugRenderingEnabled(bool isEnabled) {
 /**
  * @return A reference to the DebugRenderer object of the world
  */
-inline DebugRenderer& PhysicsWorld::getDebugRenderer() {
+RP3D_FORCE_INLINE DebugRenderer& PhysicsWorld::getDebugRenderer() {
     return mDebugRenderer;
 }
 
diff --git a/include/reactphysics3d/engine/Timer.h b/include/reactphysics3d/engine/Timer.h
index 8db66360..70d887a9 100644
--- a/include/reactphysics3d/engine/Timer.h
+++ b/include/reactphysics3d/engine/Timer.h
@@ -120,28 +120,28 @@ class Timer {
 };
 
 // Return the timestep of the physics engine
-inline double Timer::getTimeStep() const {
+RP3D_FORCE_INLINE double Timer::getTimeStep() const {
     return mTimeStep;
 }
 
 // Set the timestep of the physics engine
-inline void Timer::setTimeStep(double timeStep) {
+RP3D_FORCE_INLINE void Timer::setTimeStep(double timeStep) {
     assert(timeStep > 0.0f);
     mTimeStep = timeStep;
 }
 
 // Return the current time
-inline long double Timer::getPhysicsTime() const {
+RP3D_FORCE_INLINE long double Timer::getPhysicsTime() const {
     return mLastUpdateTime;
 }
 
 // Return if the timer is running
-inline bool Timer::getIsRunning() const {
+RP3D_FORCE_INLINE bool Timer::getIsRunning() const {
     return mIsRunning;
 }
 
 // Start the timer
-inline void Timer::start() {
+RP3D_FORCE_INLINE void Timer::start() {
     if (!mIsRunning) {
 
         // Get the current system time
@@ -153,17 +153,17 @@ inline void Timer::start() {
 }
 
 // Stop the timer
-inline void Timer::stop() {
+RP3D_FORCE_INLINE void Timer::stop() {
     mIsRunning = false;
 }
 
 // True if it's possible to take a new step
-inline bool Timer::isPossibleToTakeStep() const {
+RP3D_FORCE_INLINE bool Timer::isPossibleToTakeStep() const {
     return (mAccumulator >= mTimeStep);
 }
 
 // Take a new step => update the timer by adding the timeStep value to the current time
-inline void Timer::nextStep() {
+RP3D_FORCE_INLINE void Timer::nextStep() {
     assert(mIsRunning);
 
     // Update the accumulator value
@@ -171,12 +171,12 @@ inline void Timer::nextStep() {
 }
 
 // Compute the interpolation factor
-inline decimal Timer::computeInterpolationFactor() {
+RP3D_FORCE_INLINE decimal Timer::computeInterpolationFactor() {
     return (decimal(mAccumulator / mTimeStep));
 }
 
 // Compute the time since the last update() call and add it to the accumulator
-inline void Timer::update() {
+RP3D_FORCE_INLINE void Timer::update() {
 
     // Get the current system time
     long double currentTime = getCurrentSystemTime();
diff --git a/include/reactphysics3d/mathematics/Matrix2x2.h b/include/reactphysics3d/mathematics/Matrix2x2.h
index 29e2a54d..5f69e982 100644
--- a/include/reactphysics3d/mathematics/Matrix2x2.h
+++ b/include/reactphysics3d/mathematics/Matrix2x2.h
@@ -151,57 +151,57 @@ class Matrix2x2 {
 };
 
 // Constructor of the class Matrix2x2
-inline Matrix2x2::Matrix2x2() {
+RP3D_FORCE_INLINE Matrix2x2::Matrix2x2() {
 
     // Initialize all values in the matrix to zero
     setAllValues(0.0, 0.0, 0.0, 0.0);
 }
 
 // Constructor
-inline Matrix2x2::Matrix2x2(decimal value) {
+RP3D_FORCE_INLINE Matrix2x2::Matrix2x2(decimal value) {
     setAllValues(value, value, value, value);
 }
 
 // Constructor with arguments
-inline Matrix2x2::Matrix2x2(decimal a1, decimal a2, decimal b1, decimal b2) {
+RP3D_FORCE_INLINE Matrix2x2::Matrix2x2(decimal a1, decimal a2, decimal b1, decimal b2) {
 
     // Initialize the matrix with the values
     setAllValues(a1, a2, b1, b2);
 }
 
 // Copy-constructor
-inline Matrix2x2::Matrix2x2(const Matrix2x2& matrix) {
+RP3D_FORCE_INLINE Matrix2x2::Matrix2x2(const Matrix2x2& matrix) {
     setAllValues(matrix.mRows[0][0], matrix.mRows[0][1],
                  matrix.mRows[1][0], matrix.mRows[1][1]);
 }
 
 // Method to set all the values in the matrix
-inline void Matrix2x2::setAllValues(decimal a1, decimal a2,
+RP3D_FORCE_INLINE void Matrix2x2::setAllValues(decimal a1, decimal a2,
                                     decimal b1, decimal b2) {
     mRows[0][0] = a1; mRows[0][1] = a2;
     mRows[1][0] = b1; mRows[1][1] = b2;
 }
 
 // Set the matrix to zero
-inline void Matrix2x2::setToZero() {
+RP3D_FORCE_INLINE void Matrix2x2::setToZero() {
     mRows[0].setToZero();
     mRows[1].setToZero();
 }
 
 // Return a column
-inline Vector2 Matrix2x2::getColumn(int i) const {
+RP3D_FORCE_INLINE Vector2 Matrix2x2::getColumn(int i) const {
     assert(i>= 0 && i<2);
     return Vector2(mRows[0][i], mRows[1][i]);
 }
 
 // Return a row
-inline Vector2 Matrix2x2::getRow(int i) const {
+RP3D_FORCE_INLINE Vector2 Matrix2x2::getRow(int i) const {
     assert(i>= 0 && i<2);
     return mRows[i];
 }
 
 // Return the transpose matrix
-inline Matrix2x2 Matrix2x2::getTranspose() const {
+RP3D_FORCE_INLINE Matrix2x2 Matrix2x2::getTranspose() const {
 
     // Return the transpose matrix
     return Matrix2x2(mRows[0][0], mRows[1][0],
@@ -209,45 +209,45 @@ inline Matrix2x2 Matrix2x2::getTranspose() const {
 }
 
 // Return the determinant of the matrix
-inline decimal Matrix2x2::getDeterminant() const {
+RP3D_FORCE_INLINE decimal Matrix2x2::getDeterminant() const {
 
     // Compute and return the determinant of the matrix
     return mRows[0][0] * mRows[1][1] - mRows[1][0] * mRows[0][1];
 }
 
 // Return the trace of the matrix
-inline decimal Matrix2x2::getTrace() const {
+RP3D_FORCE_INLINE decimal Matrix2x2::getTrace() const {
 
     // Compute and return the trace
     return (mRows[0][0] + mRows[1][1]);
 }
 
 // Set the matrix to the identity matrix
-inline void Matrix2x2::setToIdentity() {
+RP3D_FORCE_INLINE void Matrix2x2::setToIdentity() {
     mRows[0][0] = 1.0; mRows[0][1] = 0.0;
     mRows[1][0] = 0.0; mRows[1][1] = 1.0;
 }
 
 // Return the 2x2 identity matrix
-inline Matrix2x2 Matrix2x2::identity() {
+RP3D_FORCE_INLINE Matrix2x2 Matrix2x2::identity() {
 
     // Return the isdentity matrix
     return Matrix2x2(1.0, 0.0, 0.0, 1.0);
 }
 
 // Return the 2x2 zero matrix
-inline Matrix2x2 Matrix2x2::zero() {
+RP3D_FORCE_INLINE Matrix2x2 Matrix2x2::zero() {
     return Matrix2x2(0.0, 0.0, 0.0, 0.0);
 }
 
 // Return the matrix with absolute values
-inline Matrix2x2 Matrix2x2::getAbsoluteMatrix() const {
+RP3D_FORCE_INLINE Matrix2x2 Matrix2x2::getAbsoluteMatrix() const {
     return Matrix2x2(fabs(mRows[0][0]), fabs(mRows[0][1]),
                      fabs(mRows[1][0]), fabs(mRows[1][1]));
 }
 
 // Overloaded operator for addition
-inline Matrix2x2 operator+(const Matrix2x2& matrix1, const Matrix2x2& matrix2) {
+RP3D_FORCE_INLINE Matrix2x2 operator+(const Matrix2x2& matrix1, const Matrix2x2& matrix2) {
     return Matrix2x2(matrix1.mRows[0][0] + matrix2.mRows[0][0],
                      matrix1.mRows[0][1] + matrix2.mRows[0][1],
                      matrix1.mRows[1][0] + matrix2.mRows[1][0],
@@ -255,7 +255,7 @@ inline Matrix2x2 operator+(const Matrix2x2& matrix1, const Matrix2x2& matrix2) {
 }
 
 // Overloaded operator for substraction
-inline Matrix2x2 operator-(const Matrix2x2& matrix1, const Matrix2x2& matrix2) {
+RP3D_FORCE_INLINE Matrix2x2 operator-(const Matrix2x2& matrix1, const Matrix2x2& matrix2) {
     return Matrix2x2(matrix1.mRows[0][0] - matrix2.mRows[0][0],
                      matrix1.mRows[0][1] - matrix2.mRows[0][1],
                      matrix1.mRows[1][0] - matrix2.mRows[1][0],
@@ -263,24 +263,24 @@ inline Matrix2x2 operator-(const Matrix2x2& matrix1, const Matrix2x2& matrix2) {
 }
 
 // Overloaded operator for the negative of the matrix
-inline Matrix2x2 operator-(const Matrix2x2& matrix) {
+RP3D_FORCE_INLINE Matrix2x2 operator-(const Matrix2x2& matrix) {
     return Matrix2x2(-matrix.mRows[0][0], -matrix.mRows[0][1],
                      -matrix.mRows[1][0], -matrix.mRows[1][1]);
 }
 
 // Overloaded operator for multiplication with a number
-inline Matrix2x2 operator*(decimal nb, const Matrix2x2& matrix) {
+RP3D_FORCE_INLINE Matrix2x2 operator*(decimal nb, const Matrix2x2& matrix) {
     return Matrix2x2(matrix.mRows[0][0] * nb, matrix.mRows[0][1] * nb,
                      matrix.mRows[1][0] * nb, matrix.mRows[1][1] * nb);
 }
 
 // Overloaded operator for multiplication with a matrix
-inline Matrix2x2 operator*(const Matrix2x2& matrix, decimal nb) {
+RP3D_FORCE_INLINE Matrix2x2 operator*(const Matrix2x2& matrix, decimal nb) {
     return nb * matrix;
 }
 
 // Overloaded operator for matrix multiplication
-inline Matrix2x2 operator*(const Matrix2x2& matrix1, const Matrix2x2& matrix2) {
+RP3D_FORCE_INLINE Matrix2x2 operator*(const Matrix2x2& matrix1, const Matrix2x2& matrix2) {
     return Matrix2x2(matrix1.mRows[0][0] * matrix2.mRows[0][0] + matrix1.mRows[0][1] *
                      matrix2.mRows[1][0],
                      matrix1.mRows[0][0] * matrix2.mRows[0][1] + matrix1.mRows[0][1] *
@@ -292,38 +292,38 @@ inline Matrix2x2 operator*(const Matrix2x2& matrix1, const Matrix2x2& matrix2) {
 }
 
 // Overloaded operator for multiplication with a vector
-inline Vector2 operator*(const Matrix2x2& matrix, const Vector2& vector) {
+RP3D_FORCE_INLINE Vector2 operator*(const Matrix2x2& matrix, const Vector2& vector) {
     return Vector2(matrix.mRows[0][0]*vector.x + matrix.mRows[0][1]*vector.y,
                    matrix.mRows[1][0]*vector.x + matrix.mRows[1][1]*vector.y);
 }
 
 // Overloaded operator for equality condition
-inline bool Matrix2x2::operator==(const Matrix2x2& matrix) const {
+RP3D_FORCE_INLINE bool Matrix2x2::operator==(const Matrix2x2& matrix) const {
     return (mRows[0][0] == matrix.mRows[0][0] && mRows[0][1] == matrix.mRows[0][1] &&
             mRows[1][0] == matrix.mRows[1][0] && mRows[1][1] == matrix.mRows[1][1]);
 }
 
 // Overloaded operator for the is different condition
-inline bool Matrix2x2::operator!= (const Matrix2x2& matrix) const {
+RP3D_FORCE_INLINE bool Matrix2x2::operator!= (const Matrix2x2& matrix) const {
     return !(*this == matrix);
 }
 
 // Overloaded operator for addition with assignment
-inline Matrix2x2& Matrix2x2::operator+=(const Matrix2x2& matrix) {
+RP3D_FORCE_INLINE Matrix2x2& Matrix2x2::operator+=(const Matrix2x2& matrix) {
    mRows[0][0] += matrix.mRows[0][0]; mRows[0][1] += matrix.mRows[0][1];
    mRows[1][0] += matrix.mRows[1][0]; mRows[1][1] += matrix.mRows[1][1];
    return *this;
 }
 
 // Overloaded operator for substraction with assignment
-inline Matrix2x2& Matrix2x2::operator-=(const Matrix2x2& matrix) {
+RP3D_FORCE_INLINE Matrix2x2& Matrix2x2::operator-=(const Matrix2x2& matrix) {
    mRows[0][0] -= matrix.mRows[0][0]; mRows[0][1] -= matrix.mRows[0][1];
    mRows[1][0] -= matrix.mRows[1][0]; mRows[1][1] -= matrix.mRows[1][1];
    return *this;
 }
 
 // Overloaded operator for multiplication with a number with assignment
-inline Matrix2x2& Matrix2x2::operator*=(decimal nb) {
+RP3D_FORCE_INLINE Matrix2x2& Matrix2x2::operator*=(decimal nb) {
    mRows[0][0] *= nb; mRows[0][1] *= nb;
    mRows[1][0] *= nb; mRows[1][1] *= nb;
    return *this;
@@ -332,19 +332,19 @@ inline Matrix2x2& Matrix2x2::operator*=(decimal nb) {
 // Overloaded operator to return a row of the matrix.
 /// This operator is also used to access a matrix value using the syntax
 /// matrix[row][col].
-inline const Vector2& Matrix2x2::operator[](int row) const {
+RP3D_FORCE_INLINE const Vector2& Matrix2x2::operator[](int row) const {
     return mRows[row];
 }
 
 // Overloaded operator to return a row of the matrix.
 /// This operator is also used to access a matrix value using the syntax
 /// matrix[row][col].
-inline Vector2& Matrix2x2::operator[](int row) {
+RP3D_FORCE_INLINE Vector2& Matrix2x2::operator[](int row) {
     return mRows[row];
 }
 
 // Get the string representation
-inline std::string Matrix2x2::to_string() const {
+RP3D_FORCE_INLINE std::string Matrix2x2::to_string() const {
     return "Matrix2x2(" + std::to_string(mRows[0][0]) + "," + std::to_string(mRows[0][1]) + "," +
            std::to_string(mRows[1][0]) + "," + std::to_string(mRows[1][1]) + ")";
 }
diff --git a/include/reactphysics3d/mathematics/Matrix3x3.h b/include/reactphysics3d/mathematics/Matrix3x3.h
index 267a3ebb..575adfc4 100644
--- a/include/reactphysics3d/mathematics/Matrix3x3.h
+++ b/include/reactphysics3d/mathematics/Matrix3x3.h
@@ -158,18 +158,18 @@ class Matrix3x3 {
 };
 
 // Constructor of the class Matrix3x3
-inline Matrix3x3::Matrix3x3() {
+RP3D_FORCE_INLINE Matrix3x3::Matrix3x3() {
     // Initialize all values in the matrix to zero
     setAllValues(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
 }
 
 // Constructor
-inline Matrix3x3::Matrix3x3(decimal value) {
+RP3D_FORCE_INLINE Matrix3x3::Matrix3x3(decimal value) {
     setAllValues(value, value, value, value, value, value, value, value, value);
 }
 
 // Constructor with arguments
-inline Matrix3x3::Matrix3x3(decimal a1, decimal a2, decimal a3,
+RP3D_FORCE_INLINE Matrix3x3::Matrix3x3(decimal a1, decimal a2, decimal a3,
                      decimal b1, decimal b2, decimal b3,
                      decimal c1, decimal c2, decimal c3) {
     // Initialize the matrix with the values
@@ -177,14 +177,14 @@ inline Matrix3x3::Matrix3x3(decimal a1, decimal a2, decimal a3,
 }
 
 // Copy-constructor
-inline Matrix3x3::Matrix3x3(const Matrix3x3& matrix) {
+RP3D_FORCE_INLINE Matrix3x3::Matrix3x3(const Matrix3x3& matrix) {
     setAllValues(matrix.mRows[0][0], matrix.mRows[0][1], matrix.mRows[0][2],
                  matrix.mRows[1][0], matrix.mRows[1][1], matrix.mRows[1][2],
                  matrix.mRows[2][0], matrix.mRows[2][1], matrix.mRows[2][2]);
 }
 
 // Method to set all the values in the matrix
-inline void Matrix3x3::setAllValues(decimal a1, decimal a2, decimal a3,
+RP3D_FORCE_INLINE void Matrix3x3::setAllValues(decimal a1, decimal a2, decimal a3,
                                     decimal b1, decimal b2, decimal b3,
                                     decimal c1, decimal c2, decimal c3) {
     mRows[0][0] = a1; mRows[0][1] = a2; mRows[0][2] = a3;
@@ -193,26 +193,26 @@ inline void Matrix3x3::setAllValues(decimal a1, decimal a2, decimal a3,
 }
 
 // Set the matrix to zero
-inline void Matrix3x3::setToZero() {
+RP3D_FORCE_INLINE void Matrix3x3::setToZero() {
     mRows[0].setToZero();
     mRows[1].setToZero();
     mRows[2].setToZero();
 }
 
 // Return a column
-inline Vector3 Matrix3x3::getColumn(int i) const {
+RP3D_FORCE_INLINE Vector3 Matrix3x3::getColumn(int i) const {
     assert(i>= 0 && i<3);
     return Vector3(mRows[0][i], mRows[1][i], mRows[2][i]);
 }
 
 // Return a row
-inline Vector3 Matrix3x3::getRow(int i) const {
+RP3D_FORCE_INLINE Vector3 Matrix3x3::getRow(int i) const {
     assert(i>= 0 && i<3);
     return mRows[i];
 }
 
 // Return the transpose matrix
-inline Matrix3x3 Matrix3x3::getTranspose() const {
+RP3D_FORCE_INLINE Matrix3x3 Matrix3x3::getTranspose() const {
 
     // Return the transpose matrix
     return Matrix3x3(mRows[0][0], mRows[1][0], mRows[2][0],
@@ -221,7 +221,7 @@ inline Matrix3x3 Matrix3x3::getTranspose() const {
 }
 
 // Return the determinant of the matrix
-inline decimal Matrix3x3::getDeterminant() const {
+RP3D_FORCE_INLINE decimal Matrix3x3::getDeterminant() const {
 
     // Compute and return the determinant of the matrix
     return (mRows[0][0]*(mRows[1][1]*mRows[2][2]-mRows[2][1]*mRows[1][2]) -
@@ -230,44 +230,44 @@ inline decimal Matrix3x3::getDeterminant() const {
 }
 
 // Return the trace of the matrix
-inline decimal Matrix3x3::getTrace() const {
+RP3D_FORCE_INLINE decimal Matrix3x3::getTrace() const {
 
     // Compute and return the trace
     return (mRows[0][0] + mRows[1][1] + mRows[2][2]);
 }
 
 // Set the matrix to the identity matrix
-inline void Matrix3x3::setToIdentity() {
+RP3D_FORCE_INLINE void Matrix3x3::setToIdentity() {
     mRows[0][0] = 1.0; mRows[0][1] = 0.0; mRows[0][2] = 0.0;
     mRows[1][0] = 0.0; mRows[1][1] = 1.0; mRows[1][2] = 0.0;
     mRows[2][0] = 0.0; mRows[2][1] = 0.0; mRows[2][2] = 1.0;
 }
 
 // Return the 3x3 identity matrix
-inline Matrix3x3 Matrix3x3::identity() {
+RP3D_FORCE_INLINE Matrix3x3 Matrix3x3::identity() {
     return Matrix3x3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);
 }
 
 // Return the 3x3 zero matrix
-inline Matrix3x3 Matrix3x3::zero() {
+RP3D_FORCE_INLINE Matrix3x3 Matrix3x3::zero() {
     return Matrix3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
 }
 
 // Return a skew-symmetric matrix using a given vector that can be used
 // to compute cross product with another vector using matrix multiplication
-inline Matrix3x3 Matrix3x3::computeSkewSymmetricMatrixForCrossProduct(const Vector3& vector) {
+RP3D_FORCE_INLINE Matrix3x3 Matrix3x3::computeSkewSymmetricMatrixForCrossProduct(const Vector3& vector) {
     return Matrix3x3(0, -vector.z, vector.y, vector.z, 0, -vector.x, -vector.y, vector.x, 0);
 }
 
 // Return the matrix with absolute values
-inline Matrix3x3 Matrix3x3::getAbsoluteMatrix() const {
+RP3D_FORCE_INLINE Matrix3x3 Matrix3x3::getAbsoluteMatrix() const {
     return Matrix3x3(std::fabs(mRows[0][0]), std::fabs(mRows[0][1]), std::fabs(mRows[0][2]),
                      std::fabs(mRows[1][0]), std::fabs(mRows[1][1]), std::fabs(mRows[1][2]),
                      std::fabs(mRows[2][0]), std::fabs(mRows[2][1]), std::fabs(mRows[2][2]));
 }
 
 // Overloaded operator for addition
-inline Matrix3x3 operator+(const Matrix3x3& matrix1, const Matrix3x3& matrix2) {
+RP3D_FORCE_INLINE Matrix3x3 operator+(const Matrix3x3& matrix1, const Matrix3x3& matrix2) {
     return Matrix3x3(matrix1.mRows[0][0] + matrix2.mRows[0][0], matrix1.mRows[0][1] +
                      matrix2.mRows[0][1], matrix1.mRows[0][2] + matrix2.mRows[0][2],
                      matrix1.mRows[1][0] + matrix2.mRows[1][0], matrix1.mRows[1][1] +
@@ -277,7 +277,7 @@ inline Matrix3x3 operator+(const Matrix3x3& matrix1, const Matrix3x3& matrix2) {
 }
 
 // Overloaded operator for substraction
-inline Matrix3x3 operator-(const Matrix3x3& matrix1, const Matrix3x3& matrix2) {
+RP3D_FORCE_INLINE Matrix3x3 operator-(const Matrix3x3& matrix1, const Matrix3x3& matrix2) {
     return Matrix3x3(matrix1.mRows[0][0] - matrix2.mRows[0][0], matrix1.mRows[0][1] -
                      matrix2.mRows[0][1], matrix1.mRows[0][2] - matrix2.mRows[0][2],
                      matrix1.mRows[1][0] - matrix2.mRows[1][0], matrix1.mRows[1][1] -
@@ -287,26 +287,26 @@ inline Matrix3x3 operator-(const Matrix3x3& matrix1, const Matrix3x3& matrix2) {
 }
 
 // Overloaded operator for the negative of the matrix
-inline Matrix3x3 operator-(const Matrix3x3& matrix) {
+RP3D_FORCE_INLINE Matrix3x3 operator-(const Matrix3x3& matrix) {
     return Matrix3x3(-matrix.mRows[0][0], -matrix.mRows[0][1], -matrix.mRows[0][2],
                      -matrix.mRows[1][0], -matrix.mRows[1][1], -matrix.mRows[1][2],
                      -matrix.mRows[2][0], -matrix.mRows[2][1], -matrix.mRows[2][2]);
 }
 
 // Overloaded operator for multiplication with a number
-inline Matrix3x3 operator*(decimal nb, const Matrix3x3& matrix) {
+RP3D_FORCE_INLINE Matrix3x3 operator*(decimal nb, const Matrix3x3& matrix) {
     return Matrix3x3(matrix.mRows[0][0] * nb, matrix.mRows[0][1] * nb, matrix.mRows[0][2] * nb,
                      matrix.mRows[1][0] * nb, matrix.mRows[1][1] * nb, matrix.mRows[1][2] * nb,
                      matrix.mRows[2][0] * nb, matrix.mRows[2][1] * nb, matrix.mRows[2][2] * nb);
 }
 
 // Overloaded operator for multiplication with a matrix
-inline Matrix3x3 operator*(const Matrix3x3& matrix, decimal nb) {
+RP3D_FORCE_INLINE Matrix3x3 operator*(const Matrix3x3& matrix, decimal nb) {
     return nb * matrix;
 }
 
 // Overloaded operator for matrix multiplication
-inline Matrix3x3 operator*(const Matrix3x3& matrix1, const Matrix3x3& matrix2) {
+RP3D_FORCE_INLINE Matrix3x3 operator*(const Matrix3x3& matrix1, const Matrix3x3& matrix2) {
     return Matrix3x3(matrix1.mRows[0][0]*matrix2.mRows[0][0] + matrix1.mRows[0][1] *
                      matrix2.mRows[1][0] + matrix1.mRows[0][2]*matrix2.mRows[2][0],
                      matrix1.mRows[0][0]*matrix2.mRows[0][1] + matrix1.mRows[0][1] *
@@ -328,7 +328,7 @@ inline Matrix3x3 operator*(const Matrix3x3& matrix1, const Matrix3x3& matrix2) {
 }
 
 // Overloaded operator for multiplication with a vector
-inline Vector3 operator*(const Matrix3x3& matrix, const Vector3& vector) {
+RP3D_FORCE_INLINE Vector3 operator*(const Matrix3x3& matrix, const Vector3& vector) {
     return Vector3(matrix.mRows[0][0]*vector.x + matrix.mRows[0][1]*vector.y +
                    matrix.mRows[0][2]*vector.z,
                    matrix.mRows[1][0]*vector.x + matrix.mRows[1][1]*vector.y +
@@ -338,7 +338,7 @@ inline Vector3 operator*(const Matrix3x3& matrix, const Vector3& vector) {
 }
 
 // Overloaded operator for equality condition
-inline bool Matrix3x3::operator==(const Matrix3x3& matrix) const {
+RP3D_FORCE_INLINE bool Matrix3x3::operator==(const Matrix3x3& matrix) const {
     return (mRows[0][0] == matrix.mRows[0][0] && mRows[0][1] == matrix.mRows[0][1] &&
             mRows[0][2] == matrix.mRows[0][2] &&
             mRows[1][0] == matrix.mRows[1][0] && mRows[1][1] == matrix.mRows[1][1] &&
@@ -348,12 +348,12 @@ inline bool Matrix3x3::operator==(const Matrix3x3& matrix) const {
 }
 
 // Overloaded operator for the is different condition
-inline bool Matrix3x3::operator!= (const Matrix3x3& matrix) const {
+RP3D_FORCE_INLINE bool Matrix3x3::operator!= (const Matrix3x3& matrix) const {
     return !(*this == matrix);
 }
 
 // Overloaded operator for addition with assignment
-inline Matrix3x3& Matrix3x3::operator+=(const Matrix3x3& matrix) {
+RP3D_FORCE_INLINE Matrix3x3& Matrix3x3::operator+=(const Matrix3x3& matrix) {
    mRows[0][0] += matrix.mRows[0][0]; mRows[0][1] += matrix.mRows[0][1];
    mRows[0][2] += matrix.mRows[0][2]; mRows[1][0] += matrix.mRows[1][0];
    mRows[1][1] += matrix.mRows[1][1]; mRows[1][2] += matrix.mRows[1][2];
@@ -363,7 +363,7 @@ inline Matrix3x3& Matrix3x3::operator+=(const Matrix3x3& matrix) {
 }
 
 // Overloaded operator for substraction with assignment
-inline Matrix3x3& Matrix3x3::operator-=(const Matrix3x3& matrix) {
+RP3D_FORCE_INLINE Matrix3x3& Matrix3x3::operator-=(const Matrix3x3& matrix) {
    mRows[0][0] -= matrix.mRows[0][0]; mRows[0][1] -= matrix.mRows[0][1];
    mRows[0][2] -= matrix.mRows[0][2]; mRows[1][0] -= matrix.mRows[1][0];
    mRows[1][1] -= matrix.mRows[1][1]; mRows[1][2] -= matrix.mRows[1][2];
@@ -373,7 +373,7 @@ inline Matrix3x3& Matrix3x3::operator-=(const Matrix3x3& matrix) {
 }
 
 // Overloaded operator for multiplication with a number with assignment
-inline Matrix3x3& Matrix3x3::operator*=(decimal nb) {
+RP3D_FORCE_INLINE Matrix3x3& Matrix3x3::operator*=(decimal nb) {
    mRows[0][0] *= nb; mRows[0][1] *= nb; mRows[0][2] *= nb;
    mRows[1][0] *= nb; mRows[1][1] *= nb; mRows[1][2] *= nb;
    mRows[2][0] *= nb; mRows[2][1] *= nb; mRows[2][2] *= nb;
@@ -383,19 +383,19 @@ inline Matrix3x3& Matrix3x3::operator*=(decimal nb) {
 // Overloaded operator to return a row of the matrix.
 /// This operator is also used to access a matrix value using the syntax
 /// matrix[row][col].
-inline const Vector3& Matrix3x3::operator[](int row) const {
+RP3D_FORCE_INLINE const Vector3& Matrix3x3::operator[](int row) const {
     return mRows[row];
 }
 
 // Overloaded operator to return a row of the matrix.
 /// This operator is also used to access a matrix value using the syntax
 /// matrix[row][col].
-inline Vector3& Matrix3x3::operator[](int row) {
+RP3D_FORCE_INLINE Vector3& Matrix3x3::operator[](int row) {
     return mRows[row];
 }
 
 // Get the string representation
-inline std::string Matrix3x3::to_string() const {
+RP3D_FORCE_INLINE std::string Matrix3x3::to_string() const {
     return "Matrix3x3(" + std::to_string(mRows[0][0]) + "," + std::to_string(mRows[0][1]) + "," + std::to_string(mRows[0][2]) + "," +
            std::to_string(mRows[1][0]) + "," + std::to_string(mRows[1][1]) + "," + std::to_string(mRows[1][2]) + "," +
            std::to_string(mRows[2][0]) + "," + std::to_string(mRows[2][1]) + "," + std::to_string(mRows[2][2]) + ")";
diff --git a/include/reactphysics3d/mathematics/Quaternion.h b/include/reactphysics3d/mathematics/Quaternion.h
index 8db5682d..15313474 100644
--- a/include/reactphysics3d/mathematics/Quaternion.h
+++ b/include/reactphysics3d/mathematics/Quaternion.h
@@ -182,28 +182,28 @@ struct Quaternion {
 };
 
 // Constructor of the class
-inline Quaternion::Quaternion() : x(0.0), y(0.0), z(0.0), w(0.0) {
+RP3D_FORCE_INLINE Quaternion::Quaternion() : x(0.0), y(0.0), z(0.0), w(0.0) {
 
 }
 
 // Constructor with arguments
-inline Quaternion::Quaternion(decimal newX, decimal newY, decimal newZ, decimal newW)
+RP3D_FORCE_INLINE Quaternion::Quaternion(decimal newX, decimal newY, decimal newZ, decimal newW)
            :x(newX), y(newY), z(newZ), w(newW) {
 
 }
 
 // Constructor with the component w and the vector v=(x y z)
-inline Quaternion::Quaternion(decimal newW, const Vector3& v) : x(v.x), y(v.y), z(v.z), w(newW) {
+RP3D_FORCE_INLINE Quaternion::Quaternion(decimal newW, const Vector3& v) : x(v.x), y(v.y), z(v.z), w(newW) {
 
 }
 
 // Constructor with the component w and the vector v=(x y z)
-inline Quaternion::Quaternion(const Vector3& v, decimal newW) : x(v.x), y(v.y), z(v.z), w(newW) {
+RP3D_FORCE_INLINE Quaternion::Quaternion(const Vector3& v, decimal newW) : x(v.x), y(v.y), z(v.z), w(newW) {
 
 }
 
 // Set all the values
-inline void Quaternion::setAllValues(decimal newX, decimal newY, decimal newZ, decimal newW) {
+RP3D_FORCE_INLINE void Quaternion::setAllValues(decimal newX, decimal newY, decimal newZ, decimal newW) {
     x = newX;
     y = newY;
     z = newZ;
@@ -211,7 +211,7 @@ inline void Quaternion::setAllValues(decimal newX, decimal newY, decimal newZ, d
 }
 
 // Set the quaternion to zero
-inline void Quaternion::setToZero() {
+RP3D_FORCE_INLINE void Quaternion::setToZero() {
     x = 0;
     y = 0;
     z = 0;
@@ -219,7 +219,7 @@ inline void Quaternion::setToZero() {
 }
 
 // Set to the identity quaternion
-inline void Quaternion::setToIdentity() {
+RP3D_FORCE_INLINE void Quaternion::setToIdentity() {
     x = 0;
     y = 0;
     z = 0;
@@ -227,24 +227,24 @@ inline void Quaternion::setToIdentity() {
 }
 
 // Return the vector v=(x y z) of the quaternion
-inline Vector3 Quaternion::getVectorV() const {
+RP3D_FORCE_INLINE Vector3 Quaternion::getVectorV() const {
 
     // Return the vector v
     return Vector3(x, y, z);
 }
 
-// Return the length of the quaternion (inline)
-inline decimal Quaternion::length() const {
+// Return the length of the quaternion (RP3D_FORCE_INLINE)
+RP3D_FORCE_INLINE decimal Quaternion::length() const {
     return std::sqrt(x*x + y*y + z*z + w*w);
 }
 
 // Return the square of the length of the quaternion
-inline decimal Quaternion::lengthSquare() const {
+RP3D_FORCE_INLINE decimal Quaternion::lengthSquare() const {
     return x*x + y*y + z*z + w*w;
 }
 
 // Normalize the quaternion
-inline void Quaternion::normalize() {
+RP3D_FORCE_INLINE void Quaternion::normalize() {
 
     decimal l = length();
 
@@ -258,7 +258,7 @@ inline void Quaternion::normalize() {
 }
 
 // Inverse the quaternion
-inline void Quaternion::inverse() {
+RP3D_FORCE_INLINE void Quaternion::inverse() {
 
     // Use the conjugate of the current quaternion
     x = -x;
@@ -267,7 +267,7 @@ inline void Quaternion::inverse() {
 }
 
 // Return the unit quaternion
-inline Quaternion Quaternion::getUnit() const {
+RP3D_FORCE_INLINE Quaternion Quaternion::getUnit() const {
     decimal lengthQuaternion = length();
 
     // Check if the length is not equal to zero
@@ -279,60 +279,60 @@ inline Quaternion Quaternion::getUnit() const {
 }
 
 // Return the identity quaternion
-inline Quaternion Quaternion::identity() {
+RP3D_FORCE_INLINE Quaternion Quaternion::identity() {
     return Quaternion(0.0, 0.0, 0.0, 1.0);
 }
 
-// Return the conjugate of the quaternion (inline)
-inline Quaternion Quaternion::getConjugate() const {
+// Return the conjugate of the quaternion (RP3D_FORCE_INLINE)
+RP3D_FORCE_INLINE Quaternion Quaternion::getConjugate() const {
     return Quaternion(-x, -y, -z, w);
 }
 
-// Return the inverse of the quaternion (inline)
-inline Quaternion Quaternion::getInverse() const {
+// Return the inverse of the quaternion (RP3D_FORCE_INLINE)
+RP3D_FORCE_INLINE Quaternion Quaternion::getInverse() const {
 
     // Return the conjugate quaternion
     return Quaternion(-x, -y, -z, w);
 }
 
 // Scalar product between two quaternions
-inline decimal Quaternion::dot(const Quaternion& quaternion) const {
+RP3D_FORCE_INLINE decimal Quaternion::dot(const Quaternion& quaternion) const {
     return (x*quaternion.x + y*quaternion.y + z*quaternion.z + w*quaternion.w);
 }
 
 // Return true if the values are not NAN OR INF
-inline bool Quaternion::isFinite() const {
+RP3D_FORCE_INLINE bool Quaternion::isFinite() const {
     return std::isfinite(x) && std::isfinite(y) && std::isfinite(z) && std::isfinite(w);
 }
 
 // Return true if it is a unit quaternion
-inline bool Quaternion::isUnit() const {
+RP3D_FORCE_INLINE bool Quaternion::isUnit() const {
     const decimal length = std::sqrt(x*x + y*y + z*z + w*w);
     const decimal tolerance = 1e-5f;
     return std::abs(length - decimal(1.0)) < tolerance;
 }
 
 // Return true if it is a valid quaternion
-inline bool Quaternion::isValid() const {
+RP3D_FORCE_INLINE bool Quaternion::isValid() const {
    return isFinite() && isUnit();
 }
 
 // Overloaded operator for the addition of two quaternions
-inline Quaternion Quaternion::operator+(const Quaternion& quaternion) const {
+RP3D_FORCE_INLINE Quaternion Quaternion::operator+(const Quaternion& quaternion) const {
 
     // Return the result quaternion
     return Quaternion(x + quaternion.x, y + quaternion.y, z + quaternion.z, w + quaternion.w);
 }
 
 // Overloaded operator for the substraction of two quaternions
-inline Quaternion Quaternion::operator-(const Quaternion& quaternion) const {
+RP3D_FORCE_INLINE Quaternion Quaternion::operator-(const Quaternion& quaternion) const {
 
     // Return the result of the substraction
     return Quaternion(x - quaternion.x, y - quaternion.y, z - quaternion.z, w - quaternion.w);
 }
 
 // Overloaded operator for addition with assignment
-inline Quaternion& Quaternion::operator+=(const Quaternion& quaternion) {
+RP3D_FORCE_INLINE Quaternion& Quaternion::operator+=(const Quaternion& quaternion) {
     x += quaternion.x;
     y += quaternion.y;
     z += quaternion.z;
@@ -341,7 +341,7 @@ inline Quaternion& Quaternion::operator+=(const Quaternion& quaternion) {
 }
 
 // Overloaded operator for substraction with assignment
-inline Quaternion& Quaternion::operator-=(const Quaternion& quaternion) {
+RP3D_FORCE_INLINE Quaternion& Quaternion::operator-=(const Quaternion& quaternion) {
     x -= quaternion.x;
     y -= quaternion.y;
     z -= quaternion.z;
@@ -350,12 +350,12 @@ inline Quaternion& Quaternion::operator-=(const Quaternion& quaternion) {
 }
 
 // Overloaded operator for the multiplication with a constant
-inline Quaternion Quaternion::operator*(decimal nb) const {
+RP3D_FORCE_INLINE Quaternion Quaternion::operator*(decimal nb) const {
     return Quaternion(nb * x, nb * y, nb * z, nb * w);
 }
 
 // Overloaded operator for the multiplication of two quaternions
-inline Quaternion Quaternion::operator*(const Quaternion& quaternion) const {
+RP3D_FORCE_INLINE Quaternion Quaternion::operator*(const Quaternion& quaternion) const {
 
     /* The followin code is equivalent to this
     return Quaternion(w * quaternion.w - getVectorV().dot(quaternion.getVectorV()),
@@ -371,7 +371,7 @@ inline Quaternion Quaternion::operator*(const Quaternion& quaternion) const {
 
 // Overloaded operator for the multiplication with a vector.
 /// This methods rotates a point given the rotation of a quaternion.
-inline Vector3 Quaternion::operator*(const Vector3& point) const {
+RP3D_FORCE_INLINE Vector3 Quaternion::operator*(const Vector3& point) const {
 
     /* The following code is equivalent to this
      * Quaternion p(point.x, point.y, point.z, 0.0);
@@ -388,7 +388,7 @@ inline Vector3 Quaternion::operator*(const Vector3& point) const {
 }
 
 // Overloaded operator for the assignment
-inline Quaternion& Quaternion::operator=(const Quaternion& quaternion) {
+RP3D_FORCE_INLINE Quaternion& Quaternion::operator=(const Quaternion& quaternion) {
 
     // Check for self-assignment
     if (this != &quaternion) {
@@ -403,13 +403,13 @@ inline Quaternion& Quaternion::operator=(const Quaternion& quaternion) {
 }
 
 // Overloaded operator for equality condition
-inline bool Quaternion::operator==(const Quaternion& quaternion) const {
+RP3D_FORCE_INLINE bool Quaternion::operator==(const Quaternion& quaternion) const {
     return (x == quaternion.x && y == quaternion.y &&
             z == quaternion.z && w == quaternion.w);
 }
 
 // Get the string representation
-inline std::string Quaternion::to_string() const {
+RP3D_FORCE_INLINE std::string Quaternion::to_string() const {
     return "Quaternion(" + std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(z) + "," +
             std::to_string(w) + ")";
 }
diff --git a/include/reactphysics3d/mathematics/Transform.h b/include/reactphysics3d/mathematics/Transform.h
index aca59848..575eca7f 100644
--- a/include/reactphysics3d/mathematics/Transform.h
+++ b/include/reactphysics3d/mathematics/Transform.h
@@ -125,62 +125,62 @@ class Transform {
 };
 
 // Constructor
-inline Transform::Transform() : mPosition(Vector3(0.0, 0.0, 0.0)), mOrientation(Quaternion::identity()) {
+RP3D_FORCE_INLINE Transform::Transform() : mPosition(Vector3(0.0, 0.0, 0.0)), mOrientation(Quaternion::identity()) {
 
 }
 
 // Constructor
-inline Transform::Transform(const Vector3& position, const Matrix3x3& orientation)
+RP3D_FORCE_INLINE Transform::Transform(const Vector3& position, const Matrix3x3& orientation)
           : mPosition(position), mOrientation(Quaternion(orientation)) {
 
 }
 
 // Constructor
-inline Transform::Transform(const Vector3& position, const Quaternion& orientation)
+RP3D_FORCE_INLINE Transform::Transform(const Vector3& position, const Quaternion& orientation)
           : mPosition(position), mOrientation(orientation) {
 
 }
 
 // Copy-constructor
-inline Transform::Transform(const Transform& transform)
+RP3D_FORCE_INLINE Transform::Transform(const Transform& transform)
           : mPosition(transform.mPosition), mOrientation(transform.mOrientation) {
 
 }
 
 // Return the position of the transform
-inline const Vector3& Transform::getPosition() const {
+RP3D_FORCE_INLINE const Vector3& Transform::getPosition() const {
     return mPosition;
 }
 
 // Set the origin of the transform
-inline void Transform::setPosition(const Vector3& position) {
+RP3D_FORCE_INLINE void Transform::setPosition(const Vector3& position) {
     mPosition = position;
 }
 
 // Return the rotation matrix
-inline const Quaternion& Transform::getOrientation() const {
+RP3D_FORCE_INLINE const Quaternion& Transform::getOrientation() const {
     return mOrientation;
 }
 
 // Set the rotation matrix of the transform
-inline void Transform::setOrientation(const Quaternion& orientation) {
+RP3D_FORCE_INLINE void Transform::setOrientation(const Quaternion& orientation) {
     mOrientation = orientation;
 }
 
 // Set the transform to the identity transform
-inline void Transform::setToIdentity() {
+RP3D_FORCE_INLINE void Transform::setToIdentity() {
     mPosition = Vector3(0.0, 0.0, 0.0);
     mOrientation = Quaternion::identity();
 }                                           
 
 // Return the inverse of the transform
-inline Transform Transform::getInverse() const {
+RP3D_FORCE_INLINE Transform Transform::getInverse() const {
     const Quaternion& invQuaternion = mOrientation.getInverse();
     return Transform(invQuaternion * (-mPosition), invQuaternion);
 }
 
 // Return an interpolated transform
-inline Transform Transform::interpolateTransforms(const Transform& oldTransform,
+RP3D_FORCE_INLINE Transform Transform::interpolateTransforms(const Transform& oldTransform,
                                                   const Transform& newTransform,
                                                   decimal interpolationFactor) {
 
@@ -195,22 +195,22 @@ inline Transform Transform::interpolateTransforms(const Transform& oldTransform,
 }
 
 // Return the identity transform
-inline Transform Transform::identity() {
+RP3D_FORCE_INLINE Transform Transform::identity() {
     return Transform(Vector3(0, 0, 0), Quaternion::identity());
 }
 
 // Return true if it is a valid transform
-inline bool Transform::isValid() const {
+RP3D_FORCE_INLINE bool Transform::isValid() const {
     return mPosition.isFinite() && mOrientation.isValid();
 }
 
 // Return the transformed vector
-inline Vector3 Transform::operator*(const Vector3& vector) const {
+RP3D_FORCE_INLINE Vector3 Transform::operator*(const Vector3& vector) const {
     return (mOrientation * vector) + mPosition;
 }
 
 // Operator of multiplication of a transform with another one
-inline Transform Transform::operator*(const Transform& transform2) const {
+RP3D_FORCE_INLINE Transform Transform::operator*(const Transform& transform2) const {
 
     // The following code is equivalent to this
     //return Transform(mPosition + mOrientation * transform2.mPosition,
@@ -239,17 +239,17 @@ inline Transform Transform::operator*(const Transform& transform2) const {
 }
 
 // Return true if the two transforms are equal
-inline bool Transform::operator==(const Transform& transform2) const {
+RP3D_FORCE_INLINE bool Transform::operator==(const Transform& transform2) const {
     return (mPosition == transform2.mPosition) && (mOrientation == transform2.mOrientation);
 }    
 
 // Return true if the two transforms are different
-inline bool Transform::operator!=(const Transform& transform2) const {
+RP3D_FORCE_INLINE bool Transform::operator!=(const Transform& transform2) const {
     return !(*this == transform2);
 }
 
 // Assignment operator
-inline Transform& Transform::operator=(const Transform& transform) {
+RP3D_FORCE_INLINE Transform& Transform::operator=(const Transform& transform) {
     if (&transform != this) {
         mPosition = transform.mPosition;
         mOrientation = transform.mOrientation;
@@ -258,7 +258,7 @@ inline Transform& Transform::operator=(const Transform& transform) {
 }
 
 // Get the string representation
-inline std::string Transform::to_string() const {
+RP3D_FORCE_INLINE std::string Transform::to_string() const {
     return "Transform(" + mPosition.to_string() + "," + mOrientation.to_string() + ")";
 }
 
diff --git a/include/reactphysics3d/mathematics/Vector2.h b/include/reactphysics3d/mathematics/Vector2.h
index 7a088398..aee3214d 100644
--- a/include/reactphysics3d/mathematics/Vector2.h
+++ b/include/reactphysics3d/mathematics/Vector2.h
@@ -161,50 +161,50 @@ struct Vector2 {
 };
 
 // Constructor
-inline Vector2::Vector2() : x(0.0), y(0.0) {
+RP3D_FORCE_INLINE Vector2::Vector2() : x(0.0), y(0.0) {
 
 }
 
 // Constructor with arguments
-inline Vector2::Vector2(decimal newX, decimal newY) : x(newX), y(newY) {
+RP3D_FORCE_INLINE Vector2::Vector2(decimal newX, decimal newY) : x(newX), y(newY) {
 
 }
 
 // Copy-constructor
-inline Vector2::Vector2(const Vector2& vector) : x(vector.x), y(vector.y) {
+RP3D_FORCE_INLINE Vector2::Vector2(const Vector2& vector) : x(vector.x), y(vector.y) {
 
 }
 
 
 // Set the vector to zero
-inline void Vector2::setToZero() {
+RP3D_FORCE_INLINE void Vector2::setToZero() {
     x = 0;
     y = 0;
 }
 
 // Set all the values of the vector
-inline void Vector2::setAllValues(decimal newX, decimal newY) {
+RP3D_FORCE_INLINE void Vector2::setAllValues(decimal newX, decimal newY) {
     x = newX;
     y = newY;
 }
 
 // Return the length of the vector
-inline decimal Vector2::length() const {
+RP3D_FORCE_INLINE decimal Vector2::length() const {
     return std::sqrt(x*x + y*y);
 }
 
 // Return the square of the length of the vector
-inline decimal Vector2::lengthSquare() const {
+RP3D_FORCE_INLINE decimal Vector2::lengthSquare() const {
     return x*x + y*y;
 }
 
-// Scalar product of two vectors (inline)
-inline decimal Vector2::dot(const Vector2& vector) const {
+// Scalar product of two vectors (RP3D_FORCE_INLINE)
+RP3D_FORCE_INLINE decimal Vector2::dot(const Vector2& vector) const {
     return (x*vector.x + y*vector.y);
 }
 
 // Normalize the vector
-inline void Vector2::normalize() {
+RP3D_FORCE_INLINE void Vector2::normalize() {
     decimal l = length();
     if (l < MACHINE_EPSILON) {
         return;
@@ -214,68 +214,68 @@ inline void Vector2::normalize() {
 }
 
 // Return the corresponding absolute value vector
-inline Vector2 Vector2::getAbsoluteVector() const {
+RP3D_FORCE_INLINE Vector2 Vector2::getAbsoluteVector() const {
     return Vector2(std::abs(x), std::abs(y));
 }
 
 // Return the axis with the minimal value
-inline int Vector2::getMinAxis() const {
+RP3D_FORCE_INLINE int Vector2::getMinAxis() const {
     return (x < y ? 0 : 1);
 }
 
 // Return the axis with the maximal value
-inline int Vector2::getMaxAxis() const {
+RP3D_FORCE_INLINE int Vector2::getMaxAxis() const {
     return (x < y ? 1 : 0);
 }
 
 // Return true if the vector is unit and false otherwise
-inline bool Vector2::isUnit() const {
+RP3D_FORCE_INLINE bool Vector2::isUnit() const {
     return approxEqual(lengthSquare(), 1.0);
 }
 
 // Return true if the values are not NAN OR INF
-inline bool Vector2::isFinite() const {
+RP3D_FORCE_INLINE bool Vector2::isFinite() const {
     return std::isfinite(x) && std::isfinite(y);
 }
 
 // Return true if the vector is the zero vector
-inline bool Vector2::isZero() const {
+RP3D_FORCE_INLINE bool Vector2::isZero() const {
     return approxEqual(lengthSquare(), 0.0);
 }
 
 // Overloaded operator for the equality condition
-inline bool Vector2::operator== (const Vector2& vector) const {
+RP3D_FORCE_INLINE bool Vector2::operator== (const Vector2& vector) const {
     return (x == vector.x && y == vector.y);
 }
 
 // Overloaded operator for the is different condition
-inline bool Vector2::operator!= (const Vector2& vector) const {
+RP3D_FORCE_INLINE bool Vector2::operator!= (const Vector2& vector) const {
     return !(*this == vector);
 }
 
 // Overloaded operator for addition with assignment
-inline Vector2& Vector2::operator+=(const Vector2& vector) {
+RP3D_FORCE_INLINE Vector2& Vector2::operator+=(const Vector2& vector) {
     x += vector.x;
     y += vector.y;
     return *this;
 }
 
 // Overloaded operator for substraction with assignment
-inline Vector2& Vector2::operator-=(const Vector2& vector) {
+RP3D_FORCE_INLINE Vector2& Vector2::operator-=(const Vector2& vector) {
     x -= vector.x;
     y -= vector.y;
     return *this;
 }
 
 // Overloaded operator for multiplication with a number with assignment
-inline Vector2& Vector2::operator*=(decimal number) {
+RP3D_FORCE_INLINE Vector2& Vector2::operator*=(decimal number) {
     x *= number;
     y *= number;
     return *this;
 }
 
 // Overloaded operator for division by a number with assignment
-inline Vector2& Vector2::operator/=(decimal number) {
+RP3D_FORCE_INLINE Vector2& Vector2::operator/=(decimal number) {
     assert(number > std::numeric_limits<decimal>::epsilon());
     x /= number;
     y /= number;
@@ -283,60 +283,60 @@ inline Vector2& Vector2::operator/=(decimal number) {
 }
 
 // Overloaded operator for value access
-inline decimal& Vector2::operator[] (int index) {
+RP3D_FORCE_INLINE decimal& Vector2::operator[] (int index) {
     return (&x)[index];
 }
 
 // Overloaded operator for value access
-inline const decimal& Vector2::operator[] (int index) const {
+RP3D_FORCE_INLINE const decimal& Vector2::operator[] (int index) const {
     return (&x)[index];
 }
 
 // Overloaded operator for addition
-inline Vector2 operator+(const Vector2& vector1, const Vector2& vector2) {
+RP3D_FORCE_INLINE Vector2 operator+(const Vector2& vector1, const Vector2& vector2) {
     return Vector2(vector1.x + vector2.x, vector1.y + vector2.y);
 }
 
 // Overloaded operator for substraction
-inline Vector2 operator-(const Vector2& vector1, const Vector2& vector2) {
+RP3D_FORCE_INLINE Vector2 operator-(const Vector2& vector1, const Vector2& vector2) {
     return Vector2(vector1.x - vector2.x, vector1.y - vector2.y);
 }
 
 // Overloaded operator for the negative of a vector
-inline Vector2 operator-(const Vector2& vector) {
+RP3D_FORCE_INLINE Vector2 operator-(const Vector2& vector) {
     return Vector2(-vector.x, -vector.y);
 }
 
 // Overloaded operator for multiplication with a number
-inline Vector2 operator*(const Vector2& vector, decimal number) {
+RP3D_FORCE_INLINE Vector2 operator*(const Vector2& vector, decimal number) {
     return Vector2(number * vector.x, number * vector.y);
 }
 
 // Overloaded operator for multiplication of two vectors
-inline Vector2 operator*(const Vector2& vector1, const Vector2& vector2) {
+RP3D_FORCE_INLINE Vector2 operator*(const Vector2& vector1, const Vector2& vector2) {
     return Vector2(vector1.x * vector2.x, vector1.y * vector2.y);
 }
 
 // Overloaded operator for division by a number
-inline Vector2 operator/(const Vector2& vector, decimal number) {
+RP3D_FORCE_INLINE Vector2 operator/(const Vector2& vector, decimal number) {
     assert(number > MACHINE_EPSILON);
     return Vector2(vector.x / number, vector.y / number);
 }
 
 // Overload operator for division between two vectors
-inline Vector2 operator/(const Vector2& vector1, const Vector2& vector2) {
+RP3D_FORCE_INLINE Vector2 operator/(const Vector2& vector1, const Vector2& vector2) {
     assert(vector2.x > MACHINE_EPSILON);
     assert(vector2.y > MACHINE_EPSILON);
     return Vector2(vector1.x / vector2.x, vector1.y / vector2.y);
 }
 
 // Overloaded operator for multiplication with a number
-inline Vector2 operator*(decimal number, const Vector2& vector) {
+RP3D_FORCE_INLINE Vector2 operator*(decimal number, const Vector2& vector) {
     return vector * number;
 }
 
 // Assignment operator
-inline Vector2& Vector2::operator=(const Vector2& vector) {
+RP3D_FORCE_INLINE Vector2& Vector2::operator=(const Vector2& vector) {
     if (&vector != this) {
         x = vector.x;
         y = vector.y;
@@ -345,29 +345,29 @@ inline Vector2& Vector2::operator=(const Vector2& vector) {
 }
 
 // Overloaded less than operator for ordering to be used inside std::set for instance
-inline bool Vector2::operator<(const Vector2& vector) const {
+RP3D_FORCE_INLINE bool Vector2::operator<(const Vector2& vector) const {
     return (x == vector.x ? y < vector.y : x < vector.x);
 }
 
 // Return a vector taking the minimum components of two vectors
-inline Vector2 Vector2::min(const Vector2& vector1, const Vector2& vector2) {
+RP3D_FORCE_INLINE Vector2 Vector2::min(const Vector2& vector1, const Vector2& vector2) {
     return Vector2(std::min(vector1.x, vector2.x),
                    std::min(vector1.y, vector2.y));
 }
 
 // Return a vector taking the maximum components of two vectors
-inline Vector2 Vector2::max(const Vector2& vector1, const Vector2& vector2) {
+RP3D_FORCE_INLINE Vector2 Vector2::max(const Vector2& vector1, const Vector2& vector2) {
     return Vector2(std::max(vector1.x, vector2.x),
                    std::max(vector1.y, vector2.y));
 }
 
 // Get the string representation
-inline std::string Vector2::to_string() const {
+RP3D_FORCE_INLINE std::string Vector2::to_string() const {
     return "Vector2(" + std::to_string(x) + "," + std::to_string(y) + ")";
 }
 
 // Return the zero vector
-inline Vector2 Vector2::zero() {
+RP3D_FORCE_INLINE Vector2 Vector2::zero() {
     return Vector2(0, 0);
 }
 
diff --git a/include/reactphysics3d/mathematics/Vector3.h b/include/reactphysics3d/mathematics/Vector3.h
index ffec1b56..b1adf487 100644
--- a/include/reactphysics3d/mathematics/Vector3.h
+++ b/include/reactphysics3d/mathematics/Vector3.h
@@ -30,6 +30,7 @@
 #include <cassert>
 #include <reactphysics3d/mathematics/mathematics_functions.h>
 #include <reactphysics3d/decimal.h>
+#include <reactphysics3d/configuration.h>
 
 /// ReactPhysics3D namespace
 namespace reactphysics3d {
@@ -173,58 +174,58 @@ struct Vector3 {
 };
 
 // Constructor of the struct Vector3
-inline Vector3::Vector3() : x(0.0), y(0.0), z(0.0) {
+RP3D_FORCE_INLINE Vector3::Vector3() : x(0.0), y(0.0), z(0.0) {
 
 }
 
 // Constructor with arguments
-inline Vector3::Vector3(decimal newX, decimal newY, decimal newZ) : x(newX), y(newY), z(newZ) {
+RP3D_FORCE_INLINE Vector3::Vector3(decimal newX, decimal newY, decimal newZ) : x(newX), y(newY), z(newZ) {
 
 }
 
 // Copy-constructor
-inline Vector3::Vector3(const Vector3& vector) : x(vector.x), y(vector.y), z(vector.z) {
+RP3D_FORCE_INLINE Vector3::Vector3(const Vector3& vector) : x(vector.x), y(vector.y), z(vector.z) {
 
 }
 
 // Set the vector to zero
-inline void Vector3::setToZero() {
+RP3D_FORCE_INLINE void Vector3::setToZero() {
     x = 0;
     y = 0;
     z = 0;
 }
 
 // Set all the values of the vector
-inline void Vector3::setAllValues(decimal newX, decimal newY, decimal newZ) {
+RP3D_FORCE_INLINE void Vector3::setAllValues(decimal newX, decimal newY, decimal newZ) {
     x = newX;
     y = newY;
     z = newZ;
 }
 
 // Return the length of the vector
-inline decimal Vector3::length() const {
+RP3D_FORCE_INLINE decimal Vector3::length() const {
     return std::sqrt(x*x + y*y + z*z);
 }
 
 // Return the square of the length of the vector
-inline decimal Vector3::lengthSquare() const {
+RP3D_FORCE_INLINE decimal Vector3::lengthSquare() const {
     return x*x + y*y + z*z;
 }
 
-// Scalar product of two vectors (inline)
-inline decimal Vector3::dot(const Vector3& vector) const {
+// Scalar product of two vectors (RP3D_FORCE_INLINE)
+RP3D_FORCE_INLINE decimal Vector3::dot(const Vector3& vector) const {
     return (x*vector.x + y*vector.y + z*vector.z);
 }
 
-// Cross product of two vectors (inline)
-inline Vector3 Vector3::cross(const Vector3& vector) const {
+// Cross product of two vectors (RP3D_FORCE_INLINE)
+RP3D_FORCE_INLINE Vector3 Vector3::cross(const Vector3& vector) const {
     return Vector3(y * vector.z - z * vector.y,
                    z * vector.x - x * vector.z,
                    x * vector.y - y * vector.x);
 }
 
 // Normalize the vector
-inline void Vector3::normalize() {
+RP3D_FORCE_INLINE void Vector3::normalize() {
     decimal l = length();
     if (l < MACHINE_EPSILON) {
         return;
@@ -235,47 +236,47 @@ inline void Vector3::normalize() {
 }
 
 // Return the corresponding absolute value vector
-inline Vector3 Vector3::getAbsoluteVector() const {
+RP3D_FORCE_INLINE Vector3 Vector3::getAbsoluteVector() const {
     return Vector3(std::abs(x), std::abs(y), std::abs(z));
 }
 
 // Return the axis with the minimal value
-inline int Vector3::getMinAxis() const {
+RP3D_FORCE_INLINE int Vector3::getMinAxis() const {
     return (x < y ? (x < z ? 0 : 2) : (y < z ? 1 : 2));
 }
 
 // Return the axis with the maximal value
-inline int Vector3::getMaxAxis() const {
+RP3D_FORCE_INLINE int Vector3::getMaxAxis() const {
     return (x < y ? (y < z ? 2 : 1) : (x < z ? 2 : 0));
 }
 
 // Return true if the vector is unit and false otherwise
-inline bool Vector3::isUnit() const {
+RP3D_FORCE_INLINE bool Vector3::isUnit() const {
     return approxEqual(lengthSquare(), 1.0);
 }
 
 // Return true if the values are not NAN OR INF
-inline bool Vector3::isFinite() const {
+RP3D_FORCE_INLINE bool Vector3::isFinite() const {
     return std::isfinite(x) && std::isfinite(y) && std::isfinite(z);
 }
 
 // Return true if the vector is the zero vector
-inline bool Vector3::isZero() const {
+RP3D_FORCE_INLINE bool Vector3::isZero() const {
     return approxEqual(lengthSquare(), 0.0);
 }
 
 // Overloaded operator for the equality condition
-inline bool Vector3::operator== (const Vector3& vector) const {
+RP3D_FORCE_INLINE bool Vector3::operator== (const Vector3& vector) const {
     return (x == vector.x && y == vector.y && z == vector.z);
 }
 
 // Overloaded operator for the is different condition
-inline bool Vector3::operator!= (const Vector3& vector) const {
+RP3D_FORCE_INLINE bool Vector3::operator!= (const Vector3& vector) const {
     return !(*this == vector);
 }
 
 // Overloaded operator for addition with assignment
-inline Vector3& Vector3::operator+=(const Vector3& vector) {
+RP3D_FORCE_INLINE Vector3& Vector3::operator+=(const Vector3& vector) {
     x += vector.x;
     y += vector.y;
     z += vector.z;
@@ -283,7 +284,7 @@ inline Vector3& Vector3::operator+=(const Vector3& vector) {
 }
 
 // Overloaded operator for substraction with assignment
-inline Vector3& Vector3::operator-=(const Vector3& vector) {
+RP3D_FORCE_INLINE Vector3& Vector3::operator-=(const Vector3& vector) {
     x -= vector.x;
     y -= vector.y;
     z -= vector.z;
@@ -291,7 +292,7 @@ inline Vector3& Vector3::operator-=(const Vector3& vector) {
 }
 
 // Overloaded operator for multiplication with a number with assignment
-inline Vector3& Vector3::operator*=(decimal number) {
+RP3D_FORCE_INLINE Vector3& Vector3::operator*=(decimal number) {
     x *= number;
     y *= number;
     z *= number;
@@ -299,7 +300,7 @@ inline Vector3& Vector3::operator*=(decimal number) {
 }
 
 // Overloaded operator for division by a number with assignment
-inline Vector3& Vector3::operator/=(decimal number) {
+RP3D_FORCE_INLINE Vector3& Vector3::operator/=(decimal number) {
     assert(number > std::numeric_limits<decimal>::epsilon());
     x /= number;
     y /= number;
@@ -308,43 +309,43 @@ inline Vector3& Vector3::operator/=(decimal number) {
 }
 
 // Overloaded operator for value access
-inline decimal& Vector3::operator[] (int index) {
+RP3D_FORCE_INLINE decimal& Vector3::operator[] (int index) {
     return (&x)[index];
 }
 
 // Overloaded operator for value access
-inline const decimal& Vector3::operator[] (int index) const {
+RP3D_FORCE_INLINE const decimal& Vector3::operator[] (int index) const {
     return (&x)[index];
 }
 
 // Overloaded operator for addition
-inline Vector3 operator+(const Vector3& vector1, const Vector3& vector2) {
+RP3D_FORCE_INLINE Vector3 operator+(const Vector3& vector1, const Vector3& vector2) {
     return Vector3(vector1.x + vector2.x, vector1.y + vector2.y, vector1.z + vector2.z);
 }
 
 // Overloaded operator for substraction
-inline Vector3 operator-(const Vector3& vector1, const Vector3& vector2) {
+RP3D_FORCE_INLINE Vector3 operator-(const Vector3& vector1, const Vector3& vector2) {
     return Vector3(vector1.x - vector2.x, vector1.y - vector2.y, vector1.z - vector2.z);
 }
 
 // Overloaded operator for the negative of a vector
-inline Vector3 operator-(const Vector3& vector) {
+RP3D_FORCE_INLINE Vector3 operator-(const Vector3& vector) {
     return Vector3(-vector.x, -vector.y, -vector.z);
 }
 
 // Overloaded operator for multiplication with a number
-inline Vector3 operator*(const Vector3& vector, decimal number) {
+RP3D_FORCE_INLINE Vector3 operator*(const Vector3& vector, decimal number) {
     return Vector3(number * vector.x, number * vector.y, number * vector.z);
 }
 
 // Overloaded operator for division by a number
-inline Vector3 operator/(const Vector3& vector, decimal number) {
+RP3D_FORCE_INLINE Vector3 operator/(const Vector3& vector, decimal number) {
     assert(number > MACHINE_EPSILON);
     return Vector3(vector.x / number, vector.y / number, vector.z / number);
 }
 
 // Overload operator for division between two vectors
-inline Vector3 operator/(const Vector3& vector1, const Vector3& vector2) {
+RP3D_FORCE_INLINE Vector3 operator/(const Vector3& vector1, const Vector3& vector2) {
     assert(vector2.x > MACHINE_EPSILON);
     assert(vector2.y > MACHINE_EPSILON);
     assert(vector2.z > MACHINE_EPSILON);
@@ -352,17 +353,17 @@ inline Vector3 operator/(const Vector3& vector1, const Vector3& vector2) {
 }
 
 // Overloaded operator for multiplication with a number
-inline Vector3 operator*(decimal number, const Vector3& vector) {
+RP3D_FORCE_INLINE Vector3 operator*(decimal number, const Vector3& vector) {
     return vector * number;
 }
 
 // Overload operator for multiplication between two vectors
-inline Vector3 operator*(const Vector3& vector1, const Vector3& vector2) {
+RP3D_FORCE_INLINE Vector3 operator*(const Vector3& vector1, const Vector3& vector2) {
     return Vector3(vector1.x * vector2.x, vector1.y * vector2.y, vector1.z * vector2.z);
 }
 
 // Assignment operator
-inline Vector3& Vector3::operator=(const Vector3& vector) {
+RP3D_FORCE_INLINE Vector3& Vector3::operator=(const Vector3& vector) {
     if (&vector != this) {
         x = vector.x;
         y = vector.y;
@@ -372,41 +373,41 @@ inline Vector3& Vector3::operator=(const Vector3& vector) {
 }
 
 // Overloaded less than operator for ordering to be used inside std::set for instance
-inline bool Vector3::operator<(const Vector3& vector) const {
+RP3D_FORCE_INLINE bool Vector3::operator<(const Vector3& vector) const {
     return (x == vector.x ? (y == vector.y ? z < vector.z : y < vector.y) : x < vector.x);
 }
 
 // Return a vector taking the minimum components of two vectors
-inline Vector3 Vector3::min(const Vector3& vector1, const Vector3& vector2) {
+RP3D_FORCE_INLINE Vector3 Vector3::min(const Vector3& vector1, const Vector3& vector2) {
     return Vector3(std::min(vector1.x, vector2.x),
                    std::min(vector1.y, vector2.y),
                    std::min(vector1.z, vector2.z));
 }
 
 // Return a vector taking the maximum components of two vectors
-inline Vector3 Vector3::max(const Vector3& vector1, const Vector3& vector2) {
+RP3D_FORCE_INLINE Vector3 Vector3::max(const Vector3& vector1, const Vector3& vector2) {
     return Vector3(std::max(vector1.x, vector2.x),
                    std::max(vector1.y, vector2.y),
                    std::max(vector1.z, vector2.z));
 }
 
 // Return the minimum value among the three components of a vector
-inline decimal Vector3::getMinValue() const {
+RP3D_FORCE_INLINE decimal Vector3::getMinValue() const {
     return std::min(std::min(x, y), z);
 }
 
 // Return the maximum value among the three components of a vector
-inline decimal Vector3::getMaxValue() const {
+RP3D_FORCE_INLINE decimal Vector3::getMaxValue() const {
     return std::max(std::max(x, y), z);
 }
 
 // Get the string representation
-inline std::string Vector3::to_string() const {
+RP3D_FORCE_INLINE std::string Vector3::to_string() const {
     return "Vector3(" + std::to_string(x) + "," + std::to_string(y) + "," + std::to_string(z) + ")";
 }
 
 // Return the zero vector
-inline Vector3 Vector3::zero() {
+RP3D_FORCE_INLINE Vector3 Vector3::zero() {
     return Vector3(0, 0, 0);
 }
 
diff --git a/include/reactphysics3d/mathematics/mathematics_functions.h b/include/reactphysics3d/mathematics/mathematics_functions.h
index 9ef9ff3a..74b7a86a 100755
--- a/include/reactphysics3d/mathematics/mathematics_functions.h
+++ b/include/reactphysics3d/mathematics/mathematics_functions.h
@@ -44,7 +44,7 @@ struct Vector2;
 
 /// Function to test if two real numbers are (almost) equal
 /// We test if two numbers a and b are such that (a-b) are in [-EPSILON; EPSILON]
-inline bool approxEqual(decimal a, decimal b, decimal epsilon = MACHINE_EPSILON) {
+RP3D_FORCE_INLINE bool approxEqual(decimal a, decimal b, decimal epsilon = MACHINE_EPSILON) {
     return (std::fabs(a - b) < epsilon);
 }
 
@@ -56,30 +56,30 @@ bool approxEqual(const Vector2& vec1, const Vector2& vec2, decimal epsilon = MAC
 
 /// Function that returns the result of the "value" clamped by
 /// two others values "lowerLimit" and "upperLimit"
-inline int clamp(int value, int lowerLimit, int upperLimit) {
+RP3D_FORCE_INLINE int clamp(int value, int lowerLimit, int upperLimit) {
     assert(lowerLimit <= upperLimit);
     return std::min(std::max(value, lowerLimit), upperLimit);
 }
 
 /// Function that returns the result of the "value" clamped by
 /// two others values "lowerLimit" and "upperLimit"
-inline decimal clamp(decimal value, decimal lowerLimit, decimal upperLimit) {
+RP3D_FORCE_INLINE decimal clamp(decimal value, decimal lowerLimit, decimal upperLimit) {
     assert(lowerLimit <= upperLimit);
     return std::min(std::max(value, lowerLimit), upperLimit);
 }
 
 /// Return the minimum value among three values
-inline decimal min3(decimal a, decimal b, decimal c) {
+RP3D_FORCE_INLINE decimal min3(decimal a, decimal b, decimal c) {
     return std::min(std::min(a, b), c);
 }
 
 /// Return the maximum value among three values
-inline decimal max3(decimal a, decimal b, decimal c) {
+RP3D_FORCE_INLINE decimal max3(decimal a, decimal b, decimal c) {
     return std::max(std::max(a, b), c);
 }
 
 /// Return true if two values have the same sign
-inline bool sameSign(decimal a, decimal b) {
+RP3D_FORCE_INLINE bool sameSign(decimal a, decimal b) {
     return a * b >= decimal(0.0);
 }
 
diff --git a/include/reactphysics3d/memory/MemoryManager.h b/include/reactphysics3d/memory/MemoryManager.h
index 55388e00..a7a5466c 100644
--- a/include/reactphysics3d/memory/MemoryManager.h
+++ b/include/reactphysics3d/memory/MemoryManager.h
@@ -102,7 +102,7 @@ class MemoryManager {
 };
 
 // Allocate memory of a given type
-inline void* MemoryManager::allocate(AllocationType allocationType, size_t size) {
+RP3D_FORCE_INLINE void* MemoryManager::allocate(AllocationType allocationType, size_t size) {
 
     switch (allocationType) {
        case AllocationType::Base: return mBaseAllocator->allocate(size);
@@ -115,7 +115,7 @@ inline void* MemoryManager::allocate(AllocationType allocationType, size_t size)
 }
 
 // Release previously allocated memory.
-inline void MemoryManager::release(AllocationType allocationType, void* pointer, size_t size) {
+RP3D_FORCE_INLINE void MemoryManager::release(AllocationType allocationType, void* pointer, size_t size) {
 
     switch (allocationType) {
        case AllocationType::Base: mBaseAllocator->release(pointer, size); break;
@@ -126,22 +126,22 @@ inline void MemoryManager::release(AllocationType allocationType, void* pointer,
 }
 
 // Return the pool allocator
-inline PoolAllocator& MemoryManager::getPoolAllocator() {
+RP3D_FORCE_INLINE PoolAllocator& MemoryManager::getPoolAllocator() {
    return mPoolAllocator;
 }
 
 // Return the single frame stack allocator
-inline SingleFrameAllocator& MemoryManager::getSingleFrameAllocator() {
+RP3D_FORCE_INLINE SingleFrameAllocator& MemoryManager::getSingleFrameAllocator() {
    return mSingleFrameAllocator;
 }
 
 // Return the heap allocator
-inline HeapAllocator& MemoryManager::getHeapAllocator() {
+RP3D_FORCE_INLINE HeapAllocator& MemoryManager::getHeapAllocator() {
    return mHeapAllocator;
 }
 
 // Reset the single frame allocator
-inline void MemoryManager::resetFrameAllocator() {
+RP3D_FORCE_INLINE void MemoryManager::resetFrameAllocator() {
    mSingleFrameAllocator.reset();
 }
 
diff --git a/include/reactphysics3d/systems/BroadPhaseSystem.h b/include/reactphysics3d/systems/BroadPhaseSystem.h
index e399619f..9b4baf8a 100644
--- a/include/reactphysics3d/systems/BroadPhaseSystem.h
+++ b/include/reactphysics3d/systems/BroadPhaseSystem.h
@@ -208,27 +208,27 @@ class BroadPhaseSystem {
 };
 
 // Return the fat AABB of a given broad-phase shape
-inline const AABB& BroadPhaseSystem::getFatAABB(int broadPhaseId) const  {
+RP3D_FORCE_INLINE const AABB& BroadPhaseSystem::getFatAABB(int broadPhaseId) const  {
     return mDynamicAABBTree.getFatAABB(broadPhaseId);
 }
 
 // Remove a collider from the array of colliders that have moved in the last simulation step
 // and that need to be tested again for broad-phase overlapping.
-inline void BroadPhaseSystem::removeMovedCollider(int broadPhaseID) {
+RP3D_FORCE_INLINE void BroadPhaseSystem::removeMovedCollider(int broadPhaseID) {
 
     // Remove the broad-phase ID from the set
     mMovedShapes.remove(broadPhaseID);
 }
 
 // Return the collider corresponding to the broad-phase node id in parameter
-inline Collider* BroadPhaseSystem::getColliderForBroadPhaseId(int broadPhaseId) const {
+RP3D_FORCE_INLINE Collider* BroadPhaseSystem::getColliderForBroadPhaseId(int broadPhaseId) const {
     return static_cast<Collider*>(mDynamicAABBTree.getNodeDataPointer(broadPhaseId));
 }
 
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void BroadPhaseSystem::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void BroadPhaseSystem::setProfiler(Profiler* profiler) {
 	mProfiler = profiler;
 	mDynamicAABBTree.setProfiler(profiler);
 }
diff --git a/include/reactphysics3d/systems/CollisionDetectionSystem.h b/include/reactphysics3d/systems/CollisionDetectionSystem.h
index 6ae515f6..683df3cc 100644
--- a/include/reactphysics3d/systems/CollisionDetectionSystem.h
+++ b/include/reactphysics3d/systems/CollisionDetectionSystem.h
@@ -373,12 +373,12 @@ class CollisionDetectionSystem {
 };
 
 // Return a reference to the collision dispatch configuration
-inline CollisionDispatch& CollisionDetectionSystem::getCollisionDispatch() {
+RP3D_FORCE_INLINE CollisionDispatch& CollisionDetectionSystem::getCollisionDispatch() {
     return mCollisionDispatch;
 }
 
 // Add a body to the collision detection
-inline void CollisionDetectionSystem::addCollider(Collider* collider, const AABB& aabb) {
+RP3D_FORCE_INLINE void CollisionDetectionSystem::addCollider(Collider* collider, const AABB& aabb) {
 
     // Add the body to the broad-phase
     mBroadPhaseSystem.addCollider(collider, aabb);
@@ -392,19 +392,19 @@ inline void CollisionDetectionSystem::addCollider(Collider* collider, const AABB
 }
 
 // Add a pair of bodies that cannot collide with each other
-inline void CollisionDetectionSystem::addNoCollisionPair(Entity body1Entity, Entity body2Entity) {
+RP3D_FORCE_INLINE void CollisionDetectionSystem::addNoCollisionPair(Entity body1Entity, Entity body2Entity) {
     mNoCollisionPairs.add(OverlappingPairs::computeBodiesIndexPair(body1Entity, body2Entity));
 }
 
 // Remove a pair of bodies that cannot collide with each other
-inline void CollisionDetectionSystem::removeNoCollisionPair(Entity body1Entity, Entity body2Entity) {
+RP3D_FORCE_INLINE void CollisionDetectionSystem::removeNoCollisionPair(Entity body1Entity, Entity body2Entity) {
     mNoCollisionPairs.remove(OverlappingPairs::computeBodiesIndexPair(body1Entity, body2Entity));
 }
 
 // Ask for a collision shape to be tested again during broad-phase.
 /// We simply put the shape in the list of collision shape that have moved in the
 /// previous frame so that it is tested for collision again in the broad-phase.
-inline void CollisionDetectionSystem::askForBroadPhaseCollisionCheck(Collider* collider) {
+RP3D_FORCE_INLINE void CollisionDetectionSystem::askForBroadPhaseCollisionCheck(Collider* collider) {
 
     if (collider->getBroadPhaseId() != -1) {
         mBroadPhaseSystem.addMovedCollider(collider->getBroadPhaseId(), collider);
@@ -412,31 +412,31 @@ inline void CollisionDetectionSystem::askForBroadPhaseCollisionCheck(Collider* c
 }
 
 // Return a pointer to the world
-inline PhysicsWorld* CollisionDetectionSystem::getWorld() {
+RP3D_FORCE_INLINE PhysicsWorld* CollisionDetectionSystem::getWorld() {
     return mWorld;
 }
 
 // Return a reference to the memory manager
-inline MemoryManager& CollisionDetectionSystem::getMemoryManager() const {
+RP3D_FORCE_INLINE MemoryManager& CollisionDetectionSystem::getMemoryManager() const {
     return mMemoryManager;
 }
 
 // Update a collider (that has moved for instance)
-inline void CollisionDetectionSystem::updateCollider(Entity colliderEntity, decimal timeStep) {
+RP3D_FORCE_INLINE void CollisionDetectionSystem::updateCollider(Entity colliderEntity, decimal timeStep) {
 
     // Update the collider component
     mBroadPhaseSystem.updateCollider(colliderEntity, timeStep);
 }
 
 // Update all the enabled colliders
-inline void CollisionDetectionSystem::updateColliders(decimal timeStep) {
+RP3D_FORCE_INLINE void CollisionDetectionSystem::updateColliders(decimal timeStep) {
     mBroadPhaseSystem.updateColliders(timeStep);
 }
 
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void CollisionDetectionSystem::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void CollisionDetectionSystem::setProfiler(Profiler* profiler) {
 	mProfiler = profiler;
     mBroadPhaseSystem.setProfiler(profiler);
     mCollisionDispatch.setProfiler(profiler);
diff --git a/include/reactphysics3d/systems/ConstraintSolverSystem.h b/include/reactphysics3d/systems/ConstraintSolverSystem.h
index f3b68d80..594fc983 100644
--- a/include/reactphysics3d/systems/ConstraintSolverSystem.h
+++ b/include/reactphysics3d/systems/ConstraintSolverSystem.h
@@ -215,7 +215,7 @@ class ConstraintSolverSystem {
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void ConstraintSolverSystem::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void ConstraintSolverSystem::setProfiler(Profiler* profiler) {
 	mProfiler = profiler;
     mSolveBallAndSocketJointSystem.setProfiler(profiler);
     mSolveFixedJointSystem.setProfiler(profiler);
diff --git a/include/reactphysics3d/systems/ContactSolverSystem.h b/include/reactphysics3d/systems/ContactSolverSystem.h
index 11c4aa31..ba30a0ac 100644
--- a/include/reactphysics3d/systems/ContactSolverSystem.h
+++ b/include/reactphysics3d/systems/ContactSolverSystem.h
@@ -398,19 +398,19 @@ class ContactSolverSystem {
 };
 
 // Return true if the split impulses position correction technique is used for contacts
-inline bool ContactSolverSystem::isSplitImpulseActive() const {
+RP3D_FORCE_INLINE bool ContactSolverSystem::isSplitImpulseActive() const {
     return mIsSplitImpulseActive;
 }
 
 // Activate or Deactivate the split impulses for contacts
-inline void ContactSolverSystem::setIsSplitImpulseActive(bool isActive) {
+RP3D_FORCE_INLINE void ContactSolverSystem::setIsSplitImpulseActive(bool isActive) {
     mIsSplitImpulseActive = isActive;
 }
 
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void ContactSolverSystem::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void ContactSolverSystem::setProfiler(Profiler* profiler) {
 
 	mProfiler = profiler;
 }
diff --git a/include/reactphysics3d/systems/DynamicsSystem.h b/include/reactphysics3d/systems/DynamicsSystem.h
index 76723ae1..ea87d0eb 100644
--- a/include/reactphysics3d/systems/DynamicsSystem.h
+++ b/include/reactphysics3d/systems/DynamicsSystem.h
@@ -114,7 +114,7 @@ class DynamicsSystem {
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void DynamicsSystem::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void DynamicsSystem::setProfiler(Profiler* profiler) {
     mProfiler = profiler;
 }
 
diff --git a/include/reactphysics3d/systems/SolveBallAndSocketJointSystem.h b/include/reactphysics3d/systems/SolveBallAndSocketJointSystem.h
index bd073781..43b2eec7 100644
--- a/include/reactphysics3d/systems/SolveBallAndSocketJointSystem.h
+++ b/include/reactphysics3d/systems/SolveBallAndSocketJointSystem.h
@@ -123,20 +123,20 @@ class SolveBallAndSocketJointSystem {
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void SolveBallAndSocketJointSystem::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void SolveBallAndSocketJointSystem::setProfiler(Profiler* profiler) {
     mProfiler = profiler;
 }
 
 #endif
 
 // Set the time step
-inline void SolveBallAndSocketJointSystem::setTimeStep(decimal timeStep) {
+RP3D_FORCE_INLINE void SolveBallAndSocketJointSystem::setTimeStep(decimal timeStep) {
     assert(timeStep > decimal(0.0));
     mTimeStep = timeStep;
 }
 
 // Set to true to enable warm starting
-inline void SolveBallAndSocketJointSystem::setIsWarmStartingActive(bool isWarmStartingActive) {
+RP3D_FORCE_INLINE void SolveBallAndSocketJointSystem::setIsWarmStartingActive(bool isWarmStartingActive) {
     mIsWarmStartingActive = isWarmStartingActive;
 }
 
diff --git a/include/reactphysics3d/systems/SolveFixedJointSystem.h b/include/reactphysics3d/systems/SolveFixedJointSystem.h
index 84d77685..79e6c6c2 100644
--- a/include/reactphysics3d/systems/SolveFixedJointSystem.h
+++ b/include/reactphysics3d/systems/SolveFixedJointSystem.h
@@ -120,20 +120,20 @@ class SolveFixedJointSystem {
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void SolveFixedJointSystem::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void SolveFixedJointSystem::setProfiler(Profiler* profiler) {
     mProfiler = profiler;
 }
 
 #endif
 
 // Set the time step
-inline void SolveFixedJointSystem::setTimeStep(decimal timeStep) {
+RP3D_FORCE_INLINE void SolveFixedJointSystem::setTimeStep(decimal timeStep) {
     assert(timeStep > decimal(0.0));
     mTimeStep = timeStep;
 }
 
 // Set to true to enable warm starting
-inline void SolveFixedJointSystem::setIsWarmStartingActive(bool isWarmStartingActive) {
+RP3D_FORCE_INLINE void SolveFixedJointSystem::setIsWarmStartingActive(bool isWarmStartingActive) {
     mIsWarmStartingActive = isWarmStartingActive;
 }
 
diff --git a/include/reactphysics3d/systems/SolveHingeJointSystem.h b/include/reactphysics3d/systems/SolveHingeJointSystem.h
index 05e5f059..811c5544 100644
--- a/include/reactphysics3d/systems/SolveHingeJointSystem.h
+++ b/include/reactphysics3d/systems/SolveHingeJointSystem.h
@@ -138,20 +138,20 @@ class SolveHingeJointSystem {
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void SolveHingeJointSystem::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void SolveHingeJointSystem::setProfiler(Profiler* profiler) {
     mProfiler = profiler;
 }
 
 #endif
 
 // Set the time step
-inline void SolveHingeJointSystem::setTimeStep(decimal timeStep) {
+RP3D_FORCE_INLINE void SolveHingeJointSystem::setTimeStep(decimal timeStep) {
     assert(timeStep > decimal(0.0));
     mTimeStep = timeStep;
 }
 
 // Set to true to enable warm starting
-inline void SolveHingeJointSystem::setIsWarmStartingActive(bool isWarmStartingActive) {
+RP3D_FORCE_INLINE void SolveHingeJointSystem::setIsWarmStartingActive(bool isWarmStartingActive) {
     mIsWarmStartingActive = isWarmStartingActive;
 }
 
diff --git a/include/reactphysics3d/systems/SolveSliderJointSystem.h b/include/reactphysics3d/systems/SolveSliderJointSystem.h
index 9e7d595c..9d60927c 100644
--- a/include/reactphysics3d/systems/SolveSliderJointSystem.h
+++ b/include/reactphysics3d/systems/SolveSliderJointSystem.h
@@ -124,20 +124,20 @@ class SolveSliderJointSystem {
 #ifdef IS_RP3D_PROFILING_ENABLED
 
 // Set the profiler
-inline void SolveSliderJointSystem::setProfiler(Profiler* profiler) {
+RP3D_FORCE_INLINE void SolveSliderJointSystem::setProfiler(Profiler* profiler) {
     mProfiler = profiler;
 }
 
 #endif
 
 // Set the time step
-inline void SolveSliderJointSystem::setTimeStep(decimal timeStep) {
+RP3D_FORCE_INLINE void SolveSliderJointSystem::setTimeStep(decimal timeStep) {
     assert(timeStep > decimal(0.0));
     mTimeStep = timeStep;
 }
 
 // Set to true to enable warm starting
-inline void SolveSliderJointSystem::setIsWarmStartingActive(bool isWarmStartingActive) {
+RP3D_FORCE_INLINE void SolveSliderJointSystem::setIsWarmStartingActive(bool isWarmStartingActive) {
     mIsWarmStartingActive = isWarmStartingActive;
 }
 
diff --git a/include/reactphysics3d/utils/DebugRenderer.h b/include/reactphysics3d/utils/DebugRenderer.h
index cae56c8c..e8e31473 100644
--- a/include/reactphysics3d/utils/DebugRenderer.h
+++ b/include/reactphysics3d/utils/DebugRenderer.h
@@ -263,7 +263,7 @@ class DebugRenderer : public EventListener {
 /**
  * @return The number of lines in the array of lines to draw
  */
-inline uint32 DebugRenderer::getNbLines() const {
+RP3D_FORCE_INLINE uint32 DebugRenderer::getNbLines() const {
 	return mLines.size();
 }
 
@@ -271,7 +271,7 @@ inline uint32 DebugRenderer::getNbLines() const {
 /**
  * @return The list of lines to draw
  */
-inline const List<DebugRenderer::DebugLine>& DebugRenderer::getLines() const {
+RP3D_FORCE_INLINE const List<DebugRenderer::DebugLine>& DebugRenderer::getLines() const {
 	return mLines;
 }
 
@@ -279,7 +279,7 @@ inline const List<DebugRenderer::DebugLine>& DebugRenderer::getLines() const {
 /**
  * @return A pointer to the first element of the lines array to draw
  */
-inline const DebugRenderer::DebugLine* DebugRenderer::getLinesArray() const {
+RP3D_FORCE_INLINE const DebugRenderer::DebugLine* DebugRenderer::getLinesArray() const {
 	return &(mLines[0]);
 }
 
@@ -287,7 +287,7 @@ inline const DebugRenderer::DebugLine* DebugRenderer::getLinesArray() const {
 /**
  * @return The number of triangles in the array of triangles to draw
  */
-inline uint32 DebugRenderer::getNbTriangles() const {
+RP3D_FORCE_INLINE uint32 DebugRenderer::getNbTriangles() const {
 	return mTriangles.size();
 }
 
@@ -295,7 +295,7 @@ inline uint32 DebugRenderer::getNbTriangles() const {
 /**
  * @return The list of triangles to draw
  */
-inline const List<DebugRenderer::DebugTriangle>& DebugRenderer::getTriangles() const {
+RP3D_FORCE_INLINE const List<DebugRenderer::DebugTriangle>& DebugRenderer::getTriangles() const {
 	return mTriangles;
 }
 
@@ -303,7 +303,7 @@ inline const List<DebugRenderer::DebugTriangle>& DebugRenderer::getTriangles() c
 /**
  * @return A pointer to the first element of the triangles array to draw
  */
-inline const DebugRenderer::DebugTriangle* DebugRenderer::getTrianglesArray() const {
+RP3D_FORCE_INLINE const DebugRenderer::DebugTriangle* DebugRenderer::getTrianglesArray() const {
 	return &(mTriangles[0]);
 }
 
@@ -312,7 +312,7 @@ inline const DebugRenderer::DebugTriangle* DebugRenderer::getTrianglesArray() co
  * @param item A debug item
  * @return True if the given debug item is being displayed and false otherwise
  */
-inline bool DebugRenderer::getIsDebugItemDisplayed(DebugItem item) const {
+RP3D_FORCE_INLINE bool DebugRenderer::getIsDebugItemDisplayed(DebugItem item) const {
 	return mDisplayedDebugItems & static_cast<uint32>(item);
 }
 
@@ -321,7 +321,7 @@ inline bool DebugRenderer::getIsDebugItemDisplayed(DebugItem item) const {
  * @param item A debug item to draw
  * @param isDisplayed True if the given debug item has to be displayed and false otherwise
  */
-inline void DebugRenderer::setIsDebugItemDisplayed(DebugItem item, bool isDisplayed) {
+RP3D_FORCE_INLINE void DebugRenderer::setIsDebugItemDisplayed(DebugItem item, bool isDisplayed) {
 	const uint32 itemFlag = static_cast<uint32>(item);
 	uint32 resetBit = ~(itemFlag);
 	mDisplayedDebugItems &= resetBit;
@@ -334,7 +334,7 @@ inline void DebugRenderer::setIsDebugItemDisplayed(DebugItem item, bool isDispla
 /**
  * @return The radius of the sphere used to display a contact point
  */
-inline decimal DebugRenderer::getContactPointSphereRadius() const {
+RP3D_FORCE_INLINE decimal DebugRenderer::getContactPointSphereRadius() const {
     return mContactPointSphereRadius;
 }
 
@@ -342,7 +342,7 @@ inline decimal DebugRenderer::getContactPointSphereRadius() const {
 /**
  * @param radius The radius of the sphere used to display a contact point
  */
-inline void DebugRenderer::setContactPointSphereRadius(decimal radius) {
+RP3D_FORCE_INLINE void DebugRenderer::setContactPointSphereRadius(decimal radius) {
     assert(radius > decimal(0.0));
     mContactPointSphereRadius = radius;
 }
@@ -352,7 +352,7 @@ inline void DebugRenderer::setContactPointSphereRadius(decimal radius) {
 /**
  * @return The length of the contact normal to display
  */
-inline decimal DebugRenderer::getContactNormalLength() const {
+RP3D_FORCE_INLINE decimal DebugRenderer::getContactNormalLength() const {
     return mContactNormalLength;
 }
 
@@ -360,7 +360,7 @@ inline decimal DebugRenderer::getContactNormalLength() const {
 /**
  * @param contactNormalLength The length of the contact normal to display
  */
-inline void DebugRenderer::setContactNormalLength(decimal contactNormalLength) {
+RP3D_FORCE_INLINE void DebugRenderer::setContactNormalLength(decimal contactNormalLength) {
     mContactNormalLength = contactNormalLength;
 }
 
diff --git a/include/reactphysics3d/utils/Profiler.h b/include/reactphysics3d/utils/Profiler.h
index a3ef2a2b..43f4ae0f 100644
--- a/include/reactphysics3d/utils/Profiler.h
+++ b/include/reactphysics3d/utils/Profiler.h
@@ -401,113 +401,113 @@ class ProfileSample {
 #define RP3D_PROFILE(name, profiler) ProfileSample profileSample(name, profiler)
 
 // Return true if we are at the root of the profiler tree
-inline bool ProfileNodeIterator::isRoot() {
+RP3D_FORCE_INLINE bool ProfileNodeIterator::isRoot() {
     return (mCurrentParentNode->getParentNode() == nullptr);
 }
 
 // Return true if we are at the end of a branch of the profiler tree
-inline bool ProfileNodeIterator::isEnd() {
+RP3D_FORCE_INLINE bool ProfileNodeIterator::isEnd() {
     return (mCurrentChildNode == nullptr);
 }
 
 // Return the name of the current node
-inline const char* ProfileNodeIterator::getCurrentName() {
+RP3D_FORCE_INLINE const char* ProfileNodeIterator::getCurrentName() {
     return mCurrentChildNode->getName();
 }
 
 // Return the total time of the current node
-inline long double ProfileNodeIterator::getCurrentTotalTime() {
+RP3D_FORCE_INLINE long double ProfileNodeIterator::getCurrentTotalTime() {
     return mCurrentChildNode->getTotalTime();
 }
 
 // Return the total number of calls of the current node
-inline uint ProfileNodeIterator::getCurrentNbTotalCalls() {
+RP3D_FORCE_INLINE uint ProfileNodeIterator::getCurrentNbTotalCalls() {
     return mCurrentChildNode->getNbTotalCalls();
 }
 
 // Return the name of the current parent node
-inline const char* ProfileNodeIterator::getCurrentParentName() {
+RP3D_FORCE_INLINE const char* ProfileNodeIterator::getCurrentParentName() {
     return mCurrentParentNode->getName();
 }
 
 // Return the total time of the current parent node
-inline long double ProfileNodeIterator::getCurrentParentTotalTime() {
+RP3D_FORCE_INLINE long double ProfileNodeIterator::getCurrentParentTotalTime() {
     return mCurrentParentNode->getTotalTime();
 }
 
 // Return the total number of calls of the current parent node
-inline uint ProfileNodeIterator::getCurrentParentNbTotalCalls() {
+RP3D_FORCE_INLINE uint ProfileNodeIterator::getCurrentParentNbTotalCalls() {
     return mCurrentParentNode->getNbTotalCalls();
 }
 
 // Go to the first node
-inline void ProfileNodeIterator::first() {
+RP3D_FORCE_INLINE void ProfileNodeIterator::first() {
     mCurrentChildNode = mCurrentParentNode->getChildNode();
 }
 
 // Go to the next node
-inline void ProfileNodeIterator::next() {
+RP3D_FORCE_INLINE void ProfileNodeIterator::next() {
     mCurrentChildNode = mCurrentChildNode->getSiblingNode();
 }
 
 // Return a pointer to the parent node
-inline ProfileNode* ProfileNode::getParentNode() {
+RP3D_FORCE_INLINE ProfileNode* ProfileNode::getParentNode() {
     return mParentNode;
 }
 
 // Return a pointer to a sibling node
-inline ProfileNode* ProfileNode::getSiblingNode() {
+RP3D_FORCE_INLINE ProfileNode* ProfileNode::getSiblingNode() {
     return mSiblingNode;
 }
 
 // Return a pointer to a child node
-inline ProfileNode* ProfileNode::getChildNode() {
+RP3D_FORCE_INLINE ProfileNode* ProfileNode::getChildNode() {
     return mChildNode;
 }
 
 // Return the name of the node
-inline const char* ProfileNode::getName() {
+RP3D_FORCE_INLINE const char* ProfileNode::getName() {
     return mName;
 }
 
 // Return the total number of call of the corresponding block of code
-inline uint ProfileNode::getNbTotalCalls() const {
+RP3D_FORCE_INLINE uint ProfileNode::getNbTotalCalls() const {
     return mNbTotalCalls;
 }
 
 // Return the total time spent in the block of code
-inline long double ProfileNode::getTotalTime() const {
+RP3D_FORCE_INLINE long double ProfileNode::getTotalTime() const {
     return mTotalTime;
 }
 
 // Return the number of frames
-inline uint Profiler::getNbFrames() {
+RP3D_FORCE_INLINE uint Profiler::getNbFrames() {
     return mFrameCounter;
 }
 
 // Return the elasped time since the start/reset of the profiling
-inline long double Profiler::getElapsedTimeSinceStart() {
+RP3D_FORCE_INLINE long double Profiler::getElapsedTimeSinceStart() {
     long double currentTime = Timer::getCurrentSystemTime() * 1000.0L;
     return currentTime - mProfilingStartTime;
 }
 
 // Increment the frame counter
-inline void Profiler::incrementFrameCounter() {
+RP3D_FORCE_INLINE void Profiler::incrementFrameCounter() {
     mFrameCounter++;
 }
 
 // Return an iterator over the profiler tree starting at the root
-inline ProfileNodeIterator* Profiler::getIterator() {
+RP3D_FORCE_INLINE ProfileNodeIterator* Profiler::getIterator() {
     return new ProfileNodeIterator(&mRootNode);
 }
 
 // Destroy a previously allocated iterator
-inline void Profiler::destroyIterator(ProfileNodeIterator* iterator) {
+RP3D_FORCE_INLINE void Profiler::destroyIterator(ProfileNodeIterator* iterator) {
     delete iterator;
 }
 
 // Destroy the profiler (release the memory)
-inline void Profiler::destroy() {
+RP3D_FORCE_INLINE void Profiler::destroy() {
     mRootNode.destroy();
 }
 
diff --git a/src/collision/narrowphase/NarrowPhaseInfoBatch.cpp b/src/collision/narrowphase/NarrowPhaseInfoBatch.cpp
index 754161fd..3aef65e3 100644
--- a/src/collision/narrowphase/NarrowPhaseInfoBatch.cpp
+++ b/src/collision/narrowphase/NarrowPhaseInfoBatch.cpp
@@ -43,43 +43,6 @@ NarrowPhaseInfoBatch::~NarrowPhaseInfoBatch() {
     clear();
 }
 
-// Add shapes to be tested during narrow-phase collision detection into the batch
-void NarrowPhaseInfoBatch::addNarrowPhaseInfo(uint64 pairId, uint64 pairIndex, Entity collider1, Entity collider2, CollisionShape* shape1,
-                                              CollisionShape* shape2, const Transform& shape1Transform, const Transform& shape2Transform,
-                                              bool needToReportContacts, MemoryAllocator& shapeAllocator) {
-
-    // Add a collision info for the two collision shapes into the overlapping pair (if not present yet)
-    // TODO OPTI : Can we better manage this
-    LastFrameCollisionInfo* lastFrameInfo = mOverlappingPairs.addLastFrameInfoIfNecessary(pairIndex, shape1->getId(), shape2->getId());
-
-    // Create a meta data object
-    narrowPhaseInfos.emplace(pairId, collider1, collider2, lastFrameInfo, shapeAllocator, shape1Transform, shape2Transform, shape1, shape2, needToReportContacts);
-}
-
-// Add a new contact point
-void NarrowPhaseInfoBatch::addContactPoint(uint index, const Vector3& contactNormal, decimal penDepth, const Vector3& localPt1, const Vector3& localPt2) {
-
-    assert(penDepth > decimal(0.0));
-
-    if (narrowPhaseInfos[index].nbContactPoints < NB_MAX_CONTACT_POINTS_IN_NARROWPHASE_INFO) {
-
-        assert(contactNormal.length() > 0.8f);
-
-        // Add it into the array of contact points
-        narrowPhaseInfos[index].contactPoints[narrowPhaseInfos[index].nbContactPoints].normal = contactNormal;
-        narrowPhaseInfos[index].contactPoints[narrowPhaseInfos[index].nbContactPoints].penetrationDepth = penDepth;
-        narrowPhaseInfos[index].contactPoints[narrowPhaseInfos[index].nbContactPoints].localPoint1 = localPt1;
-        narrowPhaseInfos[index].contactPoints[narrowPhaseInfos[index].nbContactPoints].localPoint2 = localPt2;
-        narrowPhaseInfos[index].nbContactPoints++;
-    }
-}
-
-// Reset the remaining contact points
-void NarrowPhaseInfoBatch::resetContactPoints(uint index) {
-
-    narrowPhaseInfos[index].nbContactPoints = 0;
-}
-
 // Initialize the containers using cached capacity
 void NarrowPhaseInfoBatch::reserveMemory() {
 
diff --git a/src/collision/narrowphase/NarrowPhaseInput.cpp b/src/collision/narrowphase/NarrowPhaseInput.cpp
index 454717f3..fac3d8c3 100644
--- a/src/collision/narrowphase/NarrowPhaseInput.cpp
+++ b/src/collision/narrowphase/NarrowPhaseInput.cpp
@@ -25,7 +25,6 @@
 
 // Libraries
 #include <reactphysics3d/collision/narrowphase/NarrowPhaseInput.h>
-#include <reactphysics3d/collision/narrowphase/CollisionDispatch.h>
 
 using namespace reactphysics3d;
 
@@ -38,37 +37,6 @@ NarrowPhaseInput::NarrowPhaseInput(MemoryAllocator& allocator, OverlappingPairs&
 
 }
 
-// Add shapes to be tested during narrow-phase collision detection into the batch
-void NarrowPhaseInput::addNarrowPhaseTest(uint64 pairId, uint64 pairIndex, Entity collider1, Entity collider2, CollisionShape* shape1, CollisionShape* shape2,
-                                          const Transform& shape1Transform, const Transform& shape2Transform,
-                                          NarrowPhaseAlgorithmType narrowPhaseAlgorithmType, bool reportContacts, MemoryAllocator& shapeAllocator) {
-
-    switch (narrowPhaseAlgorithmType) {
-        case NarrowPhaseAlgorithmType::SphereVsSphere:
-            mSphereVsSphereBatch.addNarrowPhaseInfo(pairId, pairIndex, collider1, collider2, shape1, shape2, shape1Transform, shape2Transform, reportContacts, shapeAllocator);
-            break;
-        case NarrowPhaseAlgorithmType::SphereVsCapsule:
-            mSphereVsCapsuleBatch.addNarrowPhaseInfo(pairId, pairIndex, collider1, collider2, shape1, shape2, shape1Transform, shape2Transform, reportContacts, shapeAllocator);
-            break;
-        case NarrowPhaseAlgorithmType::CapsuleVsCapsule:
-            mCapsuleVsCapsuleBatch.addNarrowPhaseInfo(pairId, pairIndex, collider1, collider2, shape1, shape2, shape1Transform, shape2Transform, reportContacts, shapeAllocator);
-            break;
-        case NarrowPhaseAlgorithmType::SphereVsConvexPolyhedron:
-            mSphereVsConvexPolyhedronBatch.addNarrowPhaseInfo(pairId, pairIndex, collider1, collider2, shape1, shape2, shape1Transform, shape2Transform, reportContacts, shapeAllocator);
-            break;
-        case NarrowPhaseAlgorithmType::CapsuleVsConvexPolyhedron:
-            mCapsuleVsConvexPolyhedronBatch.addNarrowPhaseInfo(pairId, pairIndex, collider1, collider2, shape1, shape2, shape1Transform, shape2Transform, reportContacts, shapeAllocator);
-            break;
-        case NarrowPhaseAlgorithmType::ConvexPolyhedronVsConvexPolyhedron:
-            mConvexPolyhedronVsConvexPolyhedronBatch.addNarrowPhaseInfo(pairId, pairIndex, collider1, collider2, shape1, shape2, shape1Transform, shape2Transform, reportContacts, shapeAllocator);
-            break;
-        case NarrowPhaseAlgorithmType::None:
-            // Must never happen
-            assert(false);
-            break;
-    }
-}
-
 /// Reserve memory for the containers with cached capacity
 void NarrowPhaseInput::reserveMemory() {
 
diff --git a/src/systems/ContactSolverSystem.cpp b/src/systems/ContactSolverSystem.cpp
index b5854a54..c5616648 100644
--- a/src/systems/ContactSolverSystem.cpp
+++ b/src/systems/ContactSolverSystem.cpp
@@ -818,7 +818,7 @@ decimal ContactSolverSystem::computeMixedFrictionCoefficient(Collider* collider1
 }
 
 // Compute th mixed rolling resistance factor between two colliders
-inline decimal ContactSolverSystem::computeMixedRollingResistance(Collider* collider1, Collider* collider2) const {
+RP3D_FORCE_INLINE decimal ContactSolverSystem::computeMixedRollingResistance(Collider* collider1, Collider* collider2) const {
     return decimal(0.5f) * (collider1->getMaterial().getRollingResistance() + collider2->getMaterial().getRollingResistance());
 }