00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef CONVEX_HULL_SHAPE_H
00017 #define CONVEX_HULL_SHAPE_H
00018
00019 #include "btPolyhedralConvexShape.h"
00020 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
00021 #include "LinearMath/btAlignedObjectArray.h"
00022
00023
00026 ATTRIBUTE_ALIGNED16(class) btConvexHullShape : public btPolyhedralConvexAabbCachingShape
00027 {
00028 btAlignedObjectArray<btVector3> m_unscaledPoints;
00029
00030 public:
00031 BT_DECLARE_ALIGNED_ALLOCATOR();
00032
00033
00037 btConvexHullShape(const btScalar* points=0,int numPoints=0, int stride=sizeof(btVector3));
00038
00039 void addPoint(const btVector3& point);
00040
00041
00042 btVector3* getUnscaledPoints()
00043 {
00044 return &m_unscaledPoints[0];
00045 }
00046
00047 const btVector3* getUnscaledPoints() const
00048 {
00049 return &m_unscaledPoints[0];
00050 }
00051
00053 const btVector3* getPoints() const
00054 {
00055 return getUnscaledPoints();
00056 }
00057
00058
00059
00060
00061 SIMD_FORCE_INLINE btVector3 getScaledPoint(int i) const
00062 {
00063 return m_unscaledPoints[i] * m_localScaling;
00064 }
00065
00066 SIMD_FORCE_INLINE int getNumPoints() const
00067 {
00068 return m_unscaledPoints.size();
00069 }
00070
00071 virtual btVector3 localGetSupportingVertex(const btVector3& vec)const;
00072 virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
00073 virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
00074
00075
00076
00077
00078 virtual const char* getName()const {return "Convex";}
00079
00080
00081 virtual int getNumVertices() const;
00082 virtual int getNumEdges() const;
00083 virtual void getEdge(int i,btVector3& pa,btVector3& pb) const;
00084 virtual void getVertex(int i,btVector3& vtx) const;
00085 virtual int getNumPlanes() const;
00086 virtual void getPlane(btVector3& planeNormal,btVector3& planeSupport,int i ) const;
00087 virtual bool isInside(const btVector3& pt,btScalar tolerance) const;
00088
00090 virtual void setLocalScaling(const btVector3& scaling);
00091
00092 virtual int calculateSerializeBufferSize() const;
00093
00095 virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
00096
00097 };
00098
00100 struct btConvexHullShapeData
00101 {
00102 btConvexInternalShapeData m_convexInternalShapeData;
00103
00104 btVector3FloatData *m_unscaledPointsFloatPtr;
00105 btVector3DoubleData *m_unscaledPointsDoublePtr;
00106
00107 int m_numUnscaledPoints;
00108 char m_padding3[4];
00109
00110 };
00111
00112
00113 SIMD_FORCE_INLINE int btConvexHullShape::calculateSerializeBufferSize() const
00114 {
00115 return sizeof(btConvexHullShapeData);
00116 }
00117
00118
00119 #endif //CONVEX_HULL_SHAPE_H
00120