diff --git a/src/body/RigidBody.cpp b/src/body/RigidBody.cpp index 247d64cd..b0fba2e1 100644 --- a/src/body/RigidBody.cpp +++ b/src/body/RigidBody.cpp @@ -57,7 +57,7 @@ RigidBody::~RigidBody() { // Return the type of the body BodyType RigidBody::getType() const { - return mWorld.mDynamicsComponents.getBodyType(mEntity); + return mWorld.mRigidBodyComponents.getBodyType(mEntity); } // Set the type of the body @@ -75,9 +75,9 @@ BodyType RigidBody::getType() const { */ void RigidBody::setType(BodyType type) { - if (mWorld.mDynamicsComponents.getBodyType(mEntity) == type) return; + if (mWorld.mRigidBodyComponents.getBodyType(mEntity) == type) return; - mWorld.mDynamicsComponents.setBodyType(mEntity, type); + mWorld.mRigidBodyComponents.setBodyType(mEntity, type); // Recompute the total mass, center of mass and inertia tensor recomputeMassInformation(); @@ -168,7 +168,7 @@ decimal RigidBody::getMass() const { void RigidBody::applyForce(const Vector3& force, const Vector3& point) { // If it is not a dynamic body, we do nothing - if (mWorld.mDynamicsComponents.getBodyType(mEntity) != BodyType::DYNAMIC) return; + if (mWorld.mRigidBodyComponents.getBodyType(mEntity) != BodyType::DYNAMIC) return; // Awake the body if it was sleeping if (mWorld.mRigidBodyComponents.getIsSleeping(mEntity)) { @@ -197,7 +197,7 @@ void RigidBody::setInertiaTensorLocal(const Matrix3x3& inertiaTensorLocal) { mUserInertiaTensorLocalInverse = inertiaTensorLocal.getInverse(); mIsInertiaTensorSetByUser = true; - if (mWorld.mDynamicsComponents.getBodyType(mEntity) != BodyType::DYNAMIC) return; + if (mWorld.mRigidBodyComponents.getBodyType(mEntity) != BodyType::DYNAMIC) return; // Compute the inverse local inertia tensor mWorld.mDynamicsComponents.setInverseInertiaTensorLocal(mEntity, mUserInertiaTensorLocalInverse); @@ -220,7 +220,7 @@ void RigidBody::setInertiaTensorLocal(const Matrix3x3& inertiaTensorLocal) { void RigidBody::applyForceToCenterOfMass(const Vector3& force) { // If it is not a dynamic body, we do nothing - if (mWorld.mDynamicsComponents.getBodyType(mEntity) != BodyType::DYNAMIC) return; + if (mWorld.mRigidBodyComponents.getBodyType(mEntity) != BodyType::DYNAMIC) return; // Awake the body if it was sleeping if (mWorld.mRigidBodyComponents.getIsSleeping(mEntity)) { @@ -260,7 +260,7 @@ void RigidBody::setInverseInertiaTensorLocal(const Matrix3x3& inverseInertiaTens mUserInertiaTensorLocalInverse = inverseInertiaTensorLocal; mIsInertiaTensorSetByUser = true; - if (mWorld.mDynamicsComponents.getBodyType(mEntity) != BodyType::DYNAMIC) return; + if (mWorld.mRigidBodyComponents.getBodyType(mEntity) != BodyType::DYNAMIC) return; // Compute the inverse local inertia tensor mWorld.mDynamicsComponents.setInverseInertiaTensorLocal(mEntity, mUserInertiaTensorLocalInverse); @@ -283,7 +283,7 @@ void RigidBody::setCenterOfMassLocal(const Vector3& centerOfMassLocal) { // TODO : Check if we need to update the postion of the body here at the end (transform of the body) - if (mWorld.mDynamicsComponents.getBodyType(mEntity) != BodyType::DYNAMIC) return; + if (mWorld.mRigidBodyComponents.getBodyType(mEntity) != BodyType::DYNAMIC) return; mIsCenterOfMassSetByUser = true; @@ -311,7 +311,7 @@ void RigidBody::setCenterOfMassLocal(const Vector3& centerOfMassLocal) { */ void RigidBody::setMass(decimal mass) { - if (mWorld.mDynamicsComponents.getBodyType(mEntity) != BodyType::DYNAMIC) return; + if (mWorld.mRigidBodyComponents.getBodyType(mEntity) != BodyType::DYNAMIC) return; mWorld.mDynamicsComponents.setInitMass(mEntity, mass); @@ -533,7 +533,7 @@ void RigidBody::setMaterial(const Material& material) { void RigidBody::setLinearVelocity(const Vector3& linearVelocity) { // If it is a static body, we do nothing - if (mWorld.mDynamicsComponents.getBodyType(mEntity) == BodyType::STATIC) return; + if (mWorld.mRigidBodyComponents.getBodyType(mEntity) == BodyType::STATIC) return; // Update the linear velocity of the current body state mWorld.mDynamicsComponents.setLinearVelocity(mEntity, linearVelocity); @@ -556,7 +556,7 @@ void RigidBody::setAngularVelocity(const Vector3& angularVelocity) { // TODO : Make sure this method is not called from the internal physics engine // If it is a static body, we do nothing - if (mWorld.mDynamicsComponents.getBodyType(mEntity) == BodyType::STATIC) return; + if (mWorld.mRigidBodyComponents.getBodyType(mEntity) == BodyType::STATIC) return; // Set the angular velocity mWorld.mDynamicsComponents.setAngularVelocity(mEntity, angularVelocity); @@ -617,13 +617,13 @@ void RigidBody::recomputeMassInformation() { const Transform& transform = mWorld.mTransformComponents.getTransform(mEntity); // If it is a STATIC or a KINEMATIC body - BodyType type = mWorld.mDynamicsComponents.getBodyType(mEntity); + BodyType type = mWorld.mRigidBodyComponents.getBodyType(mEntity); if (type == BodyType::STATIC || type == BodyType::KINEMATIC) { mWorld.mDynamicsComponents.setCenterOfMassWorld(mEntity, transform.getPosition()); return; } - assert(mWorld.mDynamicsComponents.getBodyType(mEntity) == BodyType::DYNAMIC); + assert(mWorld.mRigidBodyComponents.getBodyType(mEntity) == BodyType::DYNAMIC); // Compute the total mass of the body const List<Entity>& proxyShapesEntities = mWorld.mCollisionBodyComponents.getProxyShapes(mEntity); @@ -736,7 +736,7 @@ bool RigidBody::isGravityEnabled() const { void RigidBody::applyTorque(const Vector3& torque) { // If it is not a dynamic body, we do nothing - if (mWorld.mDynamicsComponents.getBodyType(mEntity) != BodyType::DYNAMIC) return; + if (mWorld.mRigidBodyComponents.getBodyType(mEntity) != BodyType::DYNAMIC) return; // Awake the body if it was sleeping if (mWorld.mRigidBodyComponents.getIsSleeping(mEntity)) { diff --git a/src/collision/CollisionDetection.cpp b/src/collision/CollisionDetection.cpp index f4cbf475..490562ce 100644 --- a/src/collision/CollisionDetection.cpp +++ b/src/collision/CollisionDetection.cpp @@ -237,10 +237,10 @@ void CollisionDetection::computeMiddlePhase(OverlappingPairMap& overlappingPairs const Entity body1Entity = body1->getEntity(); const Entity body2Entity = body2->getEntity(); - const bool isStaticRigidBody1 = mWorld->mDynamicsComponents.hasComponent(body1Entity) && - mWorld->mDynamicsComponents.getBodyType(body1Entity) == BodyType::STATIC; - const bool isStaticRigidBody2 = mWorld->mDynamicsComponents.hasComponent(body2Entity) && - mWorld->mDynamicsComponents.getBodyType(body2Entity) == BodyType::STATIC; + const bool isStaticRigidBody1 = mWorld->mRigidBodyComponents.hasComponent(body1Entity) && + mWorld->mRigidBodyComponents.getBodyType(body1Entity) == BodyType::STATIC; + const bool isStaticRigidBody2 = mWorld->mRigidBodyComponents.hasComponent(body2Entity) && + mWorld->mRigidBodyComponents.getBodyType(body2Entity) == BodyType::STATIC; // Check that at least one body is enabled (active and awake) and not static bool isBody1Active = !mWorld->mCollisionBodyComponents.getIsEntityDisabled(body1Entity) && !isStaticRigidBody1; diff --git a/src/components/DynamicsComponents.cpp b/src/components/DynamicsComponents.cpp index 3af49c75..a0705531 100644 --- a/src/components/DynamicsComponents.cpp +++ b/src/components/DynamicsComponents.cpp @@ -39,7 +39,7 @@ DynamicsComponents::DynamicsComponents(MemoryAllocator& allocator) sizeof(Vector3) + sizeof(Vector3) + sizeof(Vector3) + sizeof(Vector3) + sizeof(decimal) + sizeof(decimal) + sizeof(decimal) + sizeof(decimal) + sizeof(Matrix3x3) + sizeof(Matrix3x3) + sizeof(Vector3) + sizeof(Quaternion) + sizeof(Vector3) + sizeof(Vector3) + sizeof(bool) + - sizeof(bool) + sizeof(BodyType)) { + sizeof(bool)) { // Allocate memory for the components data allocate(INIT_NB_ALLOCATED_COMPONENTS); @@ -79,7 +79,6 @@ void DynamicsComponents::allocate(uint32 nbComponentsToAllocate) { Vector3* newCentersOfMassWorld = reinterpret_cast<Vector3*>(newCentersOfMassLocal + nbComponentsToAllocate); bool* newIsGravityEnabled = reinterpret_cast<bool*>(newCentersOfMassWorld + nbComponentsToAllocate); bool* newIsAlreadyInIsland = reinterpret_cast<bool*>(newIsGravityEnabled + nbComponentsToAllocate); - BodyType* newBodyTypes = reinterpret_cast<BodyType*>(newIsAlreadyInIsland + nbComponentsToAllocate); // If there was already components before if (mNbComponents > 0) { @@ -106,7 +105,6 @@ void DynamicsComponents::allocate(uint32 nbComponentsToAllocate) { memcpy(newCentersOfMassWorld, mCentersOfMassWorld, mNbComponents * sizeof(Vector3)); memcpy(newIsGravityEnabled, mIsGravityEnabled, mNbComponents * sizeof(bool)); memcpy(newIsAlreadyInIsland, mIsAlreadyInIsland, mNbComponents * sizeof(bool)); - memcpy(newBodyTypes, mBodyTypes, mNbComponents * sizeof(BodyType)); // Deallocate previous memory mMemoryAllocator.release(mBuffer, mNbAllocatedComponents * mComponentDataSize); @@ -134,7 +132,6 @@ void DynamicsComponents::allocate(uint32 nbComponentsToAllocate) { mCentersOfMassWorld = newCentersOfMassWorld; mIsGravityEnabled = newIsGravityEnabled; mIsAlreadyInIsland = newIsAlreadyInIsland; - mBodyTypes = newBodyTypes; mNbAllocatedComponents = nbComponentsToAllocate; } @@ -167,7 +164,6 @@ void DynamicsComponents::addComponent(Entity bodyEntity, bool isSleeping, const new (mCentersOfMassWorld + index) Vector3(component.worldPosition); mIsGravityEnabled[index] = true; mIsAlreadyInIsland[index] = false; - mBodyTypes[index] = component.bodyType; // Map the entity with the new component lookup index mMapEntityToComponentIndex.add(Pair<Entity, uint32>(bodyEntity, index)); @@ -206,7 +202,6 @@ void DynamicsComponents::moveComponentToIndex(uint32 srcIndex, uint32 destIndex) new (mCentersOfMassWorld + destIndex) Vector3(mCentersOfMassWorld[srcIndex]); mIsGravityEnabled[destIndex] = mIsGravityEnabled[srcIndex]; mIsAlreadyInIsland[destIndex] = mIsAlreadyInIsland[srcIndex]; - mBodyTypes[destIndex] = mBodyTypes[srcIndex]; // Destroy the source component destroyComponent(srcIndex); @@ -247,7 +242,6 @@ void DynamicsComponents::swapComponents(uint32 index1, uint32 index2) { Vector3 centerOfMassWorld1 = mCentersOfMassWorld[index1]; bool isGravityEnabled1 = mIsGravityEnabled[index1]; bool isAlreadyInIsland1 = mIsAlreadyInIsland[index1]; - BodyType bodyType1 = mBodyTypes[index1]; // Destroy component 1 destroyComponent(index1); @@ -276,7 +270,6 @@ void DynamicsComponents::swapComponents(uint32 index1, uint32 index2) { mCentersOfMassWorld[index2] = centerOfMassWorld1; mIsGravityEnabled[index2] = isGravityEnabled1; mIsAlreadyInIsland[index2] = isAlreadyInIsland1; - mBodyTypes[index2] = bodyType1; // Update the entity to component index mapping mMapEntityToComponentIndex.add(Pair<Entity, uint32>(entity1, index2)); diff --git a/src/components/DynamicsComponents.h b/src/components/DynamicsComponents.h index cf6f37a0..f19df426 100644 --- a/src/components/DynamicsComponents.h +++ b/src/components/DynamicsComponents.h @@ -126,9 +126,6 @@ class DynamicsComponents : public Components { /// Array with the boolean value to know if the body has already been added into an island bool* mIsAlreadyInIsland; - /// Array with the type of bodies (static, kinematic or dynamic) - BodyType* mBodyTypes; - // -------------------- Methods -------------------- // /// Allocate memory for a given number of components @@ -150,11 +147,9 @@ class DynamicsComponents : public Components { const Vector3& worldPosition; - BodyType bodyType; - /// Constructor - DynamicsComponent(const Vector3& worldPosition, BodyType bodyType) - : worldPosition(worldPosition), bodyType(bodyType) { + DynamicsComponent(const Vector3& worldPosition) + : worldPosition(worldPosition) { } }; @@ -290,12 +285,6 @@ class DynamicsComponents : public Components { /// Set the value to know if the entity is already in an island void setIsAlreadyInIsland(Entity bodyEntity, bool isAlreadyInIsland); - /// Return the body type of a body - BodyType getBodyType(Entity bodyEntity); - - /// Set the body type of a body - void setBodyType(Entity bodyEntity, BodyType bodyType); - // -------------------- Friendship -------------------- // friend class BroadPhaseSystem; @@ -619,7 +608,7 @@ inline void DynamicsComponents::setIsGravityEnabled(Entity bodyEntity, bool isGr mIsGravityEnabled[mMapEntityToComponentIndex[bodyEntity]] = isGravityEnabled; } -/// Set the value to know if the entity is already in an island +// Set the value to know if the entity is already in an island inline void DynamicsComponents::setIsAlreadyInIsland(Entity bodyEntity, bool isAlreadyInIsland) { assert(mMapEntityToComponentIndex.containsKey(bodyEntity)); @@ -627,22 +616,6 @@ inline void DynamicsComponents::setIsAlreadyInIsland(Entity bodyEntity, bool isA mIsAlreadyInIsland[mMapEntityToComponentIndex[bodyEntity]] = isAlreadyInIsland; } -// Return the body type of a body -inline BodyType DynamicsComponents::getBodyType(Entity bodyEntity) { - - assert(mMapEntityToComponentIndex.containsKey(bodyEntity)); - - return mBodyTypes[mMapEntityToComponentIndex[bodyEntity]]; -} - -// Set the body type of a body -inline void DynamicsComponents::setBodyType(Entity bodyEntity, BodyType bodyType) { - - assert(mMapEntityToComponentIndex.containsKey(bodyEntity)); - - mBodyTypes[mMapEntityToComponentIndex[bodyEntity]] = bodyType; -} - } #endif diff --git a/src/components/RigidBodyComponents.cpp b/src/components/RigidBodyComponents.cpp index ac4d2346..b71b3ba2 100644 --- a/src/components/RigidBodyComponents.cpp +++ b/src/components/RigidBodyComponents.cpp @@ -26,6 +26,7 @@ // Libraries #include "RigidBodyComponents.h" #include "engine/EntityManager.h" +#include "body/RigidBody.h" #include <cassert> #include <random> @@ -35,7 +36,7 @@ using namespace reactphysics3d; // Constructor RigidBodyComponents::RigidBodyComponents(MemoryAllocator& allocator) :Components(allocator, sizeof(Entity) + sizeof(RigidBody*) + - sizeof(bool) + sizeof(bool) + sizeof(decimal) ) { + sizeof(bool) + sizeof(bool) + sizeof(decimal) + sizeof(BodyType)) { // Allocate memory for the components data allocate(INIT_NB_ALLOCATED_COMPONENTS); @@ -59,6 +60,7 @@ void RigidBodyComponents::allocate(uint32 nbComponentsToAllocate) { bool* newIsAllowedToSleep = reinterpret_cast<bool*>(newBodies + nbComponentsToAllocate); bool* newIsSleeping = reinterpret_cast<bool*>(newIsAllowedToSleep + nbComponentsToAllocate); decimal* newSleepTimes = reinterpret_cast<decimal*>(newIsSleeping + nbComponentsToAllocate); + BodyType* newBodyTypes = reinterpret_cast<BodyType*>(newSleepTimes + nbComponentsToAllocate); // If there was already components before if (mNbComponents > 0) { @@ -69,6 +71,7 @@ void RigidBodyComponents::allocate(uint32 nbComponentsToAllocate) { memcpy(newIsAllowedToSleep, mIsAllowedToSleep, mNbComponents * sizeof(bool)); memcpy(newIsSleeping, mIsSleeping, mNbComponents * sizeof(bool)); memcpy(newSleepTimes, mSleepTimes, mNbComponents * sizeof(bool)); + memcpy(newBodyTypes, mBodyTypes, mNbComponents * sizeof(BodyType)); // Deallocate previous memory mMemoryAllocator.release(mBuffer, mNbAllocatedComponents * mComponentDataSize); @@ -81,6 +84,7 @@ void RigidBodyComponents::allocate(uint32 nbComponentsToAllocate) { mIsSleeping = newIsSleeping; mSleepTimes = newSleepTimes; mNbAllocatedComponents = nbComponentsToAllocate; + mBodyTypes = newBodyTypes; } // Add a component @@ -95,6 +99,7 @@ void RigidBodyComponents::addComponent(Entity bodyEntity, bool isSleeping, const mIsAllowedToSleep[index] = true; mIsSleeping[index] = false; mSleepTimes[index] = decimal(0); + mBodyTypes[index] = component.bodyType; // Map the entity with the new component lookup index mMapEntityToComponentIndex.add(Pair<Entity, uint32>(bodyEntity, index)); @@ -117,6 +122,7 @@ void RigidBodyComponents::moveComponentToIndex(uint32 srcIndex, uint32 destIndex mIsAllowedToSleep[destIndex] = mIsAllowedToSleep[srcIndex]; mIsSleeping[destIndex] = mIsSleeping[srcIndex]; mSleepTimes[destIndex] = mSleepTimes[srcIndex]; + mBodyTypes[destIndex] = mBodyTypes[srcIndex]; // Destroy the source component destroyComponent(srcIndex); @@ -138,6 +144,7 @@ void RigidBodyComponents::swapComponents(uint32 index1, uint32 index2) { bool isAllowedToSleep1 = mIsAllowedToSleep[index1]; bool isSleeping1 = mIsSleeping[index1]; decimal sleepTime1 = mSleepTimes[index1]; + BodyType bodyType1 = mBodyTypes[index1]; // Destroy component 1 destroyComponent(index1); @@ -150,6 +157,7 @@ void RigidBodyComponents::swapComponents(uint32 index1, uint32 index2) { mIsAllowedToSleep[index2] = isAllowedToSleep1; mIsSleeping[index2] = isSleeping1; mSleepTimes[index2] = sleepTime1; + mBodyTypes[index2] = bodyType1; // Update the entity to component index mapping mMapEntityToComponentIndex.add(Pair<Entity, uint32>(entity1, index2)); diff --git a/src/components/RigidBodyComponents.h b/src/components/RigidBodyComponents.h index 02cdf6e5..df4641f2 100644 --- a/src/components/RigidBodyComponents.h +++ b/src/components/RigidBodyComponents.h @@ -39,6 +39,7 @@ namespace reactphysics3d { class MemoryAllocator; class EntityManager; class RigidBody; +enum class BodyType; // Class RigidBodyComponents /** @@ -66,6 +67,9 @@ class RigidBodyComponents : public Components { /// Array with values for elapsed time since the body velocity was below the sleep velocity decimal* mSleepTimes; + /// Array with the type of bodies (static, kinematic or dynamic) + BodyType* mBodyTypes; + // -------------------- Methods -------------------- // /// Allocate memory for a given number of components @@ -86,9 +90,10 @@ class RigidBodyComponents : public Components { struct RigidBodyComponent { RigidBody* body; + BodyType bodyType; /// Constructor - RigidBodyComponent(RigidBody* body) : body(body) { + RigidBodyComponent(RigidBody* body, BodyType bodyType) : body(body), bodyType(bodyType) { } }; @@ -124,6 +129,13 @@ class RigidBodyComponents : public Components { /// Set the sleep time void setSleepTime(Entity bodyEntity, decimal sleepTime) const; + + /// Return the body type of a body + BodyType getBodyType(Entity bodyEntity); + + /// Set the body type of a body + void setBodyType(Entity bodyEntity, BodyType bodyType); + }; // Return a pointer to a body rigid @@ -182,6 +194,23 @@ inline void RigidBodyComponents::setSleepTime(Entity bodyEntity, decimal sleepTi mSleepTimes[mMapEntityToComponentIndex[bodyEntity]] = sleepTime; } +// Return the body type of a body +inline BodyType RigidBodyComponents::getBodyType(Entity bodyEntity) { + + assert(mMapEntityToComponentIndex.containsKey(bodyEntity)); + + return mBodyTypes[mMapEntityToComponentIndex[bodyEntity]]; +} + +// Set the body type of a body +inline void RigidBodyComponents::setBodyType(Entity bodyEntity, BodyType bodyType) { + + assert(mMapEntityToComponentIndex.containsKey(bodyEntity)); + + mBodyTypes[mMapEntityToComponentIndex[bodyEntity]] = bodyType; +} + + } #endif diff --git a/src/engine/DynamicsWorld.cpp b/src/engine/DynamicsWorld.cpp index 8e32e252..71cb745b 100644 --- a/src/engine/DynamicsWorld.cpp +++ b/src/engine/DynamicsWorld.cpp @@ -376,8 +376,7 @@ RigidBody* DynamicsWorld::createRigidBody(const Transform& transform) { Entity entity = mEntityManager.createEntity(); mTransformComponents.addComponent(entity, false, TransformComponents::TransformComponent(transform)); - mDynamicsComponents.addComponent(entity, false, DynamicsComponents::DynamicsComponent(transform.getPosition(), - BodyType::DYNAMIC)); + mDynamicsComponents.addComponent(entity, false, DynamicsComponents::DynamicsComponent(transform.getPosition())); // Create the rigid body RigidBody* rigidBody = new (mMemoryManager.allocate(MemoryManager::AllocationType::Pool, @@ -387,7 +386,7 @@ RigidBody* DynamicsWorld::createRigidBody(const Transform& transform) { CollisionBodyComponents::CollisionBodyComponent bodyComponent(rigidBody); mCollisionBodyComponents.addComponent(entity, false, bodyComponent); - RigidBodyComponents::RigidBodyComponent rigidBodyComponent(rigidBody); + RigidBodyComponents::RigidBodyComponent rigidBodyComponent(rigidBody, BodyType::DYNAMIC); mRigidBodyComponents.addComponent(entity, false, rigidBodyComponent); // Add the rigid body to the physics world @@ -660,7 +659,8 @@ void DynamicsWorld::createIslands() { if (mDynamicsComponents.mIsAlreadyInIsland[b]) continue; // If the body is static, we go to the next body - if (mDynamicsComponents.mBodyTypes[b] == BodyType::STATIC) continue; + // TODO : Check if we still need this test if we loop over dynamicsComponents and static bodies are not part of them + if (mRigidBodyComponents.getBodyType(mDynamicsComponents.mBodies[b]) == BodyType::STATIC) continue; // Reset the stack of bodies to visit bodyEntityIndicesToVisit.clear(); @@ -771,7 +771,7 @@ void DynamicsWorld::createIslands() { // can also be included in the other islands for (uint j=0; j < mDynamicsComponents.getNbEnabledComponents(); j++) { - if (mDynamicsComponents.mBodyTypes[j] == BodyType::STATIC) { + if (mRigidBodyComponents.getBodyType(mDynamicsComponents.mBodies[j]) == BodyType::STATIC) { mDynamicsComponents.mIsAlreadyInIsland[j] = false; } } @@ -808,7 +808,7 @@ void DynamicsWorld::updateSleepingBodies() { RigidBody* body = mRigidBodyComponents.getRigidBody(bodyEntity); // Skip static bodies - if (mDynamicsComponents.getBodyType(body->getEntity()) == BodyType::STATIC) continue; + if (mRigidBodyComponents.getBodyType(bodyEntity) == BodyType::STATIC) continue; // If the body is velocity is large enough to stay awake if (mDynamicsComponents.getLinearVelocity(bodyEntity).lengthSquare() > sleepLinearVelocitySquare ||