1 #ifndef TESTBULLETONLY_HAS_BEEN_INCLUDED
\r
2 #define TESTBULLETONLY_HAS_BEEN_INCLUDED
\r
4 #include "cppunit/TestFixture.h"
\r
5 #include "cppunit/extensions/HelperMacros.h"
\r
7 #include "btBulletDynamicsCommon.h"
\r
8 #include "BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h"
\r
10 // ---------------------------------------------------------------------------
\r
12 class TestBulletOnly : public CppUnit::TestFixture
\r
14 btCollisionConfiguration * mCollisionConfig;
\r
15 btCollisionDispatcher * mCollisionDispatch;
\r
16 btBroadphaseInterface * mBroadphase;
\r
17 btConstraintSolver * mConstraintSolver;
\r
18 btDiscreteDynamicsWorld * mWorld;
\r
19 btCollisionShape* mBodyShape;
\r
20 btRigidBody* mRigidBody;
\r
21 btDefaultMotionState* mMotionState;
\r
27 // Setup the world --
\r
28 mCollisionConfig = new btDefaultCollisionConfiguration;
\r
29 mCollisionDispatch = new btCollisionDispatcher( mCollisionConfig );
\r
30 mBroadphase = new btDbvtBroadphase();
\r
31 mConstraintSolver = new btSequentialImpulseConstraintSolver();
\r
32 mWorld = new btDiscreteDynamicsWorld( mCollisionDispatch, mBroadphase, mConstraintSolver, mCollisionConfig );
\r
33 mWorld->setGravity( btVector3( 0, -9.81, 0 ));
\r
35 // Set up the rigid body --
\r
36 mBodyShape = new btBoxShape( btVector3( 1, 1, 1 ) );
\r
38 btVector3 localInertia(0,0,0);
\r
39 mBodyShape->calculateLocalInertia(mass,localInertia);
\r
40 btTransform bodyInitial;
\r
42 mMotionState = new btDefaultMotionState();
\r
44 bodyInitial.setIdentity();
\r
45 bodyInitial.setOrigin( btVector3( 0, 0, 0 ) );
\r
46 mRigidBody = new btRigidBody( buildConstructionInfo(mass, 0.5, 0.5, 0, 0, *mMotionState, mBodyShape ) );
\r
48 mWorld->addRigidBody( mRigidBody );
\r
53 mWorld->removeRigidBody(mRigidBody);
\r
55 delete mMotionState;
\r
58 delete mConstraintSolver;
\r
60 delete mCollisionDispatch;
\r
61 delete mCollisionConfig;
\r
65 btRigidBody::btRigidBodyConstructionInfo buildConstructionInfo( btScalar mass, btScalar friction, btScalar restitution, btScalar linearDamping,
\r
66 btScalar angularDamping, btDefaultMotionState & state, btCollisionShape * shape )
\r
68 btVector3 inertia(0,0,0);
\r
70 shape->calculateLocalInertia( mass, inertia );
\r
72 btRigidBody::btRigidBodyConstructionInfo info( mass, &state, shape, inertia );
\r
74 info.m_friction = friction;
\r
75 info.m_restitution = restitution;
\r
76 info.m_linearDamping = linearDamping;
\r
77 info.m_angularDamping = angularDamping;
\r
82 void testKinematicVelocity0()
\r
84 mRigidBody->setMassProps( 1, btVector3( 1, 1, 1 ) );
\r
85 mRigidBody->updateInertiaTensor();
\r
86 mRigidBody->setCollisionFlags( btCollisionObject::CF_KINEMATIC_OBJECT );
\r
89 // Interpolate the velocity --
\r
91 //btVector3 velocity( 1., 2., 3. ), spin( 0.1, 0.2, 0.3 );
\r
92 btVector3 velocity( 1., 2., 3. ), spin( 0.1, 0.2, .3 );
\r
93 btTransform interpolated;
\r
95 // TODO: This is inaccurate for small spins.
\r
96 btTransformUtil::integrateTransform( mRigidBody->getCenterOfMassTransform(), velocity, spin, 1.0f/60.f, interpolated );
\r
98 mRigidBody->setInterpolationWorldTransform( interpolated );
\r
100 mWorld->stepSimulation( 1.f/60.f, 60, 1.0f/60.f );
\r
102 CPPUNIT_ASSERT_DOUBLES_EQUAL( mRigidBody->getLinearVelocity().length2(), velocity.length2(), 1e-8 );
\r
103 #ifdef BT_USE_DOUBLE_PRECISION
\r
104 CPPUNIT_ASSERT_DOUBLES_EQUAL( mRigidBody->getAngularVelocity().length2(), spin.length2(), 1e-4 );
\r
106 CPPUNIT_ASSERT_DOUBLES_EQUAL( mRigidBody->getAngularVelocity().length2(), spin.length2(), 5e-3 );
\r
107 #endif //CPPUNIT_ASSERT_DOUBLES_EQUAL
\r
111 CPPUNIT_TEST_SUITE(TestBulletOnly);
\r
112 CPPUNIT_TEST(testKinematicVelocity0);
\r
113 CPPUNIT_TEST_SUITE_END();
\r