diff --git a/Demos/AllBulletDemos/DemoEntries.cpp b/Demos/AllBulletDemos/DemoEntries.cpp index 6684762bd..7152e3e15 100644 --- a/Demos/AllBulletDemos/DemoEntries.cpp +++ b/Demos/AllBulletDemos/DemoEntries.cpp @@ -113,11 +113,12 @@ btDemoEntry g_demoEntries[] = //{"ConcaveDemo",ConcaveDemo::Create}, {"Concave Convexcast Demo",ConcaveConvexcastDemo::Create}, // {"SoftBody Cloth",SoftDemo0::Create}, -// {"SoftBody Pressure",SoftDemo1::Create}, + {"SoftBody Ropes Attach",SoftDemo4::Create}, {"SoftBody Cloth Attach",SoftDemo5::Create}, {"SoftBody Cluster Collide1",SoftDemo19::Create}, - {"SoftBody Volume",SoftDemo2::Create}, +// {"SoftBody Volume",SoftDemo2::Create}, + {"SoftBody Pressure",SoftDemo1::Create}, {"SoftBody Cluster Car",SoftDemo24::Create}, {"SoftBody Cluster Robot",SoftDemo25::Create}, // {"SoftBody Ropes",SoftDemo3::Create}, diff --git a/Demos/AllBulletDemos/Main.cpp b/Demos/AllBulletDemos/Main.cpp index ed7083e9e..c77a240ad 100644 --- a/Demos/AllBulletDemos/Main.cpp +++ b/Demos/AllBulletDemos/Main.cpp @@ -51,6 +51,7 @@ namespace int tx, ty, tw, th; int gDrawAabb; int gWireFrame; + int gHelpText; int gDebugContacts; int gDrawTextures=1; int gDrawShadows=0; @@ -79,6 +80,7 @@ void setDefaultSettings() gDrawAabb=0; gWireFrame=0; gDebugContacts=0; + gHelpText = 0; gDrawTextures=1; gDrawShadows=0; gDrawClusters=0; @@ -207,6 +209,13 @@ void SimulationLoop() demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawWireframe)); } + if (gHelpText) + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_NoHelpText)); + } else + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_NoHelpText); + } if (gDebugContacts) { demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawContactPoints); @@ -450,9 +459,12 @@ int main(int argc, char** argv) GLUI_Panel* drawPanel = glui->add_panel("Debug Draw"); + + glui->add_checkbox_to_panel(drawPanel, "Help", &gHelpText); glui->add_checkbox_to_panel(drawPanel, "AABBs", &gDrawAabb); glui->add_checkbox_to_panel(drawPanel, "Wireframe", &gWireFrame); glui->add_checkbox_to_panel(drawPanel, "Contacts", &gDebugContacts); + glui->add_checkbox_to_panel(drawPanel, "Textures", &gDrawTextures); glui->add_checkbox_to_panel(drawPanel, "Shadows", &gDrawShadows); glui->add_checkbox_to_panel(drawPanel, "Clusters", &gDrawClusters); diff --git a/Demos/CollisionDemo/CollisionDemo.cpp b/Demos/CollisionDemo/CollisionDemo.cpp index c98524360..3837a586f 100644 --- a/Demos/CollisionDemo/CollisionDemo.cpp +++ b/Demos/CollisionDemo/CollisionDemo.cpp @@ -20,7 +20,7 @@ subject to the following restrictions: /// -#define CHECK_GENSHER_TRIANGLE_CASE 1 +//#define CHECK_GENSHER_TRIANGLE_CASE 1 ///This low-level internal demo does intentionally NOT use the btBulletCollisionCommon.h header @@ -34,12 +34,15 @@ subject to the following restrictions: #include "BulletCollision/NarrowPhaseCollision/btPointCollector.h" #include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" #include "BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h" -#include "BulletCollision/CollisionShapes/btTriangleShape.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h" +#include "LinearMath/btTransformUtil.h" #include "CollisionDemo.h" #include "GL_ShapeDrawer.h" #include "GlutStuff.h" #include "LinearMath/btIDebugDraw.h" +#include "../OpenGL/GLDebugDrawer.h" +GLDebugDrawer debugDrawer; float yaw=0.f,pitch=0.f,roll=0.f; @@ -78,7 +81,10 @@ int main(int argc,char** argv) void CollisionDemo::initPhysics() { - m_debugMode |= btIDebugDraw::DBG_DrawWireframe; + setTexturing(false); + setShadows(false); + + //m_debugMode |= btIDebugDraw::DBG_DrawWireframe; #ifdef CHECK_GENSHER_TRIANGLE_CASE m_azi = 140.f; #else @@ -86,75 +92,32 @@ void CollisionDemo::initPhysics() #endif m_ele = 25.f; - tr[0].setOrigin(btVector3(0.0013328250f,8.1363249f,7.0390840f)); - tr[1].setOrigin(btVector3(0.00000000f,9.1262732f,2.0343180f)); + m_azi = 0; + m_ele = 0; - //tr[0].setOrigin(btVector3(0,0,0)); - //tr[1].setOrigin(btVector3(0,10,0)); + tr[0].setIdentity(); + tr[0].setOrigin(btVector3(10,0,0)); + tr[1].setIdentity(); + tr[1].setOrigin(btVector3(0,0,0)); - btMatrix3x3 basisA; - basisA.setValue(0.99999958f,0.00022980258f,0.00090992288f, - -0.00029313788f,0.99753088f,0.070228584f, - -0.00089153741f,-0.070228823f,0.99753052f); - - btMatrix3x3 basisB; - basisB.setValue(1.0000000f,4.4865553e-018f,-4.4410586e-017f, - 4.4865495e-018f,0.97979438f,0.20000751f, - 4.4410586e-017f,-0.20000751f,0.97979438f); - - tr[0].setBasis(basisA); - tr[1].setBasis(basisB); #ifdef CHECK_GENSHER_TRIANGLE_CASE tr[0].setIdentity(); tr[1].setIdentity(); #endif //CHECK_GENSHER_TRIANGLE_CASE - btVector3 boxHalfExtentsA(1.0000004768371582f,1.0000004768371582f,1.0000001192092896f); - btVector3 boxHalfExtentsB(3.2836332321166992f,3.2836332321166992f,3.2836320400238037f); + btVector3 boxHalfExtentsA(1,1,1);//1.0000004768371582f,1.0000004768371582f,1.0000001192092896f); + btVector3 boxHalfExtentsB(4,4,4);//3.2836332321166992f,3.2836332321166992f,3.2836320400238037f); #ifndef CHECK_GENSHER_TRIANGLE_CASE btBoxShape* boxA = new btBoxShape(boxHalfExtentsA); btBoxShape* boxB = new btBoxShape(boxHalfExtentsB); #endif - float p1[3], p2[3], p3[3], q1[3],q2[3], q3[3]; - - p1[0] = -3.9242966175; - p1[1] = -0.5582823175; - p1[2] = 2.0101921558; - - p2[0] = -3.6731941700; - p2[1] = -0.5604774356; - p2[2] = 2.00301921558; - - p3[0] = -3.6698703766; - p3[1] = -0.3097069263; - p3[2] = 2.0073683262; - - - - - q1[0] = -2.6317186356; - q1[1] = -1.0000005960; - q1[2] = 1.9999998808; - - q2[0] = -2.6317174435; - q2[1] = 0.9999994636; - q2[2] = 1.9999998808; - - q3[0] = -4.6317176819; - q3[1] = 1.0f; - q3[2] = 1.9999998808; - btTriangleShape* trishapeA = new btTriangleShape(btVector3(p1[0], p1[1], p1[2]), btVector3(p2[0], p2[1], p2[2]), btVector3(p3[0], p3[1], p3[2])); - trishapeA->setMargin(0.001f); - - btTriangleShape* trishapeB = new btTriangleShape(btVector3(q1[0], q1[1], q1[2]), btVector3(q2[0], q2[1], q2[2]), btVector3(q3[0], q3[1], q3[2])); - trishapeB->setMargin(0.001f); - + #ifdef CHECK_GENSHER_TRIANGLE_CASE shapePtr[0] = trishapeA; @@ -176,83 +139,148 @@ void CollisionDemo::clientMoveAndDisplay() static btVoronoiSimplexSolver sGjkSimplexSolver; btSimplexSolverInterface& gGjkSimplexSolver = sGjkSimplexSolver; +static btScalar gContactBreakingThreshold=.02f; - +int checkPerturbation = 1; +int numPerturbationIterations = 20; void CollisionDemo::displayCallback(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDisable(GL_LIGHTING); - - - - btVoronoiSimplexSolver sGjkSimplexSolver; - - btGjkPairDetector convexConvex(shapePtr[0],shapePtr[1],&sGjkSimplexSolver,0); + btVoronoiSimplexSolver sGjkSimplexSolver; + btGjkEpaPenetrationDepthSolver epaSolver; btPointCollector gjkOutput; - btGjkPairDetector::ClosestPointInput input; - - - - input.m_transformA = tr[0]; - input.m_transformB = tr[1]; - - convexConvex.getClosestPoints(input, gjkOutput, 0); + btVector3 worldBoundsMin(-1000,-1000,-1000); + btVector3 worldBoundsMax(1000,1000,1000); + { + btGjkPairDetector convexConvex(shapePtr[0],shapePtr[1],&sGjkSimplexSolver,&epaSolver); + + btGjkPairDetector::ClosestPointInput input; + input.m_transformA = tr[0]; + input.m_transformB = tr[1]; + + + convexConvex.getClosestPoints(input, gjkOutput, 0); + } if (gjkOutput.m_hasResult) { - //VECCOPY(pa, gjkOutput.m_pointInWorld); - //VECCOPY(pb, gjkOutput.m_pointInWorld); - //VECADDFAC(pb, pb, gjkOutput.m_normalOnBInWorld, gjkOutput.m_distance); - printf("bullet: %10.10f\n", gjkOutput.m_distance); // = 0.24 => that's absolutely wrong! - btVector3 endPt = gjkOutput.m_pointInWorld + - gjkOutput.m_normalOnBInWorld*gjkOutput.m_distance; + printf("bullet: %10.10f\n", gjkOutput.m_distance); + btVector3 endPt = gjkOutput.m_pointInWorld + + gjkOutput.m_normalOnBInWorld*gjkOutput.m_distance; + + debugDrawer.drawLine(gjkOutput.m_pointInWorld,endPt,btVector3(1,0,0)); + debugDrawer.drawSphere(gjkOutput.m_pointInWorld,0.05,btVector3(0,1,0)); + debugDrawer.drawSphere(endPt,0.05,btVector3(0,0,1)); + + bool perturbeA = false;//true; + const btScalar angleLimit = 0.125f * SIMD_PI; + btScalar perturbeAngle; + btScalar radiusA = shapePtr[0]->getAngularMotionDisc(); + btScalar radiusB = shapePtr[1]->getAngularMotionDisc(); + + if (radiusA < radiusB) + { + perturbeAngle = gContactBreakingThreshold /radiusA; + perturbeA = true; + } else + { + perturbeAngle = gContactBreakingThreshold / radiusB; + perturbeA = false; + } + if ( perturbeAngle > angleLimit ) + perturbeAngle = angleLimit; + + btVector3 v0,v1; + btPlaneSpace1(gjkOutput.m_normalOnBInWorld,v0,v1); + + + int i; + for ( i=0;idrawOpenGL(m,shapePtr[0],btVector3(0,1,0),getDebugMode(),worldBoundsMin,worldBoundsMax); + + } + + if (1)//gjkOutput.m_hasResult) + { + printf("bullet: %10.10f\n", gjkOutput.m_distance); + btVector3 startPt,endPt; + if (perturbeA) + { + btVector3 endPtOrg = gjkOutput.m_pointInWorld + gjkOutput.m_normalOnBInWorld*gjkOutput.m_distance; + endPt = (tr[0]*input.m_transformA.inverse())(endPtOrg); + btScalar depth = (endPt - gjkOutput.m_pointInWorld).dot(gjkOutput.m_normalOnBInWorld); + startPt = endPt-gjkOutput.m_normalOnBInWorld*depth; + } else + { + endPt = gjkOutput.m_pointInWorld + gjkOutput.m_normalOnBInWorld*gjkOutput.m_distance; + startPt = (tr[1]*input.m_transformB.inverse())(gjkOutput.m_pointInWorld); + btScalar depth = (endPt - startPt).dot(gjkOutput.m_normalOnBInWorld); + } + + + debugDrawer.drawLine(startPt,endPt,btVector3(1,0,0)); + debugDrawer.drawSphere(startPt,0.05,btVector3(0,1,0)); + debugDrawer.drawSphere(endPt,0.05,btVector3(0,0,1)); + } + } - glBegin(GL_LINES); - glColor3f(1, 0, 0); - glVertex3d(gjkOutput.m_pointInWorld.x(), gjkOutput.m_pointInWorld.y(),gjkOutput.m_pointInWorld.z()); - glVertex3d(endPt.x(),endPt.y(),endPt.z()); - //glVertex3d(gjkOutputm_pointInWorld.x(), gjkOutputm_pointInWorld.y(),gjkOutputm_pointInWorld.z()); - //glVertex3d(gjkOutputm_pointInWorld.x(), gjkOutputm_pointInWorld.y(),gjkOutputm_pointInWorld.z()); - glEnd(); } + static int looper = 0; + if (looper++>10) + { + looper =0; + checkPerturbation++; + if (checkPerturbation>numPerturbationIterations) + checkPerturbation=0; + } - //GL_ShapeDrawer::drawCoordSystem(); + GL_ShapeDrawer::drawCoordSystem(); btScalar m[16]; int i; -// btGjkPairDetector convexConvex(shapePtr[0],shapePtr[1],&sGjkSimplexSolver,0); + - convexConvex.getClosestPoints(input ,gjkOutput,0); - - btVector3 worldBoundsMin(-1000,-1000,-1000); - btVector3 worldBoundsMax(1000,1000,1000); for (i=0;idrawOpenGL(m,shapePtr[i],btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); - - } - simplex.setSimplexSolver(&sGjkSimplexSolver); - btVector3 ybuf[4],pbuf[4],qbuf[4]; - int numpoints = sGjkSimplexSolver.getSimplex(pbuf,qbuf,ybuf); - simplex.reset(); - - for (i=0;idrawOpenGL(m,&simplex,btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); - btQuaternion orn; orn.setEuler(yaw,pitch,roll); diff --git a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp index bba6e286f..660861091 100644 --- a/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp +++ b/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp @@ -11,7 +11,7 @@ #include "btHfFluid.h" btHfFluidBuoyantShapeCollisionAlgorithm::btHfFluidBuoyantShapeCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* col0,btCollisionObject* col1,btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver) -: btCollisionAlgorithm(ci), m_convexConvexAlgorithm(NULL, ci, col0, col1, simplexSolver, pdSolver) +: btCollisionAlgorithm(ci), m_convexConvexAlgorithm(NULL, ci, col0, col1, simplexSolver, pdSolver,0,0) { m_collisionObject0 = col0; m_collisionObject1 = col1; diff --git a/Extras/BulletColladaConverter/ColladaConverter.cpp b/Extras/BulletColladaConverter/ColladaConverter.cpp index 873844639..f3659fee1 100644 --- a/Extras/BulletColladaConverter/ColladaConverter.cpp +++ b/Extras/BulletColladaConverter/ColladaConverter.cpp @@ -26,7 +26,7 @@ subject to the following restrictions: #include #include "BulletCollision/CollisionShapes/btShapeHull.h" - +#include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h" #include "BulletCollision/CollisionShapes/btBoxShape.h" #include "BulletCollision/CollisionShapes/btSphereShape.h" #include "BulletCollision/CollisionShapes/btCylinderShape.h" @@ -274,6 +274,40 @@ void ColladaConverter::reset () m_dom = NULL; } +void ColladaConverter::setCameraInfo(const btVector3& upAxis,int forwardAxis) +{ + if (!instantiateDom ()) + { + return; + } + + domAsset::domUp_axis * up = m_dom->getAsset()->getUp_axis(); + int upAxisIndex = upAxis.maxAxis(); + + switch (upAxisIndex) + { + case 0: + { + up->setValue(UPAXISTYPE_X_UP); + break; + } + case 1: + { + up->setValue(UPAXISTYPE_Y_UP); + break; + } + case 2: + { + up->setValue(UPAXISTYPE_Z_UP); + break; + } + default: + { + } + }; + +} + bool ColladaConverter::convert() { @@ -1515,6 +1549,16 @@ void ColladaConverter::addConvexMesh (btCollisionShape* shape, const char* nodeN printf("ERROR: Unsupported.\n"); } +void ColladaConverter::addScaledConcaveMesh(btCollisionShape* shape, const char* nodeName) +{ + btScaledBvhTriangleMeshShape* scaledShape = (btScaledBvhTriangleMeshShape*)shape; + btBvhTriangleMeshShape* meshShape = scaledShape->getChildShape(); + btStridingMeshInterface* meshInterface = meshShape->getMeshInterface (); + addConcaveMeshInternal(meshInterface,nodeName); +} + + + void ColladaConverter::addConcaveMesh(btCollisionShape* shape, const char* nodeName) { btTriangleMeshShape* meshShape = (btTriangleMeshShape*)shape; @@ -1560,8 +1604,11 @@ void ColladaConverter::addConcaveMeshInternal(btStridingMeshInterface* meshInter geo->setId( nodeName ); geo->setName ( nodeName); + printf("numSubParts = \n",meshInterface->getNumSubParts ()); + for (int i = 0; i < meshInterface->getNumSubParts (); i++) { + domMesh *mesh = daeSafeCast( geo->createAndPlace( COLLADA_ELEMENT_MESH ) ); if ( mesh == NULL ) @@ -1581,6 +1628,12 @@ void ColladaConverter::addConcaveMeshInternal(btStridingMeshInterface* meshInter meshInterface->getLockedReadOnlyVertexIndexBase (&vertexBase, numVerts, vertexType, vertexStride, &indexBase, indexStride, numFaces, indexType, i); + printf("meshInterface subpart[%d].numVerts = %d\n",i,numVerts); + printf("meshInterface subpart[%d].numFaces = %d\n",i,numFaces); + printf("meshInterface subpart[%d].indexType= %d\n",i,indexType); + + + btAssert (vertexBase); btAssert (indexBase); btAssert (vertexType == PHY_FLOAT); @@ -1820,6 +1873,15 @@ void ColladaConverter::buildShapeNew (btCollisionShape* shape, void* domTechniqu } break; + case SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE: + { + addScaledConcaveMesh (shape, shapeName); + char shapeURL[512]; + snprintf(&shapeURL[0], 512, "#%s", shapeName); + domInstance_geometry* gi = (domInstance_geometry*)colladaShape->createAndPlace (COLLADA_ELEMENT_INSTANCE_GEOMETRY); + gi->setUrl (shapeURL); + break; + } case TRIANGLE_MESH_SHAPE_PROXYTYPE: { addConcaveMesh (shape, shapeName); @@ -1934,9 +1996,58 @@ domNode* ColladaConverter::addNode (btRigidBody* rb, const char* nodeName, const } -domRigid_constraint* ColladaConverter::addConstraint (btTypedConstraint* constraint, const char* constraintName) +domRigid_constraint* ColladaConverter::addConstraint (btTypedConstraint* originalConstraint, const char* constraintName) { - if (constraint->getConstraintType() != D6_CONSTRAINT_TYPE) + btGeneric6DofConstraint* constraint = 0; + btGeneric6DofConstraint* tmpConstraint = 0; + + switch (originalConstraint->getConstraintType()) + { + + case D6_CONSTRAINT_TYPE: + { + constraint = (btGeneric6DofConstraint*)originalConstraint; + break; + } + + case POINT2POINT_CONSTRAINT_TYPE: + { + btPoint2PointConstraint* p2p = (btPoint2PointConstraint*) originalConstraint; + bool useLinearReferenceFrameA = true; + btTransform frameA,frameB; + frameA.setIdentity(); + frameB.setIdentity(); + frameA.setOrigin(p2p->getPivotInA()); + frameB.setOrigin(p2p->getPivotInB()); + tmpConstraint = new btGeneric6DofConstraint(p2p->getRigidBodyA(),p2p->getRigidBodyB(),frameA,frameB,useLinearReferenceFrameA); + tmpConstraint->setLinearLowerLimit(btVector3(0,0,0)); + tmpConstraint->setLinearUpperLimit(btVector3(0,0,0)); + constraint = tmpConstraint; + break; + } + case HINGE_CONSTRAINT_TYPE: + { + btHingeConstraint* hinge = (btHingeConstraint*)originalConstraint; + bool useLinearReferenceFrameA = true; + btTransform frameB = hinge->getBFrame();//todo: remove this flipping + frameB.getBasis()[0][2] *= btScalar(-1.); + frameB.getBasis()[1][2] *= btScalar(-1.); + frameB.getBasis()[2][2] *= btScalar(-1.); + + tmpConstraint = new btGeneric6DofConstraint(hinge->getRigidBodyA(),hinge->getRigidBodyB(),hinge->getAFrame(),frameB,useLinearReferenceFrameA); + tmpConstraint->setLinearLowerLimit(btVector3(0,0,0)); + tmpConstraint->setLinearUpperLimit(btVector3(0,0,0)); + tmpConstraint->setAngularLowerLimit(btVector3(0,0,1)); + tmpConstraint->setAngularUpperLimit(btVector3(0,0,-1));//maxgetConstraintType() != D6_CONSTRAINT_TYPE)) return NULL; btGeneric6DofConstraint* g6c = (btGeneric6DofConstraint*)constraint; @@ -2085,6 +2196,8 @@ domRigid_constraint* ColladaConverter::addConstraint (btTypedConstraint* constra max->getValue().set (1, limit->m_upperLimit[1]); max->getValue().set (2, limit->m_upperLimit[2]); } + if (tmpConstraint) + delete tmpConstraint; return domRigidConstraint; } @@ -2388,15 +2501,15 @@ void ColladaConverter::syncOrAddGeometry (btCollisionShape* shape, const char* n void ColladaConverter::syncOrAddRigidBody (btRigidBody* body) { - domNodeRef node = findNode (body); + domNodeRef nodeRef = findNode (body); domLibrary_geometriesRef geomLib = getDefaultGeomLib (); static int random_node_name_key = 0; - if (node != NULL) + if (nodeRef != NULL) { - updateRigidBodyPosition (body, node); + updateRigidBodyPosition (body, nodeRef); updateRigidBodyVelocity (body); - printf("Updating %s in the COLLADA DOM.\n", node->getId() ? node->getId() : ""); + printf("Updating %s in the COLLADA DOM.\n", nodeRef->getId() ? nodeRef->getId() : ""); } else { /* This is a new body. */ const char* shapeName = NULL; @@ -2428,19 +2541,9 @@ void ColladaConverter::syncOrAddRigidBody (btRigidBody* body) shapeName = &shapeNameGen[0]; } - if (shape->getShapeType () == TRIANGLE_MESH_SHAPE_PROXYTYPE) { - addConcaveMesh (shape, shapeName); - } else if (shape->getShapeType () == GIMPACT_SHAPE_PROXYTYPE) - { - addGimpactMesh (shape, shapeName); - } else if (!shape->isConvex () && !shape->isCompound() && (shape->getShapeType()!=STATIC_PLANE_PROXYTYPE)) { - printf("Unknown shape type. %d Skipping rigidbody.\n", shape->getShapeType()); - return; - } - - printf("Adding %s to COLLADA DOM.\n", nodeName); + switch (shape->getShapeType()) { case STATIC_PLANE_PROXYTYPE: @@ -2455,12 +2558,49 @@ void ColladaConverter::syncOrAddRigidBody (btRigidBody* body) dNode = addNode (body, nodeName, concaveShapeName); break; } + case SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE: + { + addScaledConcaveMesh (shape, shapeName); + btScaledBvhTriangleMeshShape* scaledShape = (btScaledBvhTriangleMeshShape*)shape; + dNode = addNode (body, nodeName, shapeName); + //add scaling + domScale* scale= (domScale*)dNode->createAndPlace (COLLADA_ELEMENT_SCALE); + { + btVector3 localScaling = scaledShape->getLocalScaling(); + scale->getValue().append(localScaling[0]); + scale->getValue().append(localScaling[1]); + scale->getValue().append(localScaling[2]); + } + + + break; + } + case TRIANGLE_MESH_SHAPE_PROXYTYPE: + { + addConcaveMesh (shape, shapeName); + dNode = addNode (body, nodeName, shapeName); + break; + } + case GIMPACT_SHAPE_PROXYTYPE: + { + addGimpactMesh (shape, shapeName); + dNode = addNode (body, nodeName, shapeName); + break; + } default: { + if (!shape->isConvex () && !shape->isCompound() && (shape->getShapeType()!=STATIC_PLANE_PROXYTYPE)) + { + printf("Unknown shape type. %d Skipping rigidbody.\n", shape->getShapeType()); + return; + } dNode = addNode (body, nodeName, shapeName); - } + }; + }; + + addMaterial (body, nodeName); dRigidBody = addRigidBody (body, nodeName, shapeName); diff --git a/Extras/BulletColladaConverter/ColladaConverter.h b/Extras/BulletColladaConverter/ColladaConverter.h index 713ae2772..c31d1f3fa 100644 --- a/Extras/BulletColladaConverter/ColladaConverter.h +++ b/Extras/BulletColladaConverter/ColladaConverter.h @@ -141,6 +141,7 @@ protected: void addConvexHull (btCollisionShape* shape, const char* nodeName); void addConvexMesh (btCollisionShape* shape, const char* nodeName); void addConcaveMesh(btCollisionShape* shape, const char* nodeName); + void addScaledConcaveMesh(btCollisionShape* shape, const char* nodeName); void addGimpactMesh(btCollisionShape* shape, const char* nodeName); void addConcaveMeshInternal(class btStridingMeshInterface* meshInterface , const char* nodeName); @@ -220,9 +221,7 @@ public: virtual btTypedConstraint* getConstraint (int i); virtual void setGravity(const btVector3& gravity); virtual btVector3 getGravity (); - virtual void setCameraInfo(const btVector3& up, int forwardAxis) - { - }; + virtual void setCameraInfo(const btVector3& up, int forwardAxis); virtual btCollisionShape* createPlaneShape(const btVector3& planeNormal,btScalar planeConstant); virtual btCollisionShape* createBoxShape(const btVector3& halfExtents); diff --git a/Extras/MayaPlugin/BulletMayaPlugin.vcproj b/Extras/MayaPlugin/BulletMayaPlugin.vcproj index cb216d947..d0f0068ad 100644 --- a/Extras/MayaPlugin/BulletMayaPlugin.vcproj +++ b/Extras/MayaPlugin/BulletMayaPlugin.vcproj @@ -694,6 +694,26 @@ Name="Source Files" > + + + + + + + + + + @@ -834,6 +854,14 @@ RelativePath=".\dSolverNode.h" > + + + + diff --git a/Extras/MayaPlugin/dSolverNode.cpp b/Extras/MayaPlugin/dSolverNode.cpp index 4419b81ae..f25f76057 100644 --- a/Extras/MayaPlugin/dSolverNode.cpp +++ b/Extras/MayaPlugin/dSolverNode.cpp @@ -195,10 +195,10 @@ void initRigidBody(MObject &node) MFnTransform fnTransform(fnDagNode.parent(0)); - MPlug plgActive(node, rigidBodyNode::ia_active); - bool active = false; - plgActive.getValue(active); - if(active) { + MPlug plgMass(node, rigidBodyNode::ia_mass); + float mass = 0.f; + plgMass.getValue(mass); + if(mass>0.f) { //active rigid body, set the world transform from the initial* attributes MObject obj; @@ -259,9 +259,11 @@ void initRigidBodyArray(MObject &node) MFnTransform fnTransform(fnDagNode.parent(0)); - MPlug plgActive(node, rigidBodyArrayNode::ia_active); - bool active = false; - plgActive.getValue(active); + MPlug plgMass(node, rigidBodyArrayNode::ia_mass); + float mass = 0.f; + plgMass.getValue(mass); + bool active = (mass>0.f); + if(active) { //active rigid body, set the world transform from the initial* attributes MObject obj; @@ -382,9 +384,10 @@ void dSolverNode::gatherPassiveTransforms(MPlugArray &rbConnections, std::vector MFnTransform fnTransform(fnDagNode.parent(0)); - MPlug plgActive(node, rigidBodyNode::ia_active); - bool active = false; - plgActive.getValue(active); + MPlug plgMass(node, rigidBodyNode::ia_mass); + float mass = 0.f; + plgMass.getValue(mass); + bool active = (mass>0.f); if(!active) { MQuaternion mquat; fnTransform.getRotation(mquat); @@ -404,9 +407,10 @@ void dSolverNode::gatherPassiveTransforms(MPlugArray &rbConnections, std::vector return; } - MPlug plgActive(node, rigidBodyArrayNode::ia_active); - bool active = false; - plgActive.getValue(active); + MPlug plgMass(node, rigidBodyArrayNode::ia_mass); + float mass = 0.f; + plgMass.getValue(mass); + bool active = (mass>0.f); if(!active) { MPlug plgPosition(node, rigidBodyArrayNode::io_position); MPlug plgRotation(node, rigidBodyArrayNode::io_rotation); @@ -453,9 +457,10 @@ void dSolverNode::updatePassiveRigidBodies(MPlugArray &rbConnections, std::vecto continue; } - MPlug plgActive(node, rigidBodyNode::ia_active); - bool active = false; - plgActive.getValue(active); + MPlug plgMass(node, rigidBodyNode::ia_mass); + float mass = 0.f; + plgMass.getValue(mass); + bool active = (mass>0.f); if(!active) { //do linear interpolation for now rb->set_transform(xforms[pb].m_x0 + t * (xforms[pb].m_x1 - xforms[pb].m_x0), @@ -471,9 +476,10 @@ void dSolverNode::updatePassiveRigidBodies(MPlugArray &rbConnections, std::vecto return; } - MPlug plgActive(node, rigidBodyArrayNode::ia_active); - bool active = false; - plgActive.getValue(active); + MPlug plgMass(node, rigidBodyArrayNode::ia_mass); + float mass = 0.f; + plgMass.getValue(mass); + bool active = (mass>0.f); if(!active) { for(size_t j = 0; j < rbs.size(); ++j) { rbs[j]->set_transform(xforms[pb].m_x0 + t * (xforms[pb].m_x1 - xforms[pb].m_x0), @@ -503,9 +509,10 @@ void dSolverNode::updateActiveRigidBodies(MPlugArray &rbConnections) MFnTransform fnTransform(fnDagNode.parent(0)); - MPlug plgActive(node, rigidBodyNode::ia_active); - bool active = false; - plgActive.getValue(active); + MPlug plgMass(node, rigidBodyNode::ia_mass); + float mass = 0.f; + plgMass.getValue(mass); + bool active = (mass>0.f); if(active) { quatf rot; vec3f pos; @@ -517,10 +524,10 @@ void dSolverNode::updateActiveRigidBodies(MPlugArray &rbConnections) rigidBodyArrayNode *rbNode = static_cast(fnDagNode.userNode()); std::vector& rbs = rbNode->rigid_bodies(); - MPlug plgActive(node, rigidBodyArrayNode::ia_active); - bool active = false; - plgActive.getValue(active); - + MPlug plgMass(node, rigidBodyArrayNode::ia_mass); + float mass = 0.f; + plgMass.getValue(mass); + bool active = (mass>0.f); //write the position and rotations if(active) { MPlug plgPosition(node, rigidBodyArrayNode::io_position); @@ -574,9 +581,10 @@ void dSolverNode::applyFields(MPlugArray &rbConnections, float dt) rigidBodyNode *rbNode = static_cast(fnDagNode.userNode()); rigid_body_t::pointer rb = rbNode->rigid_body(); - MPlug plgActive(node, rigidBodyNode::ia_active); - bool active = false; - plgActive.getValue(active); + MPlug plgMass(node, rigidBodyNode::ia_mass); + float mass = 0.f; + plgMass.getValue(mass); + bool active = (mass>0.f); if(active) { rigid_bodies.push_back(rb.get()); } @@ -584,9 +592,10 @@ void dSolverNode::applyFields(MPlugArray &rbConnections, float dt) rigidBodyArrayNode *rbNode = static_cast(fnDagNode.userNode()); std::vector& rbs = rbNode->rigid_bodies(); - MPlug plgActive(node, rigidBodyArrayNode::ia_active); - bool active = false; - plgActive.getValue(active); + MPlug plgMass(node, rigidBodyArrayNode::ia_mass); + float mass = 0.f; + plgMass.getValue(mass); + bool active = (mass>0.f); if(active) { for(size_t j = 0; j < rbs.size(); ++j) { rigid_bodies.push_back(rbs[j].get()); diff --git a/Extras/MayaPlugin/rigidBodyArrayNode.cpp b/Extras/MayaPlugin/rigidBodyArrayNode.cpp index 931ad57b0..ee467ccca 100644 --- a/Extras/MayaPlugin/rigidBodyArrayNode.cpp +++ b/Extras/MayaPlugin/rigidBodyArrayNode.cpp @@ -49,7 +49,7 @@ MString rigidBodyArrayNode::typeName("dRigidBodyArray"); MObject rigidBodyArrayNode::ia_collisionShape; MObject rigidBodyArrayNode::ia_solver; MObject rigidBodyArrayNode::ia_numBodies; -MObject rigidBodyArrayNode::ia_active; + MObject rigidBodyArrayNode::ia_mass; MObject rigidBodyArrayNode::ia_restitution; MObject rigidBodyArrayNode::ia_friction; @@ -92,12 +92,7 @@ MStatus rigidBodyArrayNode::initialize() status = addAttribute(ia_numBodies); MCHECKSTATUS(status, "adding numBodies attribute") - ia_active = fnNumericAttr.create("active", "ac", MFnNumericData::kBoolean, 1, &status); - MCHECKSTATUS(status, "creating active attribute") - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_active); - MCHECKSTATUS(status, "adding active attribute") - + ia_mass = fnNumericAttr.create("mass", "ma", MFnNumericData::kDouble, 1.0, &status); MCHECKSTATUS(status, "creating mass attribute") fnNumericAttr.setKeyable(true); diff --git a/Extras/MayaPlugin/rigidBodyArrayNode.h b/Extras/MayaPlugin/rigidBodyArrayNode.h index b5db5ec21..cfdf4fbf6 100644 --- a/Extras/MayaPlugin/rigidBodyArrayNode.h +++ b/Extras/MayaPlugin/rigidBodyArrayNode.h @@ -74,7 +74,7 @@ public: static MObject ia_collisionShape; static MObject ia_solver; static MObject ia_numBodies; - static MObject ia_active; + //ia_active is obsolete and redundant -> use ia_mass == 0 for (ia_active==false), and ia_mass > 0 for (ia_active == true) static MObject ia_mass; static MObject ia_restitution; static MObject ia_friction; diff --git a/Extras/MayaPlugin/rigidBodyNode.cpp b/Extras/MayaPlugin/rigidBodyNode.cpp index e9a49cdfd..e74fa8f10 100644 --- a/Extras/MayaPlugin/rigidBodyNode.cpp +++ b/Extras/MayaPlugin/rigidBodyNode.cpp @@ -45,7 +45,6 @@ MString rigidBodyNode::typeName("dRigidBody"); MObject rigidBodyNode::ia_collisionShape; MObject rigidBodyNode::ia_solver; -MObject rigidBodyNode::ia_active; MObject rigidBodyNode::ia_mass; MObject rigidBodyNode::ia_restitution; MObject rigidBodyNode::ia_friction; @@ -77,12 +76,6 @@ MStatus rigidBodyNode::initialize() status = addAttribute(ia_solver); MCHECKSTATUS(status, "adding solver attribute") - ia_active = fnNumericAttr.create("active", "ac", MFnNumericData::kBoolean, 1, &status); - MCHECKSTATUS(status, "creating active attribute") - fnNumericAttr.setKeyable(true); - status = addAttribute(ia_active); - MCHECKSTATUS(status, "adding active attribute") - ia_mass = fnNumericAttr.create("mass", "ma", MFnNumericData::kDouble, 1.0, &status); MCHECKSTATUS(status, "creating mass attribute") fnNumericAttr.setKeyable(true); @@ -184,8 +177,6 @@ MStatus rigidBodyNode::initialize() status = attributeAffects(ia_solver, ca_solver); MCHECKSTATUS(status, "adding attributeAffects(ia_solver, ca_solver)") - // status = attributeAffects(ia_active, ca_rigidBodyParam); - // MCHECKSTATUS(status, "adding attributeAffects(ia_active, ca_rigidBodyParam)") return MS::kSuccess; } @@ -521,7 +512,6 @@ void rigidBodyNode::computeRigidBodyParam(const MPlug& plug, MDataBlock& data) m_rigid_body->set_friction(data.inputValue(ia_friction).asDouble()); m_rigid_body->set_linear_damping(data.inputValue(ia_linearDamping).asDouble()); m_rigid_body->set_angular_damping(data.inputValue(ia_angularDamping).asDouble()); - // m_rigid_body->set_kinematic(!data.inputValue(ia_active).asBool()); data.outputValue(ca_rigidBodyParam).set(true); data.setClean(plug); diff --git a/Extras/MayaPlugin/rigidBodyNode.h b/Extras/MayaPlugin/rigidBodyNode.h index 7e2a96683..3bed3be93 100644 --- a/Extras/MayaPlugin/rigidBodyNode.h +++ b/Extras/MayaPlugin/rigidBodyNode.h @@ -68,7 +68,6 @@ public: //Attributes static MObject ia_collisionShape; static MObject ia_solver; - static MObject ia_active; static MObject ia_mass; static MObject ia_restitution; static MObject ia_friction; diff --git a/Extras/MayaPlugin/scripts/dynamicaUI.mel b/Extras/MayaPlugin/scripts/dynamicaUI.mel index 868dee250..8c854107c 100644 --- a/Extras/MayaPlugin/scripts/dynamicaUI.mel +++ b/Extras/MayaPlugin/scripts/dynamicaUI.mel @@ -395,8 +395,15 @@ global proc dynamicaUI_STsubstepsChanged() } -proc dynamicaUI_createRigidBody(int $active, int $collisionShapeType) +proc dynamicaUI_createRigidBody(int $activebody, int $collisionShapeType) { + float $mass = 1; + + if($activebody == false) + { + $mass = 0; + } + string $selection[] = `ls -selection -dag -leaf -showType -type "geometry"`; //create dSolver node if necessary @@ -419,7 +426,7 @@ proc dynamicaUI_createRigidBody(int $active, int $collisionShapeType) connectAttr ($selection[$i * 2] + ".message") ($collisionShapeNode + ".inShape"); hide $shapeTransforms[0]; } - setAttr ($rigidBodyNode + ".active" ) $active; + setAttr ($rigidBodyNode + ".mass" ) $mass; setAttr ($collisionShapeNode + ".type" ) $collisionShapeType; float $pos[]= `getAttr ($shapeTransforms[0] + ".translate")`; @@ -439,7 +446,7 @@ proc dynamicaUI_createRigidBody(int $active, int $collisionShapeType) connectAttr ($collisionShapeNode + ".outCollisionShape") ($rigidBodyNode + ".inCollisionShape"); string $rigidBodyTransforms[] = `listRelatives -parent $rigidBodyNode`; - setAttr ($rigidBodyNode + ".active" ) $active; + setAttr ($rigidBodyNode + ".mass" ) $mass; setAttr ($collisionShapeNode + ".type" ) $collisionShapeType; $newBodies[0] = $rigidBodyTransforms[0]; } @@ -562,8 +569,15 @@ global proc dynamicaUI_createPassiveMeshRB() dynamicaUI_createRigidBody(false, 1); } -proc dynamicaUI_createRigidBodyArray(int $active, int $collisionShapeType) +proc dynamicaUI_createRigidBodyArray(int $activebody, int $collisionShapeType) { + float $mass = 1; + + if ($activebody == false) + { + $mass = 0; + } + global int $dynamicaUI_createArrayUI_size[]; global float $dynamicaUI_createArrayUI_offset[]; @@ -586,7 +600,7 @@ proc dynamicaUI_createRigidBodyArray(int $active, int $collisionShapeType) } } - setAttr ($rigidBodyArrayNode + ".active" ) $active; + setAttr ($rigidBodyArrayNode + ".mass" ) $mass; setAttr ($collisionShapeNode + ".type" ) $collisionShapeType; select -r $rigidBodyTransforms[0]; diff --git a/msvc/6/appHeightFieldFluidDemo.dsp b/msvc/6/appHeightFieldFluidDemo.dsp new file mode 100644 index 000000000..8595d6d98 --- /dev/null +++ b/msvc/6/appHeightFieldFluidDemo.dsp @@ -0,0 +1,309 @@ +# Microsoft Developer Studio Project File - Name="appHeightFieldFluidDemo" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=appHeightFieldFluidDemo - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "appHeightFieldFluidDemo.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "appHeightFieldFluidDemo.mak" CFG="appHeightFieldFluidDemo - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "appHeightFieldFluidDemo - Win32 DebugDoublePrecision" (based on "Win32 (x86) Console Application") +!MESSAGE "appHeightFieldFluidDemo - Win32 DebugDll" (based on "Win32 (x86) Console Application") +!MESSAGE "appHeightFieldFluidDemo - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "appHeightFieldFluidDemo - Win32 ReleaseDoublePrecision" (based on "Win32 (x86) Console Application") +!MESSAGE "appHeightFieldFluidDemo - Win32 ReleaseDll" (based on "Win32 (x86) Console Application") +!MESSAGE "appHeightFieldFluidDemo - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "appHeightFieldFluidDemo - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "release" +# PROP BASE Intermediate_Dir "release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\out\release6\build\appHeightFieldFluidDemo\" +# PROP Intermediate_Dir "..\..\out\release6\build\appHeightFieldFluidDemo\" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /vmb /vms /W3 /Gm /G5 /D "WIN32" /FD /c +# ADD CPP /nologo /vmb /vms /W3 /Gm /G5 /FD /c /Gy /GF /MD /Ob2 /Zm1000 /Og /Oi /Ot /Oy /D "_MT" /D "_MBCS" /D "NDEBUG" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "WIN32" /I "." /I "..\.." /I "..\..\src" /I "..\..\Glut" /I "..\..\Demos\OpenGL" /I "..\..\Extras\ConvexHull" +# ADD BASE MTL /nologo /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /mktyplib203 /o "NUL" /win32 /D "NDEBUG" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 /fo".\..\..\out\release6\build\appHeightFieldFluidDemo\appHeightFieldFluidDemo.res" /i "." /i "..\.." /i "..\..\src" /i "..\..\Glut" /i "..\..\Demos\OpenGL" /i "..\..\Extras\ConvexHull" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib /nologo /machine:I386 +# ADD LINK32 shell32.lib user32.lib gdi32.lib advapi32.lib glut32.lib /nologo /version:4.0 /machine:I386 /OPT:NOREF /out:"..\..\HeightFieldFluidDemo.exe" /subsystem:console /libpath:"..\..\Glut" + +!ELSEIF "$(CFG)" == "appHeightFieldFluidDemo - Win32 ReleaseDll" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries +# PROP BASE Output_Dir "release_dll" +# PROP BASE Intermediate_Dir "release_dll" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries +# PROP Output_Dir "..\..\out\release_dll6\build\appHeightFieldFluidDemo\" +# PROP Intermediate_Dir "..\..\out\release_dll6\build\appHeightFieldFluidDemo\" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /vmb /vms /W3 /Gm /G5 /D "WIN32" /FD /c +# ADD CPP /nologo /vmb /vms /W3 /Gm /G5 /FD /c /D "_MT" /D "_MBCS" /D "NDEBUG" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "WIN32" /I "." /I "..\.." /I "..\..\src" /I "..\..\Glut" /I "..\..\Demos\OpenGL" /I "..\..\Extras\ConvexHull" +# ADD BASE MTL /nologo /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /mktyplib203 /o "NUL" /win32 /D "NDEBUG" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 /fo".\..\..\out\release_dll6\build\appHeightFieldFluidDemo\appHeightFieldFluidDemo.res" /i "." /i "..\.." /i "..\..\src" /i "..\..\Glut" /i "..\..\Demos\OpenGL" /i "..\..\Extras\ConvexHull" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib /nologo /machine:I386 +# ADD LINK32 shell32.lib user32.lib gdi32.lib advapi32.lib glut32.lib /nologo /version:4.0 /machine:I386 /out:"..\..\HeightFieldFluidDemo.exe" /subsystem:console /libpath:"..\..\Glut" + +!ELSEIF "$(CFG)" == "appHeightFieldFluidDemo - Win32 ReleaseDoublePrecision" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries +# PROP BASE Output_Dir "release_dbl" +# PROP BASE Intermediate_Dir "release_dbl" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries +# PROP Output_Dir "..\..\out\release_dbl6\build\appHeightFieldFluidDemo\" +# PROP Intermediate_Dir "..\..\out\release_dbl6\build\appHeightFieldFluidDemo\" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /vmb /vms /W3 /Gm /G5 /D "WIN32" /FD /c +# ADD CPP /nologo /vmb /vms /W3 /Gm /G5 /FD /c /D "_MT" /D "_MBCS" /D "NDEBUG" /D "BT_USE_DOUBLE_PRECISION" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "WIN32" /I "." /I "..\.." /I "..\..\src" /I "..\..\Glut" /I "..\..\Demos\OpenGL" /I "..\..\Extras\ConvexHull" +# ADD BASE MTL /nologo /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /mktyplib203 /o "NUL" /win32 /D "NDEBUG" /D "BT_USE_DOUBLE_PRECISION" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 /fo".\..\..\out\release_dbl6\build\appHeightFieldFluidDemo\appHeightFieldFluidDemo.res" /i "." /i "..\.." /i "..\..\src" /i "..\..\Glut" /i "..\..\Demos\OpenGL" /i "..\..\Extras\ConvexHull" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib /nologo /machine:I386 +# ADD LINK32 shell32.lib user32.lib gdi32.lib advapi32.lib glut32.lib /nologo /version:4.0 /machine:I386 /out:"..\..\HeightFieldFluidDemo.exe" /subsystem:console /libpath:"..\..\Glut" + +!ELSEIF "$(CFG)" == "appHeightFieldFluidDemo - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "debug" +# PROP BASE Intermediate_Dir "debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\out\debug6\build\appHeightFieldFluidDemo\" +# PROP Intermediate_Dir "..\..\out\debug6\build\appHeightFieldFluidDemo\" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /vmb /vms /W3 /Gm /G5 /D "WIN32" /FD /c +# ADD CPP /nologo /vmb /vms /W3 /Gm /G5 /FD /c /GR /MDd /Zm1000 /ZI /Od /D "_MT" /D "_MBCS" /D "_DEBUG" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "WIN32" /I "." /I "..\.." /I "..\..\src" /I "..\..\Glut" /I "..\..\Demos\OpenGL" /I "..\..\Extras\ConvexHull" +# ADD BASE MTL /nologo /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /mktyplib203 /o "NUL" /win32 /D "_DEBUG" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 /fo".\..\..\out\debug6\build\appHeightFieldFluidDemo\appHeightFieldFluidDemo.res" /i "." /i "..\.." /i "..\..\src" /i "..\..\Glut" /i "..\..\Demos\OpenGL" /i "..\..\Extras\ConvexHull" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib /nologo /machine:I386 +# ADD LINK32 shell32.lib user32.lib gdi32.lib advapi32.lib glut32.lib /nologo /version:4.0 /machine:I386 /debug /pdbtype:sept /out:"..\..\HeightFieldFluidDemo.exe" /subsystem:console /libpath:"..\..\Glut" + +!ELSEIF "$(CFG)" == "appHeightFieldFluidDemo - Win32 DebugDll" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries +# PROP BASE Output_Dir "debug_dll" +# PROP BASE Intermediate_Dir "debug_dll" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries +# PROP Output_Dir "..\..\out\debug_dll6\build\appHeightFieldFluidDemo\" +# PROP Intermediate_Dir "..\..\out\debug_dll6\build\appHeightFieldFluidDemo\" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /vmb /vms /W3 /Gm /G5 /D "WIN32" /FD /c +# ADD CPP /nologo /vmb /vms /W3 /Gm /G5 /FD /c /D "_MT" /D "_MBCS" /D "_DEBUG" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "WIN32" /I "." /I "..\.." /I "..\..\src" /I "..\..\Glut" /I "..\..\Demos\OpenGL" /I "..\..\Extras\ConvexHull" +# ADD BASE MTL /nologo /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /mktyplib203 /o "NUL" /win32 /D "_DEBUG" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 /fo".\..\..\out\debug_dll6\build\appHeightFieldFluidDemo\appHeightFieldFluidDemo.res" /i "." /i "..\.." /i "..\..\src" /i "..\..\Glut" /i "..\..\Demos\OpenGL" /i "..\..\Extras\ConvexHull" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib /nologo /machine:I386 +# ADD LINK32 shell32.lib user32.lib gdi32.lib advapi32.lib glut32.lib /nologo /version:4.0 /machine:I386 /out:"..\..\HeightFieldFluidDemo.exe" /subsystem:console /libpath:"..\..\Glut" + +!ELSEIF "$(CFG)" == "appHeightFieldFluidDemo - Win32 DebugDoublePrecision" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries +# PROP BASE Output_Dir "debug_dbl" +# PROP BASE Intermediate_Dir "debug_dbl" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries +# PROP Output_Dir "..\..\out\debug_dbl6\build\appHeightFieldFluidDemo\" +# PROP Intermediate_Dir "..\..\out\debug_dbl6\build\appHeightFieldFluidDemo\" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /vmb /vms /W3 /Gm /G5 /D "WIN32" /FD /c +# ADD CPP /nologo /vmb /vms /W3 /Gm /G5 /FD /c /D "_MT" /D "_MBCS" /D "_DEBUG" /D "BT_USE_DOUBLE_PRECISION" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "WIN32" /I "." /I "..\.." /I "..\..\src" /I "..\..\Glut" /I "..\..\Demos\OpenGL" /I "..\..\Extras\ConvexHull" +# ADD BASE MTL /nologo /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /mktyplib203 /o "NUL" /win32 /D "_DEBUG" /D "BT_USE_DOUBLE_PRECISION" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 /fo".\..\..\out\debug_dbl6\build\appHeightFieldFluidDemo\appHeightFieldFluidDemo.res" /i "." /i "..\.." /i "..\..\src" /i "..\..\Glut" /i "..\..\Demos\OpenGL" /i "..\..\Extras\ConvexHull" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib /nologo /machine:I386 +# ADD LINK32 shell32.lib user32.lib gdi32.lib advapi32.lib glut32.lib /nologo /version:4.0 /machine:I386 /out:"..\..\HeightFieldFluidDemo.exe" /subsystem:console /libpath:"..\..\Glut" + +!ENDIF + +# Begin Target + +# Name "appHeightFieldFluidDemo - Win32 Release" +# Name "appHeightFieldFluidDemo - Win32 ReleaseDll" +# Name "appHeightFieldFluidDemo - Win32 ReleaseDoublePrecision" +# Name "appHeightFieldFluidDemo - Win32 Debug" +# Name "appHeightFieldFluidDemo - Win32 DebugDll" +# Name "appHeightFieldFluidDemo - Win32 DebugDoublePrecision" +# Begin Group "Source Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\BulletHfFluid\btHfFluid.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\BulletHfFluid\btHfFluidBuoyantConvexShape.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\BulletHfFluid\btHfFluidBuoyantShapeCollisionAlgorithm.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\BulletHfFluid\btHfFluidCollisionShape.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\BulletHfFluid\btHfFluidRigidCollisionAlgorithm.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\BulletHfFluid\btHfFluidRigidCollisionConfiguration.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\BulletHfFluid\btHfFluidRigidDynamicsWorld.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\HfFluidDemo.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\HfFluidDemo_GL_ShapeDrawer.cpp +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\main.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\BulletHfFluid\btHfFluid.h +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\BulletHfFluid\btHfFluidBuoyantConvexShape.h +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\BulletHfFluid\btHfFluidBuoyantShapeCollisionAlgorithm.h +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\BulletHfFluid\btHfFluidCollisionShape.h +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\BulletHfFluid\btHfFluidRigidCollisionAlgorithm.h +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\BulletHfFluid\btHfFluidRigidCollisionConfiguration.h +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\BulletHfFluid\btHfFluidRigidDynamicsWorld.h +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\HfFluidDemo.h +# End Source File +# Begin Source File + +SOURCE=..\..\Demos\HeightFieldFluidDemo\HfFluidDemo_GL_ShapeDrawer.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\msvc\appHeightFieldFluidDemo.rc +# End Source File +# End Group +# End Target +# End Project diff --git a/msvc/6/appiffCreateTest.dsp b/msvc/6/appiffCreateTest.dsp new file mode 100644 index 000000000..fa9d0957d --- /dev/null +++ b/msvc/6/appiffCreateTest.dsp @@ -0,0 +1,233 @@ +# Microsoft Developer Studio Project File - Name="appiffCreateTest" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=appiffCreateTest - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "appiffCreateTest.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "appiffCreateTest.mak" CFG="appiffCreateTest - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "appiffCreateTest - Win32 DebugDoublePrecision" (based on "Win32 (x86) Console Application") +!MESSAGE "appiffCreateTest - Win32 DebugDll" (based on "Win32 (x86) Console Application") +!MESSAGE "appiffCreateTest - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE "appiffCreateTest - Win32 ReleaseDoublePrecision" (based on "Win32 (x86) Console Application") +!MESSAGE "appiffCreateTest - Win32 ReleaseDll" (based on "Win32 (x86) Console Application") +!MESSAGE "appiffCreateTest - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "appiffCreateTest - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "release" +# PROP BASE Intermediate_Dir "release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "..\..\out\release6\build\appiffCreateTest\" +# PROP Intermediate_Dir "..\..\out\release6\build\appiffCreateTest\" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /vmb /vms /W3 /Gm /G5 /D "WIN32" /FD /c +# ADD CPP /nologo /vmb /vms /W3 /Gm /G5 /FD /c /Gy /GF /MD /Ob2 /Zm1000 /Og /Oi /Ot /Oy /D "_MT" /D "_MBCS" /D "NDEBUG" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "WIN32" /I "." /I "..\.." /I "..\..\src" /I "..\..\Extras\iff" +# ADD BASE MTL /nologo /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /mktyplib203 /o "NUL" /win32 /D "NDEBUG" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 /fo".\..\..\out\release6\build\appiffCreateTest\appiffCreateTest.res" /i "." /i "..\.." /i "..\..\src" /i "..\..\Extras\iff" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib /nologo /machine:I386 +# ADD LINK32 shell32.lib user32.lib gdi32.lib advapi32.lib /nologo /version:4.0 /machine:I386 /OPT:NOREF /out:"..\..\iffCreateTest.exe" /subsystem:console + +!ELSEIF "$(CFG)" == "appiffCreateTest - Win32 ReleaseDll" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries +# PROP BASE Output_Dir "release_dll" +# PROP BASE Intermediate_Dir "release_dll" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries +# PROP Output_Dir "..\..\out\release_dll6\build\appiffCreateTest\" +# PROP Intermediate_Dir "..\..\out\release_dll6\build\appiffCreateTest\" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /vmb /vms /W3 /Gm /G5 /D "WIN32" /FD /c +# ADD CPP /nologo /vmb /vms /W3 /Gm /G5 /FD /c /D "_MT" /D "_MBCS" /D "NDEBUG" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "WIN32" /I "." /I "..\.." /I "..\..\src" /I "..\..\Extras\iff" +# ADD BASE MTL /nologo /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /mktyplib203 /o "NUL" /win32 /D "NDEBUG" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 /fo".\..\..\out\release_dll6\build\appiffCreateTest\appiffCreateTest.res" /i "." /i "..\.." /i "..\..\src" /i "..\..\Extras\iff" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib /nologo /machine:I386 +# ADD LINK32 shell32.lib user32.lib gdi32.lib advapi32.lib /nologo /version:4.0 /machine:I386 /out:"..\..\iffCreateTest.exe" /subsystem:console + +!ELSEIF "$(CFG)" == "appiffCreateTest - Win32 ReleaseDoublePrecision" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries +# PROP BASE Output_Dir "release_dbl" +# PROP BASE Intermediate_Dir "release_dbl" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries +# PROP Output_Dir "..\..\out\release_dbl6\build\appiffCreateTest\" +# PROP Intermediate_Dir "..\..\out\release_dbl6\build\appiffCreateTest\" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /vmb /vms /W3 /Gm /G5 /D "WIN32" /FD /c +# ADD CPP /nologo /vmb /vms /W3 /Gm /G5 /FD /c /D "_MT" /D "_MBCS" /D "NDEBUG" /D "BT_USE_DOUBLE_PRECISION" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "WIN32" /I "." /I "..\.." /I "..\..\src" /I "..\..\Extras\iff" +# ADD BASE MTL /nologo /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /mktyplib203 /o "NUL" /win32 /D "NDEBUG" /D "BT_USE_DOUBLE_PRECISION" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 /fo".\..\..\out\release_dbl6\build\appiffCreateTest\appiffCreateTest.res" /i "." /i "..\.." /i "..\..\src" /i "..\..\Extras\iff" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib /nologo /machine:I386 +# ADD LINK32 shell32.lib user32.lib gdi32.lib advapi32.lib /nologo /version:4.0 /machine:I386 /out:"..\..\iffCreateTest.exe" /subsystem:console + +!ELSEIF "$(CFG)" == "appiffCreateTest - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "debug" +# PROP BASE Intermediate_Dir "debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "..\..\out\debug6\build\appiffCreateTest\" +# PROP Intermediate_Dir "..\..\out\debug6\build\appiffCreateTest\" +# PROP Ignore_Export_Lib 1 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /vmb /vms /W3 /Gm /G5 /D "WIN32" /FD /c +# ADD CPP /nologo /vmb /vms /W3 /Gm /G5 /FD /c /GR /MDd /Zm1000 /ZI /Od /D "_MT" /D "_MBCS" /D "_DEBUG" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "WIN32" /I "." /I "..\.." /I "..\..\src" /I "..\..\Extras\iff" +# ADD BASE MTL /nologo /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /mktyplib203 /o "NUL" /win32 /D "_DEBUG" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 /fo".\..\..\out\debug6\build\appiffCreateTest\appiffCreateTest.res" /i "." /i "..\.." /i "..\..\src" /i "..\..\Extras\iff" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib /nologo /machine:I386 +# ADD LINK32 shell32.lib user32.lib gdi32.lib advapi32.lib /nologo /version:4.0 /machine:I386 /debug /pdbtype:sept /out:"..\..\iffCreateTest.exe" /subsystem:console + +!ELSEIF "$(CFG)" == "appiffCreateTest - Win32 DebugDll" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries +# PROP BASE Output_Dir "debug_dll" +# PROP BASE Intermediate_Dir "debug_dll" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries +# PROP Output_Dir "..\..\out\debug_dll6\build\appiffCreateTest\" +# PROP Intermediate_Dir "..\..\out\debug_dll6\build\appiffCreateTest\" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /vmb /vms /W3 /Gm /G5 /D "WIN32" /FD /c +# ADD CPP /nologo /vmb /vms /W3 /Gm /G5 /FD /c /D "_MT" /D "_MBCS" /D "_DEBUG" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "WIN32" /I "." /I "..\.." /I "..\..\src" /I "..\..\Extras\iff" +# ADD BASE MTL /nologo /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /mktyplib203 /o "NUL" /win32 /D "_DEBUG" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 /fo".\..\..\out\debug_dll6\build\appiffCreateTest\appiffCreateTest.res" /i "." /i "..\.." /i "..\..\src" /i "..\..\Extras\iff" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib /nologo /machine:I386 +# ADD LINK32 shell32.lib user32.lib gdi32.lib advapi32.lib /nologo /version:4.0 /machine:I386 /out:"..\..\iffCreateTest.exe" /subsystem:console + +!ELSEIF "$(CFG)" == "appiffCreateTest - Win32 DebugDoublePrecision" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries +# PROP BASE Output_Dir "debug_dbl" +# PROP BASE Intermediate_Dir "debug_dbl" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries +# PROP Output_Dir "..\..\out\debug_dbl6\build\appiffCreateTest\" +# PROP Intermediate_Dir "..\..\out\debug_dbl6\build\appiffCreateTest\" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /vmb /vms /W3 /Gm /G5 /D "WIN32" /FD /c +# ADD CPP /nologo /vmb /vms /W3 /Gm /G5 /FD /c /D "_MT" /D "_MBCS" /D "_DEBUG" /D "BT_USE_DOUBLE_PRECISION" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" /D "WIN32" /I "." /I "..\.." /I "..\..\src" /I "..\..\Extras\iff" +# ADD BASE MTL /nologo /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /mktyplib203 /o "NUL" /win32 /D "_DEBUG" /D "BT_USE_DOUBLE_PRECISION" /D "_CONSOLE" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE" +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 /fo".\..\..\out\debug_dbl6\build\appiffCreateTest\appiffCreateTest.res" /i "." /i "..\.." /i "..\..\src" /i "..\..\Extras\iff" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo +LINK32=link.exe +# ADD BASE LINK32 user32.lib gdi32.lib advapi32.lib /nologo /machine:I386 +# ADD LINK32 shell32.lib user32.lib gdi32.lib advapi32.lib /nologo /version:4.0 /machine:I386 /out:"..\..\iffCreateTest.exe" /subsystem:console + +!ENDIF + +# Begin Target + +# Name "appiffCreateTest - Win32 Release" +# Name "appiffCreateTest - Win32 ReleaseDll" +# Name "appiffCreateTest - Win32 ReleaseDoublePrecision" +# Name "appiffCreateTest - Win32 Debug" +# Name "appiffCreateTest - Win32 DebugDll" +# Name "appiffCreateTest - Win32 DebugDoublePrecision" +# Begin Group "Source Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Extras\iff\iffCreateTest\main.cpp +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\msvc\appiffCreateTest.rc +# End Source File +# End Group +# End Target +# End Project diff --git a/msvc/7/appHeightFieldFluidDemo.vcproj b/msvc/7/appHeightFieldFluidDemo.vcproj new file mode 100644 index 000000000..e7153942a --- /dev/null +++ b/msvc/7/appHeightFieldFluidDemo.vcproj @@ -0,0 +1,514 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msvc/7/appiffCreateTest.vcproj b/msvc/7/appiffCreateTest.vcproj new file mode 100644 index 000000000..dfd7534e8 --- /dev/null +++ b/msvc/7/appiffCreateTest.vcproj @@ -0,0 +1,456 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msvc/71/appHeightFieldFluidDemo.vcproj b/msvc/71/appHeightFieldFluidDemo.vcproj new file mode 100644 index 000000000..d22fdd568 --- /dev/null +++ b/msvc/71/appHeightFieldFluidDemo.vcproj @@ -0,0 +1,514 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msvc/71/appiffCreateTest.vcproj b/msvc/71/appiffCreateTest.vcproj new file mode 100644 index 000000000..a0649fb3f --- /dev/null +++ b/msvc/71/appiffCreateTest.vcproj @@ -0,0 +1,456 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msvc/8/appHeightFieldFluidDemo.vcproj b/msvc/8/appHeightFieldFluidDemo.vcproj new file mode 100644 index 000000000..d2bfe625f --- /dev/null +++ b/msvc/8/appHeightFieldFluidDemo.vcproj @@ -0,0 +1,514 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msvc/8/appiffCreateTest.vcproj b/msvc/8/appiffCreateTest.vcproj new file mode 100644 index 000000000..9bb7255b2 --- /dev/null +++ b/msvc/8/appiffCreateTest.vcproj @@ -0,0 +1,456 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/msvc/appHeightFieldFluidDemo.rc b/msvc/appHeightFieldFluidDemo.rc new file mode 100644 index 000000000..0ec01bc0d --- /dev/null +++ b/msvc/appHeightFieldFluidDemo.rc @@ -0,0 +1,30 @@ +// This file is generated automatically. + +1 VERSIONINFO +FILEVERSION 2, 73, 0, 0 +PRODUCTVERSION 2, 73, 0, 0 +#ifdef CS_DEBUG +FILEFLAGS 0x1 +#else +FILEFLAGS 0x0 +#endif +{ + BLOCK "StringFileInfo" + { + BLOCK "040904E4" + { + VALUE "ProductName", "Bullet Continuous Collision Detection and Physics Library" + VALUE "ProductVersion", "2.73" + VALUE "FileVersion", "2.73" + VALUE "LegalCopyright", "Copyright (c) 2005-2008 Erwin Coumans" + VALUE "FileDescription", "HeightFieldFluidDemo" +#ifdef CS_DEBUG + VALUE "Comments", "Debug build" +#else + VALUE "Comments", "Release build" +#endif + VALUE "WWW", "http://www.bulletphysics.com" + } + } +} +1 ICON "../../msvc/bullet_ico.ico" diff --git a/msvc/appiffCreateTest.rc b/msvc/appiffCreateTest.rc new file mode 100644 index 000000000..9022d33cb --- /dev/null +++ b/msvc/appiffCreateTest.rc @@ -0,0 +1,30 @@ +// This file is generated automatically. + +1 VERSIONINFO +FILEVERSION 2, 73, 0, 0 +PRODUCTVERSION 2, 73, 0, 0 +#ifdef CS_DEBUG +FILEFLAGS 0x1 +#else +FILEFLAGS 0x0 +#endif +{ + BLOCK "StringFileInfo" + { + BLOCK "040904E4" + { + VALUE "ProductName", "Bullet Continuous Collision Detection and Physics Library" + VALUE "ProductVersion", "2.73" + VALUE "FileVersion", "2.73" + VALUE "LegalCopyright", "Copyright (c) 2005-2008 Erwin Coumans" + VALUE "FileDescription", "iffCreateTest" +#ifdef CS_DEBUG + VALUE "Comments", "Debug build" +#else + VALUE "Comments", "Release build" +#endif + VALUE "WWW", "http://www.bulletphysics.com" + } + } +} +1 ICON "../../msvc/bullet_ico.ico" diff --git a/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp b/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp index 247bceb74..274c5f5bd 100644 --- a/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp +++ b/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp @@ -51,7 +51,7 @@ subject to the following restrictions: btConvexConvexAlgorithm::CreateFunc::CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver) { - m_numPerturbationIterations = 3; + m_numPerturbationIterations = 0; m_minimumPointsPerturbationThreshold = 3; m_simplexSolver = simplexSolver; m_pdSolver = pdSolver; @@ -102,25 +102,53 @@ struct btPerturbedContactResult : public btManifoldResult btManifoldResult* m_originalManifoldResult; btTransform m_transformA; btTransform m_transformB; + btTransform m_unPerturbedTransform; + bool m_perturbA; + btIDebugDraw* m_debugDrawer; - btPerturbedContactResult(btManifoldResult* originalResult,const btTransform& transformA,const btTransform& transformB) + btPerturbedContactResult(btManifoldResult* originalResult,const btTransform& transformA,const btTransform& transformB,const btTransform& unPerturbedTransform,bool perturbA,btIDebugDraw* debugDrawer) :m_originalManifoldResult(originalResult), m_transformA(transformA), - m_transformB(transformB) + m_transformB(transformB), + m_perturbA(perturbA), + m_unPerturbedTransform(unPerturbedTransform), + m_debugDrawer(debugDrawer) { } virtual ~ btPerturbedContactResult() { } - virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth) + virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar orgDepth) { - const btVector3& worldPointB = pointInWorld; - btVector3 worldPointA = worldPointB+normalOnBInWorld*depth; - btVector3 localA = m_transformA.invXform(worldPointA); - btVector3 localB = m_transformB.invXform(pointInWorld); - m_originalManifoldResult->addLocalContactPointInternal( normalOnBInWorld,localA,localB); + btVector3 endPt,startPt; + btScalar newDepth; + btVector3 newNormal; + + if (m_perturbA) + { + btVector3 endPtOrg = pointInWorld + normalOnBInWorld*orgDepth; + endPt = (m_unPerturbedTransform*m_transformA.inverse())(endPtOrg); + newDepth = (endPt - pointInWorld).dot(normalOnBInWorld); + startPt = endPt+normalOnBInWorld*newDepth; + } else + { + endPt = pointInWorld + normalOnBInWorld*orgDepth; + startPt = (m_unPerturbedTransform*m_transformB.inverse())(pointInWorld); + newDepth = (endPt - startPt).dot(normalOnBInWorld); + + } + +//#define DEBUG_CONTACTS 1 +#ifdef DEBUG_CONTACTS + m_debugDrawer->drawLine(startPt,endPt,btVector3(1,0,0)); + m_debugDrawer->drawSphere(startPt,0.05,btVector3(0,1,0)); + m_debugDrawer->drawSphere(endPt,0.05,btVector3(0,0,1)); +#endif //DEBUG_CONTACTS + + + m_originalManifoldResult->addContactPoint(normalOnBInWorld,startPt,newDepth); } }; @@ -188,8 +216,7 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl //now perform 'm_numPerturbationIterations' collision queries with the perturbated collision objects //perform perturbation when more then 'm_minimumPointsPerturbationThreshold' points - //perturbation is work-in-progress, disable until fully finished and tested - if (0)//resultOut->getPersistentManifold()->getNumContacts() < m_minimumPointsPerturbationThreshold) + if (resultOut->getPersistentManifold()->getNumContacts() < m_minimumPointsPerturbationThreshold) { int i; @@ -211,21 +238,42 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl if ( perturbeAngle > angleLimit ) perturbeAngle = angleLimit; + btTransform unPerturbedTransform; + if (perturbeA) + { + unPerturbedTransform = input.m_transformA; + } else + { + unPerturbedTransform = input.m_transformB; + } + for ( i=0;igetWorldTransform().getBasis()); + input.m_transformA.setBasis( btMatrix3x3(rotq.inverse()*perturbeRot*rotq)*body0->getWorldTransform().getBasis()); + input.m_transformB = body1->getWorldTransform(); +#ifdef DEBUG_CONTACTS + dispatchInfo.m_debugDraw->drawTransform(input.m_transformA,10.0); +#endif //DEBUG_CONTACTS } else { + input.m_transformA = body0->getWorldTransform(); input.m_transformB.setBasis( btMatrix3x3(rotq.inverse()*perturbeRot*rotq)*body1->getWorldTransform().getBasis()); +#ifdef DEBUG_CONTACTS + dispatchInfo.m_debugDraw->drawTransform(input.m_transformB,10.0); +#endif } - btPerturbedContactResult perturbedResultOut(resultOut,input.m_transformA,input.m_transformB); + + btPerturbedContactResult perturbedResultOut(resultOut,input.m_transformA,input.m_transformB,unPerturbedTransform,perturbeA,dispatchInfo.m_debugDraw); gjkPairDetector.getClosestPoints(input,perturbedResultOut,dispatchInfo.m_debugDraw); - btScalar curSepDist = gjkPairDetector.getCachedSeparatingDistance()+dispatchInfo.m_convexConservativeDistanceThreshold; + + } } diff --git a/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp b/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp index 510995003..4f6a46626 100644 --- a/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp +++ b/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp @@ -52,14 +52,6 @@ btManifoldResult::btManifoldResult(btCollisionObject* body0,btCollisionObject* b m_rootTransB = body1->getWorldTransform(); } -void btManifoldResult::addLocalContactPointInternal(const btVector3& normalOnBInWorld,const btVector3& localPointA,const btVector3& localPointB) -{ - btVector3 worldPointA = m_rootTransA( localPointA ); - btVector3 worldPointB = m_rootTransB( localPointB ); - btScalar depth = (worldPointA - worldPointB).dot(normalOnBInWorld); - - addContactPoint(normalOnBInWorld,worldPointB,depth); -} void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth) { @@ -100,7 +92,7 @@ void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld,const b newPt.m_partId1 = m_partId1; newPt.m_index0 = m_index0; newPt.m_index1 = m_index1; - + //printf("depth=%f\n",depth); ///@todo, check this for any side effects if (insertIndex >= 0) { diff --git a/src/BulletCollision/CollisionDispatch/btManifoldResult.h b/src/BulletCollision/CollisionDispatch/btManifoldResult.h index b905e9a6a..964b6a044 100644 --- a/src/BulletCollision/CollisionDispatch/btManifoldResult.h +++ b/src/BulletCollision/CollisionDispatch/btManifoldResult.h @@ -82,8 +82,6 @@ public: virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth); - virtual void addLocalContactPointInternal(const btVector3& normalOnBInWorld,const btVector3& localPointA,const btVector3& localPointB); - SIMD_FORCE_INLINE void refreshContactPoints() { btAssert(m_manifoldPtr); diff --git a/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp b/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp index 6551cfb92..2f41b3c27 100644 --- a/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp +++ b/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp @@ -135,6 +135,9 @@ bool btContinuousConvexCollision::calcTimeOfImpact( //btScalar clippedDist = GEN_min(angularConservativeRadius,dist); //btScalar clippedDist = dist; + //don't report time of impact for motion away from the contact normal (or causes minor penetration) + if ((projectedLinearVelocity+ maxAngularProjectedVelocity)<=SIMD_EPSILON) + return false; dLambda = dist / (projectedLinearVelocity+ maxAngularProjectedVelocity); @@ -196,11 +199,10 @@ bool btContinuousConvexCollision::calcTimeOfImpact( } } - - //don't report time of impact for motion away from the contact normal (or causes minor penetration) + if ((projectedLinearVelocity+ maxAngularProjectedVelocity)<=result.m_allowedPenetration)//SIMD_EPSILON) return false; - + result.m_fraction = lambda; result.m_normal = n; result.m_hitPoint = c; diff --git a/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp b/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp index ece22c6a3..d4e29882d 100644 --- a/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp +++ b/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp @@ -183,6 +183,9 @@ int btPersistentManifold::addManifoldPoint(const btManifoldPoint& newPoint) } + if (insertIndex<0) + insertIndex=0; + btAssert(m_pointCache[insertIndex].m_userPersistentData==0); m_pointCache[insertIndex] = newPoint; return insertIndex; diff --git a/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h b/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h index 2138434e0..e99430c00 100644 --- a/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h +++ b/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h @@ -22,9 +22,9 @@ enum btSolverMode SOLVER_FRICTION_SEPARATE = 2, SOLVER_USE_WARMSTARTING = 4, SOLVER_USE_FRICTION_WARMSTARTING = 8, - SOLVER_USE_1_FRICTION_DIRECTION = 16, + SOLVER_USE_2_FRICTION_DIRECTIONS = 16, SOLVER_ENABLE_FRICTION_DIRECTION_CACHING = 32, - SOLVER_ENABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION = 64, + SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION = 64, SOLVER_CACHE_FRIENDLY = 128, SOLVER_SIMD = 256, //enabled for Windows, the solver innerloop is branchless SIMD, 40% faster than FPU/scalar version SOLVER_CUDA = 512 //will be open sourced during Game Developers Conference 2009. Much faster. @@ -77,7 +77,7 @@ struct btContactSolverInfo : public btContactSolverInfoData m_splitImpulsePenetrationThreshold = -0.02f; m_linearSlop = btScalar(0.0); m_warmstartingFactor=btScalar(0.85); - m_solverMode = SOLVER_USE_WARMSTARTING | SOLVER_SIMD;//SOLVER_RANDMIZE_ORDER + m_solverMode = SOLVER_USE_WARMSTARTING | SOLVER_SIMD ;//SOLVER_RANDMIZE_ORDER m_restingContactRestitutionThreshold = 2;//resting contact lifetime threshold to disable restitution } }; diff --git a/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h b/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h index 7ea9d9e19..bcbcbfbc6 100644 --- a/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h +++ b/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h @@ -92,6 +92,16 @@ public: return m_rbB; } + btRigidBody& getRigidBodyA() + { + return m_rbA; + } + btRigidBody& getRigidBodyB() + { + return m_rbB; + } + + void setAngularOnly(bool angularOnly) { m_angularOnly = angularOnly; diff --git a/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp b/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp index 468a1eed9..6a28b2255 100644 --- a/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp +++ b/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp @@ -543,6 +543,9 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol solverBodyIdB = getOrInitSolverBody(*colObj1); } + if (solverBodyIdA == 0 && solverBodyIdB == 0) + continue; + btVector3 rel_pos1; btVector3 rel_pos2; btScalar relaxation; @@ -703,11 +706,11 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol { cp.m_lateralFrictionDir1 = vel - cp.m_normalWorldOnB * rel_vel; btScalar lat_rel_vel = cp.m_lateralFrictionDir1.length2(); - if ((infoGlobal.m_solverMode & SOLVER_ENABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION) && lat_rel_vel > SIMD_EPSILON) + if (!(infoGlobal.m_solverMode & SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION) && lat_rel_vel > SIMD_EPSILON) { cp.m_lateralFrictionDir1 /= btSqrt(lat_rel_vel); addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation); - if(!(infoGlobal.m_solverMode & SOLVER_USE_1_FRICTION_DIRECTION)) + if((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS)) { cp.m_lateralFrictionDir2 = cp.m_lateralFrictionDir1.cross(cp.m_normalWorldOnB); cp.m_lateralFrictionDir2.normalize();//?? @@ -719,7 +722,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol //re-calculate friction direction every frame, todo: check if this is really needed btPlaneSpace1(cp.m_normalWorldOnB,cp.m_lateralFrictionDir1,cp.m_lateralFrictionDir2); addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation); - if (!(infoGlobal.m_solverMode & SOLVER_USE_1_FRICTION_DIRECTION)) + if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS)) { addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation); } @@ -729,7 +732,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol } else { addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation); - if (!(infoGlobal.m_solverMode & SOLVER_USE_1_FRICTION_DIRECTION)) + if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS)) addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation); } @@ -750,7 +753,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol } } - if (!(infoGlobal.m_solverMode & SOLVER_USE_1_FRICTION_DIRECTION)) + if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS)) { btSolverConstraint& frictionConstraint2 = m_tmpSolverContactFrictionConstraintPool[solverConstraint.m_frictionIndex+1]; if (infoGlobal.m_solverMode & SOLVER_USE_WARMSTARTING) @@ -769,7 +772,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol { btSolverConstraint& frictionConstraint1 = m_tmpSolverContactFrictionConstraintPool[solverConstraint.m_frictionIndex]; frictionConstraint1.m_appliedImpulse = 0.f; - if (!(infoGlobal.m_solverMode & SOLVER_USE_1_FRICTION_DIRECTION)) + if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS)) { btSolverConstraint& frictionConstraint2 = m_tmpSolverContactFrictionConstraintPool[solverConstraint.m_frictionIndex+1]; frictionConstraint2.m_appliedImpulse = 0.f; diff --git a/src/LinearMath/btAlignedAllocator.cpp b/src/LinearMath/btAlignedAllocator.cpp index 6fa94b6d2..f9e8b01cc 100644 --- a/src/LinearMath/btAlignedAllocator.cpp +++ b/src/LinearMath/btAlignedAllocator.cpp @@ -19,6 +19,21 @@ int gNumAlignedAllocs = 0; int gNumAlignedFree = 0; int gTotalBytesAlignedAllocs = 0;//detect memory leaks +static void *btAllocDefault(size_t size) +{ + return malloc(size); +} + +static void btFreeDefault(void *ptr) +{ + free(ptr); +} + +static btAllocFunc *sAllocFunc = btAllocDefault; +static btFreeFunc *sFreeFunc = btFreeDefault; + + + #if defined (BT_HAS_ALIGNED_ALLOCATOR) #include static void *btAlignedAllocDefault(size_t size, int alignment) @@ -49,7 +64,7 @@ static inline void *btAlignedAllocDefault(size_t size, int alignment) char *real; unsigned long offset; - real = (char *)malloc(size + sizeof(void *) + (alignment-1)); + real = (char *)sAllocFunc(size + sizeof(void *) + (alignment-1)); if (real) { offset = (alignment - (unsigned long)(real + sizeof(void *))) & (alignment-1); ret = (void *)((real + sizeof(void *)) + offset); @@ -66,25 +81,14 @@ static inline void btAlignedFreeDefault(void *ptr) if (ptr) { real = *((void **)(ptr)-1); - free(real); + sFreeFunc(real); } } #endif -static void *btAllocDefault(size_t size) -{ - return malloc(size); -} - -static void btFreeDefault(void *ptr) -{ - free(ptr); -} static btAlignedAllocFunc *sAlignedAllocFunc = btAlignedAllocDefault; static btAlignedFreeFunc *sAlignedFreeFunc = btAlignedFreeDefault; -static btAllocFunc *sAllocFunc = btAllocDefault; -static btFreeFunc *sFreeFunc = btFreeDefault; void btAlignedAllocSetCustomAligned(btAlignedAllocFunc *allocFunc, btAlignedFreeFunc *freeFunc) { diff --git a/src/LinearMath/btAlignedAllocator.h b/src/LinearMath/btAlignedAllocator.h index 150dd7ed2..a95f9911f 100644 --- a/src/LinearMath/btAlignedAllocator.h +++ b/src/LinearMath/btAlignedAllocator.h @@ -49,8 +49,11 @@ typedef void (btAlignedFreeFunc)(void *memblock); typedef void *(btAllocFunc)(size_t size); typedef void (btFreeFunc)(void *memblock); -void btAlignedAllocSetCustomAligned(btAlignedAllocFunc *allocFunc, btAlignedFreeFunc *freeFunc); +///The developer can let all Bullet memory allocations go through a custom memory allocator, using btAlignedAllocSetCustom void btAlignedAllocSetCustom(btAllocFunc *allocFunc, btFreeFunc *freeFunc); +///If the developer has already an custom aligned allocator, then btAlignedAllocSetCustomAligned can be used. The default aligned allocator pre-allocates extra memory using the non-aligned allocator, and instruments it. +void btAlignedAllocSetCustomAligned(btAlignedAllocFunc *allocFunc, btAlignedFreeFunc *freeFunc); + ///The btAlignedAllocator is a portable class for aligned memory allocations. ///Default implementations for unaligned and aligned allocations can be overridden by a custom allocator using btAlignedAllocSetCustom and btAlignedAllocSetCustomAligned. diff --git a/src/LinearMath/btScalar.h b/src/LinearMath/btScalar.h index e5996b05d..71126e6e7 100644 --- a/src/LinearMath/btScalar.h +++ b/src/LinearMath/btScalar.h @@ -45,7 +45,7 @@ inline int btGetVersion() #define ATTRIBUTE_ALIGNED16(a) a #define ATTRIBUTE_ALIGNED128(a) a #else - #define BT_HAS_ALIGNED_ALLOCATOR + //#define BT_HAS_ALIGNED_ALLOCATOR #pragma warning(disable : 4324) // disable padding warning // #pragma warning(disable:4530) // Disable the exception disable but used in MSCV Stl warning. // #pragma warning(disable:4996) //Turn off warnings about deprecated C routines