diff options
author | Nicholas Bishop <nicholasbishop@gmail.com> | 2012-10-24 03:54:02 +0400 |
---|---|---|
committer | Nicholas Bishop <nicholasbishop@gmail.com> | 2012-10-24 03:54:02 +0400 |
commit | 0b16c9e201adfcbeebd3e3cda94ccd752c243c03 (patch) | |
tree | 96d932ebbcb507a32435a56da940a6c76d784cc1 /extern/bullet2/src | |
parent | baa4fc68a80bc6042191bdb6d43298a67ed0a005 (diff) |
Patch Bullet to make it's convex hull implementation usable in BMesh
* Add access to the original indices for vertices
* Add a very simple C API for convex hull
* Add this patch to the patches folder and update readme.txt
Diffstat (limited to 'extern/bullet2/src')
4 files changed, 71 insertions, 1 deletions
diff --git a/extern/bullet2/src/Bullet-C-Api.h b/extern/bullet2/src/Bullet-C-Api.h index f27a17d51f7..2eabf3840e1 100644 --- a/extern/bullet2/src/Bullet-C-Api.h +++ b/extern/bullet2/src/Bullet-C-Api.h @@ -167,6 +167,16 @@ extern "C" { // needed for source/blender/blenkernel/intern/collision.c double plNearestPoints(float p1[3], float p2[3], float p3[3], float q1[3], float q2[3], float q3[3], float *pa, float *pb, float normal[3]); + + /* Convex Hull */ + PL_DECLARE_HANDLE(plConvexHull); + plConvexHull plConvexHullCompute(float (*coords)[3], int count); + int plConvexHullNumVertices(plConvexHull hull); + int plConvexHullNumFaces(plConvexHull hull); + void plConvexHullGetVertex(plConvexHull hull, int n, float coords[3], int *original_index); + int plConvexHullGetFaceSize(plConvexHull hull, int n); + void plConvexHullGetFaceVertices(plConvexHull hull, int n, int *vertices); + #ifdef __cplusplus } #endif diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/Bullet-C-API.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/Bullet-C-API.cpp index bd8e2748383..cf735569a9d 100644 --- a/extern/bullet2/src/BulletDynamics/Dynamics/Bullet-C-API.cpp +++ b/extern/bullet2/src/BulletDynamics/Dynamics/Bullet-C-API.cpp @@ -23,7 +23,7 @@ subject to the following restrictions: #include "Bullet-C-Api.h" #include "btBulletDynamicsCommon.h" #include "LinearMath/btAlignedAllocator.h" - +#include "LinearMath/btConvexHullComputer.h" #include "LinearMath/btVector3.h" @@ -403,3 +403,60 @@ double plNearestPoints(float p1[3], float p2[3], float p3[3], float q1[3], float return -1.0f; } +// Convex hull +plConvexHull plConvexHullCompute(float (*coords)[3], int count) +{ + btConvexHullComputer *computer = new btConvexHullComputer; + computer->compute(reinterpret_cast< float* >(coords), + sizeof(*coords), count, 0, 0); + return reinterpret_cast<plConvexHull>(computer); +} + +int plConvexHullNumVertices(plConvexHull hull) +{ + btConvexHullComputer *computer(reinterpret_cast< btConvexHullComputer* >(hull)); + return computer->vertices.size(); +} + +int plConvexHullNumFaces(plConvexHull hull) +{ + btConvexHullComputer *computer(reinterpret_cast< btConvexHullComputer* >(hull)); + return computer->faces.size(); +} + +void plConvexHullGetVertex(plConvexHull hull, int n, float coords[3], + int *original_index) +{ + btConvexHullComputer *computer(reinterpret_cast< btConvexHullComputer* >(hull)); + const btVector3 &v(computer->vertices[n]); + coords[0] = v[0]; + coords[1] = v[1]; + coords[2] = v[2]; + (*original_index) = computer->original_vertex_index[n]; +} + +int plConvexHullGetFaceSize(plConvexHull hull, int n) +{ + btConvexHullComputer *computer(reinterpret_cast< btConvexHullComputer* >(hull)); + const btConvexHullComputer::Edge *e_orig, *e; + int count; + + for (e_orig = &computer->edges[computer->faces[n]], e = e_orig, count = 0; + count == 0 || e != e_orig; + e = e->getNextEdgeOfFace(), count++); + return count; +} + +void plConvexHullGetFaceVertices(plConvexHull hull, int n, int *vertices) +{ + btConvexHullComputer *computer(reinterpret_cast< btConvexHullComputer* >(hull)); + const btConvexHullComputer::Edge *e_orig, *e; + int count; + + for (e_orig = &computer->edges[computer->faces[n]], e = e_orig, count = 0; + count == 0 || e != e_orig; + e = e->getNextEdgeOfFace(), count++) + { + vertices[count] = e->getTargetVertex(); + } +} diff --git a/extern/bullet2/src/LinearMath/btConvexHullComputer.cpp b/extern/bullet2/src/LinearMath/btConvexHullComputer.cpp index c03c901c051..4fd81dac107 100644 --- a/extern/bullet2/src/LinearMath/btConvexHullComputer.cpp +++ b/extern/bullet2/src/LinearMath/btConvexHullComputer.cpp @@ -2661,6 +2661,7 @@ btScalar btConvexHullComputer::compute(const void* coords, bool doubleCoords, in } vertices.resize(0); + original_vertex_index.resize(0); edges.resize(0); faces.resize(0); @@ -2671,6 +2672,7 @@ btScalar btConvexHullComputer::compute(const void* coords, bool doubleCoords, in { btConvexHullInternal::Vertex* v = oldVertices[copied]; vertices.push_back(hull.getCoordinates(v)); + original_vertex_index.push_back(v->point.index); btConvexHullInternal::Edge* firstEdge = v->edges; if (firstEdge) { diff --git a/extern/bullet2/src/LinearMath/btConvexHullComputer.h b/extern/bullet2/src/LinearMath/btConvexHullComputer.h index 7240ac4fb52..6871ce80e00 100644 --- a/extern/bullet2/src/LinearMath/btConvexHullComputer.h +++ b/extern/bullet2/src/LinearMath/btConvexHullComputer.h @@ -67,6 +67,7 @@ class btConvexHullComputer // Vertices of the output hull btAlignedObjectArray<btVector3> vertices; + btAlignedObjectArray<int> original_vertex_index; // Edges of the output hull btAlignedObjectArray<Edge> edges; |