58 return ClosestRayResultCallback::addSingleResult(rayResult, normalInWorldSpace);
81 btVector3 hitNormalWorld;
82 if (normalInWorldSpace)
98 return ClosestConvexResultCallback::addSingleResult(convexResult, normalInWorldSpace);
112btVector3 btKinematicCharacterController::computeReflectionDirection(
const btVector3& direction,
const btVector3& normal)
114 return direction - (
btScalar(2.0) * direction.dot(normal)) * normal;
120btVector3 btKinematicCharacterController::parallelComponent(
const btVector3& direction,
const btVector3& normal)
122 btScalar magnitude = direction.dot(normal);
123 return normal * magnitude;
129btVector3 btKinematicCharacterController::perpindicularComponent(
const btVector3& direction,
const btVector3& normal)
137 m_up.setValue(0.0f, 0.0f, 1.0f);
168btKinematicCharacterController::~btKinematicCharacterController()
177bool btKinematicCharacterController::recoverFromPenetration(
btCollisionWorld* collisionWorld)
187 btVector3 minAabb, maxAabb;
194 bool penetration =
false;
207 btCollisionObject* obj0 =
static_cast<btCollisionObject*
>(collisionPair->m_pProxy0->m_clientObject);
208 btCollisionObject* obj1 =
static_cast<btCollisionObject*
>(collisionPair->m_pProxy1->m_clientObject);
210 if ((obj0 && !obj0->hasContactResponse()) || (obj1 && !obj1->hasContactResponse()))
216 if (collisionPair->m_algorithm)
223 for (
int p = 0; p < manifold->getNumContacts(); p++)
290 world->convexSweepTest(
m_convexShape, start, end,
callback, world->getDispatchInfo().m_allowedCcdPenetration);
311 int numPenetrationLoops = 0;
315 numPenetrationLoops++;
317 if (numPenetrationLoops > 4)
340bool btKinematicCharacterController::needsCollision(
const btCollisionObject* body0,
const btCollisionObject* body1)
342 bool collides = (body0->getBroadphaseHandle()->m_collisionFilterGroup & body1->getBroadphaseHandle()->m_collisionFilterMask) != 0;
343 collides = collides && (body1->getBroadphaseHandle()->m_collisionFilterGroup & body0->getBroadphaseHandle()->m_collisionFilterMask);
347void btKinematicCharacterController::updateTargetPositionBasedOnCollision(
const btVector3& hitNormal,
btScalar tangentMag,
btScalar normalMag)
350 btScalar movementLength = movementDirection.length();
353 movementDirection.normalize();
356 reflectDir.normalize();
358 btVector3 parallelDir, perpindicularDir;
366 btVector3 parComponent = parallelDir *
btScalar(tangentMag * movementLength);
371 if (normalMag != 0.0)
373 btVector3 perpComponent = perpindicularDir *
btScalar(normalMag * movementLength);
384void btKinematicCharacterController::stepForwardAndStrafe(
btCollisionWorld* collisionWorld,
const btVector3& walkMove)
402 while (fraction >
btScalar(0.01) && maxIter-- > 0)
431 fraction -=
callback.m_closestHitFraction;
446 currentDir.normalize();
469 bool runonce =
false;
504 end_double.setIdentity();
547 if (downVelocity2 > 0.0 && downVelocity2 < stepHeight && has_hit ==
true && runonce ==
false && (
m_wasOnGround || !
m_wasJumping))
553 downVelocity = stepHeight;
610void btKinematicCharacterController::setWalkDirection(
611 const btVector3& walkDirection)
618void btKinematicCharacterController::setVelocityForTimeInterval(
619 const btVector3& velocity,
633void btKinematicCharacterController::setAngularVelocity(
const btVector3& velocity)
638const btVector3& btKinematicCharacterController::getAngularVelocity()
const
643void btKinematicCharacterController::setLinearVelocity(
const btVector3& velocity)
650 btVector3
w = velocity.normalized();
670btVector3 btKinematicCharacterController::getLinearVelocity()
const
686 while (cache->getOverlappingPairArray().size() > 0)
688 cache->removeOverlappingPair(cache->getOverlappingPairArray()[0].m_pProxy0, cache->getOverlappingPairArray()[0].m_pProxy1, collisionWorld->
getDispatcher());
692void btKinematicCharacterController::warp(
const btVector3& origin)
696 xform.setOrigin(origin);
700void btKinematicCharacterController::preStep(
btCollisionWorld* collisionWorld)
838 int numPenetrationLoops = 0;
842 numPenetrationLoops++;
844 if (numPenetrationLoops > 4)
852void btKinematicCharacterController::setFallSpeed(
btScalar fallSpeed)
857void btKinematicCharacterController::setJumpSpeed(
btScalar jumpSpeed)
863void btKinematicCharacterController::setMaxJumpHeight(
btScalar maxJumpHeight)
868bool btKinematicCharacterController::canJump()
const
873void btKinematicCharacterController::jump(
const btVector3&
v)
884 currently no jumping.
886 m_rigidBody->getMotionState()->getWorldTransform (xform);
887 btVector3 up = xform.getBasis()[1];
890 m_rigidBody->applyCentralImpulse (up * magnitude);
894void btKinematicCharacterController::setGravity(
const btVector3& gravity)
901btVector3 btKinematicCharacterController::getGravity()
const
906void btKinematicCharacterController::setMaxSlope(
btScalar slopeRadians)
912btScalar btKinematicCharacterController::getMaxSlope()
const
917void btKinematicCharacterController::setMaxPenetrationDepth(
btScalar d)
922btScalar btKinematicCharacterController::getMaxPenetrationDepth()
const
927bool btKinematicCharacterController::onGround()
const
932void btKinematicCharacterController::setStepHeight(
btScalar h)
937btVector3* btKinematicCharacterController::getUpAxisDirections()
941 return sUpAxisDirection;
944void btKinematicCharacterController::debugDraw(
btIDebugDraw* debugDrawer)
948void btKinematicCharacterController::setUpInterpolate(
bool value)
953void btKinematicCharacterController::setUp(
const btVector3& up)
955 if (up.length2() > 0 &&
m_gravity > 0.0f)
964void btKinematicCharacterController::setUpVector(
const btVector3& up)
971 if (up.length2() > 0)
972 m_up = up.normalized();
987btQuaternion btKinematicCharacterController::getRotation(btVector3& v0, btVector3& v1)
const
989 if (v0.length2() == 0.0f || v1.length2() == 0.0f)
ATTR_WARN_UNUSED_RESULT const BMVert * v
btConvexShape()
not supported on IBM SDK, until we fix the alignment of btVector3
static btVector3 getNormalizedVector(const btVector3 &v)
btScalar m_maxSlopeRadians
btConvexShape * m_convexShape
void setUp(const btVector3 &up)
void setUpVector(const btVector3 &up)
btVector3 perpindicularComponent(const btVector3 &direction, const btVector3 &normal)
btVector3 m_targetPosition
btScalar m_angularDamping
btVector3 computeReflectionDirection(const btVector3 &direction, const btVector3 &normal)
btScalar m_velocityTimeInterval
btScalar m_maxPenetrationDepth
void stepDown(btCollisionWorld *collisionWorld, btScalar dt)
btQuaternion m_targetOrientation
btManifoldArray m_manifoldArray
keep track of the contact manifolds
btVector3 m_walkDirection
this is the desired walk direction, set by the user
void stepForwardAndStrafe(btCollisionWorld *collisionWorld, const btVector3 &walkMove)
btScalar m_maxSlopeCosine
void setMaxSlope(btScalar slopeRadians)
void setStepHeight(btScalar h)
void setGravity(const btVector3 &gravity)
btScalar m_currentStepOffset
void updateTargetPositionBasedOnCollision(const btVector3 &hit_normal, btScalar tangentMag=btScalar(0.0), btScalar normalMag=btScalar(1.0))
void stepUp(btCollisionWorld *collisionWorld)
btPairCachingGhostObject * getGhostObject()
virtual bool needsCollision(const btCollisionObject *body0, const btCollisionObject *body1)
bool m_useGhostObjectSweepTest
btQuaternion m_currentOrientation
btScalar m_verticalVelocity
btVector3 m_normalizedDirection
btVector3 m_currentPosition
btVector3 parallelComponent(const btVector3 &direction, const btVector3 &normal)
bool recoverFromPenetration(btCollisionWorld *collisionWorld)
btScalar m_verticalOffset
btPairCachingGhostObject * m_ghostObject
btHashedOverlappingPairCache()
int getNumOverlappingPairs() const
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
SIMD_FORCE_INLINE btQuaternion shortestArcQuatNormalize2(btVector3 &v0, btVector3 &v1)
SIMD_FORCE_INLINE btScalar btAcos(btScalar x)
SIMD_FORCE_INLINE btScalar btCos(btScalar x)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
SIMD_FORCE_INLINE btScalar btSin(btScalar x)
SIMD_FORCE_INLINE btScalar btFabs(btScalar x)
SIMD_FORCE_INLINE btScalar btRadians(btScalar x)
SIMD_FORCE_INLINE btScalar btPow(btScalar x, btScalar y)
SIMD_FORCE_INLINE btScalar length2() const
Return the length of the vector squared.
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
SIMD_FORCE_INLINE btScalar distance2(const btVector3 &v) const
Return the distance squared between the ends of this and another vector This is symantically treating...
SIMD_FORCE_INLINE int size() const
return the number of elements in the array
SIMD_FORCE_INLINE void resize(int newsize, const T &fillData=T())
virtual void setAabb(btBroadphaseProxy *proxy, const btVector3 &aabbMin, const btVector3 &aabbMax, btDispatcher *dispatcher)=0
CollisionWorld is interface and container for the collision detection.
btDispatcher * getDispatcher()
btDispatcherInfo & getDispatchInfo()
void convexSweepTest(const btConvexShape *castShape, const btTransform &from, const btTransform &to, ConvexResultCallback &resultCallback, btScalar allowedCcdPenetration=btScalar(0.)) const
const btBroadphaseInterface * getBroadphase() const
virtual void dispatchAllCollisionPairs(btOverlappingPairCache *pairCache, const btDispatcherInfo &dispatchInfo, btDispatcher *dispatcher)=0
virtual btScalar addSingleResult(btCollisionWorld::LocalConvexResult &convexResult, bool normalInWorldSpace)
btKinematicClosestNotMeConvexResultCallback(btCollisionObject *me, const btVector3 &up, btScalar minSlopeDot)
virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult &rayResult, bool normalInWorldSpace)
btKinematicClosestNotMeRayResultCallback(btCollisionObject *me)
btScalar getDistance() const
btVector3 m_normalWorldOnB
btHashedOverlappingPairCache * getOverlappingPairCache()
The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatr...
btQuaternion inverse() const
Return the inverse of this quaternion.
void setRotation(const btVector3 &axis, const btScalar &_angle)
Set the rotation using axis angle notation.
DEGForeachIDComponentCallback callback
ccl_device_inline float2 fabs(const float2 a)
const btCollisionObject * m_hitCollisionObject
ClosestConvexResultCallback(const btVector3 &convexFromWorld, const btVector3 &convexToWorld)
ClosestRayResultCallback(const btVector3 &rayFromWorld, const btVector3 &rayToWorld)
int m_collisionFilterMask
int m_collisionFilterGroup
btVector3 m_hitNormalLocal
const btCollisionObject * m_hitCollisionObject
const btCollisionObject * m_collisionObject
btScalar m_allowedCcdPenetration