2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2010 Erwin Coumans http://continuousphysics.com/Bullet/
5 This software is provided 'as-is', without any express or implied warranty.
6 In no event will the authors be held liable for any damages arising from the use of this software.
7 Permission is granted to anyone to use this software for any purpose,
8 including commercial applications, and to alter it and redistribute it freely,
9 subject to the following restrictions:
11 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
13 3. This notice may not be removed or altered from any source distribution.
17 #ifndef BULLET_WORLD_IMPORTER_H
18 #define BULLET_WORLD_IMPORTER_H
20 #include "LinearMath/btTransform.h"
21 #include "LinearMath/btVector3.h"
22 #include "LinearMath/btAlignedObjectArray.h"
23 #include "LinearMath/btHashMap.h"
27 class btCollisionShape;
28 class btCollisionObject;
30 class btTypedConstraint;
31 class btDynamicsWorld;
32 struct ConstraintInput;
33 class btRigidBodyColladaInfo;
34 struct btCollisionShapeData;
35 class btTriangleIndexVertexArray;
36 class btStridingMeshInterface;
37 struct btStridingMeshInterfaceData;
38 class btGImpactMeshShape;
40 struct btTriangleInfoMap;
41 class btBvhTriangleMeshShape;
42 class btPoint2PointConstraint;
43 class btHingeConstraint;
44 class btConeTwistConstraint;
45 class btGeneric6DofConstraint;
46 class btGeneric6DofSpringConstraint;
47 class btSliderConstraint;
59 ///The btBulletWorldImporter is a starting point to import .bullet files.
60 ///note that not all data is converted yet. You are expected to override or modify this class.
61 ///See Bullet/Demos/SerializeDemo for a derived class that extract btSoftBody objects too.
62 class btBulletWorldImporter
66 btDynamicsWorld* m_dynamicsWorld;
68 bool m_verboseDumpAllTypes;
70 btCollisionShape* convertCollisionShape( btCollisionShapeData* shapeData );
72 btAlignedObjectArray<btCollisionShape*> m_allocatedCollisionShapes;
73 btAlignedObjectArray<btCollisionObject*> m_allocatedRigidBodies;
74 btAlignedObjectArray<btTypedConstraint*> m_allocatedConstraints;
75 btAlignedObjectArray<btOptimizedBvh*> m_allocatedBvhs;
76 btAlignedObjectArray<btTriangleInfoMap*> m_allocatedTriangleInfoMaps;
77 btAlignedObjectArray<btTriangleIndexVertexArray*> m_allocatedTriangleIndexArrays;
78 btAlignedObjectArray<btStridingMeshInterfaceData*> m_allocatedbtStridingMeshInterfaceDatas;
80 btAlignedObjectArray<char*> m_allocatedNames;
82 btAlignedObjectArray<int*> m_indexArrays;
83 btAlignedObjectArray<short int*> m_shortIndexArrays;
84 btAlignedObjectArray<unsigned char*> m_charIndexArrays;
86 btAlignedObjectArray<btVector3FloatData*> m_floatVertexArrays;
87 btAlignedObjectArray<btVector3DoubleData*> m_doubleVertexArrays;
90 btHashMap<btHashPtr,btOptimizedBvh*> m_bvhMap;
91 btHashMap<btHashPtr,btTriangleInfoMap*> m_timMap;
93 btHashMap<btHashString,btCollisionShape*> m_nameShapeMap;
94 btHashMap<btHashString,btRigidBody*> m_nameBodyMap;
95 btHashMap<btHashString,btTypedConstraint*> m_nameConstraintMap;
96 btHashMap<btHashPtr,const char*> m_objectNameMap;
98 btHashMap<btHashPtr,btCollisionShape*> m_shapeMap;
99 btHashMap<btHashPtr,btCollisionObject*> m_bodyMap;
106 static btRigidBody& getFixedBody();
108 char* duplicateName(const char* name);
112 btBulletWorldImporter(btDynamicsWorld* world=0);
114 virtual ~btBulletWorldImporter();
116 ///delete all memory collision shapes, rigid bodies, constraints etc. allocated during the load.
117 ///make sure you don't use the dynamics world containing objects after you call this method
118 virtual void deleteAllData();
120 bool loadFile(const char* fileName);
122 ///the memoryBuffer might be modified (for example if endian swaps are necessary)
123 bool loadFileFromMemory(char *memoryBuffer, int len);
125 bool loadFileFromMemory(bParse::btBulletFile* file);
127 //call make sure bulletFile2 has been parsed, either using btBulletFile::parse or btBulletWorldImporter::loadFileFromMemory
128 virtual bool convertAllObjects(bParse::btBulletFile* file);
130 void setVerboseMode(bool verboseDumpAllTypes)
132 m_verboseDumpAllTypes = verboseDumpAllTypes;
135 bool getVerboseMode() const
137 return m_verboseDumpAllTypes;
141 int getNumCollisionShapes() const;
142 btCollisionShape* getCollisionShapeByIndex(int index);
143 int getNumRigidBodies() const;
144 btCollisionObject* getRigidBodyByIndex(int index) const;
145 int getNumConstraints() const;
146 btTypedConstraint* getConstraintByIndex(int index) const;
147 int getNumBvhs() const;
148 btOptimizedBvh* getBvhByIndex(int index) const;
149 int getNumTriangleInfoMaps() const;
150 btTriangleInfoMap* getTriangleInfoMapByIndex(int index) const;
152 // queris involving named objects
153 btCollisionShape* getCollisionShapeByName(const char* name);
154 btRigidBody* getRigidBodyByName(const char* name);
155 btTypedConstraint* getConstraintByName(const char* name);
156 const char* getNameForPointer(const void* ptr) const;
158 ///those virtuals are called by load and can be overridden by the user
161 virtual btRigidBody* createRigidBody(bool isDynamic, btScalar mass, const btTransform& startTransform, btCollisionShape* shape,const char* bodyName);
162 virtual btCollisionObject* createCollisionObject( const btTransform& startTransform, btCollisionShape* shape,const char* bodyName);
166 virtual btCollisionShape* createPlaneShape(const btVector3& planeNormal,btScalar planeConstant);
167 virtual btCollisionShape* createBoxShape(const btVector3& halfExtents);
168 virtual btCollisionShape* createSphereShape(btScalar radius);
169 virtual btCollisionShape* createCapsuleShapeX(btScalar radius, btScalar height);
170 virtual btCollisionShape* createCapsuleShapeY(btScalar radius, btScalar height);
171 virtual btCollisionShape* createCapsuleShapeZ(btScalar radius, btScalar height);
173 virtual btCollisionShape* createCylinderShapeX(btScalar radius,btScalar height);
174 virtual btCollisionShape* createCylinderShapeY(btScalar radius,btScalar height);
175 virtual btCollisionShape* createCylinderShapeZ(btScalar radius,btScalar height);
176 virtual class btTriangleIndexVertexArray* createTriangleMeshContainer();
177 virtual btBvhTriangleMeshShape* createBvhTriangleMeshShape(btStridingMeshInterface* trimesh, btOptimizedBvh* bvh);
178 virtual btCollisionShape* createConvexTriangleMeshShape(btStridingMeshInterface* trimesh);
179 virtual btGImpactMeshShape* createGimpactShape(btStridingMeshInterface* trimesh);
180 virtual btStridingMeshInterfaceData* createStridingMeshInterfaceData(btStridingMeshInterfaceData* interfaceData);
182 virtual class btConvexHullShape* createConvexHullShape();
183 virtual class btCompoundShape* createCompoundShape();
184 virtual class btScaledBvhTriangleMeshShape* createScaledTrangleMeshShape(btBvhTriangleMeshShape* meshShape,const btVector3& localScalingbtBvhTriangleMeshShape);
186 virtual btTriangleIndexVertexArray* createMeshInterface(btStridingMeshInterfaceData& meshData);
188 ///acceleration and connectivity structures
189 virtual btOptimizedBvh* createOptimizedBvh();
190 virtual btTriangleInfoMap* createTriangleInfoMap();
193 virtual btPoint2PointConstraint* createPoint2PointConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB);
194 virtual btPoint2PointConstraint* createPoint2PointConstraint(btRigidBody& rbA,const btVector3& pivotInA);
195 virtual btHingeConstraint* createHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA=false);
196 virtual btHingeConstraint* createHingeConstraint(btRigidBody& rbA,const btTransform& rbAFrame, bool useReferenceFrameA=false);
197 virtual btConeTwistConstraint* createConeTwistConstraint(btRigidBody& rbA,btRigidBody& rbB,const btTransform& rbAFrame, const btTransform& rbBFrame);
198 virtual btConeTwistConstraint* createConeTwistConstraint(btRigidBody& rbA,const btTransform& rbAFrame);
199 virtual btGeneric6DofConstraint* createGeneric6DofConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
200 virtual btGeneric6DofConstraint* createGeneric6DofConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameB);
201 virtual btGeneric6DofSpringConstraint* createGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
202 virtual btSliderConstraint* createSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
203 virtual btSliderConstraint* createSliderConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameA);
207 #endif //BULLET_WORLD_IMPORTER_H