Fixes in raycast (against sphere), point 2 point constraint
Picking test works, holding shift in App_BasicGpuDemo_*
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#include "BulletCollision/CollisionShapes/btCompoundShape.h"
|
||||
#include "BulletCollision/CollisionShapes/btSphereShape.h"
|
||||
#include "BulletCollision/CollisionShapes/btStaticPlaneShape.h"
|
||||
#include "BulletCollision/CollisionShapes/btConvexHullShape.h"
|
||||
#include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h"
|
||||
|
||||
#include "LinearMath/btQuickprof.h"
|
||||
@@ -25,9 +26,9 @@
|
||||
#endif
|
||||
|
||||
|
||||
//#if (BT_BULLET_VERSION >= 282)
|
||||
//#define BT_USE_BODY_UPDATE_REVISION
|
||||
//#endif
|
||||
#if (BT_BULLET_VERSION >= 282)
|
||||
#define BT_USE_BODY_UPDATE_REVISION
|
||||
#endif
|
||||
|
||||
|
||||
b3GpuDynamicsWorld::b3GpuDynamicsWorld(class b3GpuSapBroadphase* bp,class b3GpuNarrowPhase* np, class b3GpuRigidBodyPipeline* rigidBodyPipeline)
|
||||
@@ -37,9 +38,12 @@ m_cpuGpuSync(true),
|
||||
m_bp(bp),
|
||||
m_np(np),
|
||||
m_rigidBodyPipeline(rigidBodyPipeline),
|
||||
m_localTime(0.f)
|
||||
m_localTime(0.f),
|
||||
m_staticBody(0)
|
||||
{
|
||||
|
||||
btConvexHullShape* nullShape = new btConvexHullShape();
|
||||
m_staticBody = new btRigidBody(0,0,nullShape);
|
||||
addRigidBody(m_staticBody,0,0);
|
||||
}
|
||||
|
||||
b3GpuDynamicsWorld::~b3GpuDynamicsWorld()
|
||||
@@ -63,6 +67,34 @@ int b3GpuDynamicsWorld::stepSimulation( btScalar timeStepUnused, int maxSubStep
|
||||
|
||||
BT_PROFILE("stepSimulation");
|
||||
|
||||
{
|
||||
for (int i=0;i<m_constraints.size();i++)
|
||||
{
|
||||
btTypedConstraint* constraint = m_constraints[i];
|
||||
b3TypedConstraint* c = (b3TypedConstraint*) constraint->getUserConstraintPtr();
|
||||
if (c)
|
||||
{
|
||||
switch (constraint->getConstraintType())
|
||||
{
|
||||
case POINT2POINT_CONSTRAINT_TYPE:
|
||||
{
|
||||
btPoint2PointConstraint* p2 = (btPoint2PointConstraint*) constraint;
|
||||
b3Point2PointConstraint* p3 = (b3Point2PointConstraint*) c;
|
||||
p3->setPivotA((const b3Vector3&)p2->getPivotInA());
|
||||
p3->setPivotB((const b3Vector3&)p2->getPivotInB());
|
||||
p3->m_setting.m_damping = p2->m_setting.m_damping;
|
||||
p3->m_setting.m_impulseClamp = p2->m_setting.m_impulseClamp;
|
||||
p3->m_setting.m_tau = p2->m_setting.m_tau;
|
||||
|
||||
break;
|
||||
};
|
||||
default:
|
||||
{
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// detect any change (very simple)
|
||||
{
|
||||
@@ -115,6 +147,7 @@ int b3GpuDynamicsWorld::stepSimulation( btScalar timeStepUnused, int maxSubStep
|
||||
|
||||
if (m_cpuGpuSync)
|
||||
{
|
||||
BT_PROFILE("cpuGpuSync");
|
||||
m_cpuGpuSync = false;
|
||||
m_np->writeAllBodiesToGpu();
|
||||
m_bp->writeAabbsToGpu();
|
||||
@@ -409,7 +442,7 @@ void b3GpuDynamicsWorld::addRigidBody(btRigidBody* body)
|
||||
body->setUserIndex(bodyIndex);
|
||||
|
||||
m_collisionObjects.push_back(body);
|
||||
//btDynamicsWorld::addCollisionObject(
|
||||
m_bodyUpdateRevisions.push_back(-1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -417,6 +450,11 @@ void b3GpuDynamicsWorld::removeRigidBody(btRigidBody* colObj)
|
||||
{
|
||||
m_cpuGpuSync = true;
|
||||
btDynamicsWorld::removeCollisionObject(colObj);
|
||||
m_bodyUpdateRevisions.resize(this->m_collisionObjects.size());
|
||||
for (int i=0;i<m_bodyUpdateRevisions.size();i++)
|
||||
{
|
||||
m_bodyUpdateRevisions[i] = -1;
|
||||
}
|
||||
|
||||
int bodyIndex = colObj->getUserIndex();
|
||||
|
||||
@@ -440,6 +478,11 @@ void b3GpuDynamicsWorld::removeCollisionObject(btCollisionObject* colObj)
|
||||
{
|
||||
m_cpuGpuSync = true;
|
||||
btDynamicsWorld::removeCollisionObject(colObj);
|
||||
m_bodyUpdateRevisions.resize(this->m_collisionObjects.size());
|
||||
for (int i=0;i<m_bodyUpdateRevisions.size();i++)
|
||||
{
|
||||
m_bodyUpdateRevisions[i] = -1;
|
||||
}
|
||||
if (getNumCollisionObjects()==0)
|
||||
{
|
||||
m_uniqueShapes.resize(0);
|
||||
@@ -511,28 +554,46 @@ void b3GpuDynamicsWorld::synchronizeSingleMotionState(btRigidBody* body)
|
||||
}
|
||||
}
|
||||
|
||||
void b3GpuDynamicsWorld::debugDrawWorld()
|
||||
{
|
||||
BT_PROFILE("debugDrawWorld");
|
||||
|
||||
btCollisionWorld::debugDrawWorld();
|
||||
}
|
||||
|
||||
void b3GpuDynamicsWorld::addConstraint(btTypedConstraint* constraint, bool disableCollisionsBetweenLinkedBodies)
|
||||
{
|
||||
m_constraints.push_back(constraint);
|
||||
constraint->setUserConstraintPtr(0);
|
||||
|
||||
m_constraints.push_back(constraint);
|
||||
|
||||
switch (constraint->getConstraintType())
|
||||
{
|
||||
case POINT2POINT_CONSTRAINT_TYPE:
|
||||
{
|
||||
b3Assert(constraint->getUserConstraintId()==-1);
|
||||
btPoint2PointConstraint* p = (btPoint2PointConstraint*) constraint;
|
||||
|
||||
int rbA = p->getRigidBodyA().getUserIndex();
|
||||
int rbB = p->getRigidBodyB().getUserIndex();
|
||||
|
||||
btVector3 pivotInB = p->getPivotInB();
|
||||
|
||||
if (rbB<=0)
|
||||
{
|
||||
|
||||
pivotInB = p->getRigidBodyA().getWorldTransform()*p->getPivotInA();
|
||||
rbB = m_staticBody->getUserIndex();
|
||||
}
|
||||
|
||||
if (rbA>=0 && rbB>=0)
|
||||
{
|
||||
b3Point2PointConstraint* p2p = new b3Point2PointConstraint(rbA,rbB, (const b3Vector3&)p->getPivotInA(),(const b3Vector3&)p->getPivotInB());
|
||||
b3Point2PointConstraint* p2p = new b3Point2PointConstraint(rbA,rbB, (const b3Vector3&)p->getPivotInA(),(const b3Vector3&)pivotInB);
|
||||
p2p->setBreakingImpulseThreshold(p->getBreakingImpulseThreshold());
|
||||
constraint->setUserConstraintPtr(p2p);
|
||||
m_rigidBodyPipeline->addConstraint(p2p);
|
||||
} else
|
||||
{
|
||||
constraint->setUserConstraintPtr(0);
|
||||
|
||||
b3Error("invalid body index in addConstraint.\n");
|
||||
}
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user