24#elif defined(_MSC_VER)
44#if defined(DEBUG_CONVEX_HULL) || defined(SHOW_ITERATIONS)
66 return (
x == 0) && (
y == 0) && (
z == 0);
71 return x * b.
x +
y * b.
y +
z * b.
z;
93 return (
x == b.
x) && (
y == b.
y) && (
z == b.
z);
98 return (
x != b.
x) || (
y != b.
y) || (
z != b.
z);
103 return (
x == 0) && (
y == 0) && (
z == 0);
123 return x * b.
x +
y * b.
y +
z * b.
z;
173 "addq %[bl], %[rl]\n\t"
174 "adcq %[bh], %[rh]\n\t"
190 "subq %[bl], %[rl]\n\t"
191 "sbbq %[bh], %[rh]\n\t"
205 "addq %[bl], %[rl]\n\t"
206 "adcq %[bh], %[rh]\n\t"
286 else if (numerator < 0)
300 else if (denominator < 0)
343 this->numerator = value;
348 this->numerator = -value;
444#ifdef DEBUG_CONVEX_HULL
489 if (
src->lastNearbyFace)
493 for (
Face* f =
src->firstNearbyFace; f; f = f->nextWithSameNearbyVertex)
496 f->nearbyVertex =
this;
529#ifdef DEBUG_CONVEX_HULL
575 template <
typename UWord,
typename UHWord>
665 template <
typename T>
688 for (
int i = 0; i <
size; i++,
o++)
696 template <
typename T>
821 void merge(IntermediateHull&
h0, IntermediateHull&
h1);
845 negative = !negative;
865 bool negative = a < 0;
872 negative = !negative;
901 return sign - b.
sign;
917 "movq %%rax, %[tmp]\n\t"
918 "movq %%rdx, %%rbx\n\t"
919 "movq %[tn], %%rax\n\t"
921 "subq %[tmp], %%rax\n\t"
922 "sbbq %%rbx, %%rdx\n\t"
924 "orq %%rdx, %%rax\n\t"
927 "shll $16, %%ebx\n\t"
946 return sign - b.
sign;
974 return (a > b) ? 1 : (a < b) ? -1 : 0;
996 return numerator.ucmp(denominator * b) * sign;
1045 if ((
v1n->point.x <
v1p->point.x) || ((
v1n->point.x ==
v1p->point.x) && (
v1n->point.y <
v1p->point.y)))
1056 if ((
v1n->point.x >
v1p->point.x) || ((
v1n->point.x ==
v1p->point.x) && (
v1n->point.y >
v1p->point.y)))
1154 while (((
t =
side ?
w0->next :
w0->prev) != v0) && (
t->point.x == x) && (
t->point.y <=
y0))
1163 while (((
t =
side ?
w1->prev :
w1->next) != v1) && (
t->point.x == x) && (
t->point.y >=
y1))
1188 if (
h1.minXy->point.x <
h0.minXy->point.x)
1190 h0.minXy =
h1.minXy;
1192 if (
h1.maxXy->point.x >=
h0.maxXy->point.x)
1194 h0.maxXy =
h1.maxXy;
1197 h0.maxYx =
h1.maxYx;
1207 int n = end -
start;
1225 if ((
dx == 0) && (
dy == 0))
1248 if ((
dx < 0) || ((
dx == 0) && (
dy < 0)))
1259 if ((
dy < 0) || ((
dy == 0) && (
dx < 0)))
1322#ifdef DEBUG_CONVEX_HULL
1328#ifdef DEBUG_CONVEX_HULL
1334#ifdef DEBUG_CONVEX_HULL
1338 for (Vertex* v = minXy; v;)
1354 if (v->next->prev != v)
1356 printf(
" Inconsistency");
1367 minXy->copy = (minXy->copy == -1) ? -2 : -1;
1368 minXy->printGraph();
1372void btConvexHullInternal::Vertex::printGraph()
1384 }
while (e != edges);
1387 Vertex* v = e->target;
1388 if (v->copy != copy)
1394 }
while (e != edges);
1402 if (prev->
next == next)
1404 if (prev->
prev == next)
1415 else if (prev->
prev == next)
1429#ifdef DEBUG_CONVEX_HULL
1430 printf(
"find max edge for %d\n",
start->point.index);
1441#ifdef DEBUG_CONVEX_HULL
1467#ifdef DEBUG_CONVEX_HULL
1472 }
while (e !=
start->edges);
1490#ifdef DEBUG_CONVEX_HULL
1546#ifdef DEBUG_CONVEX_HULL
1580 if (
d1.dot(normal) == 0)
1588 et1 =
e1->target->point;
1632 if (
d0.dot(normal) == 0)
1640 et0 =
e0->target->point;
1655#ifdef DEBUG_CONVEX_HULL
1656 printf(
" Advanced edges to %d %d\n",
et0.index,
et1.index);
1709 }
while (e !=
c0->edges);
1728 }
while (e !=
c1->edges);
1764#ifdef DEBUG_CONVEX_HULL
1765 printf(
"\n Checking %d %d\n",
c0->point.index,
c1->point.index);
1785#ifdef DEBUG_CONVEX_HULL
1818#ifdef DEBUG_CONVEX_HULL
1819 printf(
" Found min edges to %d %d\n",
e0 ?
e0->target->point.index : -1,
e1 ?
e1->target->point.index : -1);
1827 if ((
cmp >= 0) &&
e1)
1863 if ((
cmp <= 0) &&
e0)
1952 return (p.
y <
q.y) || ((p.
y ==
q.y) && ((p.
x <
q.x) || ((p.
x ==
q.x) && (p.
z <
q.z))));
1959 const char* ptr = (
const char*)
coords;
1962 for (
int i = 0; i < count; i++)
1964 const double* v = (
const double*)ptr;
1973 for (
int i = 0; i < count; i++)
1975 const float* v = (
const float*)ptr;
2016 ptr = (
const char*)
coords;
2019 for (
int i = 0; i < count; i++)
2021 const double* v = (
const double*)ptr;
2033 for (
int i = 0; i < count; i++)
2035 const float* v = (
const float*)ptr;
2050 for (
int i = 0; i < count; i++)
2072#ifdef DEBUG_CONVEX_HULL
2118 while (
stack.size() > 0)
2165 }
while (e != v->
edges);
2204 unsigned int seed = 243703;
2242#ifdef DEBUG_CONVEX_HULL
2243 printf(
"\nShrinking face (%d %d %d) (%d %d %d) (%d %d %d) by (%d %d %d)\n",
2244 face->
origin.
x, face->
origin.
y, face->
origin.
z, face->
dir0.
x, face->
dir0.
y, face->
dir0.
z, face->
dir1.
x, face->
dir1.
y, face->
dir1.
z,
shift.x,
shift.y,
shift.z);
2258#ifdef DEBUG_CONVEX_HULL
2259 printf(
"Start edge is ");
2261 printf(
", normal is (%lld %lld %lld), shifted dot is %lld\n", normal.
x, normal.
y, normal.
z,
shiftedDot);
2265#ifdef SHOW_ITERATIONS
2273#ifdef SHOW_ITERATIONS
2278#ifdef DEBUG_CONVEX_HULL
2279 printf(
"Moving downwards, edge is ");
2309#ifdef SHOW_ITERATIONS
2314#ifdef DEBUG_CONVEX_HULL
2315 printf(
"Moving upwards, edge is ");
2340#ifdef SHOW_ITERATIONS
2341 printf(
"Needed %d iterations to find initial intersection\n", n);
2347#ifdef SHOW_ITERATIONS
2352#ifdef SHOW_ITERATIONS
2360#ifdef DEBUG_CONVEX_HULL
2361 printf(
"Checking for outwards edge, current edge is ");
2366#ifdef SHOW_ITERATIONS
2367 printf(
"Needed %d iterations to check for complete containment\n", n);
2375#ifdef SHOW_ITERATIONS
2380#ifdef SHOW_ITERATIONS
2383#ifdef DEBUG_CONVEX_HULL
2384 printf(
"Intersecting edge is ");
2392#ifdef SHOW_ITERATIONS
2397#ifdef SHOW_ITERATIONS
2411#ifdef SHOW_ITERATIONS
2412 printf(
"Needed %d iterations to advance intersection\n", n);
2416#ifdef DEBUG_CONVEX_HULL
2417 printf(
"Advanced intersecting edge to ");
2436#ifdef SHOW_ITERATIONS
2441#ifdef SHOW_ITERATIONS
2447#ifdef DEBUG_CONVEX_HULL
2458#ifdef SHOW_ITERATIONS
2459 printf(
"Needed %d iterations to find other intersection of face\n", n);
2476#ifdef DEBUG_CONVEX_HULL
2544#ifdef DEBUG_CONVEX_HULL
2559#ifdef SHOW_ITERATIONS
2560 printf(
"Needed %d iterations to process all intersections\n",
m);
2577#ifdef DEBUG_CONVEX_HULL
2587#ifdef DEBUG_CONVEX_HULL
2588 printf(
"Removing part\n");
2590#ifdef SHOW_ITERATIONS
2596 int end =
stack.size();
2600#ifdef DEBUG_CONVEX_HULL
2607#ifdef SHOW_ITERATIONS
2628#ifdef SHOW_ITERATIONS
2629 printf(
"Needed %d iterations to remove part\n", n);
2640 int index =
vertex->copy;
2643 index = vertices.
size();
2646#ifdef DEBUG_CONVEX_HULL
2647 printf(
"Vertex %d gets index *%d\n",
vertex->point.index, index);
2676 original_vertex_index.resize(0);
2686 vertices.push_back(
hull.getCoordinates(v));
2687 original_vertex_index.push_back(v->
point.
index);
2698 int s = edges.size();
2699 edges.push_back(
Edge());
2700 edges.push_back(
Edge());
2701 Edge* c = &edges[s];
2702 Edge* r = &edges[s + 1];
2709#ifdef DEBUG_CONVEX_HULL
2729 for (
int i = 0; i <
copied; i++)
2740#ifdef DEBUG_CONVEX_HULL
2741 printf(
"Vertex *%d has edge to *%d\n", i, edges[e->
copy].getTargetVertex());
2743 faces.push_back(e->
copy);
2747#ifdef DEBUG_CONVEX_HULL
2748 printf(
" Face *%d\n", edges[f->
copy].getTargetVertex());
#define btAlignedFree(ptr)
#define btAlignedAlloc(size, alignment)
static int getVertexCopy(btConvexHullInternal::Vertex *vertex, btAlignedObjectArray< btConvexHullInternal::Vertex * > &vertices)
unsigned long long int uint64_t
const T & btMax(const T &a, const T &b)
const T & btMin(const T &a, const T &b)
btScalar dot(const btQuaternion &q1, const btQuaternion &q2)
Calculate the dot product between two quaternions.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
btScalar btAtan(btScalar x)
static unsigned long seed
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
int size() const
return the number of elements in the array
void resize(int newsize, const T &fillData=T())
void push_back(const T &_Val)
int getTargetVertex() const
btScalar compute(const void *coords, bool doubleCoords, int stride, int count, btScalar shrink, btScalar shrinkClamp)
static uint64_t high(Int128 value)
static void shlHalf(uint64_t &value)
static void shlHalf(Int128 &value)
static uint64_t low(Int128 value)
static uint32_t low(uint64_t value)
static void mul(UWord a, UWord b, UWord &resLow, UWord &resHigh)
static uint32_t high(uint64_t value)
static uint64_t mul(uint32_t a, uint32_t b)
static Int128 mul(uint64_t a, uint64_t b)
Face * nextWithSameNearbyVertex
void init(Vertex *a, Vertex *b, Vertex *c)
int ucmp(const Int128 &b) const
Int128 operator+(const Int128 &b) const
Int128 operator*(int64_t b) const
Int128(uint64_t low, uint64_t high)
bool operator<(const Int128 &b) const
Int128 operator-(const Int128 &b) const
btScalar toScalar() const
static Int128 mul(int64_t a, int64_t b)
Int128 & operator+=(const Int128 &b)
int64_t dot(const Point64 &b) const
Point32(int32_t x, int32_t y, int32_t z)
Point32 operator-(const Point32 &b) const
int64_t dot(const Point32 &b) const
bool operator!=(const Point32 &b) const
Point64 cross(const Point64 &b) const
Point32 operator+(const Point32 &b) const
Point64 cross(const Point32 &b) const
bool operator==(const Point32 &b) const
Point64(int64_t x, int64_t y, int64_t z)
int64_t dot(const Point64 &b) const
PointR128(Int128 x, Int128 y, Int128 z, Int128 denominator)
void setArraySize(int arraySize)
void freeObject(T *object)
PoolArray< T > * nextArray
btScalar toScalar() const
Rational128(const Int128 &numerator, const Int128 &denominator)
int compare(const Rational128 &b) const
Rational128(int64_t value)
bool isNegativeInfinity() const
btScalar toScalar() const
int compare(const Rational64 &b) const
Rational64(int64_t numerator, int64_t denominator)
Point32 operator-(const Vertex &b) const
Rational128 dot(const Point64 &b) const
void receiveNearbyFaces(Vertex *src)
bool mergeProjection(IntermediateHull &h0, IntermediateHull &h1, Vertex *&c0, Vertex *&c1)
btVector3 toBtVector(const Point32 &v)
void computeInternal(int start, int end, IntermediateHull &result)
void findEdgeForCoplanarFaces(Vertex *c0, Vertex *c1, Edge *&e0, Edge *&e1, Vertex *stop0, Vertex *stop1)
void compute(const void *coords, bool doubleCoords, int stride, int count)
bool shiftFace(Face *face, btScalar amount, btAlignedObjectArray< Vertex * > stack)
btVector3 getCoordinates(const Vertex *v)
btAlignedObjectArray< Vertex * > originalVertices
btScalar shrink(btScalar amount, btScalar clampAmount)
Edge * findMaxAngle(bool ccw, const Vertex *start, const Point32 &s, const Point64 &rxs, const Point64 &sxrxs, Rational64 &minCot)
static Orientation getOrientation(const Edge *prev, const Edge *next, const Point32 &s, const Point32 &t)
Pool< Vertex > vertexPool
Edge * newEdgePair(Vertex *from, Vertex *to)
void merge(IntermediateHull &h0, IntermediateHull &h1)
void removeEdgePair(Edge *edge)
btVector3 getBtNormal(Face *face)
btVector3 can be used to represent 3D points and vectors.
void setMax(const btVector3 &other)
Set each element to the max of the current values and the values of another btVector3.
const btScalar & z() const
Return the z value.
btVector3 cross(const btVector3 &v) const
Return the cross product between this and another vector.
int minAxis() const
Return the axis with the smallest value Note return values are 0,1,2 for x, y, or z.
btScalar dot(const btVector3 &v) const
Return the dot product.
btVector3 normalized() const
Return a normalized version of this vector.
const btScalar & x() const
Return the x value.
int maxAxis() const
Return the axis with the largest value Note return values are 0,1,2 for x, y, or z.
const btScalar & y() const
Return the y value.
bool operator()(const btConvexHullInternal::Point32 &p, const btConvexHullInternal::Point32 &q) const