| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- #include "Base.h"
- #include "PhysicsHingeConstraint.h"
- #include "Node.h"
- namespace gameplay
- {
- void PhysicsHingeConstraint::setLimits(float minAngle, float maxAngle, float bounciness)
- {
- // Use the defaults for softness (0.9) and biasFactor (0.3).
- GP_ASSERT(_constraint);
- ((btHingeConstraint*)_constraint)->setLimit(minAngle, maxAngle, 0.9f, 0.3f, bounciness);
- }
- PhysicsHingeConstraint::PhysicsHingeConstraint(PhysicsRigidBody* a, const Quaternion& rotationOffsetA, const Vector3& translationOffsetA,
- PhysicsRigidBody* b, const Quaternion& rotationOffsetB, const Vector3& translationOffsetB)
- : PhysicsConstraint(a, b)
- {
- GP_ASSERT(a && a->_body && a->getNode());
- // Take scale into account for the first node's translation offset.
- Vector3 sA;
- a->getNode()->getWorldMatrix().getScale(&sA);
- Vector3 tA(translationOffsetA.x * sA.x, translationOffsetA.y * sA.y, translationOffsetA.z * sA.z);
- if (b)
- {
- GP_ASSERT(b->_body && b->getNode());
- // Take scale into account for the second node's translation offset.
- Vector3 sB;
- b->getNode()->getWorldMatrix().getScale(&sB);
- Vector3 tB(translationOffsetB.x * sB.x, translationOffsetB.y * sB.y, translationOffsetB.z * sB.z);
- btTransform frameInA(BQ(rotationOffsetA), BV(tA));
- btTransform frameInB(BQ(rotationOffsetB), BV(tB));
- _constraint = new btHingeConstraint(*a->_body, *b->_body, frameInA, frameInB);
- }
- else
- {
- btTransform frameInA(BQ(rotationOffsetA), BV(tA));
- _constraint = new btHingeConstraint(*a->_body, frameInA);
- }
- }
-
- PhysicsHingeConstraint::~PhysicsHingeConstraint()
- {
- // Unused
- }
- }
|