fix win32 (non-glut) cmake build.
add partId/index to btCollisionObjectWrapper to be able to recognize recursive shape indices (a btCompoundShape with a btGimpactShape child shape etc)
This commit is contained in:
@@ -83,6 +83,10 @@ ELSE (USE_GLUT)
|
|||||||
Win32FractureDemo.cpp
|
Win32FractureDemo.cpp
|
||||||
FractureDemo.cpp
|
FractureDemo.cpp
|
||||||
FractureDemo.h
|
FractureDemo.h
|
||||||
|
btFractureBody.h
|
||||||
|
btFractureBody.cpp
|
||||||
|
btFractureDynamicsWorld.cpp
|
||||||
|
btFractureDynamicsWorld.h
|
||||||
${BULLET_PHYSICS_SOURCE_DIR}/build/bullet.rc
|
${BULLET_PHYSICS_SOURCE_DIR}/build/bullet.rc
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ subject to the following restrictions:
|
|||||||
|
|
||||||
#ifdef _WINDOWS
|
#ifdef _WINDOWS
|
||||||
#define BT_ACTIVE_ALT VK_LMENU
|
#define BT_ACTIVE_ALT VK_LMENU
|
||||||
|
#define BT_ACTIVE_SHIFT VK_LSHIFT
|
||||||
#else
|
#else
|
||||||
#define BT_KEY_K 'k'
|
#define BT_KEY_K 'k'
|
||||||
#define BT_KEY_LEFT GLUT_KEY_LEFT
|
#define BT_KEY_LEFT GLUT_KEY_LEFT
|
||||||
|
|||||||
@@ -44,6 +44,69 @@ static int quitRequest = 0;
|
|||||||
|
|
||||||
// WinMain
|
// WinMain
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef USE_AMD_OPENCL
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "btOpenCLUtils.h"
|
||||||
|
|
||||||
|
#include <LinearMath/btScalar.h>
|
||||||
|
|
||||||
|
cl_context g_cxMainContext;
|
||||||
|
cl_device_id g_cdDevice;
|
||||||
|
cl_command_queue g_cqCommandQue;
|
||||||
|
|
||||||
|
|
||||||
|
// Returns true if OpenCL is initialized properly, false otherwise.
|
||||||
|
bool initCL( void* glCtx, void* glDC )
|
||||||
|
{
|
||||||
|
const char* vendorSDK = btOpenCLUtils::getSdkVendorName();
|
||||||
|
printf("This program was compiled using the %s OpenCL SDK\n",vendorSDK);
|
||||||
|
|
||||||
|
int ciErrNum = 0;
|
||||||
|
|
||||||
|
#ifdef BT_USE_CLEW
|
||||||
|
ciErrNum = clewInit( "OpenCL.dll" );
|
||||||
|
if ( ciErrNum != CLEW_SUCCESS ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CL_PLATFORM_MINI_CL)
|
||||||
|
cl_device_type deviceType = CL_DEVICE_TYPE_CPU;
|
||||||
|
#elif defined(CL_PLATFORM_AMD)
|
||||||
|
cl_device_type deviceType = CL_DEVICE_TYPE_GPU;
|
||||||
|
#elif defined(CL_PLATFORM_NVIDIA)
|
||||||
|
cl_device_type deviceType = CL_DEVICE_TYPE_GPU;
|
||||||
|
#else
|
||||||
|
cl_device_type deviceType = CL_DEVICE_TYPE_CPU;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
g_cxMainContext = btOpenCLUtils::createContextFromType(deviceType, &ciErrNum, glCtx, glDC);
|
||||||
|
oclCHECKERROR(ciErrNum, CL_SUCCESS);
|
||||||
|
|
||||||
|
int numDev = btOpenCLUtils::getNumDevices(g_cxMainContext);
|
||||||
|
if (!numDev)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
g_cdDevice = btOpenCLUtils::getDevice(g_cxMainContext,0);
|
||||||
|
|
||||||
|
btOpenCLDeviceInfo clInfo;
|
||||||
|
btOpenCLUtils::getDeviceInfo(g_cdDevice,clInfo);
|
||||||
|
btOpenCLUtils::printDeviceInfo(g_cdDevice);
|
||||||
|
|
||||||
|
// create a command-queue
|
||||||
|
g_cqCommandQue = clCreateCommandQueue(g_cxMainContext, g_cdDevice, 0, &ciErrNum);
|
||||||
|
oclCHECKERROR(ciErrNum, CL_SUCCESS);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //#ifdef USE_AMD_OPENCL
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
||||||
LPSTR lpCmdLine, int iCmdShow)
|
LPSTR lpCmdLine, int iCmdShow)
|
||||||
{
|
{
|
||||||
@@ -57,6 +120,11 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
|||||||
|
|
||||||
gDemoApplication = createDemo();
|
gDemoApplication = createDemo();
|
||||||
|
|
||||||
|
#ifdef USE_AMD_OPENCL
|
||||||
|
|
||||||
|
bool initialized = initCL(0,0);
|
||||||
|
btAssert(initialized);
|
||||||
|
#endif //USE_AMD_OPENCL
|
||||||
|
|
||||||
// register window class
|
// register window class
|
||||||
wc.style = CS_OWNDC;
|
wc.style = CS_OWNDC;
|
||||||
|
|||||||
@@ -14,12 +14,12 @@ subject to the following restrictions:
|
|||||||
3. This notice may not be removed or altered from any source distribution.
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "BasicDemo.h"
|
#include "RaytestDemo.h"
|
||||||
|
|
||||||
///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo
|
///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo
|
||||||
DemoApplication* createDemo()
|
DemoApplication* createDemo()
|
||||||
{
|
{
|
||||||
return new BasicDemo();
|
return new RaytestDemo();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -14,12 +14,12 @@ subject to the following restrictions:
|
|||||||
3. This notice may not be removed or altered from any source distribution.
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "BasicDemo.h"
|
#include "VoronoiFractureDemo.h"
|
||||||
|
|
||||||
///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo
|
///The 'createDemo' function is called from Bullet/Demos/OpenGL/Win32AppMain.cpp to instantiate this particular demo
|
||||||
DemoApplication* createDemo()
|
DemoApplication* createDemo()
|
||||||
{
|
{
|
||||||
return new BasicDemo();
|
return new VoronoiFractureDemo();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -258,8 +258,8 @@ void btCollisionDispatcher::defaultNearCallback(btBroadphasePair& collisionPair,
|
|||||||
|
|
||||||
if (dispatcher.needsCollision(colObj0,colObj1))
|
if (dispatcher.needsCollision(colObj0,colObj1))
|
||||||
{
|
{
|
||||||
btCollisionObjectWrapper obj0Wrap(0,colObj0->getCollisionShape(),colObj0,colObj0->getWorldTransform());
|
btCollisionObjectWrapper obj0Wrap(0,colObj0->getCollisionShape(),colObj0,colObj0->getWorldTransform(),-1,-1);
|
||||||
btCollisionObjectWrapper obj1Wrap(0,colObj1->getCollisionShape(),colObj1,colObj1->getWorldTransform());
|
btCollisionObjectWrapper obj1Wrap(0,colObj1->getCollisionShape(),colObj1,colObj1->getWorldTransform(),-1,-1);
|
||||||
|
|
||||||
|
|
||||||
//dispatcher will keep algorithms persistent in the collision pair
|
//dispatcher will keep algorithms persistent in the collision pair
|
||||||
|
|||||||
@@ -27,9 +27,12 @@ public:
|
|||||||
const btCollisionShape* m_shape;
|
const btCollisionShape* m_shape;
|
||||||
const btCollisionObject* m_collisionObject;
|
const btCollisionObject* m_collisionObject;
|
||||||
const btTransform& m_worldTransform;
|
const btTransform& m_worldTransform;
|
||||||
|
int m_partId;
|
||||||
|
int m_index;
|
||||||
|
|
||||||
btCollisionObjectWrapper(const btCollisionObjectWrapper* parent, const btCollisionShape* shape, const btCollisionObject* collisionObject, const btTransform& worldTransform)
|
btCollisionObjectWrapper(const btCollisionObjectWrapper* parent, const btCollisionShape* shape, const btCollisionObject* collisionObject, const btTransform& worldTransform, int partId, int index)
|
||||||
: m_parent(parent), m_shape(shape), m_collisionObject(collisionObject), m_worldTransform(worldTransform)
|
: m_parent(parent), m_shape(shape), m_collisionObject(collisionObject), m_worldTransform(worldTransform),
|
||||||
|
m_partId(partId), m_index(index)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
SIMD_FORCE_INLINE const btTransform& getWorldTransform() const { return m_worldTransform; }
|
SIMD_FORCE_INLINE const btTransform& getWorldTransform() const { return m_worldTransform; }
|
||||||
|
|||||||
@@ -268,7 +268,7 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
|
|||||||
const btTransform& colObjWorldTransform,
|
const btTransform& colObjWorldTransform,
|
||||||
RayResultCallback& resultCallback)
|
RayResultCallback& resultCallback)
|
||||||
{
|
{
|
||||||
btCollisionObjectWrapper colObWrap(0,collisionShape,collisionObject,colObjWorldTransform);
|
btCollisionObjectWrapper colObWrap(0,collisionShape,collisionObject,colObjWorldTransform,-1,-1);
|
||||||
btCollisionWorld::rayTestSingleInternal(rayFromTrans,rayToTrans,&colObWrap,resultCallback);
|
btCollisionWorld::rayTestSingleInternal(rayFromTrans,rayToTrans,&colObWrap,resultCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -509,7 +509,7 @@ void btCollisionWorld::rayTestSingleInternal(const btTransform& rayFromTrans,con
|
|||||||
const btTransform& childTrans = m_compoundShape->getChildTransform(i);
|
const btTransform& childTrans = m_compoundShape->getChildTransform(i);
|
||||||
btTransform childWorldTrans = m_colObjWorldTransform * childTrans;
|
btTransform childWorldTrans = m_colObjWorldTransform * childTrans;
|
||||||
|
|
||||||
btCollisionObjectWrapper tmpOb(0,childCollisionShape,m_collisionObject,childWorldTrans);
|
btCollisionObjectWrapper tmpOb(0,childCollisionShape,m_collisionObject,childWorldTrans,-1,i);
|
||||||
// replace collision shape so that callback can determine the triangle
|
// replace collision shape so that callback can determine the triangle
|
||||||
|
|
||||||
|
|
||||||
@@ -567,7 +567,7 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
|
|||||||
const btTransform& colObjWorldTransform,
|
const btTransform& colObjWorldTransform,
|
||||||
ConvexResultCallback& resultCallback, btScalar allowedPenetration)
|
ConvexResultCallback& resultCallback, btScalar allowedPenetration)
|
||||||
{
|
{
|
||||||
btCollisionObjectWrapper tmpOb(0,collisionShape,collisionObject,colObjWorldTransform);
|
btCollisionObjectWrapper tmpOb(0,collisionShape,collisionObject,colObjWorldTransform,-1,-1);
|
||||||
btCollisionWorld::objectQuerySingleInternal(castShape,convexFromTrans,convexToTrans,&tmpOb,resultCallback,allowedPenetration);
|
btCollisionWorld::objectQuerySingleInternal(castShape,convexFromTrans,convexToTrans,&tmpOb,resultCallback,allowedPenetration);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -823,7 +823,7 @@ void btCollisionWorld::objectQuerySingleInternal(const btConvexShape* castShape,
|
|||||||
|
|
||||||
LocalInfoAdder my_cb(i, &resultCallback);
|
LocalInfoAdder my_cb(i, &resultCallback);
|
||||||
|
|
||||||
btCollisionObjectWrapper tmpObj(colObjWrap,childCollisionShape,colObjWrap->getCollisionObject(),childWorldTrans);
|
btCollisionObjectWrapper tmpObj(colObjWrap,childCollisionShape,colObjWrap->getCollisionObject(),childWorldTrans,-1,i);
|
||||||
|
|
||||||
objectQuerySingleInternal(castShape, convexFromTrans,convexToTrans,
|
objectQuerySingleInternal(castShape, convexFromTrans,convexToTrans,
|
||||||
&tmpObj,my_cb, allowedPenetration);
|
&tmpObj,my_cb, allowedPenetration);
|
||||||
@@ -1135,8 +1135,8 @@ struct btSingleContactCallback : public btBroadphaseAabbCallback
|
|||||||
//only perform raycast if filterMask matches
|
//only perform raycast if filterMask matches
|
||||||
if(m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
|
if(m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
|
||||||
{
|
{
|
||||||
btCollisionObjectWrapper ob0(0,m_collisionObject->getCollisionShape(),m_collisionObject,m_collisionObject->getWorldTransform());
|
btCollisionObjectWrapper ob0(0,m_collisionObject->getCollisionShape(),m_collisionObject,m_collisionObject->getWorldTransform(),-1,-1);
|
||||||
btCollisionObjectWrapper ob1(0,collisionObject->getCollisionShape(),collisionObject,collisionObject->getWorldTransform());
|
btCollisionObjectWrapper ob1(0,collisionObject->getCollisionShape(),collisionObject,collisionObject->getWorldTransform(),-1,-1);
|
||||||
|
|
||||||
btCollisionAlgorithm* algorithm = m_world->getDispatcher()->findAlgorithm(&ob0,&ob1);
|
btCollisionAlgorithm* algorithm = m_world->getDispatcher()->findAlgorithm(&ob0,&ob1);
|
||||||
if (algorithm)
|
if (algorithm)
|
||||||
@@ -1171,8 +1171,8 @@ void btCollisionWorld::contactTest( btCollisionObject* colObj, ContactResultCall
|
|||||||
///it reports one or more contact points (including the one with deepest penetration)
|
///it reports one or more contact points (including the one with deepest penetration)
|
||||||
void btCollisionWorld::contactPairTest(btCollisionObject* colObjA, btCollisionObject* colObjB, ContactResultCallback& resultCallback)
|
void btCollisionWorld::contactPairTest(btCollisionObject* colObjA, btCollisionObject* colObjB, ContactResultCallback& resultCallback)
|
||||||
{
|
{
|
||||||
btCollisionObjectWrapper obA(0,colObjA->getCollisionShape(),colObjA,colObjA->getWorldTransform());
|
btCollisionObjectWrapper obA(0,colObjA->getCollisionShape(),colObjA,colObjA->getWorldTransform(),-1,-1);
|
||||||
btCollisionObjectWrapper obB(0,colObjB->getCollisionShape(),colObjB,colObjB->getWorldTransform());
|
btCollisionObjectWrapper obB(0,colObjB->getCollisionShape(),colObjB,colObjB->getWorldTransform(),-1,-1);
|
||||||
|
|
||||||
btCollisionAlgorithm* algorithm = getDispatcher()->findAlgorithm(&obA,&obB);
|
btCollisionAlgorithm* algorithm = getDispatcher()->findAlgorithm(&obA,&obB);
|
||||||
if (algorithm)
|
if (algorithm)
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ void btCompoundCollisionAlgorithm::preallocateChildAlgorithms(const btCollisionO
|
|||||||
|
|
||||||
const btCollisionShape* childShape = compoundShape->getChildShape(i);
|
const btCollisionShape* childShape = compoundShape->getChildShape(i);
|
||||||
|
|
||||||
btCollisionObjectWrapper childWrap(colObjWrap,childShape,colObjWrap->getCollisionObject(),colObjWrap->getWorldTransform());//wrong child trans, but unused (hopefully)
|
btCollisionObjectWrapper childWrap(colObjWrap,childShape,colObjWrap->getCollisionObject(),colObjWrap->getWorldTransform(),-1,i);//wrong child trans, but unused (hopefully)
|
||||||
m_childCollisionAlgorithms[i] = m_dispatcher->findAlgorithm(&childWrap,otherObjWrap,m_sharedManifold);
|
m_childCollisionAlgorithms[i] = m_dispatcher->findAlgorithm(&childWrap,otherObjWrap,m_sharedManifold);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -132,7 +132,7 @@ public:
|
|||||||
if (TestAabbAgainstAabb2(aabbMin0,aabbMax0,aabbMin1,aabbMax1))
|
if (TestAabbAgainstAabb2(aabbMin0,aabbMax0,aabbMin1,aabbMax1))
|
||||||
{
|
{
|
||||||
|
|
||||||
btCollisionObjectWrapper compoundWrap(this->m_compoundColObjWrap,childShape,m_compoundColObjWrap->getCollisionObject(),newChildWorldTrans);
|
btCollisionObjectWrapper compoundWrap(this->m_compoundColObjWrap,childShape,m_compoundColObjWrap->getCollisionObject(),newChildWorldTrans,-1,index);
|
||||||
|
|
||||||
|
|
||||||
//the contactpoint is still projected back using the original inverted worldtrans
|
//the contactpoint is still projected back using the original inverted worldtrans
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ void btConvexTriangleCallback::processTriangle(btVector3* triangle,int partId, i
|
|||||||
tm.setMargin(m_collisionMarginTriangle);
|
tm.setMargin(m_collisionMarginTriangle);
|
||||||
|
|
||||||
|
|
||||||
btCollisionObjectWrapper triObWrap(m_triBodyWrap,&tm,m_triBodyWrap->getCollisionObject(),m_triBodyWrap->getWorldTransform());//correct transform?
|
btCollisionObjectWrapper triObWrap(m_triBodyWrap,&tm,m_triBodyWrap->getCollisionObject(),m_triBodyWrap->getWorldTransform(),partId,triangleIndex);//correct transform?
|
||||||
btCollisionAlgorithm* colAlgo = ci.m_dispatcher1->findAlgorithm(m_convexBodyWrap,&triObWrap,m_manifoldPtr);
|
btCollisionAlgorithm* colAlgo = ci.m_dispatcher1->findAlgorithm(m_convexBodyWrap,&triObWrap,m_manifoldPtr);
|
||||||
|
|
||||||
const btCollisionObjectWrapper* tmpWrap = 0;
|
const btCollisionObjectWrapper* tmpWrap = 0;
|
||||||
|
|||||||
@@ -231,16 +231,14 @@ void btGImpactCollisionAlgorithm::shape_vs_shape_collision(
|
|||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
btCollisionObjectWrapper ob0(body0Wrap,shape0,body0Wrap->getCollisionObject(), body0Wrap->getWorldTransform());
|
|
||||||
btCollisionObjectWrapper ob1(body1Wrap,shape1,body1Wrap->getCollisionObject(),body1Wrap->getWorldTransform());
|
|
||||||
|
|
||||||
btCollisionAlgorithm* algor = newAlgorithm(&ob0,&ob1);
|
btCollisionAlgorithm* algor = newAlgorithm(body0Wrap,body1Wrap);
|
||||||
// post : checkManifold is called
|
// post : checkManifold is called
|
||||||
|
|
||||||
m_resultOut->setShapeIdentifiersA(m_part0,m_triface0);
|
m_resultOut->setShapeIdentifiersA(m_part0,m_triface0);
|
||||||
m_resultOut->setShapeIdentifiersB(m_part1,m_triface1);
|
m_resultOut->setShapeIdentifiersB(m_part1,m_triface1);
|
||||||
|
|
||||||
algor->processCollision(&ob0,&ob1,*m_dispatchInfo,m_resultOut);
|
algor->processCollision(body0Wrap,body1Wrap,*m_dispatchInfo,m_resultOut);
|
||||||
|
|
||||||
algor->~btCollisionAlgorithm();
|
algor->~btCollisionAlgorithm();
|
||||||
m_dispatcher->freeCollisionAlgorithm(algor);
|
m_dispatcher->freeCollisionAlgorithm(algor);
|
||||||
@@ -258,8 +256,8 @@ void btGImpactCollisionAlgorithm::convex_vs_convex_collision(
|
|||||||
m_resultOut->setShapeIdentifiersA(m_part0,m_triface0);
|
m_resultOut->setShapeIdentifiersA(m_part0,m_triface0);
|
||||||
m_resultOut->setShapeIdentifiersB(m_part1,m_triface1);
|
m_resultOut->setShapeIdentifiersB(m_part1,m_triface1);
|
||||||
|
|
||||||
btCollisionObjectWrapper ob0(body0Wrap,shape0,body0Wrap->getCollisionObject(),body0Wrap->getWorldTransform());
|
btCollisionObjectWrapper ob0(body0Wrap,shape0,body0Wrap->getCollisionObject(),body0Wrap->getWorldTransform(),m_part0,m_triface0);
|
||||||
btCollisionObjectWrapper ob1(body1Wrap,shape1,body1Wrap->getCollisionObject(),body1Wrap->getWorldTransform());
|
btCollisionObjectWrapper ob1(body1Wrap,shape1,body1Wrap->getCollisionObject(),body1Wrap->getWorldTransform(),m_part1,m_triface1);
|
||||||
checkConvexAlgorithm(&ob0,&ob1);
|
checkConvexAlgorithm(&ob0,&ob1);
|
||||||
m_convex_algorithm->processCollision(&ob0,&ob1,*m_dispatchInfo,m_resultOut);
|
m_convex_algorithm->processCollision(&ob0,&ob1,*m_dispatchInfo,m_resultOut);
|
||||||
|
|
||||||
@@ -553,8 +551,8 @@ void btGImpactCollisionAlgorithm::gimpact_vs_gimpact(
|
|||||||
tr1 = orgtrans1*shape1->getChildTransform(m_triface1);
|
tr1 = orgtrans1*shape1->getChildTransform(m_triface1);
|
||||||
}
|
}
|
||||||
|
|
||||||
btCollisionObjectWrapper ob0(body0Wrap,colshape0,body0Wrap->getCollisionObject(),tr0);
|
btCollisionObjectWrapper ob0(body0Wrap,colshape0,body0Wrap->getCollisionObject(),tr0,m_part0,m_triface0);
|
||||||
btCollisionObjectWrapper ob1(body1Wrap,colshape1,body1Wrap->getCollisionObject(),tr1);
|
btCollisionObjectWrapper ob1(body1Wrap,colshape1,body1Wrap->getCollisionObject(),tr1,m_part1,m_triface1);
|
||||||
|
|
||||||
//collide two convex shapes
|
//collide two convex shapes
|
||||||
convex_vs_convex_collision(&ob0,&ob1,colshape0,colshape1);
|
convex_vs_convex_collision(&ob0,&ob1,colshape0,colshape1);
|
||||||
@@ -654,17 +652,29 @@ void btGImpactCollisionAlgorithm::gimpact_vs_shape(const btCollisionObjectWrappe
|
|||||||
tr0 = orgtrans0*shape0->getChildTransform(child_index);
|
tr0 = orgtrans0*shape0->getChildTransform(child_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
btCollisionObjectWrapper ob0(body0Wrap,colshape0,body0Wrap->getCollisionObject(),body0Wrap->getWorldTransform());
|
btCollisionObjectWrapper ob0(body0Wrap,colshape0,body0Wrap->getCollisionObject(),body0Wrap->getWorldTransform(),m_part0,m_triface0);
|
||||||
|
const btCollisionObjectWrapper* prevObj0 = m_resultOut->getBody0Wrap();
|
||||||
|
|
||||||
|
if (m_resultOut->getBody0Wrap()->getCollisionObject()==ob0.getCollisionObject())
|
||||||
|
{
|
||||||
|
m_resultOut->setBody0Wrap(&ob0);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
m_resultOut->setBody1Wrap(&ob0);
|
||||||
|
}
|
||||||
|
|
||||||
//collide two shapes
|
//collide two shapes
|
||||||
if(swapped)
|
if(swapped)
|
||||||
{
|
{
|
||||||
|
|
||||||
shape_vs_shape_collision(body1Wrap,&ob0,shape1,colshape0);
|
shape_vs_shape_collision(body1Wrap,&ob0,shape1,colshape0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
shape_vs_shape_collision(&ob0,body1Wrap,colshape0,shape1);
|
shape_vs_shape_collision(&ob0,body1Wrap,colshape0,shape1);
|
||||||
}
|
}
|
||||||
|
m_resultOut->setBody0Wrap(prevObj0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -686,10 +696,29 @@ void btGImpactCollisionAlgorithm::gimpact_vs_compoundshape(const btCollisionObje
|
|||||||
const btCollisionShape * colshape1 = shape1->getChildShape(i);
|
const btCollisionShape * colshape1 = shape1->getChildShape(i);
|
||||||
btTransform childtrans1 = orgtrans1*shape1->getChildTransform(i);
|
btTransform childtrans1 = orgtrans1*shape1->getChildTransform(i);
|
||||||
|
|
||||||
btCollisionObjectWrapper ob1(body1Wrap,colshape1,body1Wrap->getCollisionObject(),childtrans1);
|
btCollisionObjectWrapper ob1(body1Wrap,colshape1,body1Wrap->getCollisionObject(),childtrans1,-1,i);
|
||||||
|
|
||||||
|
const btCollisionObjectWrapper* tmp = 0;
|
||||||
|
if (m_resultOut->getBody0Wrap()->getCollisionObject()==ob1.getCollisionObject())
|
||||||
|
{
|
||||||
|
tmp = m_resultOut->getBody0Wrap();
|
||||||
|
m_resultOut->setBody0Wrap(&ob1);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
tmp = m_resultOut->getBody1Wrap();
|
||||||
|
m_resultOut->setBody1Wrap(&ob1);
|
||||||
|
}
|
||||||
//collide child shape
|
//collide child shape
|
||||||
gimpact_vs_shape(body0Wrap, &ob1,
|
gimpact_vs_shape(body0Wrap, &ob1,
|
||||||
shape0,colshape1,swapped);
|
shape0,colshape1,swapped);
|
||||||
|
|
||||||
|
if (m_resultOut->getBody0Wrap()->getCollisionObject()==ob1.getCollisionObject())
|
||||||
|
{
|
||||||
|
m_resultOut->setBody0Wrap(tmp);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
m_resultOut->setBody1Wrap(tmp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -778,8 +807,31 @@ public:
|
|||||||
algorithm->setPart1(partId);
|
algorithm->setPart1(partId);
|
||||||
algorithm->setFace1(triangleIndex);
|
algorithm->setFace1(triangleIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
btCollisionObjectWrapper ob1Wrap(body1Wrap,&tri1,body1Wrap->getCollisionObject(),body1Wrap->getWorldTransform(),partId,triangleIndex);
|
||||||
|
const btCollisionObjectWrapper * tmp = 0;
|
||||||
|
|
||||||
|
if (algorithm->internalGetResultOut()->getBody0Wrap()->getCollisionObject()==ob1Wrap.getCollisionObject())
|
||||||
|
{
|
||||||
|
tmp = algorithm->internalGetResultOut()->getBody0Wrap();
|
||||||
|
algorithm->internalGetResultOut()->setBody0Wrap(&ob1Wrap);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
tmp = algorithm->internalGetResultOut()->getBody1Wrap();
|
||||||
|
algorithm->internalGetResultOut()->setBody1Wrap(&ob1Wrap);
|
||||||
|
}
|
||||||
|
|
||||||
algorithm->gimpact_vs_shape(
|
algorithm->gimpact_vs_shape(
|
||||||
body0Wrap,body1Wrap,gimpactshape0,&tri1,swapped);
|
body0Wrap,&ob1Wrap,gimpactshape0,&tri1,swapped);
|
||||||
|
|
||||||
|
if (algorithm->internalGetResultOut()->getBody0Wrap()->getCollisionObject()==ob1Wrap.getCollisionObject())
|
||||||
|
{
|
||||||
|
algorithm->internalGetResultOut()->setBody0Wrap(tmp);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
algorithm->internalGetResultOut()->setBody1Wrap(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -210,6 +210,10 @@ public:
|
|||||||
manifoldArray.push_back(m_manifoldPtr);
|
manifoldArray.push_back(m_manifoldPtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
btManifoldResult* internalGetResultOut()
|
||||||
|
{
|
||||||
|
return m_resultOut;
|
||||||
|
}
|
||||||
|
|
||||||
struct CreateFunc :public btCollisionAlgorithmCreateFunc
|
struct CreateFunc :public btCollisionAlgorithmCreateFunc
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -166,8 +166,8 @@ public:
|
|||||||
collisionPair.m_internalTmpValue = 2;
|
collisionPair.m_internalTmpValue = 2;
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
btCollisionObjectWrapper ob0(0,colObj0->getCollisionShape(),colObj0,colObj0->getWorldTransform());
|
btCollisionObjectWrapper ob0(0,colObj0->getCollisionShape(),colObj0,colObj0->getWorldTransform(),-1,-1);
|
||||||
btCollisionObjectWrapper ob1(0,colObj1->getCollisionShape(),colObj1,colObj1->getWorldTransform());
|
btCollisionObjectWrapper ob1(0,colObj1->getCollisionShape(),colObj1,colObj1->getWorldTransform(),-1,-1);
|
||||||
|
|
||||||
collisionPair.m_algorithm = m_dispatcher->findAlgorithm(&ob0,&ob1);
|
collisionPair.m_algorithm = m_dispatcher->findAlgorithm(&ob0,&ob1);
|
||||||
collisionPair.m_internalTmpValue = 3;
|
collisionPair.m_internalTmpValue = 3;
|
||||||
@@ -245,8 +245,8 @@ void SpuGatheringCollisionDispatcher::dispatchAllCollisionPairs(btOverlappingPai
|
|||||||
if (dispatcher->needsCollision(colObj0,colObj1))
|
if (dispatcher->needsCollision(colObj0,colObj1))
|
||||||
{
|
{
|
||||||
//discrete collision detection query
|
//discrete collision detection query
|
||||||
btCollisionObjectWrapper ob0(0,colObj0->getCollisionShape(),colObj0,colObj0->getWorldTransform());
|
btCollisionObjectWrapper ob0(0,colObj0->getCollisionShape(),colObj0,colObj0->getWorldTransform(),-1,-1);
|
||||||
btCollisionObjectWrapper ob1(0,colObj1->getCollisionShape(),colObj1,colObj1->getWorldTransform());
|
btCollisionObjectWrapper ob1(0,colObj1->getCollisionShape(),colObj1,colObj1->getWorldTransform(),-1,-1);
|
||||||
|
|
||||||
btManifoldResult contactPointResult(&ob0,&ob1);
|
btManifoldResult contactPointResult(&ob0,&ob1);
|
||||||
|
|
||||||
|
|||||||
@@ -117,9 +117,9 @@ void btSoftBodyTriangleCallback::processTriangle(btVector3* triangle,int partId,
|
|||||||
//copy over user pointers to temporary shape
|
//copy over user pointers to temporary shape
|
||||||
tm->setUserPointer(m_triBody->getCollisionShape()->getUserPointer());
|
tm->setUserPointer(m_triBody->getCollisionShape()->getUserPointer());
|
||||||
|
|
||||||
btCollisionObjectWrapper softBody(0,m_softBody->getCollisionShape(),m_softBody,m_softBody->getWorldTransform());
|
btCollisionObjectWrapper softBody(0,m_softBody->getCollisionShape(),m_softBody,m_softBody->getWorldTransform(),-1,-1);
|
||||||
//btCollisionObjectWrapper triBody(0,tm, ob, btTransform::getIdentity());//ob->getWorldTransform());//??
|
//btCollisionObjectWrapper triBody(0,tm, ob, btTransform::getIdentity());//ob->getWorldTransform());//??
|
||||||
btCollisionObjectWrapper triBody(0,tm, m_triBody, m_triBody->getWorldTransform());
|
btCollisionObjectWrapper triBody(0,tm, m_triBody, m_triBody->getWorldTransform(),partId, triangleIndex);
|
||||||
|
|
||||||
btCollisionAlgorithm* colAlgo = ci.m_dispatcher1->findAlgorithm(&softBody,&triBody,0);//m_manifoldPtr);
|
btCollisionAlgorithm* colAlgo = ci.m_dispatcher1->findAlgorithm(&softBody,&triBody,0);//m_manifoldPtr);
|
||||||
|
|
||||||
@@ -161,8 +161,8 @@ void btSoftBodyTriangleCallback::processTriangle(btVector3* triangle,int partId,
|
|||||||
tm->setUserPointer(m_triBody->getCollisionShape()->getUserPointer());
|
tm->setUserPointer(m_triBody->getCollisionShape()->getUserPointer());
|
||||||
|
|
||||||
|
|
||||||
btCollisionObjectWrapper softBody(0,m_softBody->getCollisionShape(),m_softBody,m_softBody->getWorldTransform());
|
btCollisionObjectWrapper softBody(0,m_softBody->getCollisionShape(),m_softBody,m_softBody->getWorldTransform(),-1,-1);
|
||||||
btCollisionObjectWrapper triBody(0,tm, m_triBody, m_triBody->getWorldTransform());//btTransform::getIdentity());//??
|
btCollisionObjectWrapper triBody(0,tm, m_triBody, m_triBody->getWorldTransform(),partId, triangleIndex);//btTransform::getIdentity());//??
|
||||||
|
|
||||||
btCollisionAlgorithm* colAlgo = ci.m_dispatcher1->findAlgorithm(&softBody,&triBody,0);//m_manifoldPtr);
|
btCollisionAlgorithm* colAlgo = ci.m_dispatcher1->findAlgorithm(&softBody,&triBody,0);//m_manifoldPtr);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user