Initialize libbullet git in 2.0_beta.
[platform/upstream/libbullet.git] / UnitTests / BulletUnitTests / TestBulletOnly.h
1 #ifndef TESTBULLETONLY_HAS_BEEN_INCLUDED\r
2 #define TESTBULLETONLY_HAS_BEEN_INCLUDED\r
3 \r
4 #include "cppunit/TestFixture.h"\r
5 #include "cppunit/extensions/HelperMacros.h"\r
6 \r
7 #include "btBulletDynamicsCommon.h"\r
8 #include "BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h"\r
9 \r
10 // ---------------------------------------------------------------------------\r
11 \r
12 class TestBulletOnly : public CppUnit::TestFixture\r
13 {\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
22 \r
23 public:\r
24 \r
25         void setUp() \r
26         {\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
34 \r
35                 // Set up the rigid body --\r
36                 mBodyShape = new btBoxShape( btVector3( 1, 1, 1 ) );\r
37                 btScalar mass = 1;\r
38                 btVector3 localInertia(0,0,0);\r
39                 mBodyShape->calculateLocalInertia(mass,localInertia);\r
40                 btTransform             bodyInitial;\r
41 \r
42                 mMotionState =                  new btDefaultMotionState();\r
43 \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
47 \r
48                 mWorld->addRigidBody( mRigidBody );\r
49         }\r
50 \r
51         void tearDown() \r
52         {\r
53                 mWorld->removeRigidBody(mRigidBody);\r
54                 delete mRigidBody;\r
55                 delete mMotionState;\r
56                 delete mBodyShape;\r
57                 delete mWorld;\r
58                 delete mConstraintSolver;\r
59                 delete mBroadphase;\r
60                 delete mCollisionDispatch;\r
61                 delete mCollisionConfig;\r
62                 \r
63         }\r
64 \r
65         btRigidBody::btRigidBodyConstructionInfo buildConstructionInfo( btScalar mass, btScalar friction, btScalar restitution, btScalar linearDamping,\r
66                 btScalar angularDamping, btDefaultMotionState & state, btCollisionShape * shape )\r
67         {\r
68                 btVector3 inertia(0,0,0);\r
69                 if (mass>0)\r
70                         shape->calculateLocalInertia( mass, inertia );\r
71 \r
72                 btRigidBody::btRigidBodyConstructionInfo info( mass, &state, shape, inertia );\r
73 \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
78 \r
79                 return info;\r
80         }\r
81 \r
82         void testKinematicVelocity0()\r
83         {\r
84                 mRigidBody->setMassProps( 1, btVector3( 1, 1, 1 ) );\r
85                 mRigidBody->updateInertiaTensor();\r
86                 mRigidBody->setCollisionFlags( btCollisionObject::CF_KINEMATIC_OBJECT );\r
87                 // -- .\r
88 \r
89                 // Interpolate the velocity -- \r
90 \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
94 \r
95                 // TODO: This is inaccurate for small spins.\r
96                 btTransformUtil::integrateTransform( mRigidBody->getCenterOfMassTransform(), velocity, spin, 1.0f/60.f, interpolated );\r
97 \r
98                 mRigidBody->setInterpolationWorldTransform( interpolated );\r
99 \r
100                 mWorld->stepSimulation( 1.f/60.f, 60, 1.0f/60.f );\r
101         \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
105 #else\r
106                 CPPUNIT_ASSERT_DOUBLES_EQUAL( mRigidBody->getAngularVelocity().length2(), spin.length2(), 5e-3 );\r
107 #endif //CPPUNIT_ASSERT_DOUBLES_EQUAL\r
108                 \r
109         }\r
110 \r
111         CPPUNIT_TEST_SUITE(TestBulletOnly);\r
112         CPPUNIT_TEST(testKinematicVelocity0);\r
113         CPPUNIT_TEST_SUITE_END();\r
114 \r
115 private:\r
116 \r
117 };\r
118 \r
119 #endif\r