1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
|
/* Copyright (c) <2003-2011> <Julio Jerez, Newton Game Dynamics>
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 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.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*/
#if !defined(__DGCOLLISIONPOLYGONALSOUP_H__)
#define __DGCOLLISIONPOLYGONALSOUP_H__
#include "dgCollision.h"
#include "dgCollisionConvex.h"
#define DG_MAX_COLLIDING_FACES (1024 * 2)
#define DG_MAX_COLLIDING_VERTEX (DG_MAX_COLLIDING_FACES * 4)
class dgCollisionMesh;
typedef void (*dgCollisionMeshCollisionCallback)(const dgBody *bodyWithTreeCollision, const dgBody *const body, dgInt32 faceID,
dgInt32 vertexCount, const dgFloat32 *vertex, dgInt32 vertexStrideInBytes);
DG_MSC_VECTOR_ALIGMENT
class dgPolygonMeshDesc {
public:
// colliding box in polygonSoup local space
dgVector m_boxP0;
dgVector m_boxP1;
dgInt32 m_threadNumber;
dgInt32 m_faceCount;
dgInt32 m_vertexStrideInBytes;
void *m_userData;
dgFloat32 *m_vertex;
dgInt32 *m_userAttribute;
dgInt32 *m_faceIndexCount;
dgInt32 *m_faceVertexIndex;
dgBody *m_objBody;
dgBody *m_polySoupBody;
dgFloat32 *m_faceMaxSize;
// private data;
const dgCollisionMesh *m_me;
dgInt32 *m_faceNormalIndex;
dgInt32 *m_faceAdjencentEdgeNormal;
dgInt32 m_globalIndexCount;
dgInt32 m_globalUserAttribute[DG_MAX_COLLIDING_FACES];
dgInt32 m_globalFaceIndexCount[DG_MAX_COLLIDING_FACES];
dgInt32 m_globalFaceNormalIndex[DG_MAX_COLLIDING_FACES];
dgFloat32 m_globalFaceMaxSize[DG_MAX_COLLIDING_FACES];
dgInt32 m_globalFaceVertexIndex[DG_MAX_COLLIDING_VERTEX];
dgInt32 m_globalAdjencentEdgeNormal[DG_MAX_COLLIDING_VERTEX];
} DG_GCC_VECTOR_ALIGMENT;
DG_MSC_VECTOR_ALIGMENT
class dgCollisionMeshRayHitDesc {
public:
dgCollisionMeshRayHitDesc()
: m_matrix(dgGetIdentityMatrix()) {
}
dgVector m_localP0;
dgVector m_localP1;
dgVector m_normal;
dgUnsigned32 m_userId;
void *m_userData;
void *m_altenateUserData;
dgMatrix m_matrix;
} DG_GCC_VECTOR_ALIGMENT;
class dgCollisionMesh: public dgCollision {
public:
class DG_CLIPPED_FACE_EDGE {
public:
DG_CLIPPED_FACE_EDGE *m_next;
DG_CLIPPED_FACE_EDGE *m_twin;
dgInt32 m_incidentNormal;
dgInt32 m_incidentVertex;
};
DG_MSC_VECTOR_ALIGMENT
class dgGetVertexListIndexList {
public:
dgInt32 *m_indexList;
dgInt32 *m_userDataList;
dgFloat32 *m_veterxArray;
dgInt32 m_triangleCount;
dgInt32 m_maxIndexCount;
dgInt32 m_vertexCount;
dgInt32 m_vertexStrideInBytes;
} DG_GCC_VECTOR_ALIGMENT;
DG_MSC_VECTOR_ALIGMENT
class dgCollisionConvexPolygon: public dgCollisionConvex {
public:
dgCollisionConvexPolygon(dgMemoryAllocator *const allocator);
~dgCollisionConvexPolygon();
virtual dgInt32 CalculateSignature() const;
virtual void Serialize(dgSerialize callback, void *const userData) const;
virtual void SetCollisionBBox(const dgVector &p0, const dgVector &p1);
virtual dgFloat32 RayCast(const dgVector &localP0, const dgVector &localP1, dgContactPoint &contactOut, OnRayPrecastAction preFilter, const dgBody *const body, void *const userData) const;
virtual bool OOBBTest(const dgMatrix &matrix, const dgCollisionConvex *const shape, void *const cacheOrder) const;
virtual dgVector SupportVertex(const dgVector &dir) const;
virtual dgVector SupportVertexSimd(const dgVector &dir) const;
virtual dgInt32 CalculatePlaneIntersection(const dgVector &normal, const dgVector &point, dgVector *const contactsOut) const;
virtual dgInt32 CalculatePlaneIntersectionSimd(const dgVector &normal, const dgVector &point, dgVector *const contactsOut) const;
virtual dgFloat32 GetVolume() const;
virtual dgFloat32 GetBoxMinRadius() const;
virtual dgFloat32 GetBoxMaxRadius() const;
virtual void CalculateInertia(dgVector &inertia, dgVector &origin) const;
virtual bool IsEdgeIntersection() const;
void BeamClipping(const dgCollisionConvex *const hull, const dgMatrix &matrix, dgFloat32 size);
void BeamClippingSimd(const dgCollisionConvex *const hull, const dgMatrix &matrix, dgFloat32 size);
dgInt32 QuickTest(const dgCollisionConvex *const hull, const dgMatrix &matrix);
dgInt32 QuickTestSimd(const dgCollisionConvex *const hull, const dgMatrix &matrix);
dgInt32 QuickTestContinue(const dgCollisionConvex *const hull, const dgMatrix &matrix);
dgInt32 QuickTestContinueSimd(const dgCollisionConvex *const hull, const dgMatrix &matrix);
dgInt32 ClipContacts(dgInt32 count, dgContactPoint *const contactOut, const dgMatrix &globalMatrix) const;
dgVector ClosestDistanceToTriangle(const dgVector &point, const dgVector &p0, const dgVector &p1, const dgVector &p2, bool &isEdge) const;
bool PointToPolygonDistance(const dgVector &point, dgFloat32 radius, dgVector &out, bool &isEdge);
bool DistanceToOrigen(const dgMatrix &matrix, const dgVector &scale, dgFloat32 radius, dgVector &out, bool &isEdge);
dgFloat32 MovingPointToPolygonContact(const dgVector &p, const dgVector &veloc, dgFloat32 radius, dgContactPoint &contact);
dgFloat32 MovingSphereToEdgeContact(const dgVector ¢er, const dgVector &veloc, dgFloat32 radius, const dgVector &v0, const dgVector &v1, dgVector &contactOutOnLine) const;
void CalculateNormal();
void CalculateNormalSimd();
dgVector m_normal;
dgVector m_localPoly[64];
dgVector m_localPolySimd[64 * 3 / 4];
dgInt32 m_clippEdgeNormal[64];
dgInt32 m_count;
dgInt32 m_paddedCount;
dgInt32 m_normalIndex;
dgInt32 m_stride;
dgInt32 *m_index;
dgInt32 *m_adjacentNormalIndex;
dgFloat32 *m_vertex;
mutable dgInt32 m_isEdgeIntersection;
} DG_GCC_VECTOR_ALIGMENT;
dgCollisionMesh(dgMemoryAllocator *const allocator, dgCollisionID type);
dgCollisionMesh(dgWorld *const world, dgDeserialize deserialization, void *const userData);
virtual ~dgCollisionMesh();
void SetCollisionCallback(dgCollisionMeshCollisionCallback debugCallback);
virtual void *GetUserData() const;
virtual dgFloat32 GetVolume() const;
virtual dgFloat32 GetBoxMinRadius() const;
virtual dgFloat32 GetBoxMaxRadius() const;
virtual void CalculateInertia(dgVector &inertia, dgVector &origin) const;
virtual void GetVertexListIndexList(const dgVector &p0, const dgVector &p1, dgGetVertexListIndexList &data) const = 0;
virtual void GetCollidingFaces(dgPolygonMeshDesc *const data) const = 0;
virtual void GetCollidingFacesSimd(dgPolygonMeshDesc *const data) const = 0;
dgCollisionMeshCollisionCallback GetDebugCollisionCallback() const {
return m_debugCallback;
}
// dgCollisionMeshUserRayCastCallback GetDebugRayCastCallback() const { return m_userRayCastCallback;}
protected:
virtual void SetCollisionBBox(const dgVector &p0, const dgVector &p1);
private:
virtual dgInt32 CalculateSignature() const;
dgVector SupportVertex(const dgVector &dir) const;
virtual void CalcAABB(const dgMatrix &matrix, dgVector &p0, dgVector &p1) const;
virtual void CalcAABBSimd(const dgMatrix &matrix, dgVector &p0, dgVector &p1) const;
virtual bool OOBBTest(const dgMatrix &matrix, const dgCollisionConvex *const shape, void *const cacheOrder) const;
virtual void DebugCollision(const dgMatrix &matrix, OnDebugCollisionMeshCallback callback, void *const userData) const;
virtual dgVector CalculateVolumeIntegral(const dgMatrix &globalMatrix, GetBuoyancyPlane bouyancyPlane, void *const context) const;
virtual dgFloat32 RayCast(const dgVector &localP0, const dgVector &localP1, dgContactPoint &contactOut, OnRayPrecastAction preFilter, const dgBody *const body, void *const userData) const = 0;
virtual dgFloat32 RayCastSimd(const dgVector &localP0, const dgVector &localP1, dgContactPoint &contactOut, OnRayPrecastAction preFilter, const dgBody *const body, void *const userData) const = 0;
dgInt32 CalculatePlaneIntersection(const dgFloat32 *vertex, const dgInt32 *index, dgInt32 indexCount, dgInt32 strideInFloat,
const dgPlane &localPlane, dgVector *const contactsOut) const;
virtual void GetCollisionInfo(dgCollisionInfo *info) const;
virtual void Serialize(dgSerialize callback, void *const userData) const;
#ifdef DG_DEBUG_AABB
dgVector BoxSupportMapping(const dgVector &dir) const;
#endif
protected:
dgVector m_boxSize;
dgVector m_boxOrigin;
dgMemoryAllocator *m_allocator;
dgCollisionMeshCollisionCallback m_debugCallback;
// dgCollisionMeshUserRayCastCallback m_userRayCastCallback;
dgCollisionConvexPolygon *m_polygon[DG_MAXIMUN_THREADS];
friend class dgWorld;
};
#endif
|