Blender V2.61 - r43446

btGImpactShape.h

Go to the documentation of this file.
00001 
00004 /*
00005 This source file is part of GIMPACT Library.
00006 
00007 For the latest info, see http://gimpact.sourceforge.net/
00008 
00009 Copyright (c) 2007 Francisco Leon Najera. C.C. 80087371.
00010 email: projectileman@yahoo.com
00011 
00012 
00013 This software is provided 'as-is', without any express or implied warranty.
00014 In no event will the authors be held liable for any damages arising from the use of this software.
00015 Permission is granted to anyone to use this software for any purpose,
00016 including commercial applications, and to alter it and redistribute it freely,
00017 subject to the following restrictions:
00018 
00019 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.
00020 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
00021 3. This notice may not be removed or altered from any source distribution.
00022 */
00023 
00024 
00025 #ifndef GIMPACT_SHAPE_H
00026 #define GIMPACT_SHAPE_H
00027 
00028 #include "BulletCollision/CollisionShapes/btCollisionShape.h"
00029 #include "BulletCollision/CollisionShapes/btTriangleShape.h"
00030 #include "BulletCollision/CollisionShapes/btStridingMeshInterface.h"
00031 #include "BulletCollision/CollisionShapes/btCollisionMargin.h"
00032 #include "BulletCollision/CollisionDispatch/btCollisionWorld.h"
00033 #include "BulletCollision/CollisionShapes/btConcaveShape.h"
00034 #include "BulletCollision/CollisionShapes/btTetrahedronShape.h"
00035 #include "LinearMath/btVector3.h"
00036 #include "LinearMath/btTransform.h"
00037 #include "LinearMath/btMatrix3x3.h"
00038 #include "LinearMath/btAlignedObjectArray.h"
00039 
00040 #include "btGImpactQuantizedBvh.h" // box tree class
00041 
00042 
00044 typedef btGImpactQuantizedBvh btGImpactBoxSet;
00045 
00046 enum eGIMPACT_SHAPE_TYPE
00047 {
00048     CONST_GIMPACT_COMPOUND_SHAPE = 0,
00049     CONST_GIMPACT_TRIMESH_SHAPE_PART,
00050     CONST_GIMPACT_TRIMESH_SHAPE
00051 };
00052 
00053 
00055 class btTetrahedronShapeEx:public btBU_Simplex1to4
00056 {
00057 public:
00058     btTetrahedronShapeEx()
00059     {
00060         m_numVertices = 4;
00061     }
00062 
00063 
00064     SIMD_FORCE_INLINE void setVertices(
00065         const btVector3 & v0,const btVector3 & v1,
00066         const btVector3 & v2,const btVector3 & v3)
00067     {
00068         m_vertices[0] = v0;
00069         m_vertices[1] = v1;
00070         m_vertices[2] = v2;
00071         m_vertices[3] = v3;
00072         recalcLocalAabb();
00073     }
00074 };
00075 
00076 
00078 class btGImpactShapeInterface : public btConcaveShape
00079 {
00080 protected:
00081     btAABB m_localAABB;
00082     bool m_needs_update;
00083     btVector3  localScaling;
00084     btGImpactBoxSet m_box_set;// optionally boxset
00085 
00088     virtual void calcLocalAABB()
00089     {
00090         lockChildShapes();
00091         if(m_box_set.getNodeCount() == 0)
00092         {
00093             m_box_set.buildSet();
00094         }
00095         else
00096         {
00097             m_box_set.update();
00098         }
00099         unlockChildShapes();
00100 
00101         m_localAABB = m_box_set.getGlobalBox();
00102     }
00103 
00104 
00105 public:
00106     btGImpactShapeInterface()
00107     {
00108         m_shapeType=GIMPACT_SHAPE_PROXYTYPE;
00109         m_localAABB.invalidate();
00110         m_needs_update = true;
00111         localScaling.setValue(1.f,1.f,1.f);
00112     }
00113 
00114 
00116 
00122     SIMD_FORCE_INLINE void updateBound()
00123     {
00124         if(!m_needs_update) return;
00125         calcLocalAABB();
00126         m_needs_update  = false;
00127     }
00128 
00130 
00133     void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
00134     {
00135         btAABB transformedbox = m_localAABB;
00136         transformedbox.appy_transform(t);
00137         aabbMin = transformedbox.m_min;
00138         aabbMax = transformedbox.m_max;
00139     }
00140 
00142     virtual void postUpdate()
00143     {
00144         m_needs_update = true;
00145     }
00146 
00148     SIMD_FORCE_INLINE const btAABB & getLocalBox()
00149     {
00150         return m_localAABB;
00151     }
00152 
00153 
00154     virtual int getShapeType() const
00155     {
00156         return GIMPACT_SHAPE_PROXYTYPE;
00157     }
00158 
00162     virtual void    setLocalScaling(const btVector3& scaling)
00163     {
00164         localScaling = scaling;
00165         postUpdate();
00166     }
00167 
00168     virtual const btVector3& getLocalScaling() const
00169     {
00170         return localScaling;
00171     }
00172 
00173 
00174     virtual void setMargin(btScalar margin)
00175     {
00176         m_collisionMargin = margin;
00177         int i = getNumChildShapes();
00178         while(i--)
00179         {
00180             btCollisionShape* child = getChildShape(i);
00181             child->setMargin(margin);
00182         }
00183 
00184         m_needs_update = true;
00185     }
00186 
00187 
00190 
00192     virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType() const = 0 ;
00193 
00195     SIMD_FORCE_INLINE btGImpactBoxSet * getBoxSet()
00196     {
00197         return &m_box_set;
00198     }
00199 
00201     SIMD_FORCE_INLINE bool hasBoxSet()  const
00202     {
00203         if(m_box_set.getNodeCount() == 0) return false;
00204         return true;
00205     }
00206 
00208     virtual const btPrimitiveManagerBase * getPrimitiveManager()  const = 0;
00209 
00210 
00212     virtual int getNumChildShapes() const  = 0;
00213 
00215     virtual bool childrenHasTransform() const = 0;
00216 
00218     virtual bool needsRetrieveTriangles() const = 0;
00219 
00221     virtual bool needsRetrieveTetrahedrons() const = 0;
00222 
00223     virtual void getBulletTriangle(int prim_index,btTriangleShapeEx & triangle) const = 0;
00224 
00225     virtual void getBulletTetrahedron(int prim_index,btTetrahedronShapeEx & tetrahedron) const = 0;
00226 
00227 
00228 
00230     virtual void lockChildShapes() const
00231     {
00232     }
00233 
00234     virtual void unlockChildShapes() const
00235     {
00236     }
00237 
00239     SIMD_FORCE_INLINE void getPrimitiveTriangle(int index,btPrimitiveTriangle & triangle) const
00240     {
00241         getPrimitiveManager()->get_primitive_triangle(index,triangle);
00242     }
00243 
00244 
00246 
00248     virtual void getChildAabb(int child_index,const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
00249     {
00250         btAABB child_aabb;
00251         getPrimitiveManager()->get_primitive_box(child_index,child_aabb);
00252         child_aabb.appy_transform(t);
00253         aabbMin = child_aabb.m_min;
00254         aabbMax = child_aabb.m_max;
00255     }
00256 
00258     virtual btCollisionShape* getChildShape(int index) = 0;
00259 
00260 
00262     virtual const btCollisionShape* getChildShape(int index) const = 0;
00263 
00265     virtual btTransform getChildTransform(int index) const = 0;
00266 
00268 
00271     virtual void setChildTransform(int index, const btTransform & transform) = 0;
00272 
00274 
00275 
00277     virtual void rayTest(const btVector3& rayFrom, const btVector3& rayTo, btCollisionWorld::RayResultCallback& resultCallback)  const
00278     {
00279         (void) rayFrom; (void) rayTo; (void) resultCallback;
00280     }
00281 
00283 
00286     virtual void    processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
00287     {
00288         (void) callback; (void) aabbMin; (void) aabbMax;
00289     }
00290 
00292 
00293 };
00294 
00295 
00297 
00300 class btGImpactCompoundShape    : public btGImpactShapeInterface
00301 {
00302 public:
00304     class CompoundPrimitiveManager:public btPrimitiveManagerBase
00305     {
00306     public:
00307         virtual ~CompoundPrimitiveManager() {}
00308         btGImpactCompoundShape * m_compoundShape;
00309 
00310 
00311         CompoundPrimitiveManager(const CompoundPrimitiveManager& compound)
00312             : btPrimitiveManagerBase()
00313         {
00314             m_compoundShape = compound.m_compoundShape;
00315         }
00316 
00317         CompoundPrimitiveManager(btGImpactCompoundShape * compoundShape)
00318         {
00319             m_compoundShape = compoundShape;
00320         }
00321 
00322         CompoundPrimitiveManager()
00323         {
00324             m_compoundShape = NULL;
00325         }
00326 
00327         virtual bool is_trimesh() const
00328         {
00329             return false;
00330         }
00331 
00332         virtual int get_primitive_count() const
00333         {
00334             return (int )m_compoundShape->getNumChildShapes();
00335         }
00336 
00337         virtual void get_primitive_box(int prim_index ,btAABB & primbox) const
00338         {
00339             btTransform prim_trans;
00340             if(m_compoundShape->childrenHasTransform())
00341             {
00342                 prim_trans = m_compoundShape->getChildTransform(prim_index);
00343             }
00344             else
00345             {
00346                 prim_trans.setIdentity();
00347             }
00348             const btCollisionShape* shape = m_compoundShape->getChildShape(prim_index);
00349             shape->getAabb(prim_trans,primbox.m_min,primbox.m_max);
00350         }
00351 
00352         virtual void get_primitive_triangle(int prim_index,btPrimitiveTriangle & triangle) const
00353         {
00354             btAssert(0);
00355             (void) prim_index; (void) triangle;
00356         }
00357 
00358     };
00359 
00360 
00361 
00362 protected:
00363     CompoundPrimitiveManager m_primitive_manager;
00364     btAlignedObjectArray<btTransform>       m_childTransforms;
00365     btAlignedObjectArray<btCollisionShape*> m_childShapes;
00366 
00367 
00368 public:
00369 
00370     btGImpactCompoundShape(bool children_has_transform = true)
00371     {
00372         (void) children_has_transform;
00373         m_primitive_manager.m_compoundShape = this;
00374         m_box_set.setPrimitiveManager(&m_primitive_manager);
00375     }
00376 
00377     virtual ~btGImpactCompoundShape()
00378     {
00379     }
00380 
00381 
00383     virtual bool childrenHasTransform() const
00384     {
00385         if(m_childTransforms.size()==0) return false;
00386         return true;
00387     }
00388 
00389 
00391     virtual const btPrimitiveManagerBase * getPrimitiveManager()  const
00392     {
00393         return &m_primitive_manager;
00394     }
00395 
00397     SIMD_FORCE_INLINE CompoundPrimitiveManager * getCompoundPrimitiveManager()
00398     {
00399         return &m_primitive_manager;
00400     }
00401 
00403     virtual int getNumChildShapes() const
00404     {
00405         return m_childShapes.size();
00406     }
00407 
00408 
00410     void addChildShape(const btTransform& localTransform,btCollisionShape* shape)
00411     {
00412         btAssert(shape->isConvex());
00413         m_childTransforms.push_back(localTransform);
00414         m_childShapes.push_back(shape);
00415     }
00416 
00418     void addChildShape(btCollisionShape* shape)
00419     {
00420         btAssert(shape->isConvex());
00421         m_childShapes.push_back(shape);
00422     }
00423 
00425     virtual btCollisionShape* getChildShape(int index)
00426     {
00427         return m_childShapes[index];
00428     }
00429 
00431     virtual const btCollisionShape* getChildShape(int index) const
00432     {
00433         return m_childShapes[index];
00434     }
00435 
00437 
00439     virtual void getChildAabb(int child_index,const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
00440     {
00441 
00442         if(childrenHasTransform())
00443         {
00444             m_childShapes[child_index]->getAabb(t*m_childTransforms[child_index],aabbMin,aabbMax);
00445         }
00446         else
00447         {
00448             m_childShapes[child_index]->getAabb(t,aabbMin,aabbMax);
00449         }
00450     }
00451 
00452 
00454     virtual btTransform getChildTransform(int index) const
00455     {
00456         btAssert(m_childTransforms.size() == m_childShapes.size());
00457         return m_childTransforms[index];
00458     }
00459 
00461 
00464     virtual void setChildTransform(int index, const btTransform & transform)
00465     {
00466         btAssert(m_childTransforms.size() == m_childShapes.size());
00467         m_childTransforms[index] = transform;
00468         postUpdate();
00469     }
00470 
00472     virtual bool needsRetrieveTriangles() const
00473     {
00474         return false;
00475     }
00476 
00478     virtual bool needsRetrieveTetrahedrons() const
00479     {
00480         return false;
00481     }
00482 
00483 
00484     virtual void getBulletTriangle(int prim_index,btTriangleShapeEx & triangle) const
00485     {
00486         (void) prim_index; (void) triangle;
00487         btAssert(0);
00488     }
00489 
00490     virtual void getBulletTetrahedron(int prim_index,btTetrahedronShapeEx & tetrahedron) const
00491     {
00492         (void) prim_index; (void) tetrahedron;
00493         btAssert(0);
00494     }
00495 
00496 
00498     virtual void    calculateLocalInertia(btScalar mass,btVector3& inertia) const;
00499 
00500     virtual const char* getName()const
00501     {
00502         return "GImpactCompound";
00503     }
00504 
00505     virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType() const
00506     {
00507         return CONST_GIMPACT_COMPOUND_SHAPE;
00508     }
00509 
00510 };
00511 
00512 
00513 
00515 
00521 class btGImpactMeshShapePart : public btGImpactShapeInterface
00522 {
00523 public:
00525 
00528     class TrimeshPrimitiveManager:public btPrimitiveManagerBase
00529     {
00530     public:
00531         btScalar m_margin;
00532         btStridingMeshInterface * m_meshInterface;
00533         btVector3 m_scale;
00534         int m_part;
00535         int m_lock_count;
00536         const unsigned char *vertexbase;
00537         int numverts;
00538         PHY_ScalarType type;
00539         int stride;
00540         const unsigned char *indexbase;
00541         int indexstride;
00542         int  numfaces;
00543         PHY_ScalarType indicestype;
00544 
00545         TrimeshPrimitiveManager()
00546         {
00547             m_meshInterface = NULL;
00548             m_part = 0;
00549             m_margin = 0.01f;
00550             m_scale = btVector3(1.f,1.f,1.f);
00551             m_lock_count = 0;
00552             vertexbase = 0;
00553             numverts = 0;
00554             stride = 0;
00555             indexbase = 0;
00556             indexstride = 0;
00557             numfaces = 0;
00558         }
00559 
00560         TrimeshPrimitiveManager(const TrimeshPrimitiveManager & manager)
00561             : btPrimitiveManagerBase()
00562         {
00563             m_meshInterface = manager.m_meshInterface;
00564             m_part = manager.m_part;
00565             m_margin = manager.m_margin;
00566             m_scale = manager.m_scale;
00567             m_lock_count = 0;
00568             vertexbase = 0;
00569             numverts = 0;
00570             stride = 0;
00571             indexbase = 0;
00572             indexstride = 0;
00573             numfaces = 0;
00574 
00575         }
00576 
00577         TrimeshPrimitiveManager(
00578             btStridingMeshInterface * meshInterface,    int part)
00579         {
00580             m_meshInterface = meshInterface;
00581             m_part = part;
00582             m_scale = m_meshInterface->getScaling();
00583             m_margin = 0.1f;
00584             m_lock_count = 0;
00585             vertexbase = 0;
00586             numverts = 0;
00587             stride = 0;
00588             indexbase = 0;
00589             indexstride = 0;
00590             numfaces = 0;
00591 
00592         }
00593 
00594         virtual ~TrimeshPrimitiveManager() {}
00595 
00596         void lock()
00597         {
00598             if(m_lock_count>0)
00599             {
00600                 m_lock_count++;
00601                 return;
00602             }
00603             m_meshInterface->getLockedReadOnlyVertexIndexBase(
00604                 &vertexbase,numverts,
00605                 type, stride,&indexbase, indexstride, numfaces,indicestype,m_part);
00606 
00607             m_lock_count = 1;
00608         }
00609 
00610         void unlock()
00611         {
00612             if(m_lock_count == 0) return;
00613             if(m_lock_count>1)
00614             {
00615                 --m_lock_count;
00616                 return;
00617             }
00618             m_meshInterface->unLockReadOnlyVertexBase(m_part);
00619             vertexbase = NULL;
00620             m_lock_count = 0;
00621         }
00622 
00623         virtual bool is_trimesh() const
00624         {
00625             return true;
00626         }
00627 
00628         virtual int get_primitive_count() const
00629         {
00630             return (int )numfaces;
00631         }
00632 
00633         SIMD_FORCE_INLINE int get_vertex_count() const
00634         {
00635             return (int )numverts;
00636         }
00637 
00638         SIMD_FORCE_INLINE void get_indices(int face_index,int &i0,int &i1,int &i2) const
00639         {
00640             if(indicestype == PHY_SHORT)
00641             {
00642                 short * s_indices = (short *)(indexbase + face_index*indexstride);
00643                 i0 = s_indices[0];
00644                 i1 = s_indices[1];
00645                 i2 = s_indices[2];
00646             }
00647             else
00648             {
00649                 int * i_indices = (int *)(indexbase + face_index*indexstride);
00650                 i0 = i_indices[0];
00651                 i1 = i_indices[1];
00652                 i2 = i_indices[2];
00653             }
00654         }
00655 
00656         SIMD_FORCE_INLINE void get_vertex(int vertex_index, btVector3 & vertex) const
00657         {
00658             if(type == PHY_DOUBLE)
00659             {
00660                 double * dvertices = (double *)(vertexbase + vertex_index*stride);
00661                 vertex[0] = btScalar(dvertices[0]*m_scale[0]);
00662                 vertex[1] = btScalar(dvertices[1]*m_scale[1]);
00663                 vertex[2] = btScalar(dvertices[2]*m_scale[2]);
00664             }
00665             else
00666             {
00667                 float * svertices = (float *)(vertexbase + vertex_index*stride);
00668                 vertex[0] = svertices[0]*m_scale[0];
00669                 vertex[1] = svertices[1]*m_scale[1];
00670                 vertex[2] = svertices[2]*m_scale[2];
00671             }
00672         }
00673 
00674         virtual void get_primitive_box(int prim_index ,btAABB & primbox) const
00675         {
00676             btPrimitiveTriangle  triangle;
00677             get_primitive_triangle(prim_index,triangle);
00678             primbox.calc_from_triangle_margin(
00679                 triangle.m_vertices[0],
00680                 triangle.m_vertices[1],triangle.m_vertices[2],triangle.m_margin);
00681         }
00682 
00683         virtual void get_primitive_triangle(int prim_index,btPrimitiveTriangle & triangle) const
00684         {
00685             int indices[3];
00686             get_indices(prim_index,indices[0],indices[1],indices[2]);
00687             get_vertex(indices[0],triangle.m_vertices[0]);
00688             get_vertex(indices[1],triangle.m_vertices[1]);
00689             get_vertex(indices[2],triangle.m_vertices[2]);
00690             triangle.m_margin = m_margin;
00691         }
00692 
00693         SIMD_FORCE_INLINE void get_bullet_triangle(int prim_index,btTriangleShapeEx & triangle) const
00694         {
00695             int indices[3];
00696             get_indices(prim_index,indices[0],indices[1],indices[2]);
00697             get_vertex(indices[0],triangle.m_vertices1[0]);
00698             get_vertex(indices[1],triangle.m_vertices1[1]);
00699             get_vertex(indices[2],triangle.m_vertices1[2]);
00700             triangle.setMargin(m_margin);
00701         }
00702 
00703     };
00704 
00705 
00706 protected:
00707     TrimeshPrimitiveManager m_primitive_manager;
00708 public:
00709 
00710     btGImpactMeshShapePart()
00711     {
00712         m_box_set.setPrimitiveManager(&m_primitive_manager);
00713     }
00714 
00715 
00716     btGImpactMeshShapePart(btStridingMeshInterface * meshInterface, int part)
00717     {
00718         m_primitive_manager.m_meshInterface = meshInterface;
00719         m_primitive_manager.m_part = part;
00720         m_box_set.setPrimitiveManager(&m_primitive_manager);
00721     }
00722 
00723     virtual ~btGImpactMeshShapePart()
00724     {
00725     }
00726 
00728     virtual bool childrenHasTransform() const
00729     {
00730         return false;
00731     }
00732 
00733 
00735     virtual void lockChildShapes() const
00736     {
00737         void * dummy = (void*)(m_box_set.getPrimitiveManager());
00738         TrimeshPrimitiveManager * dummymanager = static_cast<TrimeshPrimitiveManager *>(dummy);
00739         dummymanager->lock();
00740     }
00741 
00742     virtual void unlockChildShapes()  const
00743     {
00744         void * dummy = (void*)(m_box_set.getPrimitiveManager());
00745         TrimeshPrimitiveManager * dummymanager = static_cast<TrimeshPrimitiveManager *>(dummy);
00746         dummymanager->unlock();
00747     }
00748 
00750     virtual int getNumChildShapes() const
00751     {
00752         return m_primitive_manager.get_primitive_count();
00753     }
00754 
00755 
00757     virtual btCollisionShape* getChildShape(int index)
00758     {
00759         (void) index;
00760         btAssert(0);
00761         return NULL;
00762     }
00763 
00764 
00765 
00767     virtual const btCollisionShape* getChildShape(int index) const
00768     {
00769         (void) index;
00770         btAssert(0);
00771         return NULL;
00772     }
00773 
00775     virtual btTransform getChildTransform(int index) const
00776     {
00777         (void) index;
00778         btAssert(0);
00779         return btTransform();
00780     }
00781 
00783 
00786     virtual void setChildTransform(int index, const btTransform & transform)
00787     {
00788         (void) index;
00789         (void) transform;
00790         btAssert(0);
00791     }
00792 
00793 
00795     virtual const btPrimitiveManagerBase * getPrimitiveManager()  const
00796     {
00797         return &m_primitive_manager;
00798     }
00799 
00800     SIMD_FORCE_INLINE TrimeshPrimitiveManager * getTrimeshPrimitiveManager()
00801     {
00802         return &m_primitive_manager;
00803     }
00804 
00805 
00806 
00807 
00808 
00809     virtual void    calculateLocalInertia(btScalar mass,btVector3& inertia) const;
00810 
00811 
00812 
00813 
00814     virtual const char* getName()const
00815     {
00816         return "GImpactMeshShapePart";
00817     }
00818 
00819     virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType() const
00820     {
00821         return CONST_GIMPACT_TRIMESH_SHAPE_PART;
00822     }
00823 
00825     virtual bool needsRetrieveTriangles() const
00826     {
00827         return true;
00828     }
00829 
00831     virtual bool needsRetrieveTetrahedrons() const
00832     {
00833         return false;
00834     }
00835 
00836     virtual void getBulletTriangle(int prim_index,btTriangleShapeEx & triangle) const
00837     {
00838         m_primitive_manager.get_bullet_triangle(prim_index,triangle);
00839     }
00840 
00841     virtual void getBulletTetrahedron(int prim_index,btTetrahedronShapeEx & tetrahedron) const
00842     {
00843         (void) prim_index;
00844         (void) tetrahedron;
00845         btAssert(0);
00846     }
00847 
00848 
00849 
00850     SIMD_FORCE_INLINE int getVertexCount() const
00851     {
00852         return m_primitive_manager.get_vertex_count();
00853     }
00854 
00855     SIMD_FORCE_INLINE void getVertex(int vertex_index, btVector3 & vertex) const
00856     {
00857         m_primitive_manager.get_vertex(vertex_index,vertex);
00858     }
00859 
00860     SIMD_FORCE_INLINE void setMargin(btScalar margin)
00861     {
00862         m_primitive_manager.m_margin = margin;
00863         postUpdate();
00864     }
00865 
00866     SIMD_FORCE_INLINE btScalar getMargin() const
00867     {
00868         return m_primitive_manager.m_margin;
00869     }
00870 
00871     virtual void    setLocalScaling(const btVector3& scaling)
00872     {
00873         m_primitive_manager.m_scale = scaling;
00874         postUpdate();
00875     }
00876 
00877     virtual const btVector3& getLocalScaling() const
00878     {
00879         return m_primitive_manager.m_scale;
00880     }
00881 
00882     SIMD_FORCE_INLINE int getPart() const
00883     {
00884         return (int)m_primitive_manager.m_part;
00885     }
00886 
00887     virtual void    processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const;
00888 };
00889 
00890 
00892 
00899 class btGImpactMeshShape : public btGImpactShapeInterface
00900 {
00901     btStridingMeshInterface* m_meshInterface;
00902 
00903 protected:
00904     btAlignedObjectArray<btGImpactMeshShapePart*> m_mesh_parts;
00905     void buildMeshParts(btStridingMeshInterface * meshInterface)
00906     {
00907         for (int i=0;i<meshInterface->getNumSubParts() ;++i )
00908         {
00909             btGImpactMeshShapePart * newpart = new btGImpactMeshShapePart(meshInterface,i);
00910             m_mesh_parts.push_back(newpart);
00911         }
00912     }
00913 
00915     virtual void calcLocalAABB()
00916     {
00917         m_localAABB.invalidate();
00918         int i = m_mesh_parts.size();
00919         while(i--)
00920         {
00921             m_mesh_parts[i]->updateBound();
00922             m_localAABB.merge(m_mesh_parts[i]->getLocalBox());
00923         }
00924     }
00925 
00926 public:
00927     btGImpactMeshShape(btStridingMeshInterface * meshInterface)
00928     {
00929         m_meshInterface = meshInterface;
00930         buildMeshParts(meshInterface);
00931     }
00932 
00933     virtual ~btGImpactMeshShape()
00934     {
00935         int i = m_mesh_parts.size();
00936         while(i--)
00937         {
00938             btGImpactMeshShapePart * part = m_mesh_parts[i];
00939             delete part;
00940         }
00941         m_mesh_parts.clear();
00942     }
00943 
00944 
00945     btStridingMeshInterface* getMeshInterface()
00946     {
00947         return m_meshInterface;
00948     }
00949 
00950     const btStridingMeshInterface* getMeshInterface() const
00951     {
00952         return m_meshInterface;
00953     }
00954 
00955     int getMeshPartCount() const
00956     {
00957         return m_mesh_parts.size();
00958     }
00959 
00960     btGImpactMeshShapePart * getMeshPart(int index)
00961     {
00962         return m_mesh_parts[index];
00963     }
00964 
00965 
00966 
00967     const btGImpactMeshShapePart * getMeshPart(int index) const
00968     {
00969         return m_mesh_parts[index];
00970     }
00971 
00972 
00973     virtual void    setLocalScaling(const btVector3& scaling)
00974     {
00975         localScaling = scaling;
00976 
00977         int i = m_mesh_parts.size();
00978         while(i--)
00979         {
00980             btGImpactMeshShapePart * part = m_mesh_parts[i];
00981             part->setLocalScaling(scaling);
00982         }
00983 
00984         m_needs_update = true;
00985     }
00986 
00987     virtual void setMargin(btScalar margin)
00988     {
00989         m_collisionMargin = margin;
00990 
00991         int i = m_mesh_parts.size();
00992         while(i--)
00993         {
00994             btGImpactMeshShapePart * part = m_mesh_parts[i];
00995             part->setMargin(margin);
00996         }
00997 
00998         m_needs_update = true;
00999     }
01000 
01002     virtual void postUpdate()
01003     {
01004         int i = m_mesh_parts.size();
01005         while(i--)
01006         {
01007             btGImpactMeshShapePart * part = m_mesh_parts[i];
01008             part->postUpdate();
01009         }
01010 
01011         m_needs_update = true;
01012     }
01013 
01014     virtual void    calculateLocalInertia(btScalar mass,btVector3& inertia) const;
01015 
01016 
01018     virtual const btPrimitiveManagerBase * getPrimitiveManager()  const
01019     {
01020         btAssert(0);
01021         return NULL;
01022     }
01023 
01024 
01026     virtual int getNumChildShapes() const
01027     {
01028         btAssert(0);
01029         return 0;
01030     }
01031 
01032 
01034     virtual bool childrenHasTransform() const
01035     {
01036         btAssert(0);
01037         return false;
01038     }
01039 
01041     virtual bool needsRetrieveTriangles() const
01042     {
01043         btAssert(0);
01044         return false;
01045     }
01046 
01048     virtual bool needsRetrieveTetrahedrons() const
01049     {
01050         btAssert(0);
01051         return false;
01052     }
01053 
01054     virtual void getBulletTriangle(int prim_index,btTriangleShapeEx & triangle) const
01055     {
01056         (void) prim_index; (void) triangle;
01057         btAssert(0);
01058     }
01059 
01060     virtual void getBulletTetrahedron(int prim_index,btTetrahedronShapeEx & tetrahedron) const
01061     {
01062         (void) prim_index; (void) tetrahedron;
01063         btAssert(0);
01064     }
01065 
01067     virtual void lockChildShapes() const
01068     {
01069         btAssert(0);
01070     }
01071 
01072     virtual void unlockChildShapes() const
01073     {
01074         btAssert(0);
01075     }
01076 
01077 
01078 
01079 
01081 
01083     virtual void getChildAabb(int child_index,const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
01084     {
01085         (void) child_index; (void) t; (void) aabbMin; (void) aabbMax;
01086         btAssert(0);
01087     }
01088 
01090     virtual btCollisionShape* getChildShape(int index)
01091     {
01092         (void) index;
01093         btAssert(0);
01094         return NULL;
01095     }
01096 
01097 
01099     virtual const btCollisionShape* getChildShape(int index) const
01100     {
01101         (void) index;
01102         btAssert(0);
01103         return NULL;
01104     }
01105 
01107     virtual btTransform getChildTransform(int index) const
01108     {
01109         (void) index;
01110         btAssert(0);
01111         return btTransform();
01112     }
01113 
01115 
01118     virtual void setChildTransform(int index, const btTransform & transform)
01119     {
01120         (void) index; (void) transform;
01121         btAssert(0);
01122     }
01123 
01124 
01125     virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType() const
01126     {
01127         return CONST_GIMPACT_TRIMESH_SHAPE;
01128     }
01129 
01130 
01131     virtual const char* getName()const
01132     {
01133         return "GImpactMesh";
01134     }
01135 
01136     virtual void rayTest(const btVector3& rayFrom, const btVector3& rayTo, btCollisionWorld::RayResultCallback& resultCallback)  const;
01137 
01139 
01142     virtual void    processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const;
01143 
01144     virtual int calculateSerializeBufferSize() const;
01145 
01147     virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
01148 
01149 };
01150 
01152 struct  btGImpactMeshShapeData
01153 {
01154     btCollisionShapeData    m_collisionShapeData;
01155 
01156     btStridingMeshInterfaceData m_meshInterface;
01157 
01158     btVector3FloatData  m_localScaling;
01159 
01160     float   m_collisionMargin;
01161 
01162     int     m_gimpactSubType;
01163 };
01164 
01165 SIMD_FORCE_INLINE   int btGImpactMeshShape::calculateSerializeBufferSize() const
01166 {
01167     return sizeof(btGImpactMeshShapeData);
01168 }
01169 
01170 
01171 #endif //GIMPACT_MESH_SHAPE_H