btConvexHullComputer.cpp 56 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755
  1. /*
  2. Copyright (c) 2011 Ole Kniemeyer, MAXON, www.maxon.net
  3. This software is provided 'as-is', without any express or implied warranty.
  4. In no event will the authors be held liable for any damages arising from the use of this software.
  5. Permission is granted to anyone to use this software for any purpose,
  6. including commercial applications, and to alter it and redistribute it freely,
  7. subject to the following restrictions:
  8. 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.
  9. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
  10. 3. This notice may not be removed or altered from any source distribution.
  11. */
  12. #include <string.h>
  13. #include "btConvexHullComputer.h"
  14. #include "btAlignedObjectArray.h"
  15. #include "btMinMax.h"
  16. #include "btVector3.h"
  17. #ifdef __GNUC__
  18. #include <stdint.h>
  19. #elif defined(_MSC_VER)
  20. typedef __int32 int32_t;
  21. typedef __int64 int64_t;
  22. typedef unsigned __int32 uint32_t;
  23. typedef unsigned __int64 uint64_t;
  24. #else
  25. typedef int int32_t;
  26. typedef long long int int64_t;
  27. typedef unsigned int uint32_t;
  28. typedef unsigned long long int uint64_t;
  29. #endif
  30. //The definition of USE_X86_64_ASM is moved into the build system. You can enable it manually by commenting out the following lines
  31. //#if (defined(__GNUC__) && defined(__x86_64__) && !defined(__ICL)) // || (defined(__ICL) && defined(_M_X64)) bug in Intel compiler, disable inline assembly
  32. // #define USE_X86_64_ASM
  33. //#endif
  34. //#define DEBUG_CONVEX_HULL
  35. //#define SHOW_ITERATIONS
  36. #if defined(DEBUG_CONVEX_HULL) || defined(SHOW_ITERATIONS)
  37. #include <stdio.h>
  38. #endif
  39. // Convex hull implementation based on Preparata and Hong
  40. // Ole Kniemeyer, MAXON Computer GmbH
  41. class btConvexHullInternal
  42. {
  43. public:
  44. class Point64
  45. {
  46. public:
  47. int64_t x;
  48. int64_t y;
  49. int64_t z;
  50. Point64(int64_t x, int64_t y, int64_t z): x(x), y(y), z(z)
  51. {
  52. }
  53. bool isZero()
  54. {
  55. return (x == 0) && (y == 0) && (z == 0);
  56. }
  57. int64_t dot(const Point64& b) const
  58. {
  59. return x * b.x + y * b.y + z * b.z;
  60. }
  61. };
  62. class Point32
  63. {
  64. public:
  65. int32_t x;
  66. int32_t y;
  67. int32_t z;
  68. int index;
  69. Point32()
  70. {
  71. }
  72. Point32(int32_t x, int32_t y, int32_t z): x(x), y(y), z(z), index(-1)
  73. {
  74. }
  75. bool operator==(const Point32& b) const
  76. {
  77. return (x == b.x) && (y == b.y) && (z == b.z);
  78. }
  79. bool operator!=(const Point32& b) const
  80. {
  81. return (x != b.x) || (y != b.y) || (z != b.z);
  82. }
  83. bool isZero()
  84. {
  85. return (x == 0) && (y == 0) && (z == 0);
  86. }
  87. Point64 cross(const Point32& b) const
  88. {
  89. return Point64(y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x);
  90. }
  91. Point64 cross(const Point64& b) const
  92. {
  93. return Point64(y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x);
  94. }
  95. int64_t dot(const Point32& b) const
  96. {
  97. return x * b.x + y * b.y + z * b.z;
  98. }
  99. int64_t dot(const Point64& b) const
  100. {
  101. return x * b.x + y * b.y + z * b.z;
  102. }
  103. Point32 operator+(const Point32& b) const
  104. {
  105. return Point32(x + b.x, y + b.y, z + b.z);
  106. }
  107. Point32 operator-(const Point32& b) const
  108. {
  109. return Point32(x - b.x, y - b.y, z - b.z);
  110. }
  111. };
  112. class Int128
  113. {
  114. public:
  115. uint64_t low;
  116. uint64_t high;
  117. Int128()
  118. {
  119. }
  120. Int128(uint64_t low, uint64_t high): low(low), high(high)
  121. {
  122. }
  123. Int128(uint64_t low): low(low), high(0)
  124. {
  125. }
  126. Int128(int64_t value): low(value), high((value >= 0) ? 0 : (uint64_t) -1LL)
  127. {
  128. }
  129. static Int128 mul(int64_t a, int64_t b);
  130. static Int128 mul(uint64_t a, uint64_t b);
  131. Int128 operator-() const
  132. {
  133. return Int128((uint64_t) -(int64_t)low, ~high + (low == 0));
  134. }
  135. Int128 operator+(const Int128& b) const
  136. {
  137. #ifdef USE_X86_64_ASM
  138. Int128 result;
  139. __asm__ ("addq %[bl], %[rl]\n\t"
  140. "adcq %[bh], %[rh]\n\t"
  141. : [rl] "=r" (result.low), [rh] "=r" (result.high)
  142. : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high)
  143. : "cc" );
  144. return result;
  145. #else
  146. uint64_t lo = low + b.low;
  147. return Int128(lo, high + b.high + (lo < low));
  148. #endif
  149. }
  150. Int128 operator-(const Int128& b) const
  151. {
  152. #ifdef USE_X86_64_ASM
  153. Int128 result;
  154. __asm__ ("subq %[bl], %[rl]\n\t"
  155. "sbbq %[bh], %[rh]\n\t"
  156. : [rl] "=r" (result.low), [rh] "=r" (result.high)
  157. : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high)
  158. : "cc" );
  159. return result;
  160. #else
  161. return *this + -b;
  162. #endif
  163. }
  164. Int128& operator+=(const Int128& b)
  165. {
  166. #ifdef USE_X86_64_ASM
  167. __asm__ ("addq %[bl], %[rl]\n\t"
  168. "adcq %[bh], %[rh]\n\t"
  169. : [rl] "=r" (low), [rh] "=r" (high)
  170. : "0"(low), "1"(high), [bl] "g"(b.low), [bh] "g"(b.high)
  171. : "cc" );
  172. #else
  173. uint64_t lo = low + b.low;
  174. if (lo < low)
  175. {
  176. ++high;
  177. }
  178. low = lo;
  179. high += b.high;
  180. #endif
  181. return *this;
  182. }
  183. Int128& operator++()
  184. {
  185. if (++low == 0)
  186. {
  187. ++high;
  188. }
  189. return *this;
  190. }
  191. Int128 operator*(int64_t b) const;
  192. btScalar toScalar() const
  193. {
  194. return ((int64_t) high >= 0) ? btScalar(high) * (btScalar(0x100000000LL) * btScalar(0x100000000LL)) + btScalar(low)
  195. : -(-*this).toScalar();
  196. }
  197. int getSign() const
  198. {
  199. return ((int64_t) high < 0) ? -1 : (high || low) ? 1 : 0;
  200. }
  201. bool operator<(const Int128& b) const
  202. {
  203. return (high < b.high) || ((high == b.high) && (low < b.low));
  204. }
  205. int ucmp(const Int128&b) const
  206. {
  207. if (high < b.high)
  208. {
  209. return -1;
  210. }
  211. if (high > b.high)
  212. {
  213. return 1;
  214. }
  215. if (low < b.low)
  216. {
  217. return -1;
  218. }
  219. if (low > b.low)
  220. {
  221. return 1;
  222. }
  223. return 0;
  224. }
  225. };
  226. class Rational64
  227. {
  228. private:
  229. uint64_t m_numerator;
  230. uint64_t m_denominator;
  231. int sign;
  232. public:
  233. Rational64(int64_t numerator, int64_t denominator)
  234. {
  235. if (numerator > 0)
  236. {
  237. sign = 1;
  238. m_numerator = (uint64_t) numerator;
  239. }
  240. else if (numerator < 0)
  241. {
  242. sign = -1;
  243. m_numerator = (uint64_t) -numerator;
  244. }
  245. else
  246. {
  247. sign = 0;
  248. m_numerator = 0;
  249. }
  250. if (denominator > 0)
  251. {
  252. m_denominator = (uint64_t) denominator;
  253. }
  254. else if (denominator < 0)
  255. {
  256. sign = -sign;
  257. m_denominator = (uint64_t) -denominator;
  258. }
  259. else
  260. {
  261. m_denominator = 0;
  262. }
  263. }
  264. bool isNegativeInfinity() const
  265. {
  266. return (sign < 0) && (m_denominator == 0);
  267. }
  268. bool isNaN() const
  269. {
  270. return (sign == 0) && (m_denominator == 0);
  271. }
  272. int compare(const Rational64& b) const;
  273. btScalar toScalar() const
  274. {
  275. return sign * ((m_denominator == 0) ? SIMD_INFINITY : (btScalar) m_numerator / m_denominator);
  276. }
  277. };
  278. class Rational128
  279. {
  280. private:
  281. Int128 numerator;
  282. Int128 denominator;
  283. int sign;
  284. bool isInt64;
  285. public:
  286. Rational128(int64_t value)
  287. {
  288. if (value > 0)
  289. {
  290. sign = 1;
  291. this->numerator = value;
  292. }
  293. else if (value < 0)
  294. {
  295. sign = -1;
  296. this->numerator = -value;
  297. }
  298. else
  299. {
  300. sign = 0;
  301. this->numerator = (uint64_t) 0;
  302. }
  303. this->denominator = (uint64_t) 1;
  304. isInt64 = true;
  305. }
  306. Rational128(const Int128& numerator, const Int128& denominator)
  307. {
  308. sign = numerator.getSign();
  309. if (sign >= 0)
  310. {
  311. this->numerator = numerator;
  312. }
  313. else
  314. {
  315. this->numerator = -numerator;
  316. }
  317. int dsign = denominator.getSign();
  318. if (dsign >= 0)
  319. {
  320. this->denominator = denominator;
  321. }
  322. else
  323. {
  324. sign = -sign;
  325. this->denominator = -denominator;
  326. }
  327. isInt64 = false;
  328. }
  329. int compare(const Rational128& b) const;
  330. int compare(int64_t b) const;
  331. btScalar toScalar() const
  332. {
  333. return sign * ((denominator.getSign() == 0) ? SIMD_INFINITY : numerator.toScalar() / denominator.toScalar());
  334. }
  335. };
  336. class PointR128
  337. {
  338. public:
  339. Int128 x;
  340. Int128 y;
  341. Int128 z;
  342. Int128 denominator;
  343. PointR128()
  344. {
  345. }
  346. PointR128(Int128 x, Int128 y, Int128 z, Int128 denominator): x(x), y(y), z(z), denominator(denominator)
  347. {
  348. }
  349. btScalar xvalue() const
  350. {
  351. return x.toScalar() / denominator.toScalar();
  352. }
  353. btScalar yvalue() const
  354. {
  355. return y.toScalar() / denominator.toScalar();
  356. }
  357. btScalar zvalue() const
  358. {
  359. return z.toScalar() / denominator.toScalar();
  360. }
  361. };
  362. class Edge;
  363. class Face;
  364. class Vertex
  365. {
  366. public:
  367. Vertex* next;
  368. Vertex* prev;
  369. Edge* edges;
  370. Face* firstNearbyFace;
  371. Face* lastNearbyFace;
  372. PointR128 point128;
  373. Point32 point;
  374. int copy;
  375. Vertex(): next(NULL), prev(NULL), edges(NULL), firstNearbyFace(NULL), lastNearbyFace(NULL), copy(-1)
  376. {
  377. }
  378. #ifdef DEBUG_CONVEX_HULL
  379. void print()
  380. {
  381. printf("V%d (%d, %d, %d)", point.index, point.x, point.y, point.z);
  382. }
  383. void printGraph();
  384. #endif
  385. Point32 operator-(const Vertex& b) const
  386. {
  387. return point - b.point;
  388. }
  389. Rational128 dot(const Point64& b) const
  390. {
  391. return (point.index >= 0) ? Rational128(point.dot(b))
  392. : Rational128(point128.x * b.x + point128.y * b.y + point128.z * b.z, point128.denominator);
  393. }
  394. btScalar xvalue() const
  395. {
  396. return (point.index >= 0) ? btScalar(point.x) : point128.xvalue();
  397. }
  398. btScalar yvalue() const
  399. {
  400. return (point.index >= 0) ? btScalar(point.y) : point128.yvalue();
  401. }
  402. btScalar zvalue() const
  403. {
  404. return (point.index >= 0) ? btScalar(point.z) : point128.zvalue();
  405. }
  406. void receiveNearbyFaces(Vertex* src)
  407. {
  408. if (lastNearbyFace)
  409. {
  410. lastNearbyFace->nextWithSameNearbyVertex = src->firstNearbyFace;
  411. }
  412. else
  413. {
  414. firstNearbyFace = src->firstNearbyFace;
  415. }
  416. if (src->lastNearbyFace)
  417. {
  418. lastNearbyFace = src->lastNearbyFace;
  419. }
  420. for (Face* f = src->firstNearbyFace; f; f = f->nextWithSameNearbyVertex)
  421. {
  422. btAssert(f->nearbyVertex == src);
  423. f->nearbyVertex = this;
  424. }
  425. src->firstNearbyFace = NULL;
  426. src->lastNearbyFace = NULL;
  427. }
  428. };
  429. class Edge
  430. {
  431. public:
  432. Edge* next;
  433. Edge* prev;
  434. Edge* reverse;
  435. Vertex* target;
  436. Face* face;
  437. int copy;
  438. ~Edge()
  439. {
  440. next = NULL;
  441. prev = NULL;
  442. reverse = NULL;
  443. target = NULL;
  444. face = NULL;
  445. }
  446. void link(Edge* n)
  447. {
  448. btAssert(reverse->target == n->reverse->target);
  449. next = n;
  450. n->prev = this;
  451. }
  452. #ifdef DEBUG_CONVEX_HULL
  453. void print()
  454. {
  455. printf("E%p : %d -> %d, n=%p p=%p (0 %d\t%d\t%d) -> (%d %d %d)", this, reverse->target->point.index, target->point.index, next, prev,
  456. reverse->target->point.x, reverse->target->point.y, reverse->target->point.z, target->point.x, target->point.y, target->point.z);
  457. }
  458. #endif
  459. };
  460. class Face
  461. {
  462. public:
  463. Face* next;
  464. Vertex* nearbyVertex;
  465. Face* nextWithSameNearbyVertex;
  466. Point32 origin;
  467. Point32 dir0;
  468. Point32 dir1;
  469. Face(): next(NULL), nearbyVertex(NULL), nextWithSameNearbyVertex(NULL)
  470. {
  471. }
  472. void init(Vertex* a, Vertex* b, Vertex* c)
  473. {
  474. nearbyVertex = a;
  475. origin = a->point;
  476. dir0 = *b - *a;
  477. dir1 = *c - *a;
  478. if (a->lastNearbyFace)
  479. {
  480. a->lastNearbyFace->nextWithSameNearbyVertex = this;
  481. }
  482. else
  483. {
  484. a->firstNearbyFace = this;
  485. }
  486. a->lastNearbyFace = this;
  487. }
  488. Point64 getNormal()
  489. {
  490. return dir0.cross(dir1);
  491. }
  492. };
  493. template<typename UWord, typename UHWord> class DMul
  494. {
  495. private:
  496. static uint32_t high(uint64_t value)
  497. {
  498. return (uint32_t) (value >> 32);
  499. }
  500. static uint32_t low(uint64_t value)
  501. {
  502. return (uint32_t) value;
  503. }
  504. static uint64_t mul(uint32_t a, uint32_t b)
  505. {
  506. return (uint64_t) a * (uint64_t) b;
  507. }
  508. static void shlHalf(uint64_t& value)
  509. {
  510. value <<= 32;
  511. }
  512. static uint64_t high(Int128 value)
  513. {
  514. return value.high;
  515. }
  516. static uint64_t low(Int128 value)
  517. {
  518. return value.low;
  519. }
  520. static Int128 mul(uint64_t a, uint64_t b)
  521. {
  522. return Int128::mul(a, b);
  523. }
  524. static void shlHalf(Int128& value)
  525. {
  526. value.high = value.low;
  527. value.low = 0;
  528. }
  529. public:
  530. static void mul(UWord a, UWord b, UWord& resLow, UWord& resHigh)
  531. {
  532. UWord p00 = mul(low(a), low(b));
  533. UWord p01 = mul(low(a), high(b));
  534. UWord p10 = mul(high(a), low(b));
  535. UWord p11 = mul(high(a), high(b));
  536. UWord p0110 = UWord(low(p01)) + UWord(low(p10));
  537. p11 += high(p01);
  538. p11 += high(p10);
  539. p11 += high(p0110);
  540. shlHalf(p0110);
  541. p00 += p0110;
  542. if (p00 < p0110)
  543. {
  544. ++p11;
  545. }
  546. resLow = p00;
  547. resHigh = p11;
  548. }
  549. };
  550. private:
  551. class IntermediateHull
  552. {
  553. public:
  554. Vertex* minXy;
  555. Vertex* maxXy;
  556. Vertex* minYx;
  557. Vertex* maxYx;
  558. IntermediateHull(): minXy(NULL), maxXy(NULL), minYx(NULL), maxYx(NULL)
  559. {
  560. }
  561. void print();
  562. };
  563. enum Orientation {NONE, CLOCKWISE, COUNTER_CLOCKWISE};
  564. template <typename T> class PoolArray
  565. {
  566. private:
  567. T* array;
  568. int size;
  569. public:
  570. PoolArray<T>* next;
  571. PoolArray(int size): size(size), next(NULL)
  572. {
  573. array = (T*) btAlignedAlloc(sizeof(T) * size, 16);
  574. }
  575. ~PoolArray()
  576. {
  577. btAlignedFree(array);
  578. }
  579. T* init()
  580. {
  581. T* o = array;
  582. for (int i = 0; i < size; i++, o++)
  583. {
  584. o->next = (i+1 < size) ? o + 1 : NULL;
  585. }
  586. return array;
  587. }
  588. };
  589. template <typename T> class Pool
  590. {
  591. private:
  592. PoolArray<T>* arrays;
  593. PoolArray<T>* nextArray;
  594. T* freeObjects;
  595. int arraySize;
  596. public:
  597. Pool(): arrays(NULL), nextArray(NULL), freeObjects(NULL), arraySize(256)
  598. {
  599. }
  600. ~Pool()
  601. {
  602. while (arrays)
  603. {
  604. PoolArray<T>* p = arrays;
  605. arrays = p->next;
  606. p->~PoolArray<T>();
  607. btAlignedFree(p);
  608. }
  609. }
  610. void reset()
  611. {
  612. nextArray = arrays;
  613. freeObjects = NULL;
  614. }
  615. void setArraySize(int arraySize)
  616. {
  617. this->arraySize = arraySize;
  618. }
  619. T* newObject()
  620. {
  621. T* o = freeObjects;
  622. if (!o)
  623. {
  624. PoolArray<T>* p = nextArray;
  625. if (p)
  626. {
  627. nextArray = p->next;
  628. }
  629. else
  630. {
  631. p = new(btAlignedAlloc(sizeof(PoolArray<T>), 16)) PoolArray<T>(arraySize);
  632. p->next = arrays;
  633. arrays = p;
  634. }
  635. o = p->init();
  636. }
  637. freeObjects = o->next;
  638. return new(o) T();
  639. };
  640. void freeObject(T* object)
  641. {
  642. object->~T();
  643. object->next = freeObjects;
  644. freeObjects = object;
  645. }
  646. };
  647. btVector3 scaling;
  648. btVector3 center;
  649. Pool<Vertex> vertexPool;
  650. Pool<Edge> edgePool;
  651. Pool<Face> facePool;
  652. btAlignedObjectArray<Vertex*> originalVertices;
  653. int mergeStamp;
  654. int minAxis;
  655. int medAxis;
  656. int maxAxis;
  657. int usedEdgePairs;
  658. int maxUsedEdgePairs;
  659. static Orientation getOrientation(const Edge* prev, const Edge* next, const Point32& s, const Point32& t);
  660. Edge* findMaxAngle(bool ccw, const Vertex* start, const Point32& s, const Point64& rxs, const Point64& sxrxs, Rational64& minCot);
  661. void findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge*& e0, Edge*& e1, Vertex* stop0, Vertex* stop1);
  662. Edge* newEdgePair(Vertex* from, Vertex* to);
  663. void removeEdgePair(Edge* edge)
  664. {
  665. Edge* n = edge->next;
  666. Edge* r = edge->reverse;
  667. btAssert(edge->target && r->target);
  668. if (n != edge)
  669. {
  670. n->prev = edge->prev;
  671. edge->prev->next = n;
  672. r->target->edges = n;
  673. }
  674. else
  675. {
  676. r->target->edges = NULL;
  677. }
  678. n = r->next;
  679. if (n != r)
  680. {
  681. n->prev = r->prev;
  682. r->prev->next = n;
  683. edge->target->edges = n;
  684. }
  685. else
  686. {
  687. edge->target->edges = NULL;
  688. }
  689. edgePool.freeObject(edge);
  690. edgePool.freeObject(r);
  691. usedEdgePairs--;
  692. }
  693. void computeInternal(int start, int end, IntermediateHull& result);
  694. bool mergeProjection(IntermediateHull& h0, IntermediateHull& h1, Vertex*& c0, Vertex*& c1);
  695. void merge(IntermediateHull& h0, IntermediateHull& h1);
  696. btVector3 toBtVector(const Point32& v);
  697. btVector3 getBtNormal(Face* face);
  698. bool shiftFace(Face* face, btScalar amount, btAlignedObjectArray<Vertex*> stack);
  699. public:
  700. Vertex* vertexList;
  701. void compute(const void* coords, bool doubleCoords, int stride, int count);
  702. btVector3 getCoordinates(const Vertex* v);
  703. btScalar shrink(btScalar amount, btScalar clampAmount);
  704. };
  705. btConvexHullInternal::Int128 btConvexHullInternal::Int128::operator*(int64_t b) const
  706. {
  707. bool negative = (int64_t) high < 0;
  708. Int128 a = negative ? -*this : *this;
  709. if (b < 0)
  710. {
  711. negative = !negative;
  712. b = -b;
  713. }
  714. Int128 result = mul(a.low, (uint64_t) b);
  715. result.high += a.high * (uint64_t) b;
  716. return negative ? -result : result;
  717. }
  718. btConvexHullInternal::Int128 btConvexHullInternal::Int128::mul(int64_t a, int64_t b)
  719. {
  720. Int128 result;
  721. #ifdef USE_X86_64_ASM
  722. __asm__ ("imulq %[b]"
  723. : "=a" (result.low), "=d" (result.high)
  724. : "0"(a), [b] "r"(b)
  725. : "cc" );
  726. return result;
  727. #else
  728. bool negative = a < 0;
  729. if (negative)
  730. {
  731. a = -a;
  732. }
  733. if (b < 0)
  734. {
  735. negative = !negative;
  736. b = -b;
  737. }
  738. DMul<uint64_t, uint32_t>::mul((uint64_t) a, (uint64_t) b, result.low, result.high);
  739. return negative ? -result : result;
  740. #endif
  741. }
  742. btConvexHullInternal::Int128 btConvexHullInternal::Int128::mul(uint64_t a, uint64_t b)
  743. {
  744. Int128 result;
  745. #ifdef USE_X86_64_ASM
  746. __asm__ ("mulq %[b]"
  747. : "=a" (result.low), "=d" (result.high)
  748. : "0"(a), [b] "r"(b)
  749. : "cc" );
  750. #else
  751. DMul<uint64_t, uint32_t>::mul(a, b, result.low, result.high);
  752. #endif
  753. return result;
  754. }
  755. int btConvexHullInternal::Rational64::compare(const Rational64& b) const
  756. {
  757. if (sign != b.sign)
  758. {
  759. return sign - b.sign;
  760. }
  761. else if (sign == 0)
  762. {
  763. return 0;
  764. }
  765. // return (numerator * b.denominator > b.numerator * denominator) ? sign : (numerator * b.denominator < b.numerator * denominator) ? -sign : 0;
  766. #ifdef USE_X86_64_ASM
  767. int result;
  768. int64_t tmp;
  769. int64_t dummy;
  770. __asm__ ("mulq %[bn]\n\t"
  771. "movq %%rax, %[tmp]\n\t"
  772. "movq %%rdx, %%rbx\n\t"
  773. "movq %[tn], %%rax\n\t"
  774. "mulq %[bd]\n\t"
  775. "subq %[tmp], %%rax\n\t"
  776. "sbbq %%rbx, %%rdx\n\t" // rdx:rax contains 128-bit-difference "numerator*b.denominator - b.numerator*denominator"
  777. "setnsb %%bh\n\t" // bh=1 if difference is non-negative, bh=0 otherwise
  778. "orq %%rdx, %%rax\n\t"
  779. "setnzb %%bl\n\t" // bl=1 if difference if non-zero, bl=0 if it is zero
  780. "decb %%bh\n\t" // now bx=0x0000 if difference is zero, 0xff01 if it is negative, 0x0001 if it is positive (i.e., same sign as difference)
  781. "shll $16, %%ebx\n\t" // ebx has same sign as difference
  782. : "=&b"(result), [tmp] "=&r"(tmp), "=a"(dummy)
  783. : "a"(denominator), [bn] "g"(b.numerator), [tn] "g"(numerator), [bd] "g"(b.denominator)
  784. : "%rdx", "cc" );
  785. return result ? result ^ sign // if sign is +1, only bit 0 of result is inverted, which does not change the sign of result (and cannot result in zero)
  786. // if sign is -1, all bits of result are inverted, which changes the sign of result (and again cannot result in zero)
  787. : 0;
  788. #else
  789. return sign * Int128::mul(m_numerator, b.m_denominator).ucmp(Int128::mul(m_denominator, b.m_numerator));
  790. #endif
  791. }
  792. int btConvexHullInternal::Rational128::compare(const Rational128& b) const
  793. {
  794. if (sign != b.sign)
  795. {
  796. return sign - b.sign;
  797. }
  798. else if (sign == 0)
  799. {
  800. return 0;
  801. }
  802. if (isInt64)
  803. {
  804. return -b.compare(sign * (int64_t) numerator.low);
  805. }
  806. Int128 nbdLow, nbdHigh, dbnLow, dbnHigh;
  807. DMul<Int128, uint64_t>::mul(numerator, b.denominator, nbdLow, nbdHigh);
  808. DMul<Int128, uint64_t>::mul(denominator, b.numerator, dbnLow, dbnHigh);
  809. int cmp = nbdHigh.ucmp(dbnHigh);
  810. if (cmp)
  811. {
  812. return cmp * sign;
  813. }
  814. return nbdLow.ucmp(dbnLow) * sign;
  815. }
  816. int btConvexHullInternal::Rational128::compare(int64_t b) const
  817. {
  818. if (isInt64)
  819. {
  820. int64_t a = sign * (int64_t) numerator.low;
  821. return (a > b) ? 1 : (a < b) ? -1 : 0;
  822. }
  823. if (b > 0)
  824. {
  825. if (sign <= 0)
  826. {
  827. return -1;
  828. }
  829. }
  830. else if (b < 0)
  831. {
  832. if (sign >= 0)
  833. {
  834. return 1;
  835. }
  836. b = -b;
  837. }
  838. else
  839. {
  840. return sign;
  841. }
  842. return numerator.ucmp(denominator * b) * sign;
  843. }
  844. btConvexHullInternal::Edge* btConvexHullInternal::newEdgePair(Vertex* from, Vertex* to)
  845. {
  846. btAssert(from && to);
  847. Edge* e = edgePool.newObject();
  848. Edge* r = edgePool.newObject();
  849. e->reverse = r;
  850. r->reverse = e;
  851. e->copy = mergeStamp;
  852. r->copy = mergeStamp;
  853. e->target = to;
  854. r->target = from;
  855. e->face = NULL;
  856. r->face = NULL;
  857. usedEdgePairs++;
  858. if (usedEdgePairs > maxUsedEdgePairs)
  859. {
  860. maxUsedEdgePairs = usedEdgePairs;
  861. }
  862. return e;
  863. }
  864. bool btConvexHullInternal::mergeProjection(IntermediateHull& h0, IntermediateHull& h1, Vertex*& c0, Vertex*& c1)
  865. {
  866. Vertex* v0 = h0.maxYx;
  867. Vertex* v1 = h1.minYx;
  868. if ((v0->point.x == v1->point.x) && (v0->point.y == v1->point.y))
  869. {
  870. btAssert(v0->point.z < v1->point.z);
  871. Vertex* v1p = v1->prev;
  872. if (v1p == v1)
  873. {
  874. c0 = v0;
  875. if (v1->edges)
  876. {
  877. btAssert(v1->edges->next == v1->edges);
  878. v1 = v1->edges->target;
  879. btAssert(v1->edges->next == v1->edges);
  880. }
  881. c1 = v1;
  882. return false;
  883. }
  884. Vertex* v1n = v1->next;
  885. v1p->next = v1n;
  886. v1n->prev = v1p;
  887. if (v1 == h1.minXy)
  888. {
  889. if ((v1n->point.x < v1p->point.x) || ((v1n->point.x == v1p->point.x) && (v1n->point.y < v1p->point.y)))
  890. {
  891. h1.minXy = v1n;
  892. }
  893. else
  894. {
  895. h1.minXy = v1p;
  896. }
  897. }
  898. if (v1 == h1.maxXy)
  899. {
  900. if ((v1n->point.x > v1p->point.x) || ((v1n->point.x == v1p->point.x) && (v1n->point.y > v1p->point.y)))
  901. {
  902. h1.maxXy = v1n;
  903. }
  904. else
  905. {
  906. h1.maxXy = v1p;
  907. }
  908. }
  909. }
  910. v0 = h0.maxXy;
  911. v1 = h1.maxXy;
  912. Vertex* v00 = NULL;
  913. Vertex* v10 = NULL;
  914. int32_t sign = 1;
  915. for (int side = 0; side <= 1; side++)
  916. {
  917. int32_t dx = (v1->point.x - v0->point.x) * sign;
  918. if (dx > 0)
  919. {
  920. while (true)
  921. {
  922. int32_t dy = v1->point.y - v0->point.y;
  923. Vertex* w0 = side ? v0->next : v0->prev;
  924. if (w0 != v0)
  925. {
  926. int32_t dx0 = (w0->point.x - v0->point.x) * sign;
  927. int32_t dy0 = w0->point.y - v0->point.y;
  928. if ((dy0 <= 0) && ((dx0 == 0) || ((dx0 < 0) && (dy0 * dx <= dy * dx0))))
  929. {
  930. v0 = w0;
  931. dx = (v1->point.x - v0->point.x) * sign;
  932. continue;
  933. }
  934. }
  935. Vertex* w1 = side ? v1->next : v1->prev;
  936. if (w1 != v1)
  937. {
  938. int32_t dx1 = (w1->point.x - v1->point.x) * sign;
  939. int32_t dy1 = w1->point.y - v1->point.y;
  940. int32_t dxn = (w1->point.x - v0->point.x) * sign;
  941. if ((dxn > 0) && (dy1 < 0) && ((dx1 == 0) || ((dx1 < 0) && (dy1 * dx < dy * dx1))))
  942. {
  943. v1 = w1;
  944. dx = dxn;
  945. continue;
  946. }
  947. }
  948. break;
  949. }
  950. }
  951. else if (dx < 0)
  952. {
  953. while (true)
  954. {
  955. int32_t dy = v1->point.y - v0->point.y;
  956. Vertex* w1 = side ? v1->prev : v1->next;
  957. if (w1 != v1)
  958. {
  959. int32_t dx1 = (w1->point.x - v1->point.x) * sign;
  960. int32_t dy1 = w1->point.y - v1->point.y;
  961. if ((dy1 >= 0) && ((dx1 == 0) || ((dx1 < 0) && (dy1 * dx <= dy * dx1))))
  962. {
  963. v1 = w1;
  964. dx = (v1->point.x - v0->point.x) * sign;
  965. continue;
  966. }
  967. }
  968. Vertex* w0 = side ? v0->prev : v0->next;
  969. if (w0 != v0)
  970. {
  971. int32_t dx0 = (w0->point.x - v0->point.x) * sign;
  972. int32_t dy0 = w0->point.y - v0->point.y;
  973. int32_t dxn = (v1->point.x - w0->point.x) * sign;
  974. if ((dxn < 0) && (dy0 > 0) && ((dx0 == 0) || ((dx0 < 0) && (dy0 * dx < dy * dx0))))
  975. {
  976. v0 = w0;
  977. dx = dxn;
  978. continue;
  979. }
  980. }
  981. break;
  982. }
  983. }
  984. else
  985. {
  986. int32_t x = v0->point.x;
  987. int32_t y0 = v0->point.y;
  988. Vertex* w0 = v0;
  989. Vertex* t;
  990. while (((t = side ? w0->next : w0->prev) != v0) && (t->point.x == x) && (t->point.y <= y0))
  991. {
  992. w0 = t;
  993. y0 = t->point.y;
  994. }
  995. v0 = w0;
  996. int32_t y1 = v1->point.y;
  997. Vertex* w1 = v1;
  998. while (((t = side ? w1->prev : w1->next) != v1) && (t->point.x == x) && (t->point.y >= y1))
  999. {
  1000. w1 = t;
  1001. y1 = t->point.y;
  1002. }
  1003. v1 = w1;
  1004. }
  1005. if (side == 0)
  1006. {
  1007. v00 = v0;
  1008. v10 = v1;
  1009. v0 = h0.minXy;
  1010. v1 = h1.minXy;
  1011. sign = -1;
  1012. }
  1013. }
  1014. v0->prev = v1;
  1015. v1->next = v0;
  1016. v00->next = v10;
  1017. v10->prev = v00;
  1018. if (h1.minXy->point.x < h0.minXy->point.x)
  1019. {
  1020. h0.minXy = h1.minXy;
  1021. }
  1022. if (h1.maxXy->point.x >= h0.maxXy->point.x)
  1023. {
  1024. h0.maxXy = h1.maxXy;
  1025. }
  1026. h0.maxYx = h1.maxYx;
  1027. c0 = v00;
  1028. c1 = v10;
  1029. return true;
  1030. }
  1031. void btConvexHullInternal::computeInternal(int start, int end, IntermediateHull& result)
  1032. {
  1033. int n = end - start;
  1034. switch (n)
  1035. {
  1036. case 0:
  1037. result.minXy = NULL;
  1038. result.maxXy = NULL;
  1039. result.minYx = NULL;
  1040. result.maxYx = NULL;
  1041. return;
  1042. case 2:
  1043. {
  1044. Vertex* v = originalVertices[start];
  1045. Vertex* w = v + 1;
  1046. if (v->point != w->point)
  1047. {
  1048. int32_t dx = v->point.x - w->point.x;
  1049. int32_t dy = v->point.y - w->point.y;
  1050. if ((dx == 0) && (dy == 0))
  1051. {
  1052. if (v->point.z > w->point.z)
  1053. {
  1054. Vertex* t = w;
  1055. w = v;
  1056. v = t;
  1057. }
  1058. btAssert(v->point.z < w->point.z);
  1059. v->next = v;
  1060. v->prev = v;
  1061. result.minXy = v;
  1062. result.maxXy = v;
  1063. result.minYx = v;
  1064. result.maxYx = v;
  1065. }
  1066. else
  1067. {
  1068. v->next = w;
  1069. v->prev = w;
  1070. w->next = v;
  1071. w->prev = v;
  1072. if ((dx < 0) || ((dx == 0) && (dy < 0)))
  1073. {
  1074. result.minXy = v;
  1075. result.maxXy = w;
  1076. }
  1077. else
  1078. {
  1079. result.minXy = w;
  1080. result.maxXy = v;
  1081. }
  1082. if ((dy < 0) || ((dy == 0) && (dx < 0)))
  1083. {
  1084. result.minYx = v;
  1085. result.maxYx = w;
  1086. }
  1087. else
  1088. {
  1089. result.minYx = w;
  1090. result.maxYx = v;
  1091. }
  1092. }
  1093. Edge* e = newEdgePair(v, w);
  1094. e->link(e);
  1095. v->edges = e;
  1096. e = e->reverse;
  1097. e->link(e);
  1098. w->edges = e;
  1099. return;
  1100. }
  1101. }
  1102. // lint -fallthrough
  1103. case 1:
  1104. {
  1105. Vertex* v = originalVertices[start];
  1106. v->edges = NULL;
  1107. v->next = v;
  1108. v->prev = v;
  1109. result.minXy = v;
  1110. result.maxXy = v;
  1111. result.minYx = v;
  1112. result.maxYx = v;
  1113. return;
  1114. }
  1115. }
  1116. int split0 = start + n / 2;
  1117. Point32 p = originalVertices[split0-1]->point;
  1118. int split1 = split0;
  1119. while ((split1 < end) && (originalVertices[split1]->point == p))
  1120. {
  1121. split1++;
  1122. }
  1123. computeInternal(start, split0, result);
  1124. IntermediateHull hull1;
  1125. computeInternal(split1, end, hull1);
  1126. #ifdef DEBUG_CONVEX_HULL
  1127. printf("\n\nMerge\n");
  1128. result.print();
  1129. hull1.print();
  1130. #endif
  1131. merge(result, hull1);
  1132. #ifdef DEBUG_CONVEX_HULL
  1133. printf("\n Result\n");
  1134. result.print();
  1135. #endif
  1136. }
  1137. #ifdef DEBUG_CONVEX_HULL
  1138. void btConvexHullInternal::IntermediateHull::print()
  1139. {
  1140. printf(" Hull\n");
  1141. for (Vertex* v = minXy; v; )
  1142. {
  1143. printf(" ");
  1144. v->print();
  1145. if (v == maxXy)
  1146. {
  1147. printf(" maxXy");
  1148. }
  1149. if (v == minYx)
  1150. {
  1151. printf(" minYx");
  1152. }
  1153. if (v == maxYx)
  1154. {
  1155. printf(" maxYx");
  1156. }
  1157. if (v->next->prev != v)
  1158. {
  1159. printf(" Inconsistency");
  1160. }
  1161. printf("\n");
  1162. v = v->next;
  1163. if (v == minXy)
  1164. {
  1165. break;
  1166. }
  1167. }
  1168. if (minXy)
  1169. {
  1170. minXy->copy = (minXy->copy == -1) ? -2 : -1;
  1171. minXy->printGraph();
  1172. }
  1173. }
  1174. void btConvexHullInternal::Vertex::printGraph()
  1175. {
  1176. print();
  1177. printf("\nEdges\n");
  1178. Edge* e = edges;
  1179. if (e)
  1180. {
  1181. do
  1182. {
  1183. e->print();
  1184. printf("\n");
  1185. e = e->next;
  1186. } while (e != edges);
  1187. do
  1188. {
  1189. Vertex* v = e->target;
  1190. if (v->copy != copy)
  1191. {
  1192. v->copy = copy;
  1193. v->printGraph();
  1194. }
  1195. e = e->next;
  1196. } while (e != edges);
  1197. }
  1198. }
  1199. #endif
  1200. btConvexHullInternal::Orientation btConvexHullInternal::getOrientation(const Edge* prev, const Edge* next, const Point32& s, const Point32& t)
  1201. {
  1202. btAssert(prev->reverse->target == next->reverse->target);
  1203. if (prev->next == next)
  1204. {
  1205. if (prev->prev == next)
  1206. {
  1207. Point64 n = t.cross(s);
  1208. Point64 m = (*prev->target - *next->reverse->target).cross(*next->target - *next->reverse->target);
  1209. btAssert(!m.isZero());
  1210. int64_t dot = n.dot(m);
  1211. btAssert(dot != 0);
  1212. return (dot > 0) ? COUNTER_CLOCKWISE : CLOCKWISE;
  1213. }
  1214. return COUNTER_CLOCKWISE;
  1215. }
  1216. else if (prev->prev == next)
  1217. {
  1218. return CLOCKWISE;
  1219. }
  1220. else
  1221. {
  1222. return NONE;
  1223. }
  1224. }
  1225. btConvexHullInternal::Edge* btConvexHullInternal::findMaxAngle(bool ccw, const Vertex* start, const Point32& s, const Point64& rxs, const Point64& sxrxs, Rational64& minCot)
  1226. {
  1227. Edge* minEdge = NULL;
  1228. #ifdef DEBUG_CONVEX_HULL
  1229. printf("find max edge for %d\n", start->point.index);
  1230. #endif
  1231. Edge* e = start->edges;
  1232. if (e)
  1233. {
  1234. do
  1235. {
  1236. if (e->copy > mergeStamp)
  1237. {
  1238. Point32 t = *e->target - *start;
  1239. Rational64 cot(t.dot(sxrxs), t.dot(rxs));
  1240. #ifdef DEBUG_CONVEX_HULL
  1241. printf(" Angle is %f (%d) for ", (float) btAtan(cot.toScalar()), (int) cot.isNaN());
  1242. e->print();
  1243. #endif
  1244. if (cot.isNaN())
  1245. {
  1246. btAssert(ccw ? (t.dot(s) < 0) : (t.dot(s) > 0));
  1247. }
  1248. else
  1249. {
  1250. int cmp;
  1251. if (minEdge == NULL)
  1252. {
  1253. minCot = cot;
  1254. minEdge = e;
  1255. }
  1256. else if ((cmp = cot.compare(minCot)) < 0)
  1257. {
  1258. minCot = cot;
  1259. minEdge = e;
  1260. }
  1261. else if ((cmp == 0) && (ccw == (getOrientation(minEdge, e, s, t) == COUNTER_CLOCKWISE)))
  1262. {
  1263. minEdge = e;
  1264. }
  1265. }
  1266. #ifdef DEBUG_CONVEX_HULL
  1267. printf("\n");
  1268. #endif
  1269. }
  1270. e = e->next;
  1271. } while (e != start->edges);
  1272. }
  1273. return minEdge;
  1274. }
  1275. void btConvexHullInternal::findEdgeForCoplanarFaces(Vertex* c0, Vertex* c1, Edge*& e0, Edge*& e1, Vertex* stop0, Vertex* stop1)
  1276. {
  1277. Edge* start0 = e0;
  1278. Edge* start1 = e1;
  1279. Point32 et0 = start0 ? start0->target->point : c0->point;
  1280. Point32 et1 = start1 ? start1->target->point : c1->point;
  1281. Point32 s = c1->point - c0->point;
  1282. Point64 normal = ((start0 ? start0 : start1)->target->point - c0->point).cross(s);
  1283. int64_t dist = c0->point.dot(normal);
  1284. btAssert(!start1 || (start1->target->point.dot(normal) == dist));
  1285. Point64 perp = s.cross(normal);
  1286. btAssert(!perp.isZero());
  1287. #ifdef DEBUG_CONVEX_HULL
  1288. printf(" Advancing %d %d (%p %p, %d %d)\n", c0->point.index, c1->point.index, start0, start1, start0 ? start0->target->point.index : -1, start1 ? start1->target->point.index : -1);
  1289. #endif
  1290. int64_t maxDot0 = et0.dot(perp);
  1291. if (e0)
  1292. {
  1293. while (e0->target != stop0)
  1294. {
  1295. Edge* e = e0->reverse->prev;
  1296. if (e->target->point.dot(normal) < dist)
  1297. {
  1298. break;
  1299. }
  1300. btAssert(e->target->point.dot(normal) == dist);
  1301. if (e->copy == mergeStamp)
  1302. {
  1303. break;
  1304. }
  1305. int64_t dot = e->target->point.dot(perp);
  1306. if (dot <= maxDot0)
  1307. {
  1308. break;
  1309. }
  1310. maxDot0 = dot;
  1311. e0 = e;
  1312. et0 = e->target->point;
  1313. }
  1314. }
  1315. int64_t maxDot1 = et1.dot(perp);
  1316. if (e1)
  1317. {
  1318. while (e1->target != stop1)
  1319. {
  1320. Edge* e = e1->reverse->next;
  1321. if (e->target->point.dot(normal) < dist)
  1322. {
  1323. break;
  1324. }
  1325. btAssert(e->target->point.dot(normal) == dist);
  1326. if (e->copy == mergeStamp)
  1327. {
  1328. break;
  1329. }
  1330. int64_t dot = e->target->point.dot(perp);
  1331. if (dot <= maxDot1)
  1332. {
  1333. break;
  1334. }
  1335. maxDot1 = dot;
  1336. e1 = e;
  1337. et1 = e->target->point;
  1338. }
  1339. }
  1340. #ifdef DEBUG_CONVEX_HULL
  1341. printf(" Starting at %d %d\n", et0.index, et1.index);
  1342. #endif
  1343. int64_t dx = maxDot1 - maxDot0;
  1344. if (dx > 0)
  1345. {
  1346. while (true)
  1347. {
  1348. int64_t dy = (et1 - et0).dot(s);
  1349. if (e0 && (e0->target != stop0))
  1350. {
  1351. Edge* f0 = e0->next->reverse;
  1352. if (f0->copy > mergeStamp)
  1353. {
  1354. int64_t dx0 = (f0->target->point - et0).dot(perp);
  1355. int64_t dy0 = (f0->target->point - et0).dot(s);
  1356. if ((dx0 == 0) ? (dy0 < 0) : ((dx0 < 0) && (Rational64(dy0, dx0).compare(Rational64(dy, dx)) >= 0)))
  1357. {
  1358. et0 = f0->target->point;
  1359. dx = (et1 - et0).dot(perp);
  1360. e0 = (e0 == start0) ? NULL : f0;
  1361. continue;
  1362. }
  1363. }
  1364. }
  1365. if (e1 && (e1->target != stop1))
  1366. {
  1367. Edge* f1 = e1->reverse->next;
  1368. if (f1->copy > mergeStamp)
  1369. {
  1370. Point32 d1 = f1->target->point - et1;
  1371. if (d1.dot(normal) == 0)
  1372. {
  1373. int64_t dx1 = d1.dot(perp);
  1374. int64_t dy1 = d1.dot(s);
  1375. int64_t dxn = (f1->target->point - et0).dot(perp);
  1376. if ((dxn > 0) && ((dx1 == 0) ? (dy1 < 0) : ((dx1 < 0) && (Rational64(dy1, dx1).compare(Rational64(dy, dx)) > 0))))
  1377. {
  1378. e1 = f1;
  1379. et1 = e1->target->point;
  1380. dx = dxn;
  1381. continue;
  1382. }
  1383. }
  1384. else
  1385. {
  1386. btAssert((e1 == start1) && (d1.dot(normal) < 0));
  1387. }
  1388. }
  1389. }
  1390. break;
  1391. }
  1392. }
  1393. else if (dx < 0)
  1394. {
  1395. while (true)
  1396. {
  1397. int64_t dy = (et1 - et0).dot(s);
  1398. if (e1 && (e1->target != stop1))
  1399. {
  1400. Edge* f1 = e1->prev->reverse;
  1401. if (f1->copy > mergeStamp)
  1402. {
  1403. int64_t dx1 = (f1->target->point - et1).dot(perp);
  1404. int64_t dy1 = (f1->target->point - et1).dot(s);
  1405. if ((dx1 == 0) ? (dy1 > 0) : ((dx1 < 0) && (Rational64(dy1, dx1).compare(Rational64(dy, dx)) <= 0)))
  1406. {
  1407. et1 = f1->target->point;
  1408. dx = (et1 - et0).dot(perp);
  1409. e1 = (e1 == start1) ? NULL : f1;
  1410. continue;
  1411. }
  1412. }
  1413. }
  1414. if (e0 && (e0->target != stop0))
  1415. {
  1416. Edge* f0 = e0->reverse->prev;
  1417. if (f0->copy > mergeStamp)
  1418. {
  1419. Point32 d0 = f0->target->point - et0;
  1420. if (d0.dot(normal) == 0)
  1421. {
  1422. int64_t dx0 = d0.dot(perp);
  1423. int64_t dy0 = d0.dot(s);
  1424. int64_t dxn = (et1 - f0->target->point).dot(perp);
  1425. if ((dxn < 0) && ((dx0 == 0) ? (dy0 > 0) : ((dx0 < 0) && (Rational64(dy0, dx0).compare(Rational64(dy, dx)) < 0))))
  1426. {
  1427. e0 = f0;
  1428. et0 = e0->target->point;
  1429. dx = dxn;
  1430. continue;
  1431. }
  1432. }
  1433. else
  1434. {
  1435. btAssert((e0 == start0) && (d0.dot(normal) < 0));
  1436. }
  1437. }
  1438. }
  1439. break;
  1440. }
  1441. }
  1442. #ifdef DEBUG_CONVEX_HULL
  1443. printf(" Advanced edges to %d %d\n", et0.index, et1.index);
  1444. #endif
  1445. }
  1446. void btConvexHullInternal::merge(IntermediateHull& h0, IntermediateHull& h1)
  1447. {
  1448. if (!h1.maxXy)
  1449. {
  1450. return;
  1451. }
  1452. if (!h0.maxXy)
  1453. {
  1454. h0 = h1;
  1455. return;
  1456. }
  1457. mergeStamp--;
  1458. Vertex* c0 = NULL;
  1459. Edge* toPrev0 = NULL;
  1460. Edge* firstNew0 = NULL;
  1461. Edge* pendingHead0 = NULL;
  1462. Edge* pendingTail0 = NULL;
  1463. Vertex* c1 = NULL;
  1464. Edge* toPrev1 = NULL;
  1465. Edge* firstNew1 = NULL;
  1466. Edge* pendingHead1 = NULL;
  1467. Edge* pendingTail1 = NULL;
  1468. Point32 prevPoint;
  1469. if (mergeProjection(h0, h1, c0, c1))
  1470. {
  1471. Point32 s = *c1 - *c0;
  1472. Point64 normal = Point32(0, 0, -1).cross(s);
  1473. Point64 t = s.cross(normal);
  1474. btAssert(!t.isZero());
  1475. Edge* e = c0->edges;
  1476. Edge* start0 = NULL;
  1477. if (e)
  1478. {
  1479. do
  1480. {
  1481. int64_t dot = (*e->target - *c0).dot(normal);
  1482. btAssert(dot <= 0);
  1483. if ((dot == 0) && ((*e->target - *c0).dot(t) > 0))
  1484. {
  1485. if (!start0 || (getOrientation(start0, e, s, Point32(0, 0, -1)) == CLOCKWISE))
  1486. {
  1487. start0 = e;
  1488. }
  1489. }
  1490. e = e->next;
  1491. } while (e != c0->edges);
  1492. }
  1493. e = c1->edges;
  1494. Edge* start1 = NULL;
  1495. if (e)
  1496. {
  1497. do
  1498. {
  1499. int64_t dot = (*e->target - *c1).dot(normal);
  1500. btAssert(dot <= 0);
  1501. if ((dot == 0) && ((*e->target - *c1).dot(t) > 0))
  1502. {
  1503. if (!start1 || (getOrientation(start1, e, s, Point32(0, 0, -1)) == COUNTER_CLOCKWISE))
  1504. {
  1505. start1 = e;
  1506. }
  1507. }
  1508. e = e->next;
  1509. } while (e != c1->edges);
  1510. }
  1511. if (start0 || start1)
  1512. {
  1513. findEdgeForCoplanarFaces(c0, c1, start0, start1, NULL, NULL);
  1514. if (start0)
  1515. {
  1516. c0 = start0->target;
  1517. }
  1518. if (start1)
  1519. {
  1520. c1 = start1->target;
  1521. }
  1522. }
  1523. prevPoint = c1->point;
  1524. prevPoint.z++;
  1525. }
  1526. else
  1527. {
  1528. prevPoint = c1->point;
  1529. prevPoint.x++;
  1530. }
  1531. Vertex* first0 = c0;
  1532. Vertex* first1 = c1;
  1533. bool firstRun = true;
  1534. while (true)
  1535. {
  1536. Point32 s = *c1 - *c0;
  1537. Point32 r = prevPoint - c0->point;
  1538. Point64 rxs = r.cross(s);
  1539. Point64 sxrxs = s.cross(rxs);
  1540. #ifdef DEBUG_CONVEX_HULL
  1541. printf("\n Checking %d %d\n", c0->point.index, c1->point.index);
  1542. #endif
  1543. Rational64 minCot0(0, 0);
  1544. Edge* min0 = findMaxAngle(false, c0, s, rxs, sxrxs, minCot0);
  1545. Rational64 minCot1(0, 0);
  1546. Edge* min1 = findMaxAngle(true, c1, s, rxs, sxrxs, minCot1);
  1547. if (!min0 && !min1)
  1548. {
  1549. Edge* e = newEdgePair(c0, c1);
  1550. e->link(e);
  1551. c0->edges = e;
  1552. e = e->reverse;
  1553. e->link(e);
  1554. c1->edges = e;
  1555. return;
  1556. }
  1557. else
  1558. {
  1559. int cmp = !min0 ? 1 : !min1 ? -1 : minCot0.compare(minCot1);
  1560. #ifdef DEBUG_CONVEX_HULL
  1561. printf(" -> Result %d\n", cmp);
  1562. #endif
  1563. if (firstRun || ((cmp >= 0) ? !minCot1.isNegativeInfinity() : !minCot0.isNegativeInfinity()))
  1564. {
  1565. Edge* e = newEdgePair(c0, c1);
  1566. if (pendingTail0)
  1567. {
  1568. pendingTail0->prev = e;
  1569. }
  1570. else
  1571. {
  1572. pendingHead0 = e;
  1573. }
  1574. e->next = pendingTail0;
  1575. pendingTail0 = e;
  1576. e = e->reverse;
  1577. if (pendingTail1)
  1578. {
  1579. pendingTail1->next = e;
  1580. }
  1581. else
  1582. {
  1583. pendingHead1 = e;
  1584. }
  1585. e->prev = pendingTail1;
  1586. pendingTail1 = e;
  1587. }
  1588. Edge* e0 = min0;
  1589. Edge* e1 = min1;
  1590. #ifdef DEBUG_CONVEX_HULL
  1591. printf(" Found min edges to %d %d\n", e0 ? e0->target->point.index : -1, e1 ? e1->target->point.index : -1);
  1592. #endif
  1593. if (cmp == 0)
  1594. {
  1595. findEdgeForCoplanarFaces(c0, c1, e0, e1, NULL, NULL);
  1596. }
  1597. if ((cmp >= 0) && e1)
  1598. {
  1599. if (toPrev1)
  1600. {
  1601. for (Edge* e = toPrev1->next, *n = NULL; e != min1; e = n)
  1602. {
  1603. n = e->next;
  1604. removeEdgePair(e);
  1605. }
  1606. }
  1607. if (pendingTail1)
  1608. {
  1609. if (toPrev1)
  1610. {
  1611. toPrev1->link(pendingHead1);
  1612. }
  1613. else
  1614. {
  1615. min1->prev->link(pendingHead1);
  1616. firstNew1 = pendingHead1;
  1617. }
  1618. pendingTail1->link(min1);
  1619. pendingHead1 = NULL;
  1620. pendingTail1 = NULL;
  1621. }
  1622. else if (!toPrev1)
  1623. {
  1624. firstNew1 = min1;
  1625. }
  1626. prevPoint = c1->point;
  1627. c1 = e1->target;
  1628. toPrev1 = e1->reverse;
  1629. }
  1630. if ((cmp <= 0) && e0)
  1631. {
  1632. if (toPrev0)
  1633. {
  1634. for (Edge* e = toPrev0->prev, *n = NULL; e != min0; e = n)
  1635. {
  1636. n = e->prev;
  1637. removeEdgePair(e);
  1638. }
  1639. }
  1640. if (pendingTail0)
  1641. {
  1642. if (toPrev0)
  1643. {
  1644. pendingHead0->link(toPrev0);
  1645. }
  1646. else
  1647. {
  1648. pendingHead0->link(min0->next);
  1649. firstNew0 = pendingHead0;
  1650. }
  1651. min0->link(pendingTail0);
  1652. pendingHead0 = NULL;
  1653. pendingTail0 = NULL;
  1654. }
  1655. else if (!toPrev0)
  1656. {
  1657. firstNew0 = min0;
  1658. }
  1659. prevPoint = c0->point;
  1660. c0 = e0->target;
  1661. toPrev0 = e0->reverse;
  1662. }
  1663. }
  1664. if ((c0 == first0) && (c1 == first1))
  1665. {
  1666. if (toPrev0 == NULL)
  1667. {
  1668. pendingHead0->link(pendingTail0);
  1669. c0->edges = pendingTail0;
  1670. }
  1671. else
  1672. {
  1673. for (Edge* e = toPrev0->prev, *n = NULL; e != firstNew0; e = n)
  1674. {
  1675. n = e->prev;
  1676. removeEdgePair(e);
  1677. }
  1678. if (pendingTail0)
  1679. {
  1680. pendingHead0->link(toPrev0);
  1681. firstNew0->link(pendingTail0);
  1682. }
  1683. }
  1684. if (toPrev1 == NULL)
  1685. {
  1686. pendingTail1->link(pendingHead1);
  1687. c1->edges = pendingTail1;
  1688. }
  1689. else
  1690. {
  1691. for (Edge* e = toPrev1->next, *n = NULL; e != firstNew1; e = n)
  1692. {
  1693. n = e->next;
  1694. removeEdgePair(e);
  1695. }
  1696. if (pendingTail1)
  1697. {
  1698. toPrev1->link(pendingHead1);
  1699. pendingTail1->link(firstNew1);
  1700. }
  1701. }
  1702. return;
  1703. }
  1704. firstRun = false;
  1705. }
  1706. }
  1707. class pointCmp
  1708. {
  1709. public:
  1710. bool operator() ( const btConvexHullInternal::Point32& p, const btConvexHullInternal::Point32& q ) const
  1711. {
  1712. return (p.y < q.y) || ((p.y == q.y) && ((p.x < q.x) || ((p.x == q.x) && (p.z < q.z))));
  1713. }
  1714. };
  1715. void btConvexHullInternal::compute(const void* coords, bool doubleCoords, int stride, int count)
  1716. {
  1717. btVector3 min(btScalar(1e30), btScalar(1e30), btScalar(1e30)), max(btScalar(-1e30), btScalar(-1e30), btScalar(-1e30));
  1718. const char* ptr = (const char*) coords;
  1719. if (doubleCoords)
  1720. {
  1721. for (int i = 0; i < count; i++)
  1722. {
  1723. const double* v = (const double*) ptr;
  1724. btVector3 p((btScalar) v[0], (btScalar) v[1], (btScalar) v[2]);
  1725. ptr += stride;
  1726. min.setMin(p);
  1727. max.setMax(p);
  1728. }
  1729. }
  1730. else
  1731. {
  1732. for (int i = 0; i < count; i++)
  1733. {
  1734. const float* v = (const float*) ptr;
  1735. btVector3 p(v[0], v[1], v[2]);
  1736. ptr += stride;
  1737. min.setMin(p);
  1738. max.setMax(p);
  1739. }
  1740. }
  1741. btVector3 s = max - min;
  1742. maxAxis = s.maxAxis();
  1743. minAxis = s.minAxis();
  1744. if (minAxis == maxAxis)
  1745. {
  1746. minAxis = (maxAxis + 1) % 3;
  1747. }
  1748. medAxis = 3 - maxAxis - minAxis;
  1749. s /= btScalar(10216);
  1750. if (((medAxis + 1) % 3) != maxAxis)
  1751. {
  1752. s *= -1;
  1753. }
  1754. scaling = s;
  1755. if (s[0] != 0)
  1756. {
  1757. s[0] = btScalar(1) / s[0];
  1758. }
  1759. if (s[1] != 0)
  1760. {
  1761. s[1] = btScalar(1) / s[1];
  1762. }
  1763. if (s[2] != 0)
  1764. {
  1765. s[2] = btScalar(1) / s[2];
  1766. }
  1767. center = (min + max) * btScalar(0.5);
  1768. btAlignedObjectArray<Point32> points;
  1769. points.resize(count);
  1770. ptr = (const char*) coords;
  1771. if (doubleCoords)
  1772. {
  1773. for (int i = 0; i < count; i++)
  1774. {
  1775. const double* v = (const double*) ptr;
  1776. btVector3 p((btScalar) v[0], (btScalar) v[1], (btScalar) v[2]);
  1777. ptr += stride;
  1778. p = (p - center) * s;
  1779. points[i].x = (int32_t) p[medAxis];
  1780. points[i].y = (int32_t) p[maxAxis];
  1781. points[i].z = (int32_t) p[minAxis];
  1782. points[i].index = i;
  1783. }
  1784. }
  1785. else
  1786. {
  1787. for (int i = 0; i < count; i++)
  1788. {
  1789. const float* v = (const float*) ptr;
  1790. btVector3 p(v[0], v[1], v[2]);
  1791. ptr += stride;
  1792. p = (p - center) * s;
  1793. points[i].x = (int32_t) p[medAxis];
  1794. points[i].y = (int32_t) p[maxAxis];
  1795. points[i].z = (int32_t) p[minAxis];
  1796. points[i].index = i;
  1797. }
  1798. }
  1799. points.quickSort(pointCmp());
  1800. vertexPool.reset();
  1801. vertexPool.setArraySize(count);
  1802. originalVertices.resize(count);
  1803. for (int i = 0; i < count; i++)
  1804. {
  1805. Vertex* v = vertexPool.newObject();
  1806. v->edges = NULL;
  1807. v->point = points[i];
  1808. v->copy = -1;
  1809. originalVertices[i] = v;
  1810. }
  1811. points.clear();
  1812. edgePool.reset();
  1813. edgePool.setArraySize(6 * count);
  1814. usedEdgePairs = 0;
  1815. maxUsedEdgePairs = 0;
  1816. mergeStamp = -3;
  1817. IntermediateHull hull;
  1818. computeInternal(0, count, hull);
  1819. vertexList = hull.minXy;
  1820. #ifdef DEBUG_CONVEX_HULL
  1821. printf("max. edges %d (3v = %d)", maxUsedEdgePairs, 3 * count);
  1822. #endif
  1823. }
  1824. btVector3 btConvexHullInternal::toBtVector(const Point32& v)
  1825. {
  1826. btVector3 p;
  1827. p[medAxis] = btScalar(v.x);
  1828. p[maxAxis] = btScalar(v.y);
  1829. p[minAxis] = btScalar(v.z);
  1830. return p * scaling;
  1831. }
  1832. btVector3 btConvexHullInternal::getBtNormal(Face* face)
  1833. {
  1834. return toBtVector(face->dir0).cross(toBtVector(face->dir1)).normalized();
  1835. }
  1836. btVector3 btConvexHullInternal::getCoordinates(const Vertex* v)
  1837. {
  1838. btVector3 p;
  1839. p[medAxis] = v->xvalue();
  1840. p[maxAxis] = v->yvalue();
  1841. p[minAxis] = v->zvalue();
  1842. return p * scaling + center;
  1843. }
  1844. btScalar btConvexHullInternal::shrink(btScalar amount, btScalar clampAmount)
  1845. {
  1846. if (!vertexList)
  1847. {
  1848. return 0;
  1849. }
  1850. int stamp = --mergeStamp;
  1851. btAlignedObjectArray<Vertex*> stack;
  1852. vertexList->copy = stamp;
  1853. stack.push_back(vertexList);
  1854. btAlignedObjectArray<Face*> faces;
  1855. Point32 ref = vertexList->point;
  1856. Int128 hullCenterX(0, 0);
  1857. Int128 hullCenterY(0, 0);
  1858. Int128 hullCenterZ(0, 0);
  1859. Int128 volume(0, 0);
  1860. while (stack.size() > 0)
  1861. {
  1862. Vertex* v = stack[stack.size() - 1];
  1863. stack.pop_back();
  1864. Edge* e = v->edges;
  1865. if (e)
  1866. {
  1867. do
  1868. {
  1869. if (e->target->copy != stamp)
  1870. {
  1871. e->target->copy = stamp;
  1872. stack.push_back(e->target);
  1873. }
  1874. if (e->copy != stamp)
  1875. {
  1876. Face* face = facePool.newObject();
  1877. face->init(e->target, e->reverse->prev->target, v);
  1878. faces.push_back(face);
  1879. Edge* f = e;
  1880. Vertex* a = NULL;
  1881. Vertex* b = NULL;
  1882. do
  1883. {
  1884. if (a && b)
  1885. {
  1886. int64_t vol = (v->point - ref).dot((a->point - ref).cross(b->point - ref));
  1887. btAssert(vol >= 0);
  1888. Point32 c = v->point + a->point + b->point + ref;
  1889. hullCenterX += vol * c.x;
  1890. hullCenterY += vol * c.y;
  1891. hullCenterZ += vol * c.z;
  1892. volume += vol;
  1893. }
  1894. btAssert(f->copy != stamp);
  1895. f->copy = stamp;
  1896. f->face = face;
  1897. a = b;
  1898. b = f->target;
  1899. f = f->reverse->prev;
  1900. } while (f != e);
  1901. }
  1902. e = e->next;
  1903. } while (e != v->edges);
  1904. }
  1905. }
  1906. if (volume.getSign() <= 0)
  1907. {
  1908. return 0;
  1909. }
  1910. btVector3 hullCenter;
  1911. hullCenter[medAxis] = hullCenterX.toScalar();
  1912. hullCenter[maxAxis] = hullCenterY.toScalar();
  1913. hullCenter[minAxis] = hullCenterZ.toScalar();
  1914. hullCenter /= 4 * volume.toScalar();
  1915. hullCenter *= scaling;
  1916. int faceCount = faces.size();
  1917. if (clampAmount > 0)
  1918. {
  1919. btScalar minDist = SIMD_INFINITY;
  1920. for (int i = 0; i < faceCount; i++)
  1921. {
  1922. btVector3 normal = getBtNormal(faces[i]);
  1923. btScalar dist = normal.dot(toBtVector(faces[i]->origin) - hullCenter);
  1924. if (dist < minDist)
  1925. {
  1926. minDist = dist;
  1927. }
  1928. }
  1929. if (minDist <= 0)
  1930. {
  1931. return 0;
  1932. }
  1933. amount = btMin(amount, minDist * clampAmount);
  1934. }
  1935. unsigned int seed = 243703;
  1936. for (int i = 0; i < faceCount; i++, seed = 1664525 * seed + 1013904223)
  1937. {
  1938. btSwap(faces[i], faces[seed % faceCount]);
  1939. }
  1940. for (int i = 0; i < faceCount; i++)
  1941. {
  1942. if (!shiftFace(faces[i], amount, stack))
  1943. {
  1944. return -amount;
  1945. }
  1946. }
  1947. return amount;
  1948. }
  1949. bool btConvexHullInternal::shiftFace(Face* face, btScalar amount, btAlignedObjectArray<Vertex*> stack)
  1950. {
  1951. btVector3 origShift = getBtNormal(face) * -amount;
  1952. if (scaling[0] != 0)
  1953. {
  1954. origShift[0] /= scaling[0];
  1955. }
  1956. if (scaling[1] != 0)
  1957. {
  1958. origShift[1] /= scaling[1];
  1959. }
  1960. if (scaling[2] != 0)
  1961. {
  1962. origShift[2] /= scaling[2];
  1963. }
  1964. Point32 shift((int32_t) origShift[medAxis], (int32_t) origShift[maxAxis], (int32_t) origShift[minAxis]);
  1965. if (shift.isZero())
  1966. {
  1967. return true;
  1968. }
  1969. Point64 normal = face->getNormal();
  1970. #ifdef DEBUG_CONVEX_HULL
  1971. printf("\nShrinking face (%d %d %d) (%d %d %d) (%d %d %d) by (%d %d %d)\n",
  1972. 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);
  1973. #endif
  1974. int64_t origDot = face->origin.dot(normal);
  1975. Point32 shiftedOrigin = face->origin + shift;
  1976. int64_t shiftedDot = shiftedOrigin.dot(normal);
  1977. btAssert(shiftedDot <= origDot);
  1978. if (shiftedDot >= origDot)
  1979. {
  1980. return false;
  1981. }
  1982. Edge* intersection = NULL;
  1983. Edge* startEdge = face->nearbyVertex->edges;
  1984. #ifdef DEBUG_CONVEX_HULL
  1985. printf("Start edge is ");
  1986. startEdge->print();
  1987. printf(", normal is (%lld %lld %lld), shifted dot is %lld\n", normal.x, normal.y, normal.z, shiftedDot);
  1988. #endif
  1989. Rational128 optDot = face->nearbyVertex->dot(normal);
  1990. int cmp = optDot.compare(shiftedDot);
  1991. #ifdef SHOW_ITERATIONS
  1992. int n = 0;
  1993. #endif
  1994. if (cmp >= 0)
  1995. {
  1996. Edge* e = startEdge;
  1997. do
  1998. {
  1999. #ifdef SHOW_ITERATIONS
  2000. n++;
  2001. #endif
  2002. Rational128 dot = e->target->dot(normal);
  2003. btAssert(dot.compare(origDot) <= 0);
  2004. #ifdef DEBUG_CONVEX_HULL
  2005. printf("Moving downwards, edge is ");
  2006. e->print();
  2007. printf(", dot is %f (%f %lld)\n", (float) dot.toScalar(), (float) optDot.toScalar(), shiftedDot);
  2008. #endif
  2009. if (dot.compare(optDot) < 0)
  2010. {
  2011. int c = dot.compare(shiftedDot);
  2012. optDot = dot;
  2013. e = e->reverse;
  2014. startEdge = e;
  2015. if (c < 0)
  2016. {
  2017. intersection = e;
  2018. break;
  2019. }
  2020. cmp = c;
  2021. }
  2022. e = e->prev;
  2023. } while (e != startEdge);
  2024. if (!intersection)
  2025. {
  2026. return false;
  2027. }
  2028. }
  2029. else
  2030. {
  2031. Edge* e = startEdge;
  2032. do
  2033. {
  2034. #ifdef SHOW_ITERATIONS
  2035. n++;
  2036. #endif
  2037. Rational128 dot = e->target->dot(normal);
  2038. btAssert(dot.compare(origDot) <= 0);
  2039. #ifdef DEBUG_CONVEX_HULL
  2040. printf("Moving upwards, edge is ");
  2041. e->print();
  2042. printf(", dot is %f (%f %lld)\n", (float) dot.toScalar(), (float) optDot.toScalar(), shiftedDot);
  2043. #endif
  2044. if (dot.compare(optDot) > 0)
  2045. {
  2046. cmp = dot.compare(shiftedDot);
  2047. if (cmp >= 0)
  2048. {
  2049. intersection = e;
  2050. break;
  2051. }
  2052. optDot = dot;
  2053. e = e->reverse;
  2054. startEdge = e;
  2055. }
  2056. e = e->prev;
  2057. } while (e != startEdge);
  2058. if (!intersection)
  2059. {
  2060. return true;
  2061. }
  2062. }
  2063. #ifdef SHOW_ITERATIONS
  2064. printf("Needed %d iterations to find initial intersection\n", n);
  2065. #endif
  2066. if (cmp == 0)
  2067. {
  2068. Edge* e = intersection->reverse->next;
  2069. #ifdef SHOW_ITERATIONS
  2070. n = 0;
  2071. #endif
  2072. while (e->target->dot(normal).compare(shiftedDot) <= 0)
  2073. {
  2074. #ifdef SHOW_ITERATIONS
  2075. n++;
  2076. #endif
  2077. e = e->next;
  2078. if (e == intersection->reverse)
  2079. {
  2080. return true;
  2081. }
  2082. #ifdef DEBUG_CONVEX_HULL
  2083. printf("Checking for outwards edge, current edge is ");
  2084. e->print();
  2085. printf("\n");
  2086. #endif
  2087. }
  2088. #ifdef SHOW_ITERATIONS
  2089. printf("Needed %d iterations to check for complete containment\n", n);
  2090. #endif
  2091. }
  2092. Edge* firstIntersection = NULL;
  2093. Edge* faceEdge = NULL;
  2094. Edge* firstFaceEdge = NULL;
  2095. #ifdef SHOW_ITERATIONS
  2096. int m = 0;
  2097. #endif
  2098. while (true)
  2099. {
  2100. #ifdef SHOW_ITERATIONS
  2101. m++;
  2102. #endif
  2103. #ifdef DEBUG_CONVEX_HULL
  2104. printf("Intersecting edge is ");
  2105. intersection->print();
  2106. printf("\n");
  2107. #endif
  2108. if (cmp == 0)
  2109. {
  2110. Edge* e = intersection->reverse->next;
  2111. startEdge = e;
  2112. #ifdef SHOW_ITERATIONS
  2113. n = 0;
  2114. #endif
  2115. while (true)
  2116. {
  2117. #ifdef SHOW_ITERATIONS
  2118. n++;
  2119. #endif
  2120. if (e->target->dot(normal).compare(shiftedDot) >= 0)
  2121. {
  2122. break;
  2123. }
  2124. intersection = e->reverse;
  2125. e = e->next;
  2126. if (e == startEdge)
  2127. {
  2128. return true;
  2129. }
  2130. }
  2131. #ifdef SHOW_ITERATIONS
  2132. printf("Needed %d iterations to advance intersection\n", n);
  2133. #endif
  2134. }
  2135. #ifdef DEBUG_CONVEX_HULL
  2136. printf("Advanced intersecting edge to ");
  2137. intersection->print();
  2138. printf(", cmp = %d\n", cmp);
  2139. #endif
  2140. if (!firstIntersection)
  2141. {
  2142. firstIntersection = intersection;
  2143. }
  2144. else if (intersection == firstIntersection)
  2145. {
  2146. break;
  2147. }
  2148. int prevCmp = cmp;
  2149. Edge* prevIntersection = intersection;
  2150. Edge* prevFaceEdge = faceEdge;
  2151. Edge* e = intersection->reverse;
  2152. #ifdef SHOW_ITERATIONS
  2153. n = 0;
  2154. #endif
  2155. while (true)
  2156. {
  2157. #ifdef SHOW_ITERATIONS
  2158. n++;
  2159. #endif
  2160. e = e->reverse->prev;
  2161. btAssert(e != intersection->reverse);
  2162. cmp = e->target->dot(normal).compare(shiftedDot);
  2163. #ifdef DEBUG_CONVEX_HULL
  2164. printf("Testing edge ");
  2165. e->print();
  2166. printf(" -> cmp = %d\n", cmp);
  2167. #endif
  2168. if (cmp >= 0)
  2169. {
  2170. intersection = e;
  2171. break;
  2172. }
  2173. }
  2174. #ifdef SHOW_ITERATIONS
  2175. printf("Needed %d iterations to find other intersection of face\n", n);
  2176. #endif
  2177. if (cmp > 0)
  2178. {
  2179. Vertex* removed = intersection->target;
  2180. e = intersection->reverse;
  2181. if (e->prev == e)
  2182. {
  2183. removed->edges = NULL;
  2184. }
  2185. else
  2186. {
  2187. removed->edges = e->prev;
  2188. e->prev->link(e->next);
  2189. e->link(e);
  2190. }
  2191. #ifdef DEBUG_CONVEX_HULL
  2192. printf("1: Removed part contains (%d %d %d)\n", removed->point.x, removed->point.y, removed->point.z);
  2193. #endif
  2194. Point64 n0 = intersection->face->getNormal();
  2195. Point64 n1 = intersection->reverse->face->getNormal();
  2196. int64_t m00 = face->dir0.dot(n0);
  2197. int64_t m01 = face->dir1.dot(n0);
  2198. int64_t m10 = face->dir0.dot(n1);
  2199. int64_t m11 = face->dir1.dot(n1);
  2200. int64_t r0 = (intersection->face->origin - shiftedOrigin).dot(n0);
  2201. int64_t r1 = (intersection->reverse->face->origin - shiftedOrigin).dot(n1);
  2202. Int128 det = Int128::mul(m00, m11) - Int128::mul(m01, m10);
  2203. btAssert(det.getSign() != 0);
  2204. Vertex* v = vertexPool.newObject();
  2205. v->point.index = -1;
  2206. v->copy = -1;
  2207. v->point128 = PointR128(Int128::mul(face->dir0.x * r0, m11) - Int128::mul(face->dir0.x * r1, m01)
  2208. + Int128::mul(face->dir1.x * r1, m00) - Int128::mul(face->dir1.x * r0, m10) + det * shiftedOrigin.x,
  2209. Int128::mul(face->dir0.y * r0, m11) - Int128::mul(face->dir0.y * r1, m01)
  2210. + Int128::mul(face->dir1.y * r1, m00) - Int128::mul(face->dir1.y * r0, m10) + det * shiftedOrigin.y,
  2211. Int128::mul(face->dir0.z * r0, m11) - Int128::mul(face->dir0.z * r1, m01)
  2212. + Int128::mul(face->dir1.z * r1, m00) - Int128::mul(face->dir1.z * r0, m10) + det * shiftedOrigin.z,
  2213. det);
  2214. v->point.x = (int32_t) v->point128.xvalue();
  2215. v->point.y = (int32_t) v->point128.yvalue();
  2216. v->point.z = (int32_t) v->point128.zvalue();
  2217. intersection->target = v;
  2218. v->edges = e;
  2219. stack.push_back(v);
  2220. stack.push_back(removed);
  2221. stack.push_back(NULL);
  2222. }
  2223. if (cmp || prevCmp || (prevIntersection->reverse->next->target != intersection->target))
  2224. {
  2225. faceEdge = newEdgePair(prevIntersection->target, intersection->target);
  2226. if (prevCmp == 0)
  2227. {
  2228. faceEdge->link(prevIntersection->reverse->next);
  2229. }
  2230. if ((prevCmp == 0) || prevFaceEdge)
  2231. {
  2232. prevIntersection->reverse->link(faceEdge);
  2233. }
  2234. if (cmp == 0)
  2235. {
  2236. intersection->reverse->prev->link(faceEdge->reverse);
  2237. }
  2238. faceEdge->reverse->link(intersection->reverse);
  2239. }
  2240. else
  2241. {
  2242. faceEdge = prevIntersection->reverse->next;
  2243. }
  2244. if (prevFaceEdge)
  2245. {
  2246. if (prevCmp > 0)
  2247. {
  2248. faceEdge->link(prevFaceEdge->reverse);
  2249. }
  2250. else if (faceEdge != prevFaceEdge->reverse)
  2251. {
  2252. stack.push_back(prevFaceEdge->target);
  2253. while (faceEdge->next != prevFaceEdge->reverse)
  2254. {
  2255. Vertex* removed = faceEdge->next->target;
  2256. removeEdgePair(faceEdge->next);
  2257. stack.push_back(removed);
  2258. #ifdef DEBUG_CONVEX_HULL
  2259. printf("2: Removed part contains (%d %d %d)\n", removed->point.x, removed->point.y, removed->point.z);
  2260. #endif
  2261. }
  2262. stack.push_back(NULL);
  2263. }
  2264. }
  2265. faceEdge->face = face;
  2266. faceEdge->reverse->face = intersection->face;
  2267. if (!firstFaceEdge)
  2268. {
  2269. firstFaceEdge = faceEdge;
  2270. }
  2271. }
  2272. #ifdef SHOW_ITERATIONS
  2273. printf("Needed %d iterations to process all intersections\n", m);
  2274. #endif
  2275. if (cmp > 0)
  2276. {
  2277. firstFaceEdge->reverse->target = faceEdge->target;
  2278. firstIntersection->reverse->link(firstFaceEdge);
  2279. firstFaceEdge->link(faceEdge->reverse);
  2280. }
  2281. else if (firstFaceEdge != faceEdge->reverse)
  2282. {
  2283. stack.push_back(faceEdge->target);
  2284. while (firstFaceEdge->next != faceEdge->reverse)
  2285. {
  2286. Vertex* removed = firstFaceEdge->next->target;
  2287. removeEdgePair(firstFaceEdge->next);
  2288. stack.push_back(removed);
  2289. #ifdef DEBUG_CONVEX_HULL
  2290. printf("3: Removed part contains (%d %d %d)\n", removed->point.x, removed->point.y, removed->point.z);
  2291. #endif
  2292. }
  2293. stack.push_back(NULL);
  2294. }
  2295. btAssert(stack.size() > 0);
  2296. vertexList = stack[0];
  2297. #ifdef DEBUG_CONVEX_HULL
  2298. printf("Removing part\n");
  2299. #endif
  2300. #ifdef SHOW_ITERATIONS
  2301. n = 0;
  2302. #endif
  2303. int pos = 0;
  2304. while (pos < stack.size())
  2305. {
  2306. int end = stack.size();
  2307. while (pos < end)
  2308. {
  2309. Vertex* kept = stack[pos++];
  2310. #ifdef DEBUG_CONVEX_HULL
  2311. kept->print();
  2312. #endif
  2313. bool deeper = false;
  2314. Vertex* removed;
  2315. while ((removed = stack[pos++]) != NULL)
  2316. {
  2317. #ifdef SHOW_ITERATIONS
  2318. n++;
  2319. #endif
  2320. kept->receiveNearbyFaces(removed);
  2321. while (removed->edges)
  2322. {
  2323. if (!deeper)
  2324. {
  2325. deeper = true;
  2326. stack.push_back(kept);
  2327. }
  2328. stack.push_back(removed->edges->target);
  2329. removeEdgePair(removed->edges);
  2330. }
  2331. }
  2332. if (deeper)
  2333. {
  2334. stack.push_back(NULL);
  2335. }
  2336. }
  2337. }
  2338. #ifdef SHOW_ITERATIONS
  2339. printf("Needed %d iterations to remove part\n", n);
  2340. #endif
  2341. stack.resize(0);
  2342. face->origin = shiftedOrigin;
  2343. return true;
  2344. }
  2345. static int getVertexCopy(btConvexHullInternal::Vertex* vertex, btAlignedObjectArray<btConvexHullInternal::Vertex*>& vertices)
  2346. {
  2347. int index = vertex->copy;
  2348. if (index < 0)
  2349. {
  2350. index = vertices.size();
  2351. vertex->copy = index;
  2352. vertices.push_back(vertex);
  2353. #ifdef DEBUG_CONVEX_HULL
  2354. printf("Vertex %d gets index *%d\n", vertex->point.index, index);
  2355. #endif
  2356. }
  2357. return index;
  2358. }
  2359. btScalar btConvexHullComputer::compute(const void* coords, bool doubleCoords, int stride, int count, btScalar shrink, btScalar shrinkClamp)
  2360. {
  2361. if (count <= 0)
  2362. {
  2363. vertices.clear();
  2364. edges.clear();
  2365. faces.clear();
  2366. return 0;
  2367. }
  2368. btConvexHullInternal hull;
  2369. hull.compute(coords, doubleCoords, stride, count);
  2370. btScalar shift = 0;
  2371. if ((shrink > 0) && ((shift = hull.shrink(shrink, shrinkClamp)) < 0))
  2372. {
  2373. vertices.clear();
  2374. edges.clear();
  2375. faces.clear();
  2376. return shift;
  2377. }
  2378. vertices.resize(0);
  2379. edges.resize(0);
  2380. faces.resize(0);
  2381. btAlignedObjectArray<btConvexHullInternal::Vertex*> oldVertices;
  2382. getVertexCopy(hull.vertexList, oldVertices);
  2383. int copied = 0;
  2384. while (copied < oldVertices.size())
  2385. {
  2386. btConvexHullInternal::Vertex* v = oldVertices[copied];
  2387. vertices.push_back(hull.getCoordinates(v));
  2388. btConvexHullInternal::Edge* firstEdge = v->edges;
  2389. if (firstEdge)
  2390. {
  2391. int firstCopy = -1;
  2392. int prevCopy = -1;
  2393. btConvexHullInternal::Edge* e = firstEdge;
  2394. do
  2395. {
  2396. if (e->copy < 0)
  2397. {
  2398. int s = edges.size();
  2399. edges.push_back(Edge());
  2400. edges.push_back(Edge());
  2401. Edge* c = &edges[s];
  2402. Edge* r = &edges[s + 1];
  2403. e->copy = s;
  2404. e->reverse->copy = s + 1;
  2405. c->reverse = 1;
  2406. r->reverse = -1;
  2407. c->targetVertex = getVertexCopy(e->target, oldVertices);
  2408. r->targetVertex = copied;
  2409. #ifdef DEBUG_CONVEX_HULL
  2410. printf(" CREATE: Vertex *%d has edge to *%d\n", copied, c->getTargetVertex());
  2411. #endif
  2412. }
  2413. if (prevCopy >= 0)
  2414. {
  2415. edges[e->copy].next = prevCopy - e->copy;
  2416. }
  2417. else
  2418. {
  2419. firstCopy = e->copy;
  2420. }
  2421. prevCopy = e->copy;
  2422. e = e->next;
  2423. } while (e != firstEdge);
  2424. edges[firstCopy].next = prevCopy - firstCopy;
  2425. }
  2426. copied++;
  2427. }
  2428. for (int i = 0; i < copied; i++)
  2429. {
  2430. btConvexHullInternal::Vertex* v = oldVertices[i];
  2431. btConvexHullInternal::Edge* firstEdge = v->edges;
  2432. if (firstEdge)
  2433. {
  2434. btConvexHullInternal::Edge* e = firstEdge;
  2435. do
  2436. {
  2437. if (e->copy >= 0)
  2438. {
  2439. #ifdef DEBUG_CONVEX_HULL
  2440. printf("Vertex *%d has edge to *%d\n", i, edges[e->copy].getTargetVertex());
  2441. #endif
  2442. faces.push_back(e->copy);
  2443. btConvexHullInternal::Edge* f = e;
  2444. do
  2445. {
  2446. #ifdef DEBUG_CONVEX_HULL
  2447. printf(" Face *%d\n", edges[f->copy].getTargetVertex());
  2448. #endif
  2449. f->copy = -1;
  2450. f = f->reverse->prev;
  2451. } while (f != e);
  2452. }
  2453. e = e->next;
  2454. } while (e != firstEdge);
  2455. }
  2456. }
  2457. return shift;
  2458. }