Add constrained position/orientation to DynamicsComponents
This commit is contained in:
parent
a11d884ce1
commit
1bc7e0710b
|
@ -38,7 +38,7 @@ DynamicsComponents::DynamicsComponents(MemoryAllocator& allocator)
|
||||||
:Components(allocator, sizeof(Entity) + sizeof(Vector3) + sizeof(Vector3) + sizeof(Vector3) + sizeof(Vector3) +
|
:Components(allocator, sizeof(Entity) + sizeof(Vector3) + sizeof(Vector3) + sizeof(Vector3) + sizeof(Vector3) +
|
||||||
sizeof(Vector3) + sizeof(Vector3) + sizeof(Vector3) + sizeof(Vector3) + sizeof(decimal) +
|
sizeof(Vector3) + sizeof(Vector3) + sizeof(Vector3) + sizeof(Vector3) + sizeof(decimal) +
|
||||||
sizeof(decimal) + sizeof(decimal) + sizeof(decimal) + sizeof(Matrix3x3) + sizeof(Matrix3x3) +
|
sizeof(decimal) + sizeof(decimal) + sizeof(decimal) + sizeof(Matrix3x3) + sizeof(Matrix3x3) +
|
||||||
sizeof(bool) + sizeof(bool)) {
|
sizeof(Vector3) + sizeof(Quaternion) + sizeof(bool) + sizeof(bool)) {
|
||||||
|
|
||||||
// Allocate memory for the components data
|
// Allocate memory for the components data
|
||||||
allocate(INIT_NB_ALLOCATED_COMPONENTS);
|
allocate(INIT_NB_ALLOCATED_COMPONENTS);
|
||||||
|
@ -72,7 +72,9 @@ void DynamicsComponents::allocate(uint32 nbComponentsToAllocate) {
|
||||||
decimal* newInverseMasses = reinterpret_cast<decimal*>(newInitMasses + nbComponentsToAllocate);
|
decimal* newInverseMasses = reinterpret_cast<decimal*>(newInitMasses + nbComponentsToAllocate);
|
||||||
Matrix3x3* newInertiaTensorLocalInverses = reinterpret_cast<Matrix3x3*>(newInverseMasses + nbComponentsToAllocate);
|
Matrix3x3* newInertiaTensorLocalInverses = reinterpret_cast<Matrix3x3*>(newInverseMasses + nbComponentsToAllocate);
|
||||||
Matrix3x3* newInertiaTensorWorldInverses = reinterpret_cast<Matrix3x3*>(newInertiaTensorLocalInverses + nbComponentsToAllocate);
|
Matrix3x3* newInertiaTensorWorldInverses = reinterpret_cast<Matrix3x3*>(newInertiaTensorLocalInverses + nbComponentsToAllocate);
|
||||||
bool* newIsGravityEnabled = reinterpret_cast<bool*>(newInertiaTensorWorldInverses + nbComponentsToAllocate);
|
Vector3* newConstrainedPositions = reinterpret_cast<Vector3*>(newInertiaTensorWorldInverses + nbComponentsToAllocate);
|
||||||
|
Quaternion* newConstrainedOrientations = reinterpret_cast<Quaternion*>(newConstrainedPositions + nbComponentsToAllocate);
|
||||||
|
bool* newIsGravityEnabled = reinterpret_cast<bool*>(newConstrainedOrientations + nbComponentsToAllocate);
|
||||||
bool* newIsAlreadyInIsland = reinterpret_cast<bool*>(newIsGravityEnabled + nbComponentsToAllocate);
|
bool* newIsAlreadyInIsland = reinterpret_cast<bool*>(newIsGravityEnabled + nbComponentsToAllocate);
|
||||||
|
|
||||||
// If there was already components before
|
// If there was already components before
|
||||||
|
@ -94,6 +96,8 @@ void DynamicsComponents::allocate(uint32 nbComponentsToAllocate) {
|
||||||
memcpy(newInverseMasses, mInverseMasses, mNbComponents * sizeof(decimal));
|
memcpy(newInverseMasses, mInverseMasses, mNbComponents * sizeof(decimal));
|
||||||
memcpy(newInertiaTensorLocalInverses, mInverseInertiaTensorsLocal, mNbComponents * sizeof(Matrix3x3));
|
memcpy(newInertiaTensorLocalInverses, mInverseInertiaTensorsLocal, mNbComponents * sizeof(Matrix3x3));
|
||||||
memcpy(newInertiaTensorWorldInverses, mInverseInertiaTensorsWorld, mNbComponents * sizeof(Matrix3x3));
|
memcpy(newInertiaTensorWorldInverses, mInverseInertiaTensorsWorld, mNbComponents * sizeof(Matrix3x3));
|
||||||
|
memcpy(newConstrainedPositions, mConstrainedPositions, mNbComponents * sizeof(Vector3));
|
||||||
|
memcpy(newConstrainedOrientations, mConstrainedOrientations, mNbComponents * sizeof(Quaternion));
|
||||||
memcpy(newIsGravityEnabled, mIsGravityEnabled, mNbComponents * sizeof(bool));
|
memcpy(newIsGravityEnabled, mIsGravityEnabled, mNbComponents * sizeof(bool));
|
||||||
memcpy(newIsAlreadyInIsland, mIsAlreadyInIsland, mNbComponents * sizeof(bool));
|
memcpy(newIsAlreadyInIsland, mIsAlreadyInIsland, mNbComponents * sizeof(bool));
|
||||||
|
|
||||||
|
@ -117,6 +121,8 @@ void DynamicsComponents::allocate(uint32 nbComponentsToAllocate) {
|
||||||
mInverseMasses = newInverseMasses;
|
mInverseMasses = newInverseMasses;
|
||||||
mInverseInertiaTensorsLocal = newInertiaTensorLocalInverses;
|
mInverseInertiaTensorsLocal = newInertiaTensorLocalInverses;
|
||||||
mInverseInertiaTensorsWorld = newInertiaTensorWorldInverses;
|
mInverseInertiaTensorsWorld = newInertiaTensorWorldInverses;
|
||||||
|
mConstrainedPositions = newConstrainedPositions;
|
||||||
|
mConstrainedOrientations = newConstrainedOrientations;
|
||||||
mIsGravityEnabled = newIsGravityEnabled;
|
mIsGravityEnabled = newIsGravityEnabled;
|
||||||
mIsAlreadyInIsland = newIsAlreadyInIsland;
|
mIsAlreadyInIsland = newIsAlreadyInIsland;
|
||||||
mNbAllocatedComponents = nbComponentsToAllocate;
|
mNbAllocatedComponents = nbComponentsToAllocate;
|
||||||
|
@ -144,6 +150,8 @@ void DynamicsComponents::addComponent(Entity bodyEntity, bool isSleeping, const
|
||||||
mInverseMasses[index] = decimal(1.0);
|
mInverseMasses[index] = decimal(1.0);
|
||||||
new (mInverseInertiaTensorsLocal + index) Matrix3x3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);
|
new (mInverseInertiaTensorsLocal + index) Matrix3x3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);
|
||||||
new (mInverseInertiaTensorsWorld + index) Matrix3x3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);
|
new (mInverseInertiaTensorsWorld + index) Matrix3x3(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);
|
||||||
|
new (mConstrainedPositions + index) Vector3(0, 0, 0);
|
||||||
|
new (mConstrainedOrientations + index) Quaternion(0, 0, 0, 1);
|
||||||
mIsGravityEnabled[index] = true;
|
mIsGravityEnabled[index] = true;
|
||||||
mIsAlreadyInIsland[index] = false;
|
mIsAlreadyInIsland[index] = false;
|
||||||
|
|
||||||
|
@ -178,6 +186,8 @@ void DynamicsComponents::moveComponentToIndex(uint32 srcIndex, uint32 destIndex)
|
||||||
mInverseMasses[destIndex] = mInverseMasses[srcIndex];
|
mInverseMasses[destIndex] = mInverseMasses[srcIndex];
|
||||||
mInverseInertiaTensorsLocal[destIndex] = mInverseInertiaTensorsLocal[srcIndex];
|
mInverseInertiaTensorsLocal[destIndex] = mInverseInertiaTensorsLocal[srcIndex];
|
||||||
mInverseInertiaTensorsWorld[destIndex] = mInverseInertiaTensorsWorld[srcIndex];
|
mInverseInertiaTensorsWorld[destIndex] = mInverseInertiaTensorsWorld[srcIndex];
|
||||||
|
mConstrainedPositions[destIndex] = mConstrainedPositions[srcIndex];
|
||||||
|
mConstrainedOrientations[destIndex] = mConstrainedOrientations[srcIndex];
|
||||||
mIsGravityEnabled[destIndex] = mIsGravityEnabled[srcIndex];
|
mIsGravityEnabled[destIndex] = mIsGravityEnabled[srcIndex];
|
||||||
mIsAlreadyInIsland[destIndex] = mIsAlreadyInIsland[srcIndex];
|
mIsAlreadyInIsland[destIndex] = mIsAlreadyInIsland[srcIndex];
|
||||||
|
|
||||||
|
@ -214,6 +224,8 @@ void DynamicsComponents::swapComponents(uint32 index1, uint32 index2) {
|
||||||
decimal inverseMass1 = mInverseMasses[index1];
|
decimal inverseMass1 = mInverseMasses[index1];
|
||||||
Matrix3x3 inertiaTensorLocalInverse1 = mInverseInertiaTensorsLocal[index1];
|
Matrix3x3 inertiaTensorLocalInverse1 = mInverseInertiaTensorsLocal[index1];
|
||||||
Matrix3x3 inertiaTensorWorldInverse1 = mInverseInertiaTensorsWorld[index1];
|
Matrix3x3 inertiaTensorWorldInverse1 = mInverseInertiaTensorsWorld[index1];
|
||||||
|
Vector3 constrainedPosition1 = mConstrainedPositions[index1];
|
||||||
|
Quaternion constrainedOrientation1 = mConstrainedOrientations[index1];
|
||||||
bool isGravityEnabled1 = mIsGravityEnabled[index1];
|
bool isGravityEnabled1 = mIsGravityEnabled[index1];
|
||||||
bool isAlreadyInIsland1 = mIsAlreadyInIsland[index1];
|
bool isAlreadyInIsland1 = mIsAlreadyInIsland[index1];
|
||||||
|
|
||||||
|
@ -238,6 +250,8 @@ void DynamicsComponents::swapComponents(uint32 index1, uint32 index2) {
|
||||||
mInverseMasses[index2] = inverseMass1;
|
mInverseMasses[index2] = inverseMass1;
|
||||||
mInverseInertiaTensorsLocal[index2] = inertiaTensorLocalInverse1;
|
mInverseInertiaTensorsLocal[index2] = inertiaTensorLocalInverse1;
|
||||||
mInverseInertiaTensorsWorld[index2] = inertiaTensorWorldInverse1;
|
mInverseInertiaTensorsWorld[index2] = inertiaTensorWorldInverse1;
|
||||||
|
mConstrainedPositions[index2] = constrainedPosition1;
|
||||||
|
mConstrainedOrientations[index2] = constrainedOrientation1;
|
||||||
mIsGravityEnabled[index2] = isGravityEnabled1;
|
mIsGravityEnabled[index2] = isGravityEnabled1;
|
||||||
mIsAlreadyInIsland[index2] = isAlreadyInIsland1;
|
mIsAlreadyInIsland[index2] = isAlreadyInIsland1;
|
||||||
|
|
||||||
|
@ -269,4 +283,6 @@ void DynamicsComponents::destroyComponent(uint32 index) {
|
||||||
mExternalTorques[index].~Vector3();
|
mExternalTorques[index].~Vector3();
|
||||||
mInverseInertiaTensorsLocal[index].~Matrix3x3();
|
mInverseInertiaTensorsLocal[index].~Matrix3x3();
|
||||||
mInverseInertiaTensorsWorld[index].~Matrix3x3();
|
mInverseInertiaTensorsWorld[index].~Matrix3x3();
|
||||||
|
mConstrainedPositions[index].~Vector3();
|
||||||
|
mConstrainedOrientations[index].~Quaternion();
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,6 +96,12 @@ class DynamicsComponents : public Components {
|
||||||
/// Array with the inverse of the world inertia tensor of each component
|
/// Array with the inverse of the world inertia tensor of each component
|
||||||
Matrix3x3* mInverseInertiaTensorsWorld;
|
Matrix3x3* mInverseInertiaTensorsWorld;
|
||||||
|
|
||||||
|
/// Array with the constrained position of each component (for position error correction)
|
||||||
|
Vector3* mConstrainedPositions;
|
||||||
|
|
||||||
|
/// Array of constrained orientation for each component (for position error correction)
|
||||||
|
Quaternion* mConstrainedOrientations;
|
||||||
|
|
||||||
/// True if the gravity needs to be applied to this component
|
/// True if the gravity needs to be applied to this component
|
||||||
bool* mIsGravityEnabled;
|
bool* mIsGravityEnabled;
|
||||||
|
|
||||||
|
@ -184,6 +190,12 @@ class DynamicsComponents : public Components {
|
||||||
/// Return the inverse world inertia tensor of an entity
|
/// Return the inverse world inertia tensor of an entity
|
||||||
const Matrix3x3& getInertiaTensorWorldInverse(Entity bodyEntity);
|
const Matrix3x3& getInertiaTensorWorldInverse(Entity bodyEntity);
|
||||||
|
|
||||||
|
/// Return the constrained position of an entity
|
||||||
|
const Vector3& getConstrainedPosition(Entity bodyEntity);
|
||||||
|
|
||||||
|
/// Return the constrained orientation of an entity
|
||||||
|
const Quaternion& getConstrainedOrientation(Entity bodyEntity);
|
||||||
|
|
||||||
/// Return true if gravity is enabled for this entity
|
/// Return true if gravity is enabled for this entity
|
||||||
bool getIsGravityEnabled(Entity bodyEntity) const;
|
bool getIsGravityEnabled(Entity bodyEntity) const;
|
||||||
|
|
||||||
|
@ -232,6 +244,12 @@ class DynamicsComponents : public Components {
|
||||||
/// Set the inverse world inertia tensor of an entity
|
/// Set the inverse world inertia tensor of an entity
|
||||||
void setInverseInertiaTensorWorld(Entity bodyEntity, const Matrix3x3& inertiaTensorWorldInverse);
|
void setInverseInertiaTensorWorld(Entity bodyEntity, const Matrix3x3& inertiaTensorWorldInverse);
|
||||||
|
|
||||||
|
/// Set the constrained position of an entity
|
||||||
|
void setConstrainedPosition(Entity bodyEntity, const Vector3& constrainedPosition);
|
||||||
|
|
||||||
|
/// Set the constrained orientation of an entity
|
||||||
|
void setConstrainedOrientation(Entity bodyEntity, const Quaternion& constrainedOrientation);
|
||||||
|
|
||||||
/// Set the value to know if the gravity is enabled for this entity
|
/// Set the value to know if the gravity is enabled for this entity
|
||||||
bool setIsGravityEnabled(Entity bodyEntity, bool isGravityEnabled);
|
bool setIsGravityEnabled(Entity bodyEntity, bool isGravityEnabled);
|
||||||
|
|
||||||
|
@ -378,6 +396,22 @@ inline const Matrix3x3& DynamicsComponents::getInertiaTensorWorldInverse(Entity
|
||||||
return mInverseInertiaTensorsWorld[mMapEntityToComponentIndex[bodyEntity]];
|
return mInverseInertiaTensorsWorld[mMapEntityToComponentIndex[bodyEntity]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return the constrained position of an entity
|
||||||
|
inline const Vector3& DynamicsComponents::getConstrainedPosition(Entity bodyEntity) {
|
||||||
|
|
||||||
|
assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
|
||||||
|
|
||||||
|
return mConstrainedPositions[mMapEntityToComponentIndex[bodyEntity]];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the constrained orientation of an entity
|
||||||
|
inline const Quaternion& DynamicsComponents::getConstrainedOrientation(Entity bodyEntity) {
|
||||||
|
|
||||||
|
assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
|
||||||
|
|
||||||
|
return mConstrainedOrientations[mMapEntityToComponentIndex[bodyEntity]];
|
||||||
|
}
|
||||||
|
|
||||||
// Set the constrained linear velocity of an entity
|
// Set the constrained linear velocity of an entity
|
||||||
inline void DynamicsComponents::setConstrainedLinearVelocity(Entity bodyEntity, const Vector3& constrainedLinearVelocity) {
|
inline void DynamicsComponents::setConstrainedLinearVelocity(Entity bodyEntity, const Vector3& constrainedLinearVelocity) {
|
||||||
|
|
||||||
|
@ -474,6 +508,22 @@ inline void DynamicsComponents::setInverseInertiaTensorWorld(Entity bodyEntity,
|
||||||
mInverseInertiaTensorsWorld[mMapEntityToComponentIndex[bodyEntity]] = inertiaTensorWorldInverse;
|
mInverseInertiaTensorsWorld[mMapEntityToComponentIndex[bodyEntity]] = inertiaTensorWorldInverse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the constrained position of an entity
|
||||||
|
inline void DynamicsComponents::setConstrainedPosition(Entity bodyEntity, const Vector3& constrainedPosition) {
|
||||||
|
|
||||||
|
assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
|
||||||
|
|
||||||
|
mConstrainedPositions[mMapEntityToComponentIndex[bodyEntity]] = constrainedPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the constrained orientation of an entity
|
||||||
|
inline void DynamicsComponents::setConstrainedOrientation(Entity bodyEntity, const Quaternion& constrainedOrientation) {
|
||||||
|
|
||||||
|
assert(mMapEntityToComponentIndex.containsKey(bodyEntity));
|
||||||
|
|
||||||
|
mConstrainedOrientations[mMapEntityToComponentIndex[bodyEntity]] = constrainedOrientation;
|
||||||
|
}
|
||||||
|
|
||||||
// Return true if gravity is enabled for this entity
|
// Return true if gravity is enabled for this entity
|
||||||
inline bool DynamicsComponents::getIsGravityEnabled(Entity bodyEntity) const {
|
inline bool DynamicsComponents::getIsGravityEnabled(Entity bodyEntity) const {
|
||||||
|
|
||||||
|
|
|
@ -169,10 +169,10 @@ void BallAndSocketJoint::solvePositionConstraint(const ConstraintSolverData& con
|
||||||
if (mPositionCorrectionTechnique != JointsPositionCorrectionTechnique::NON_LINEAR_GAUSS_SEIDEL) return;
|
if (mPositionCorrectionTechnique != JointsPositionCorrectionTechnique::NON_LINEAR_GAUSS_SEIDEL) return;
|
||||||
|
|
||||||
// Get the bodies center of mass and orientations
|
// Get the bodies center of mass and orientations
|
||||||
Vector3& x1 = constraintSolverData.positions[mIndexBody1];
|
Vector3 x1 = constraintSolverData.dynamicsComponents.getConstrainedPosition(mBody1Entity);
|
||||||
Vector3& x2 = constraintSolverData.positions[mIndexBody2];
|
Vector3 x2 = constraintSolverData.dynamicsComponents.getConstrainedPosition(mBody2Entity);
|
||||||
Quaternion& q1 = constraintSolverData.orientations[mIndexBody1];
|
Quaternion q1 = constraintSolverData.dynamicsComponents.getConstrainedOrientation(mBody1Entity);
|
||||||
Quaternion& q2 = constraintSolverData.orientations[mIndexBody2];
|
Quaternion q2 = constraintSolverData.dynamicsComponents.getConstrainedOrientation(mBody2Entity);
|
||||||
|
|
||||||
// Get the inverse mass and inverse inertia tensors of the bodies
|
// Get the inverse mass and inverse inertia tensors of the bodies
|
||||||
const decimal inverseMassBody1 = constraintSolverData.dynamicsComponents.getMassInverse(mBody1Entity);
|
const decimal inverseMassBody1 = constraintSolverData.dynamicsComponents.getMassInverse(mBody1Entity);
|
||||||
|
@ -234,5 +234,10 @@ void BallAndSocketJoint::solvePositionConstraint(const ConstraintSolverData& con
|
||||||
x2 += v2;
|
x2 += v2;
|
||||||
q2 += Quaternion(0, w2) * q2 * decimal(0.5);
|
q2 += Quaternion(0, w2) * q2 * decimal(0.5);
|
||||||
q2.normalize();
|
q2.normalize();
|
||||||
|
|
||||||
|
constraintSolverData.dynamicsComponents.setConstrainedPosition(mBody1Entity, x1);
|
||||||
|
constraintSolverData.dynamicsComponents.setConstrainedPosition(mBody2Entity, x2);
|
||||||
|
constraintSolverData.dynamicsComponents.setConstrainedOrientation(mBody1Entity, q1);
|
||||||
|
constraintSolverData.dynamicsComponents.setConstrainedOrientation(mBody2Entity, q2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -235,10 +235,10 @@ void FixedJoint::solvePositionConstraint(const ConstraintSolverData& constraintS
|
||||||
if (mPositionCorrectionTechnique != JointsPositionCorrectionTechnique::NON_LINEAR_GAUSS_SEIDEL) return;
|
if (mPositionCorrectionTechnique != JointsPositionCorrectionTechnique::NON_LINEAR_GAUSS_SEIDEL) return;
|
||||||
|
|
||||||
// Get the bodies positions and orientations
|
// Get the bodies positions and orientations
|
||||||
Vector3& x1 = constraintSolverData.positions[mIndexBody1];
|
Vector3 x1 = constraintSolverData.dynamicsComponents.getConstrainedPosition(mBody1Entity);
|
||||||
Vector3& x2 = constraintSolverData.positions[mIndexBody2];
|
Vector3 x2 = constraintSolverData.dynamicsComponents.getConstrainedPosition(mBody2Entity);
|
||||||
Quaternion& q1 = constraintSolverData.orientations[mIndexBody1];
|
Quaternion q1 = constraintSolverData.dynamicsComponents.getConstrainedOrientation(mBody1Entity);
|
||||||
Quaternion& q2 = constraintSolverData.orientations[mIndexBody2];
|
Quaternion q2 = constraintSolverData.dynamicsComponents.getConstrainedOrientation(mBody2Entity);
|
||||||
|
|
||||||
// Get the inverse mass and inverse inertia tensors of the bodies
|
// Get the inverse mass and inverse inertia tensors of the bodies
|
||||||
decimal inverseMassBody1 = constraintSolverData.dynamicsComponents.getMassInverse(mBody1Entity);
|
decimal inverseMassBody1 = constraintSolverData.dynamicsComponents.getMassInverse(mBody1Entity);
|
||||||
|
@ -357,5 +357,10 @@ void FixedJoint::solvePositionConstraint(const ConstraintSolverData& constraintS
|
||||||
// Update the body position/orientation of body 2
|
// Update the body position/orientation of body 2
|
||||||
q2 += Quaternion(0, w2) * q2 * decimal(0.5);
|
q2 += Quaternion(0, w2) * q2 * decimal(0.5);
|
||||||
q2.normalize();
|
q2.normalize();
|
||||||
|
|
||||||
|
constraintSolverData.dynamicsComponents.setConstrainedPosition(mBody1Entity, x1);
|
||||||
|
constraintSolverData.dynamicsComponents.setConstrainedPosition(mBody2Entity, x2);
|
||||||
|
constraintSolverData.dynamicsComponents.setConstrainedOrientation(mBody1Entity, q1);
|
||||||
|
constraintSolverData.dynamicsComponents.setConstrainedOrientation(mBody2Entity, q2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -414,10 +414,10 @@ void HingeJoint::solvePositionConstraint(const ConstraintSolverData& constraintS
|
||||||
if (mPositionCorrectionTechnique != JointsPositionCorrectionTechnique::NON_LINEAR_GAUSS_SEIDEL) return;
|
if (mPositionCorrectionTechnique != JointsPositionCorrectionTechnique::NON_LINEAR_GAUSS_SEIDEL) return;
|
||||||
|
|
||||||
// Get the bodies positions and orientations
|
// Get the bodies positions and orientations
|
||||||
Vector3& x1 = constraintSolverData.positions[mIndexBody1];
|
Vector3 x1 = constraintSolverData.dynamicsComponents.getConstrainedPosition(mBody1Entity);
|
||||||
Vector3& x2 = constraintSolverData.positions[mIndexBody2];
|
Vector3 x2 = constraintSolverData.dynamicsComponents.getConstrainedPosition(mBody2Entity);
|
||||||
Quaternion& q1 = constraintSolverData.orientations[mIndexBody1];
|
Quaternion q1 = constraintSolverData.dynamicsComponents.getConstrainedOrientation(mBody1Entity);
|
||||||
Quaternion& q2 = constraintSolverData.orientations[mIndexBody2];
|
Quaternion q2 = constraintSolverData.dynamicsComponents.getConstrainedOrientation(mBody2Entity);
|
||||||
|
|
||||||
// Get the inverse mass and inverse inertia tensors of the bodies
|
// Get the inverse mass and inverse inertia tensors of the bodies
|
||||||
decimal inverseMassBody1 = constraintSolverData.dynamicsComponents.getMassInverse(mBody1Entity);
|
decimal inverseMassBody1 = constraintSolverData.dynamicsComponents.getMassInverse(mBody1Entity);
|
||||||
|
@ -614,6 +614,11 @@ void HingeJoint::solvePositionConstraint(const ConstraintSolverData& constraintS
|
||||||
q2.normalize();
|
q2.normalize();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constraintSolverData.dynamicsComponents.setConstrainedPosition(mBody1Entity, x1);
|
||||||
|
constraintSolverData.dynamicsComponents.setConstrainedPosition(mBody2Entity, x2);
|
||||||
|
constraintSolverData.dynamicsComponents.setConstrainedOrientation(mBody1Entity, q1);
|
||||||
|
constraintSolverData.dynamicsComponents.setConstrainedOrientation(mBody2Entity, q2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -446,10 +446,10 @@ void SliderJoint::solvePositionConstraint(const ConstraintSolverData& constraint
|
||||||
if (mPositionCorrectionTechnique != JointsPositionCorrectionTechnique::NON_LINEAR_GAUSS_SEIDEL) return;
|
if (mPositionCorrectionTechnique != JointsPositionCorrectionTechnique::NON_LINEAR_GAUSS_SEIDEL) return;
|
||||||
|
|
||||||
// Get the bodies positions and orientations
|
// Get the bodies positions and orientations
|
||||||
Vector3& x1 = constraintSolverData.positions[mIndexBody1];
|
Vector3 x1 = constraintSolverData.dynamicsComponents.getConstrainedPosition(mBody1Entity);
|
||||||
Vector3& x2 = constraintSolverData.positions[mIndexBody2];
|
Vector3 x2 = constraintSolverData.dynamicsComponents.getConstrainedPosition(mBody2Entity);
|
||||||
Quaternion& q1 = constraintSolverData.orientations[mIndexBody1];
|
Quaternion q1 = constraintSolverData.dynamicsComponents.getConstrainedOrientation(mBody1Entity);
|
||||||
Quaternion& q2 = constraintSolverData.orientations[mIndexBody2];
|
Quaternion q2 = constraintSolverData.dynamicsComponents.getConstrainedOrientation(mBody2Entity);
|
||||||
|
|
||||||
// Get the inverse mass and inverse inertia tensors of the bodies
|
// Get the inverse mass and inverse inertia tensors of the bodies
|
||||||
const decimal inverseMassBody1 = constraintSolverData.dynamicsComponents.getMassInverse(mBody1Entity);
|
const decimal inverseMassBody1 = constraintSolverData.dynamicsComponents.getMassInverse(mBody1Entity);
|
||||||
|
@ -689,6 +689,11 @@ void SliderJoint::solvePositionConstraint(const ConstraintSolverData& constraint
|
||||||
q2.normalize();
|
q2.normalize();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constraintSolverData.dynamicsComponents.setConstrainedPosition(mBody1Entity, x1);
|
||||||
|
constraintSolverData.dynamicsComponents.setConstrainedPosition(mBody2Entity, x2);
|
||||||
|
constraintSolverData.dynamicsComponents.setConstrainedOrientation(mBody1Entity, q1);
|
||||||
|
constraintSolverData.dynamicsComponents.setConstrainedOrientation(mBody2Entity, q2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable/Disable the limits of the joint
|
// Enable/Disable the limits of the joint
|
||||||
|
|
|
@ -54,18 +54,12 @@ struct ConstraintSolverData {
|
||||||
/// Reference to the dynamics components
|
/// Reference to the dynamics components
|
||||||
DynamicsComponents& dynamicsComponents;
|
DynamicsComponents& dynamicsComponents;
|
||||||
|
|
||||||
/// Reference to the bodies positions
|
|
||||||
Vector3* positions;
|
|
||||||
|
|
||||||
/// Reference to the bodies orientations
|
|
||||||
Quaternion* orientations;
|
|
||||||
|
|
||||||
/// True if warm starting of the solver is active
|
/// True if warm starting of the solver is active
|
||||||
bool isWarmStartingActive;
|
bool isWarmStartingActive;
|
||||||
|
|
||||||
/// Constructor
|
/// Constructor
|
||||||
ConstraintSolverData(DynamicsComponents& dynamicsComponents)
|
ConstraintSolverData(DynamicsComponents& dynamicsComponents)
|
||||||
:dynamicsComponents(dynamicsComponents), positions(nullptr), orientations(nullptr) {
|
:dynamicsComponents(dynamicsComponents) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -189,10 +183,6 @@ class ConstraintSolver {
|
||||||
/// Enable/Disable the Non-Linear-Gauss-Seidel position correction technique.
|
/// Enable/Disable the Non-Linear-Gauss-Seidel position correction technique.
|
||||||
void setIsNonLinearGaussSeidelPositionCorrectionActive(bool isActive);
|
void setIsNonLinearGaussSeidelPositionCorrectionActive(bool isActive);
|
||||||
|
|
||||||
/// Set the constrained positions/orientations arrays
|
|
||||||
void setConstrainedPositionsArrays(Vector3* constrainedPositions,
|
|
||||||
Quaternion* constrainedOrientations);
|
|
||||||
|
|
||||||
#ifdef IS_PROFILING_ACTIVE
|
#ifdef IS_PROFILING_ACTIVE
|
||||||
|
|
||||||
/// Set the profiler
|
/// Set the profiler
|
||||||
|
@ -202,17 +192,6 @@ class ConstraintSolver {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Set the constrained positions/orientations arrays
|
|
||||||
inline void ConstraintSolver::setConstrainedPositionsArrays(Vector3* constrainedPositions,
|
|
||||||
Quaternion* constrainedOrientations) {
|
|
||||||
|
|
||||||
assert(constrainedPositions != nullptr);
|
|
||||||
assert(constrainedOrientations != nullptr);
|
|
||||||
|
|
||||||
mConstraintSolverData.positions = constrainedPositions;
|
|
||||||
mConstraintSolverData.orientations = constrainedOrientations;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef IS_PROFILING_ACTIVE
|
#ifdef IS_PROFILING_ACTIVE
|
||||||
|
|
||||||
// Set the profiler
|
// Set the profiler
|
||||||
|
|
|
@ -56,8 +56,7 @@ DynamicsWorld::DynamicsWorld(const Vector3& gravity, const WorldSettings& worldS
|
||||||
mNbPositionSolverIterations(mConfig.defaultPositionSolverNbIterations),
|
mNbPositionSolverIterations(mConfig.defaultPositionSolverNbIterations),
|
||||||
mIsSleepingEnabled(mConfig.isSleepingEnabled), mRigidBodies(mMemoryManager.getPoolAllocator()),
|
mIsSleepingEnabled(mConfig.isSleepingEnabled), mRigidBodies(mMemoryManager.getPoolAllocator()),
|
||||||
mJoints(mMemoryManager.getPoolAllocator()), mGravity(gravity), mTimeStep(decimal(1.0f / 60.0f)),
|
mJoints(mMemoryManager.getPoolAllocator()), mGravity(gravity), mTimeStep(decimal(1.0f / 60.0f)),
|
||||||
mIsGravityEnabled(true), mConstrainedPositions(nullptr),
|
mIsGravityEnabled(true), mSleepLinearVelocity(mConfig.defaultSleepLinearVelocity),
|
||||||
mConstrainedOrientations(nullptr), mSleepLinearVelocity(mConfig.defaultSleepLinearVelocity),
|
|
||||||
mSleepAngularVelocity(mConfig.defaultSleepAngularVelocity), mTimeBeforeSleep(mConfig.defaultTimeBeforeSleep),
|
mSleepAngularVelocity(mConfig.defaultSleepAngularVelocity), mTimeBeforeSleep(mConfig.defaultTimeBeforeSleep),
|
||||||
mFreeJointsIDs(mMemoryManager.getPoolAllocator()), mCurrentJointId(0) {
|
mFreeJointsIDs(mMemoryManager.getPoolAllocator()), mCurrentJointId(0) {
|
||||||
|
|
||||||
|
@ -176,7 +175,6 @@ void DynamicsWorld::integrateRigidBodiesPositions() {
|
||||||
RigidBody* body = static_cast<RigidBody*>(mBodyComponents.getBody(bodyEntity));
|
RigidBody* body = static_cast<RigidBody*>(mBodyComponents.getBody(bodyEntity));
|
||||||
|
|
||||||
// Get the constrained velocity
|
// Get the constrained velocity
|
||||||
uint indexArray = body->mArrayIndex;
|
|
||||||
Vector3 newLinVelocity = mDynamicsComponents.getConstrainedLinearVelocity(bodyEntity);
|
Vector3 newLinVelocity = mDynamicsComponents.getConstrainedLinearVelocity(bodyEntity);
|
||||||
Vector3 newAngVelocity = mDynamicsComponents.getConstrainedAngularVelocity(bodyEntity);
|
Vector3 newAngVelocity = mDynamicsComponents.getConstrainedAngularVelocity(bodyEntity);
|
||||||
|
|
||||||
|
@ -196,10 +194,10 @@ void DynamicsWorld::integrateRigidBodiesPositions() {
|
||||||
const Quaternion& currentOrientation = mTransformComponents.getTransform(body->getEntity()).getOrientation();
|
const Quaternion& currentOrientation = mTransformComponents.getTransform(body->getEntity()).getOrientation();
|
||||||
|
|
||||||
// Update the new constrained position and orientation of the body
|
// Update the new constrained position and orientation of the body
|
||||||
mConstrainedPositions[indexArray] = currentPosition + newLinVelocity * mTimeStep;
|
mDynamicsComponents.setConstrainedPosition(bodyEntity, currentPosition + newLinVelocity * mTimeStep);
|
||||||
mConstrainedOrientations[indexArray] = currentOrientation +
|
mDynamicsComponents.setConstrainedOrientation(bodyEntity, currentOrientation +
|
||||||
Quaternion(0, newAngVelocity) *
|
Quaternion(0, newAngVelocity) *
|
||||||
currentOrientation * decimal(0.5) * mTimeStep;
|
currentOrientation * decimal(0.5) * mTimeStep);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -229,10 +227,11 @@ void DynamicsWorld::updateBodiesState() {
|
||||||
mDynamicsComponents.setAngularVelocity(bodyEntity, mDynamicsComponents.getConstrainedAngularVelocity(bodyEntity));
|
mDynamicsComponents.setAngularVelocity(bodyEntity, mDynamicsComponents.getConstrainedAngularVelocity(bodyEntity));
|
||||||
|
|
||||||
// Update the position of the center of mass of the body
|
// Update the position of the center of mass of the body
|
||||||
body->mCenterOfMassWorld = mConstrainedPositions[index];
|
body->mCenterOfMassWorld = mDynamicsComponents.getConstrainedPosition(bodyEntity);
|
||||||
|
|
||||||
// Update the orientation of the body
|
// Update the orientation of the body
|
||||||
mTransformComponents.getTransform(bodyEntity).setOrientation(mConstrainedOrientations[index].getUnit());
|
const Quaternion& constrainedOrientation = mDynamicsComponents.getConstrainedOrientation(bodyEntity);
|
||||||
|
mTransformComponents.getTransform(bodyEntity).setOrientation(constrainedOrientation.getUnit());
|
||||||
|
|
||||||
// Update the transform of the body (using the new center of mass and new orientation)
|
// Update the transform of the body (using the new center of mass and new orientation)
|
||||||
body->updateTransformWithCenterOfMass();
|
body->updateTransformWithCenterOfMass();
|
||||||
|
@ -256,13 +255,6 @@ void DynamicsWorld::initVelocityArrays() {
|
||||||
|
|
||||||
assert(mDynamicsComponents.getNbComponents() == nbBodies);
|
assert(mDynamicsComponents.getNbComponents() == nbBodies);
|
||||||
|
|
||||||
mConstrainedPositions = static_cast<Vector3*>(mMemoryManager.allocate(MemoryManager::AllocationType::Frame,
|
|
||||||
nbBodies * sizeof(Vector3)));
|
|
||||||
mConstrainedOrientations = static_cast<Quaternion*>(mMemoryManager.allocate(MemoryManager::AllocationType::Frame,
|
|
||||||
nbBodies * sizeof(Quaternion)));
|
|
||||||
assert(mConstrainedPositions != nullptr);
|
|
||||||
assert(mConstrainedOrientations != nullptr);
|
|
||||||
|
|
||||||
// Initialize the map of body indexes in the velocity arrays
|
// Initialize the map of body indexes in the velocity arrays
|
||||||
uint i = 0;
|
uint i = 0;
|
||||||
for (List<RigidBody*>::Iterator it = mRigidBodies.begin(); it != mRigidBodies.end(); ++it) {
|
for (List<RigidBody*>::Iterator it = mRigidBodies.begin(); it != mRigidBodies.end(); ++it) {
|
||||||
|
@ -348,10 +340,6 @@ void DynamicsWorld::solveContactsAndConstraints() {
|
||||||
|
|
||||||
RP3D_PROFILE("DynamicsWorld::solveContactsAndConstraints()", mProfiler);
|
RP3D_PROFILE("DynamicsWorld::solveContactsAndConstraints()", mProfiler);
|
||||||
|
|
||||||
// Set the velocities arrays
|
|
||||||
mConstraintSolver.setConstrainedPositionsArrays(mConstrainedPositions,
|
|
||||||
mConstrainedOrientations);
|
|
||||||
|
|
||||||
// ---------- Solve velocity constraints for joints and contacts ---------- //
|
// ---------- Solve velocity constraints for joints and contacts ---------- //
|
||||||
|
|
||||||
// Initialize the contact solver
|
// Initialize the contact solver
|
||||||
|
|
|
@ -88,12 +88,6 @@ class DynamicsWorld : public CollisionWorld {
|
||||||
/// True if the gravity force is on
|
/// True if the gravity force is on
|
||||||
bool mIsGravityEnabled;
|
bool mIsGravityEnabled;
|
||||||
|
|
||||||
/// Array of constrained rigid bodies position (for position error correction)
|
|
||||||
Vector3* mConstrainedPositions;
|
|
||||||
|
|
||||||
/// Array of constrained rigid bodies orientation (for position error correction)
|
|
||||||
Quaternion* mConstrainedOrientations;
|
|
||||||
|
|
||||||
/// Sleep linear velocity threshold
|
/// Sleep linear velocity threshold
|
||||||
decimal mSleepLinearVelocity;
|
decimal mSleepLinearVelocity;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user