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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines


bullet
Author(s): Erwin Coumans, ROS package maintained by Tully Foote
autogenerated on Wed Oct 31 2012 07:54:31