explicitly deserialize btCapsuleShape date (margin, scaling, halfextents), because the API modifies them
This commit is contained in:
@@ -60,7 +60,7 @@ IF(MSVC)
|
|||||||
|
|
||||||
IF (NOT USE_MSVC_RUNTIME_LIBRARY_DLL)
|
IF (NOT USE_MSVC_RUNTIME_LIBRARY_DLL)
|
||||||
#We statically link to reduce dependancies
|
#We statically link to reduce dependancies
|
||||||
FOREACH(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
|
FOREACH(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO )
|
||||||
IF(${flag_var} MATCHES "/MD")
|
IF(${flag_var} MATCHES "/MD")
|
||||||
STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
|
STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
|
||||||
ENDIF(${flag_var} MATCHES "/MD")
|
ENDIF(${flag_var} MATCHES "/MD")
|
||||||
|
|||||||
@@ -443,7 +443,7 @@ void DemoApplication::keyboardCallback(unsigned char key, int x, int y)
|
|||||||
m_debugMode |= btIDebugDraw::DBG_ProfileTimings;
|
m_debugMode |= btIDebugDraw::DBG_ProfileTimings;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '=':
|
case '\\':
|
||||||
{
|
{
|
||||||
int maxSerializeBufferSize = 1024*1024*5;
|
int maxSerializeBufferSize = 1024*1024*5;
|
||||||
btDefaultSerializer* serializer = new btDefaultSerializer(maxSerializeBufferSize);
|
btDefaultSerializer* serializer = new btDefaultSerializer(maxSerializeBufferSize);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ void SerializeSetup::initPhysics(GraphicsPhysicsBridge& gfxBridge)
|
|||||||
{
|
{
|
||||||
this->createEmptyDynamicsWorld();
|
this->createEmptyDynamicsWorld();
|
||||||
gfxBridge.createPhysicsDebugDrawer(m_dynamicsWorld);
|
gfxBridge.createPhysicsDebugDrawer(m_dynamicsWorld);
|
||||||
m_dynamicsWorld->getDebugDrawer()->setDebugMode(btIDebugDraw::DBG_DrawWireframe);
|
m_dynamicsWorld->getDebugDrawer()->setDebugMode(btIDebugDraw::DBG_DrawWireframe+btIDebugDraw::DBG_DrawContactPoints);
|
||||||
btBulletWorldImporter* importer = new btBulletWorldImporter(m_dynamicsWorld);
|
btBulletWorldImporter* importer = new btBulletWorldImporter(m_dynamicsWorld);
|
||||||
const char* someFileName="spider.bullet";
|
const char* someFileName="spider.bullet";
|
||||||
|
|
||||||
|
|||||||
@@ -314,7 +314,8 @@ struct GL3TexLoader : public MyTextureLoader
|
|||||||
|
|
||||||
virtual void LoadTexture( Gwen::Texture* pTexture )
|
virtual void LoadTexture( Gwen::Texture* pTexture )
|
||||||
{
|
{
|
||||||
const char* n = pTexture->name.Get().c_str();
|
Gwen::String namestr = pTexture->name.Get();
|
||||||
|
const char* n = namestr.c_str();
|
||||||
GLint* texIdPtr = m_hashMap[n];
|
GLint* texIdPtr = m_hashMap[n];
|
||||||
if (texIdPtr)
|
if (texIdPtr)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -197,10 +197,46 @@ btCollisionShape* btWorldImporter::convertCollisionShape( btCollisionShapeData*
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
//The btCapsuleShape* API has issue passing the margin/scaling/halfextents unmodified through the API
|
||||||
|
//so deal with this
|
||||||
|
case CAPSULE_SHAPE_PROXYTYPE:
|
||||||
|
{
|
||||||
|
btCapsuleShapeData* capData = (btCapsuleShapeData*)shapeData;
|
||||||
|
|
||||||
|
|
||||||
|
switch (capData->m_upAxis)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
shape = createCapsuleShapeX(1,1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
shape = createCapsuleShapeY(1,1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
shape = createCapsuleShapeZ(1,1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
printf("error: wrong up axis for btCapsuleShape\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
if (shape)
|
||||||
|
{
|
||||||
|
btCapsuleShape* cap = (btCapsuleShape*) shape;
|
||||||
|
cap->deSerializeFloat(capData);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case CYLINDER_SHAPE_PROXYTYPE:
|
case CYLINDER_SHAPE_PROXYTYPE:
|
||||||
case CONE_SHAPE_PROXYTYPE:
|
case CONE_SHAPE_PROXYTYPE:
|
||||||
case CAPSULE_SHAPE_PROXYTYPE:
|
|
||||||
case BOX_SHAPE_PROXYTYPE:
|
case BOX_SHAPE_PROXYTYPE:
|
||||||
case SPHERE_SHAPE_PROXYTYPE:
|
case SPHERE_SHAPE_PROXYTYPE:
|
||||||
case MULTI_SPHERE_SHAPE_PROXYTYPE:
|
case MULTI_SPHERE_SHAPE_PROXYTYPE:
|
||||||
@@ -227,36 +263,7 @@ btCollisionShape* btWorldImporter::convertCollisionShape( btCollisionShapeData*
|
|||||||
shape = createSphereShape(implicitShapeDimensions.getX());
|
shape = createSphereShape(implicitShapeDimensions.getX());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CAPSULE_SHAPE_PROXYTYPE:
|
|
||||||
{
|
|
||||||
btCapsuleShapeData* capData = (btCapsuleShapeData*)shapeData;
|
|
||||||
switch (capData->m_upAxis)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
{
|
|
||||||
shape = createCapsuleShapeX(implicitShapeDimensions.getY()+bsd->m_collisionMargin*2,2*implicitShapeDimensions.getX());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
{
|
|
||||||
shape = createCapsuleShapeY(implicitShapeDimensions.getX()+bsd->m_collisionMargin*2,2*implicitShapeDimensions.getY());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
|
||||||
{
|
|
||||||
shape = createCapsuleShapeZ(implicitShapeDimensions.getX()+bsd->m_collisionMargin*2,2*implicitShapeDimensions.getZ());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
printf("error: wrong up axis for btCapsuleShape\n");
|
|
||||||
}
|
|
||||||
bsd->m_collisionMargin = 0.f;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case CYLINDER_SHAPE_PROXYTYPE:
|
case CYLINDER_SHAPE_PROXYTYPE:
|
||||||
{
|
{
|
||||||
btCylinderShapeData* cylData = (btCylinderShapeData*) shapeData;
|
btCylinderShapeData* cylData = (btCylinderShapeData*) shapeData;
|
||||||
|
|||||||
@@ -117,6 +117,7 @@ public:
|
|||||||
///fills the dataBuffer and returns the struct name (and 0 on failure)
|
///fills the dataBuffer and returns the struct name (and 0 on failure)
|
||||||
virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
|
virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
|
||||||
|
|
||||||
|
SIMD_FORCE_INLINE void deSerializeFloat(struct btCapsuleShapeData* dataBuffer);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -181,4 +182,13 @@ SIMD_FORCE_INLINE const char* btCapsuleShape::serialize(void* dataBuffer, btSeri
|
|||||||
return "btCapsuleShapeData";
|
return "btCapsuleShapeData";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SIMD_FORCE_INLINE void btCapsuleShape::deSerializeFloat(btCapsuleShapeData* dataBuffer)
|
||||||
|
{
|
||||||
|
m_implicitShapeDimensions.deSerializeFloat(dataBuffer->m_convexInternalShapeData.m_implicitShapeDimensions);
|
||||||
|
m_collisionMargin = dataBuffer->m_convexInternalShapeData.m_collisionMargin;
|
||||||
|
m_localScaling.deSerializeFloat(dataBuffer->m_convexInternalShapeData.m_localScaling);
|
||||||
|
//it is best to already pre-allocate the matching btCapsuleShape*(X/Z) version to match m_upAxis
|
||||||
|
m_upAxis = dataBuffer->m_upAxis;
|
||||||
|
}
|
||||||
|
|
||||||
#endif //BT_CAPSULE_SHAPE_H
|
#endif //BT_CAPSULE_SHAPE_H
|
||||||
|
|||||||
Reference in New Issue
Block a user