parent
7b58a62aa6
commit
97141d9ee7
|
@ -533,10 +533,10 @@ static void addBallToHull(convexHull *hull, bmeshBall *ballForConvexHull) {
|
|||
vec3Add(&ballForConvexHull->position, &y, &q.pt[3]);
|
||||
vec3Add(&q.pt[3], &z, &q.pt[3]);
|
||||
|
||||
convexHullAddVertex(hull, &q.pt[0]);
|
||||
convexHullAddVertex(hull, &q.pt[1]);
|
||||
convexHullAddVertex(hull, &q.pt[2]);
|
||||
convexHullAddVertex(hull, &q.pt[3]);
|
||||
convexHullAddVertex(hull, &q.pt[0], ballForConvexHull->index, 0);
|
||||
convexHullAddVertex(hull, &q.pt[1], ballForConvexHull->index, 1);
|
||||
convexHullAddVertex(hull, &q.pt[2], ballForConvexHull->index, 2);
|
||||
convexHullAddVertex(hull, &q.pt[3], ballForConvexHull->index, 3);
|
||||
}
|
||||
|
||||
static int bmeshStichFrom(bmesh *bm, bmeshBall *parent, bmeshBall *ball) {
|
||||
|
|
|
@ -12,6 +12,12 @@
|
|||
// Translate from Danielhst's lua version https://github.com/danielhst/3d-Hull-gift-wrap/blob/master/giftWrap.lua
|
||||
//
|
||||
|
||||
typedef struct {
|
||||
vec3 pt;
|
||||
int plane;
|
||||
int orderOnPlane;
|
||||
} converHullVertex;
|
||||
|
||||
struct convexHull {
|
||||
array *vertexArray;
|
||||
array *openEdgeArray;
|
||||
|
@ -31,7 +37,7 @@ convexHull *convexHullCreate(void) {
|
|||
fprintf(stderr, "%s:Insufficient memory.\n", __FUNCTION__);
|
||||
return 0;
|
||||
}
|
||||
hull->vertexArray = arrayCreate(sizeof(vec3));
|
||||
hull->vertexArray = arrayCreate(sizeof(converHullVertex));
|
||||
if (!hull->vertexArray) {
|
||||
fprintf(stderr, "%s:arrayCreate failed.\n", __FUNCTION__);
|
||||
return 0;
|
||||
|
@ -65,13 +71,18 @@ int convexHullEdgeExsits(convexHull *hull, int firstVertex,
|
|||
return hull->openEdgeExistMap[unitIndex] & (0x00000001 << unitOffset);
|
||||
}
|
||||
|
||||
int convexHullAddVertex(convexHull *hull, vec3 *vertex) {
|
||||
int convexHullAddVertex(convexHull *hull, vec3 *vertex, int plane,
|
||||
int orderOnPlane) {
|
||||
converHullVertex *vtx;
|
||||
int newVertex = arrayGetLength(hull->vertexArray);
|
||||
if (0 != arraySetLength(hull->vertexArray, newVertex + 1)) {
|
||||
fprintf(stderr, "%s:arraySetLength failed.\n", __FUNCTION__);
|
||||
return -1;
|
||||
}
|
||||
*((vec3 *)arrayGetItem(hull->vertexArray, newVertex)) = *vertex;
|
||||
vtx = (converHullVertex *)arrayGetItem(hull->vertexArray, newVertex);
|
||||
vtx->plane = plane;
|
||||
vtx->orderOnPlane = orderOnPlane;
|
||||
vtx->pt = *vertex;
|
||||
return newVertex;
|
||||
}
|
||||
|
||||
|
@ -103,19 +114,49 @@ int convexHullAddEdge(convexHull *hull, int p1, int p2) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int isInAdjacentOrder(int order1, int order2) {
|
||||
return ((order1 + 1) % 4 == order2 ||
|
||||
(order2 + 1) % 4 == order1);
|
||||
}
|
||||
|
||||
int convexHullAddTriangle(convexHull *hull, int firstVertex, int secondVertex,
|
||||
int thirdVertex) {
|
||||
triangle *tri;
|
||||
int newTri = arrayGetLength(hull->triangleArray);
|
||||
converHullVertex *vtx1;
|
||||
converHullVertex *vtx2;
|
||||
converHullVertex *vtx3;
|
||||
int newTri;
|
||||
vtx1 = (converHullVertex *)arrayGetItem(hull->vertexArray, firstVertex);
|
||||
vtx2 = (converHullVertex *)arrayGetItem(hull->vertexArray, secondVertex);
|
||||
vtx3 = (converHullVertex *)arrayGetItem(hull->vertexArray, thirdVertex);
|
||||
if (vtx1->plane == vtx2->plane && vtx1->plane == vtx3->plane) {
|
||||
return 0;
|
||||
}
|
||||
if (vtx1->plane == vtx2->plane) {
|
||||
if (!isInAdjacentOrder(vtx1->orderOnPlane, vtx2->orderOnPlane)) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (vtx1->plane == vtx3->plane) {
|
||||
if (!isInAdjacentOrder(vtx1->orderOnPlane, vtx3->orderOnPlane)) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if (vtx2->plane == vtx3->plane) {
|
||||
if (!isInAdjacentOrder(vtx2->orderOnPlane, vtx3->orderOnPlane)) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
newTri = arrayGetLength(hull->triangleArray);
|
||||
if (0 != arraySetLength(hull->triangleArray, newTri + 1)) {
|
||||
fprintf(stderr, "%s:arraySetLength failed.\n", __FUNCTION__);
|
||||
return -1;
|
||||
}
|
||||
tri = (triangle *)arrayGetItem(hull->triangleArray, newTri);
|
||||
memset(tri, 0, sizeof(triangle));
|
||||
tri->pt[0] = *((vec3 *)arrayGetItem(hull->vertexArray, firstVertex));
|
||||
tri->pt[1] = *((vec3 *)arrayGetItem(hull->vertexArray, secondVertex));
|
||||
tri->pt[2] = *((vec3 *)arrayGetItem(hull->vertexArray, thirdVertex));
|
||||
tri->pt[0] = vtx1->pt;
|
||||
tri->pt[1] = vtx2->pt;
|
||||
tri->pt[2] = vtx3->pt;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,8 @@
|
|||
|
||||
typedef struct convexHull convexHull;
|
||||
convexHull *convexHullCreate(void);
|
||||
int convexHullAddVertex(convexHull *hull, vec3 *vertex);
|
||||
int convexHullAddVertex(convexHull *hull, vec3 *vertex, int plane,
|
||||
int orderOnPlane);
|
||||
void convexHullDestroy(convexHull *hull);
|
||||
int convexHullGenerate(convexHull *hull);
|
||||
int convexHullGetTriangleNum(convexHull *hull);
|
||||
|
|
Loading…
Reference in New Issue