polypartition-godot-types.patch 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819
  1. diff --git a/thirdparty/misc/polypartition.cpp b/thirdparty/misc/polypartition.cpp
  2. index 3a8a6efa8319..4f1b6dcb21d8 100644
  3. --- a/thirdparty/misc/polypartition.cpp
  4. +++ b/thirdparty/misc/polypartition.cpp
  5. @@ -23,10 +23,7 @@
  6. #include "polypartition.h"
  7. -#include <math.h>
  8. -#include <string.h>
  9. #include <algorithm>
  10. -#include <vector>
  11. TPPLPoly::TPPLPoly() {
  12. hole = false;
  13. @@ -186,7 +183,7 @@ int TPPLPartition::Intersects(TPPLPoint &p11, TPPLPoint &p12, TPPLPoint &p21, TP
  14. // Removes holes from inpolys by merging them with non-holes.
  15. int TPPLPartition::RemoveHoles(TPPLPolyList *inpolys, TPPLPolyList *outpolys) {
  16. TPPLPolyList polys;
  17. - TPPLPolyList::iterator holeiter, polyiter, iter, iter2;
  18. + TPPLPolyList::Element *holeiter, *polyiter, *iter, *iter2;
  19. long i, i2, holepointindex, polypointindex;
  20. TPPLPoint holepoint, polypoint, bestpolypoint;
  21. TPPLPoint linep1, linep2;
  22. @@ -198,15 +195,15 @@ int TPPLPartition::RemoveHoles(TPPLPolyList *inpolys, TPPLPolyList *outpolys) {
  23. // Check for the trivial case of no holes.
  24. hasholes = false;
  25. - for (iter = inpolys->begin(); iter != inpolys->end(); iter++) {
  26. - if (iter->IsHole()) {
  27. + for (iter = inpolys->front(); iter; iter = iter->next()) {
  28. + if (iter->get().IsHole()) {
  29. hasholes = true;
  30. break;
  31. }
  32. }
  33. if (!hasholes) {
  34. - for (iter = inpolys->begin(); iter != inpolys->end(); iter++) {
  35. - outpolys->push_back(*iter);
  36. + for (iter = inpolys->front(); iter; iter = iter->next()) {
  37. + outpolys->push_back(iter->get());
  38. }
  39. return 1;
  40. }
  41. @@ -216,8 +213,8 @@ int TPPLPartition::RemoveHoles(TPPLPolyList *inpolys, TPPLPolyList *outpolys) {
  42. while (1) {
  43. // Find the hole point with the largest x.
  44. hasholes = false;
  45. - for (iter = polys.begin(); iter != polys.end(); iter++) {
  46. - if (!iter->IsHole()) {
  47. + for (iter = polys.front(); iter; iter = iter->next()) {
  48. + if (!iter->get().IsHole()) {
  49. continue;
  50. }
  51. @@ -227,8 +224,8 @@ int TPPLPartition::RemoveHoles(TPPLPolyList *inpolys, TPPLPolyList *outpolys) {
  52. holepointindex = 0;
  53. }
  54. - for (i = 0; i < iter->GetNumPoints(); i++) {
  55. - if (iter->GetPoint(i).x > holeiter->GetPoint(holepointindex).x) {
  56. + for (i = 0; i < iter->get().GetNumPoints(); i++) {
  57. + if (iter->get().GetPoint(i).x > holeiter->get().GetPoint(holepointindex).x) {
  58. holeiter = iter;
  59. holepointindex = i;
  60. }
  61. @@ -237,24 +234,24 @@ int TPPLPartition::RemoveHoles(TPPLPolyList *inpolys, TPPLPolyList *outpolys) {
  62. if (!hasholes) {
  63. break;
  64. }
  65. - holepoint = holeiter->GetPoint(holepointindex);
  66. + holepoint = holeiter->get().GetPoint(holepointindex);
  67. pointfound = false;
  68. - for (iter = polys.begin(); iter != polys.end(); iter++) {
  69. - if (iter->IsHole()) {
  70. + for (iter = polys.front(); iter; iter = iter->next()) {
  71. + if (iter->get().IsHole()) {
  72. continue;
  73. }
  74. - for (i = 0; i < iter->GetNumPoints(); i++) {
  75. - if (iter->GetPoint(i).x <= holepoint.x) {
  76. + for (i = 0; i < iter->get().GetNumPoints(); i++) {
  77. + if (iter->get().GetPoint(i).x <= holepoint.x) {
  78. continue;
  79. }
  80. - if (!InCone(iter->GetPoint((i + iter->GetNumPoints() - 1) % (iter->GetNumPoints())),
  81. - iter->GetPoint(i),
  82. - iter->GetPoint((i + 1) % (iter->GetNumPoints())),
  83. + if (!InCone(iter->get().GetPoint((i + iter->get().GetNumPoints() - 1) % (iter->get().GetNumPoints())),
  84. + iter->get().GetPoint(i),
  85. + iter->get().GetPoint((i + 1) % (iter->get().GetNumPoints())),
  86. holepoint)) {
  87. continue;
  88. }
  89. - polypoint = iter->GetPoint(i);
  90. + polypoint = iter->get().GetPoint(i);
  91. if (pointfound) {
  92. v1 = Normalize(polypoint - holepoint);
  93. v2 = Normalize(bestpolypoint - holepoint);
  94. @@ -263,13 +260,13 @@ int TPPLPartition::RemoveHoles(TPPLPolyList *inpolys, TPPLPolyList *outpolys) {
  95. }
  96. }
  97. pointvisible = true;
  98. - for (iter2 = polys.begin(); iter2 != polys.end(); iter2++) {
  99. - if (iter2->IsHole()) {
  100. + for (iter2 = polys.front(); iter2; iter2->next()) {
  101. + if (iter2->get().IsHole()) {
  102. continue;
  103. }
  104. - for (i2 = 0; i2 < iter2->GetNumPoints(); i2++) {
  105. - linep1 = iter2->GetPoint(i2);
  106. - linep2 = iter2->GetPoint((i2 + 1) % (iter2->GetNumPoints()));
  107. + for (i2 = 0; i2 < iter2->get().GetNumPoints(); i2++) {
  108. + linep1 = iter2->get().GetPoint(i2);
  109. + linep2 = iter2->get().GetPoint((i2 + 1) % (iter2->get().GetNumPoints()));
  110. if (Intersects(holepoint, polypoint, linep1, linep2)) {
  111. pointvisible = false;
  112. break;
  113. @@ -292,18 +289,18 @@ int TPPLPartition::RemoveHoles(TPPLPolyList *inpolys, TPPLPolyList *outpolys) {
  114. return 0;
  115. }
  116. - newpoly.Init(holeiter->GetNumPoints() + polyiter->GetNumPoints() + 2);
  117. + newpoly.Init(holeiter->get().GetNumPoints() + polyiter->get().GetNumPoints() + 2);
  118. i2 = 0;
  119. for (i = 0; i <= polypointindex; i++) {
  120. - newpoly[i2] = polyiter->GetPoint(i);
  121. + newpoly[i2] = polyiter->get().GetPoint(i);
  122. i2++;
  123. }
  124. - for (i = 0; i <= holeiter->GetNumPoints(); i++) {
  125. - newpoly[i2] = holeiter->GetPoint((i + holepointindex) % holeiter->GetNumPoints());
  126. + for (i = 0; i <= holeiter->get().GetNumPoints(); i++) {
  127. + newpoly[i2] = holeiter->get().GetPoint((i + holepointindex) % holeiter->get().GetNumPoints());
  128. i2++;
  129. }
  130. - for (i = polypointindex; i < polyiter->GetNumPoints(); i++) {
  131. - newpoly[i2] = polyiter->GetPoint(i);
  132. + for (i = polypointindex; i < polyiter->get().GetNumPoints(); i++) {
  133. + newpoly[i2] = polyiter->get().GetPoint(i);
  134. i2++;
  135. }
  136. @@ -312,8 +309,8 @@ int TPPLPartition::RemoveHoles(TPPLPolyList *inpolys, TPPLPolyList *outpolys) {
  137. polys.push_back(newpoly);
  138. }
  139. - for (iter = polys.begin(); iter != polys.end(); iter++) {
  140. - outpolys->push_back(*iter);
  141. + for (iter = polys.front(); iter; iter = iter->next()) {
  142. + outpolys->push_back(iter->get());
  143. }
  144. return 1;
  145. @@ -524,13 +521,13 @@ int TPPLPartition::Triangulate_EC(TPPLPoly *poly, TPPLPolyList *triangles) {
  146. int TPPLPartition::Triangulate_EC(TPPLPolyList *inpolys, TPPLPolyList *triangles) {
  147. TPPLPolyList outpolys;
  148. - TPPLPolyList::iterator iter;
  149. + TPPLPolyList::Element *iter;
  150. if (!RemoveHoles(inpolys, &outpolys)) {
  151. return 0;
  152. }
  153. - for (iter = outpolys.begin(); iter != outpolys.end(); iter++) {
  154. - if (!Triangulate_EC(&(*iter), triangles)) {
  155. + for (iter = outpolys.front(); iter; iter = iter->next()) {
  156. + if (!Triangulate_EC(&(iter->get()), triangles)) {
  157. return 0;
  158. }
  159. }
  160. @@ -543,7 +540,7 @@ int TPPLPartition::ConvexPartition_HM(TPPLPoly *poly, TPPLPolyList *parts) {
  161. }
  162. TPPLPolyList triangles;
  163. - TPPLPolyList::iterator iter1, iter2;
  164. + TPPLPolyList::Element *iter1, *iter2;
  165. TPPLPoly *poly1 = NULL, *poly2 = NULL;
  166. TPPLPoly newpoly;
  167. TPPLPoint d1, d2, p1, p2, p3;
  168. @@ -578,19 +575,19 @@ int TPPLPartition::ConvexPartition_HM(TPPLPoly *poly, TPPLPolyList *parts) {
  169. return 0;
  170. }
  171. - for (iter1 = triangles.begin(); iter1 != triangles.end(); iter1++) {
  172. - poly1 = &(*iter1);
  173. + for (iter1 = triangles.front(); iter1; iter1 = iter1->next()) {
  174. + poly1 = &(iter1->get());
  175. for (i11 = 0; i11 < poly1->GetNumPoints(); i11++) {
  176. d1 = poly1->GetPoint(i11);
  177. i12 = (i11 + 1) % (poly1->GetNumPoints());
  178. d2 = poly1->GetPoint(i12);
  179. isdiagonal = false;
  180. - for (iter2 = iter1; iter2 != triangles.end(); iter2++) {
  181. + for (iter2 = iter1; iter2; iter2 = iter2->next()) {
  182. if (iter1 == iter2) {
  183. continue;
  184. }
  185. - poly2 = &(*iter2);
  186. + poly2 = &(iter2->get());
  187. for (i21 = 0; i21 < poly2->GetNumPoints(); i21++) {
  188. if ((d2.x != poly2->GetPoint(i21).x) || (d2.y != poly2->GetPoint(i21).y)) {
  189. @@ -660,16 +657,16 @@ int TPPLPartition::ConvexPartition_HM(TPPLPoly *poly, TPPLPolyList *parts) {
  190. }
  191. triangles.erase(iter2);
  192. - *iter1 = newpoly;
  193. - poly1 = &(*iter1);
  194. + iter1->get() = newpoly;
  195. + poly1 = &(iter1->get());
  196. i11 = -1;
  197. continue;
  198. }
  199. }
  200. - for (iter1 = triangles.begin(); iter1 != triangles.end(); iter1++) {
  201. - parts->push_back(*iter1);
  202. + for (iter1 = triangles.front(); iter1; iter1 = iter1->next()) {
  203. + parts->push_back(iter1->get());
  204. }
  205. return 1;
  206. @@ -677,13 +674,13 @@ int TPPLPartition::ConvexPartition_HM(TPPLPoly *poly, TPPLPolyList *parts) {
  207. int TPPLPartition::ConvexPartition_HM(TPPLPolyList *inpolys, TPPLPolyList *parts) {
  208. TPPLPolyList outpolys;
  209. - TPPLPolyList::iterator iter;
  210. + TPPLPolyList::Element *iter;
  211. if (!RemoveHoles(inpolys, &outpolys)) {
  212. return 0;
  213. }
  214. - for (iter = outpolys.begin(); iter != outpolys.end(); iter++) {
  215. - if (!ConvexPartition_HM(&(*iter), parts)) {
  216. + for (iter = outpolys.front(); iter; iter = iter->next()) {
  217. + if (!ConvexPartition_HM(&(iter->get()), parts)) {
  218. return 0;
  219. }
  220. }
  221. @@ -824,8 +821,8 @@ int TPPLPartition::Triangulate_OPT(TPPLPoly *poly, TPPLPolyList *triangles) {
  222. newdiagonal.index1 = 0;
  223. newdiagonal.index2 = n - 1;
  224. diagonals.push_back(newdiagonal);
  225. - while (!diagonals.empty()) {
  226. - diagonal = *(diagonals.begin());
  227. + while (!diagonals.is_empty()) {
  228. + diagonal = diagonals.front()->get();
  229. diagonals.pop_front();
  230. bestvertex = dpstates[diagonal.index2][diagonal.index1].bestvertex;
  231. if (bestvertex == -1) {
  232. @@ -873,10 +870,10 @@ void TPPLPartition::UpdateState(long a, long b, long w, long i, long j, DPState2
  233. pairs->push_front(newdiagonal);
  234. dpstates[a][b].weight = w;
  235. } else {
  236. - if ((!pairs->empty()) && (i <= pairs->begin()->index1)) {
  237. + if ((!pairs->is_empty()) && (i <= pairs->front()->get().index1)) {
  238. return;
  239. }
  240. - while ((!pairs->empty()) && (pairs->begin()->index2 >= j)) {
  241. + while ((!pairs->is_empty()) && (pairs->front()->get().index2 >= j)) {
  242. pairs->pop_front();
  243. }
  244. pairs->push_front(newdiagonal);
  245. @@ -885,7 +882,7 @@ void TPPLPartition::UpdateState(long a, long b, long w, long i, long j, DPState2
  246. void TPPLPartition::TypeA(long i, long j, long k, PartitionVertex *vertices, DPState2 **dpstates) {
  247. DiagonalList *pairs = NULL;
  248. - DiagonalList::iterator iter, lastiter;
  249. + DiagonalList::Element *iter, *lastiter;
  250. long top;
  251. long w;
  252. @@ -902,23 +899,23 @@ void TPPLPartition::TypeA(long i, long j, long k, PartitionVertex *vertices, DPS
  253. }
  254. if (j - i > 1) {
  255. pairs = &(dpstates[i][j].pairs);
  256. - iter = pairs->end();
  257. - lastiter = pairs->end();
  258. - while (iter != pairs->begin()) {
  259. + iter = pairs->back();
  260. + lastiter = pairs->back();
  261. + while (iter != pairs->front()) {
  262. iter--;
  263. - if (!IsReflex(vertices[iter->index2].p, vertices[j].p, vertices[k].p)) {
  264. + if (!IsReflex(vertices[iter->get().index2].p, vertices[j].p, vertices[k].p)) {
  265. lastiter = iter;
  266. } else {
  267. break;
  268. }
  269. }
  270. - if (lastiter == pairs->end()) {
  271. + if (lastiter == pairs->back()) {
  272. w++;
  273. } else {
  274. - if (IsReflex(vertices[k].p, vertices[i].p, vertices[lastiter->index1].p)) {
  275. + if (IsReflex(vertices[k].p, vertices[i].p, vertices[lastiter->get().index1].p)) {
  276. w++;
  277. } else {
  278. - top = lastiter->index1;
  279. + top = lastiter->get().index1;
  280. }
  281. }
  282. }
  283. @@ -927,7 +924,7 @@ void TPPLPartition::TypeA(long i, long j, long k, PartitionVertex *vertices, DPS
  284. void TPPLPartition::TypeB(long i, long j, long k, PartitionVertex *vertices, DPState2 **dpstates) {
  285. DiagonalList *pairs = NULL;
  286. - DiagonalList::iterator iter, lastiter;
  287. + DiagonalList::Element *iter, *lastiter;
  288. long top;
  289. long w;
  290. @@ -946,21 +943,21 @@ void TPPLPartition::TypeB(long i, long j, long k, PartitionVertex *vertices, DPS
  291. if (k - j > 1) {
  292. pairs = &(dpstates[j][k].pairs);
  293. - iter = pairs->begin();
  294. - if ((!pairs->empty()) && (!IsReflex(vertices[i].p, vertices[j].p, vertices[iter->index1].p))) {
  295. + iter = pairs->front();
  296. + if ((!pairs->is_empty()) && (!IsReflex(vertices[i].p, vertices[j].p, vertices[iter->get().index1].p))) {
  297. lastiter = iter;
  298. - while (iter != pairs->end()) {
  299. - if (!IsReflex(vertices[i].p, vertices[j].p, vertices[iter->index1].p)) {
  300. + while (iter) {
  301. + if (!IsReflex(vertices[i].p, vertices[j].p, vertices[iter->get().index1].p)) {
  302. lastiter = iter;
  303. - iter++;
  304. + iter = iter->next();
  305. } else {
  306. break;
  307. }
  308. }
  309. - if (IsReflex(vertices[lastiter->index2].p, vertices[k].p, vertices[i].p)) {
  310. + if (IsReflex(vertices[lastiter->get().index2].p, vertices[k].p, vertices[i].p)) {
  311. w++;
  312. } else {
  313. - top = lastiter->index2;
  314. + top = lastiter->get().index2;
  315. }
  316. } else {
  317. w++;
  318. @@ -981,11 +978,11 @@ int TPPLPartition::ConvexPartition_OPT(TPPLPoly *poly, TPPLPolyList *parts) {
  319. DiagonalList diagonals, diagonals2;
  320. Diagonal diagonal, newdiagonal;
  321. DiagonalList *pairs = NULL, *pairs2 = NULL;
  322. - DiagonalList::iterator iter, iter2;
  323. + DiagonalList::Element *iter, *iter2;
  324. int ret;
  325. TPPLPoly newpoly;
  326. - std::vector<long> indices;
  327. - std::vector<long>::iterator iiter;
  328. + List<long> indices;
  329. + List<long>::Element *iiter;
  330. bool ijreal, jkreal;
  331. n = poly->GetNumPoints();
  332. @@ -1110,35 +1107,35 @@ int TPPLPartition::ConvexPartition_OPT(TPPLPoly *poly, TPPLPolyList *parts) {
  333. newdiagonal.index1 = 0;
  334. newdiagonal.index2 = n - 1;
  335. diagonals.push_front(newdiagonal);
  336. - while (!diagonals.empty()) {
  337. - diagonal = *(diagonals.begin());
  338. + while (!diagonals.is_empty()) {
  339. + diagonal = diagonals.front()->get();
  340. diagonals.pop_front();
  341. if ((diagonal.index2 - diagonal.index1) <= 1) {
  342. continue;
  343. }
  344. pairs = &(dpstates[diagonal.index1][diagonal.index2].pairs);
  345. - if (pairs->empty()) {
  346. + if (pairs->is_empty()) {
  347. ret = 0;
  348. break;
  349. }
  350. if (!vertices[diagonal.index1].isConvex) {
  351. - iter = pairs->end();
  352. + iter = pairs->back();
  353. iter--;
  354. - j = iter->index2;
  355. + j = iter->get().index2;
  356. newdiagonal.index1 = j;
  357. newdiagonal.index2 = diagonal.index2;
  358. diagonals.push_front(newdiagonal);
  359. if ((j - diagonal.index1) > 1) {
  360. - if (iter->index1 != iter->index2) {
  361. + if (iter->get().index1 != iter->get().index2) {
  362. pairs2 = &(dpstates[diagonal.index1][j].pairs);
  363. while (1) {
  364. - if (pairs2->empty()) {
  365. + if (pairs2->is_empty()) {
  366. ret = 0;
  367. break;
  368. }
  369. - iter2 = pairs2->end();
  370. + iter2 = pairs2->back();
  371. iter2--;
  372. - if (iter->index1 != iter2->index1) {
  373. + if (iter->get().index1 != iter2->get().index1) {
  374. pairs2->pop_back();
  375. } else {
  376. break;
  377. @@ -1153,21 +1150,21 @@ int TPPLPartition::ConvexPartition_OPT(TPPLPoly *poly, TPPLPolyList *parts) {
  378. diagonals.push_front(newdiagonal);
  379. }
  380. } else {
  381. - iter = pairs->begin();
  382. - j = iter->index1;
  383. + iter = pairs->front();
  384. + j = iter->get().index1;
  385. newdiagonal.index1 = diagonal.index1;
  386. newdiagonal.index2 = j;
  387. diagonals.push_front(newdiagonal);
  388. if ((diagonal.index2 - j) > 1) {
  389. - if (iter->index1 != iter->index2) {
  390. + if (iter->get().index1 != iter->get().index2) {
  391. pairs2 = &(dpstates[j][diagonal.index2].pairs);
  392. while (1) {
  393. - if (pairs2->empty()) {
  394. + if (pairs2->is_empty()) {
  395. ret = 0;
  396. break;
  397. }
  398. - iter2 = pairs2->begin();
  399. - if (iter->index2 != iter2->index2) {
  400. + iter2 = pairs2->front();
  401. + if (iter->get().index2 != iter2->get().index2) {
  402. pairs2->pop_front();
  403. } else {
  404. break;
  405. @@ -1197,8 +1194,8 @@ int TPPLPartition::ConvexPartition_OPT(TPPLPoly *poly, TPPLPolyList *parts) {
  406. newdiagonal.index1 = 0;
  407. newdiagonal.index2 = n - 1;
  408. diagonals.push_front(newdiagonal);
  409. - while (!diagonals.empty()) {
  410. - diagonal = *(diagonals.begin());
  411. + while (!diagonals.is_empty()) {
  412. + diagonal = diagonals.front()->get();
  413. diagonals.pop_front();
  414. if ((diagonal.index2 - diagonal.index1) <= 1) {
  415. continue;
  416. @@ -1210,8 +1207,8 @@ int TPPLPartition::ConvexPartition_OPT(TPPLPoly *poly, TPPLPolyList *parts) {
  417. indices.push_back(diagonal.index2);
  418. diagonals2.push_front(diagonal);
  419. - while (!diagonals2.empty()) {
  420. - diagonal = *(diagonals2.begin());
  421. + while (!diagonals2.is_empty()) {
  422. + diagonal = diagonals2.front()->get();
  423. diagonals2.pop_front();
  424. if ((diagonal.index2 - diagonal.index1) <= 1) {
  425. continue;
  426. @@ -1220,16 +1217,16 @@ int TPPLPartition::ConvexPartition_OPT(TPPLPoly *poly, TPPLPolyList *parts) {
  427. jkreal = true;
  428. pairs = &(dpstates[diagonal.index1][diagonal.index2].pairs);
  429. if (!vertices[diagonal.index1].isConvex) {
  430. - iter = pairs->end();
  431. + iter = pairs->back();
  432. iter--;
  433. - j = iter->index2;
  434. - if (iter->index1 != iter->index2) {
  435. + j = iter->get().index2;
  436. + if (iter->get().index1 != iter->get().index2) {
  437. ijreal = false;
  438. }
  439. } else {
  440. - iter = pairs->begin();
  441. - j = iter->index1;
  442. - if (iter->index1 != iter->index2) {
  443. + iter = pairs->front();
  444. + j = iter->get().index1;
  445. + if (iter->get().index1 != iter->get().index2) {
  446. jkreal = false;
  447. }
  448. }
  449. @@ -1253,11 +1250,12 @@ int TPPLPartition::ConvexPartition_OPT(TPPLPoly *poly, TPPLPolyList *parts) {
  450. indices.push_back(j);
  451. }
  452. - std::sort(indices.begin(), indices.end());
  453. + //std::sort(indices.begin(), indices.end());
  454. + indices.sort();
  455. newpoly.Init((long)indices.size());
  456. k = 0;
  457. - for (iiter = indices.begin(); iiter != indices.end(); iiter++) {
  458. - newpoly[k] = vertices[*iiter].p;
  459. + for (iiter = indices.front(); iiter != indices.back(); iiter = iiter->next()) {
  460. + newpoly[k] = vertices[iiter->get()].p;
  461. k++;
  462. }
  463. parts->push_back(newpoly);
  464. @@ -1281,7 +1279,7 @@ int TPPLPartition::ConvexPartition_OPT(TPPLPoly *poly, TPPLPolyList *parts) {
  465. // "Computational Geometry: Algorithms and Applications"
  466. // by Mark de Berg, Otfried Cheong, Marc van Kreveld, and Mark Overmars.
  467. int TPPLPartition::MonotonePartition(TPPLPolyList *inpolys, TPPLPolyList *monotonePolys) {
  468. - TPPLPolyList::iterator iter;
  469. + TPPLPolyList::Element *iter;
  470. MonotoneVertex *vertices = NULL;
  471. long i, numvertices, vindex, vindex2, newnumvertices, maxnumvertices;
  472. long polystartindex, polyendindex;
  473. @@ -1291,11 +1289,8 @@ int TPPLPartition::MonotonePartition(TPPLPolyList *inpolys, TPPLPolyList *monoto
  474. bool error = false;
  475. numvertices = 0;
  476. - for (iter = inpolys->begin(); iter != inpolys->end(); iter++) {
  477. - if (!iter->Valid()) {
  478. - return 0;
  479. - }
  480. - numvertices += iter->GetNumPoints();
  481. + for (iter = inpolys->front(); iter; iter++) {
  482. + numvertices += iter->get().GetNumPoints();
  483. }
  484. maxnumvertices = numvertices * 3;
  485. @@ -1303,8 +1298,8 @@ int TPPLPartition::MonotonePartition(TPPLPolyList *inpolys, TPPLPolyList *monoto
  486. newnumvertices = numvertices;
  487. polystartindex = 0;
  488. - for (iter = inpolys->begin(); iter != inpolys->end(); iter++) {
  489. - poly = &(*iter);
  490. + for (iter = inpolys->front(); iter; iter++) {
  491. + poly = &(iter->get());
  492. polyendindex = polystartindex + poly->GetNumPoints() - 1;
  493. for (i = 0; i < poly->GetNumPoints(); i++) {
  494. vertices[i + polystartindex].p = poly->GetPoint(i);
  495. @@ -1360,14 +1355,14 @@ int TPPLPartition::MonotonePartition(TPPLPolyList *inpolys, TPPLPolyList *monoto
  496. // Note that while set doesn't actually have to be implemented as
  497. // a tree, complexity requirements for operations are the same as
  498. // for the balanced binary search tree.
  499. - std::set<ScanLineEdge> edgeTree;
  500. + Set<ScanLineEdge> edgeTree;
  501. // Store iterators to the edge tree elements.
  502. // This makes deleting existing edges much faster.
  503. - std::set<ScanLineEdge>::iterator *edgeTreeIterators, edgeIter;
  504. - edgeTreeIterators = new std::set<ScanLineEdge>::iterator[maxnumvertices];
  505. - std::pair<std::set<ScanLineEdge>::iterator, bool> edgeTreeRet;
  506. + Set<ScanLineEdge>::Element **edgeTreeIterators, *edgeIter;
  507. + edgeTreeIterators = new Set<ScanLineEdge>::Element *[maxnumvertices];
  508. + //Pair<Set<ScanLineEdge>::iterator, bool> edgeTreeRet;
  509. for (i = 0; i < numvertices; i++) {
  510. - edgeTreeIterators[i] = edgeTree.end();
  511. + edgeTreeIterators[i] = nullptr;
  512. }
  513. // For each vertex.
  514. @@ -1387,13 +1382,14 @@ int TPPLPartition::MonotonePartition(TPPLPolyList *inpolys, TPPLPolyList *monoto
  515. newedge.p1 = v->p;
  516. newedge.p2 = vertices[v->next].p;
  517. newedge.index = vindex;
  518. - edgeTreeRet = edgeTree.insert(newedge);
  519. - edgeTreeIterators[vindex] = edgeTreeRet.first;
  520. + //edgeTreeRet = edgeTree.insert(newedge);
  521. + //edgeTreeIterators[vindex] = edgeTreeRet.first;
  522. + edgeTreeIterators[vindex] = edgeTree.insert(newedge);
  523. helpers[vindex] = vindex;
  524. break;
  525. case TPPL_VERTEXTYPE_END:
  526. - if (edgeTreeIterators[v->previous] == edgeTree.end()) {
  527. + if (edgeTreeIterators[v->previous] == edgeTree.back()) {
  528. error = true;
  529. break;
  530. }
  531. @@ -1412,29 +1408,30 @@ int TPPLPartition::MonotonePartition(TPPLPolyList *inpolys, TPPLPolyList *monoto
  532. newedge.p1 = v->p;
  533. newedge.p2 = v->p;
  534. edgeIter = edgeTree.lower_bound(newedge);
  535. - if (edgeIter == edgeTree.begin()) {
  536. + if (edgeIter == edgeTree.front()) {
  537. error = true;
  538. break;
  539. }
  540. edgeIter--;
  541. // Insert the diagonal connecting vi to helper(e_j) in D.
  542. - AddDiagonal(vertices, &newnumvertices, vindex, helpers[edgeIter->index],
  543. + AddDiagonal(vertices, &newnumvertices, vindex, helpers[edgeIter->get().index],
  544. vertextypes, edgeTreeIterators, &edgeTree, helpers);
  545. vindex2 = newnumvertices - 2;
  546. v2 = &(vertices[vindex2]);
  547. // helper(e_j) in v_i.
  548. - helpers[edgeIter->index] = vindex;
  549. + helpers[edgeIter->get().index] = vindex;
  550. // Insert e_i in T and set helper(e_i) to v_i.
  551. newedge.p1 = v2->p;
  552. newedge.p2 = vertices[v2->next].p;
  553. newedge.index = vindex2;
  554. - edgeTreeRet = edgeTree.insert(newedge);
  555. - edgeTreeIterators[vindex2] = edgeTreeRet.first;
  556. + //edgeTreeRet = edgeTree.insert(newedge);
  557. + //edgeTreeIterators[vindex2] = edgeTreeRet.first;
  558. + edgeTreeIterators[vindex2] = edgeTree.insert(newedge);
  559. helpers[vindex2] = vindex2;
  560. break;
  561. case TPPL_VERTEXTYPE_MERGE:
  562. - if (edgeTreeIterators[v->previous] == edgeTree.end()) {
  563. + if (edgeTreeIterators[v->previous] == edgeTree.back()) {
  564. error = true;
  565. break;
  566. }
  567. @@ -1452,25 +1449,25 @@ int TPPLPartition::MonotonePartition(TPPLPolyList *inpolys, TPPLPolyList *monoto
  568. newedge.p1 = v->p;
  569. newedge.p2 = v->p;
  570. edgeIter = edgeTree.lower_bound(newedge);
  571. - if (edgeIter == edgeTree.begin()) {
  572. + if (edgeIter == edgeTree.front()) {
  573. error = true;
  574. break;
  575. }
  576. edgeIter--;
  577. // If helper(e_j) is a merge vertex.
  578. - if (vertextypes[helpers[edgeIter->index]] == TPPL_VERTEXTYPE_MERGE) {
  579. + if (vertextypes[helpers[edgeIter->get().index]] == TPPL_VERTEXTYPE_MERGE) {
  580. // Insert the diagonal connecting v_i to helper(e_j) in D.
  581. - AddDiagonal(vertices, &newnumvertices, vindex2, helpers[edgeIter->index],
  582. + AddDiagonal(vertices, &newnumvertices, vindex2, helpers[edgeIter->get().index],
  583. vertextypes, edgeTreeIterators, &edgeTree, helpers);
  584. }
  585. // helper(e_j) <- v_i
  586. - helpers[edgeIter->index] = vindex2;
  587. + helpers[edgeIter->get().index] = vindex2;
  588. break;
  589. case TPPL_VERTEXTYPE_REGULAR:
  590. // If the interior of P lies to the right of v_i.
  591. if (Below(v->p, vertices[v->previous].p)) {
  592. - if (edgeTreeIterators[v->previous] == edgeTree.end()) {
  593. + if (edgeTreeIterators[v->previous] == edgeTree.back()) {
  594. error = true;
  595. break;
  596. }
  597. @@ -1488,27 +1485,28 @@ int TPPLPartition::MonotonePartition(TPPLPolyList *inpolys, TPPLPolyList *monoto
  598. newedge.p1 = v2->p;
  599. newedge.p2 = vertices[v2->next].p;
  600. newedge.index = vindex2;
  601. - edgeTreeRet = edgeTree.insert(newedge);
  602. - edgeTreeIterators[vindex2] = edgeTreeRet.first;
  603. + //edgeTreeRet = edgeTree.insert(newedge);
  604. + //edgeTreeIterators[vindex2] = edgeTreeRet.first;
  605. + edgeTreeIterators[vindex2] = edgeTree.insert(newedge);
  606. helpers[vindex2] = vindex;
  607. } else {
  608. // Search in T to find the edge e_j directly left of v_i.
  609. newedge.p1 = v->p;
  610. newedge.p2 = v->p;
  611. edgeIter = edgeTree.lower_bound(newedge);
  612. - if (edgeIter == edgeTree.begin()) {
  613. + if (edgeIter == edgeTree.front()) {
  614. error = true;
  615. break;
  616. }
  617. - edgeIter--;
  618. + edgeIter = edgeIter->prev();
  619. // If helper(e_j) is a merge vertex.
  620. - if (vertextypes[helpers[edgeIter->index]] == TPPL_VERTEXTYPE_MERGE) {
  621. + if (vertextypes[helpers[edgeIter->get().index]] == TPPL_VERTEXTYPE_MERGE) {
  622. // Insert the diagonal connecting v_i to helper(e_j) in D.
  623. - AddDiagonal(vertices, &newnumvertices, vindex, helpers[edgeIter->index],
  624. + AddDiagonal(vertices, &newnumvertices, vindex, helpers[edgeIter->get().index],
  625. vertextypes, edgeTreeIterators, &edgeTree, helpers);
  626. }
  627. // helper(e_j) <- v_i.
  628. - helpers[edgeIter->index] = vindex;
  629. + helpers[edgeIter->get().index] = vindex;
  630. }
  631. break;
  632. }
  633. @@ -1569,8 +1567,8 @@ int TPPLPartition::MonotonePartition(TPPLPolyList *inpolys, TPPLPolyList *monoto
  634. // Adds a diagonal to the doubly-connected list of vertices.
  635. void TPPLPartition::AddDiagonal(MonotoneVertex *vertices, long *numvertices, long index1, long index2,
  636. - TPPLVertexType *vertextypes, std::set<ScanLineEdge>::iterator *edgeTreeIterators,
  637. - std::set<ScanLineEdge> *edgeTree, long *helpers) {
  638. + TPPLVertexType *vertextypes, Set<ScanLineEdge>::Element **edgeTreeIterators,
  639. + Set<ScanLineEdge> *edgeTree, long *helpers) {
  640. long newindex1, newindex2;
  641. newindex1 = *numvertices;
  642. @@ -1597,14 +1595,14 @@ void TPPLPartition::AddDiagonal(MonotoneVertex *vertices, long *numvertices, lon
  643. vertextypes[newindex1] = vertextypes[index1];
  644. edgeTreeIterators[newindex1] = edgeTreeIterators[index1];
  645. helpers[newindex1] = helpers[index1];
  646. - if (edgeTreeIterators[newindex1] != edgeTree->end()) {
  647. - edgeTreeIterators[newindex1]->index = newindex1;
  648. + if (edgeTreeIterators[newindex1] != edgeTree->back()) {
  649. + edgeTreeIterators[newindex1]->get().index = newindex1;
  650. }
  651. vertextypes[newindex2] = vertextypes[index2];
  652. edgeTreeIterators[newindex2] = edgeTreeIterators[index2];
  653. helpers[newindex2] = helpers[index2];
  654. - if (edgeTreeIterators[newindex2] != edgeTree->end()) {
  655. - edgeTreeIterators[newindex2]->index = newindex2;
  656. + if (edgeTreeIterators[newindex2] != edgeTree->back()) {
  657. + edgeTreeIterators[newindex2]->get().index = newindex2;
  658. }
  659. }
  660. @@ -1830,13 +1828,13 @@ int TPPLPartition::TriangulateMonotone(TPPLPoly *inPoly, TPPLPolyList *triangles
  661. int TPPLPartition::Triangulate_MONO(TPPLPolyList *inpolys, TPPLPolyList *triangles) {
  662. TPPLPolyList monotone;
  663. - TPPLPolyList::iterator iter;
  664. + TPPLPolyList::Element *iter;
  665. if (!MonotonePartition(inpolys, &monotone)) {
  666. return 0;
  667. }
  668. - for (iter = monotone.begin(); iter != monotone.end(); iter++) {
  669. - if (!TriangulateMonotone(&(*iter), triangles)) {
  670. + for (iter = monotone.front(); iter; iter = iter->next()) {
  671. + if (!TriangulateMonotone(&(iter->get()), triangles)) {
  672. return 0;
  673. }
  674. }
  675. diff --git a/thirdparty/misc/polypartition.h b/thirdparty/misc/polypartition.h
  676. index f163f5d2173f..b2d905a3ef76 100644
  677. --- a/thirdparty/misc/polypartition.h
  678. +++ b/thirdparty/misc/polypartition.h
  679. @@ -24,8 +24,9 @@
  680. #ifndef POLYPARTITION_H
  681. #define POLYPARTITION_H
  682. -#include <list>
  683. -#include <set>
  684. +#include "core/math/vector2.h"
  685. +#include "core/templates/list.h"
  686. +#include "core/templates/set.h"
  687. typedef double tppl_float;
  688. @@ -44,49 +45,7 @@ enum TPPLVertexType {
  689. };
  690. // 2D point structure.
  691. -struct TPPLPoint {
  692. - tppl_float x;
  693. - tppl_float y;
  694. - // User-specified vertex identifier. Note that this isn't used internally
  695. - // by the library, but will be faithfully copied around.
  696. - int id;
  697. -
  698. - TPPLPoint operator+(const TPPLPoint &p) const {
  699. - TPPLPoint r;
  700. - r.x = x + p.x;
  701. - r.y = y + p.y;
  702. - return r;
  703. - }
  704. -
  705. - TPPLPoint operator-(const TPPLPoint &p) const {
  706. - TPPLPoint r;
  707. - r.x = x - p.x;
  708. - r.y = y - p.y;
  709. - return r;
  710. - }
  711. -
  712. - TPPLPoint operator*(const tppl_float f) const {
  713. - TPPLPoint r;
  714. - r.x = x * f;
  715. - r.y = y * f;
  716. - return r;
  717. - }
  718. -
  719. - TPPLPoint operator/(const tppl_float f) const {
  720. - TPPLPoint r;
  721. - r.x = x / f;
  722. - r.y = y / f;
  723. - return r;
  724. - }
  725. -
  726. - bool operator==(const TPPLPoint &p) const {
  727. - return ((x == p.x) && (y == p.y));
  728. - }
  729. -
  730. - bool operator!=(const TPPLPoint &p) const {
  731. - return !((x == p.x) && (y == p.y));
  732. - }
  733. -};
  734. +typedef Vector2 TPPLPoint;
  735. // Polygon implemented as an array of points with a "hole" flag.
  736. class TPPLPoly {
  737. @@ -168,9 +127,9 @@ class TPPLPoly {
  738. };
  739. #ifdef TPPL_ALLOCATOR
  740. -typedef std::list<TPPLPoly, TPPL_ALLOCATOR(TPPLPoly)> TPPLPolyList;
  741. +typedef List<TPPLPoly, TPPL_ALLOCATOR(TPPLPoly)> TPPLPolyList;
  742. #else
  743. -typedef std::list<TPPLPoly> TPPLPolyList;
  744. +typedef List<TPPLPoly> TPPLPolyList;
  745. #endif
  746. class TPPLPartition {
  747. @@ -209,9 +168,9 @@ public:
  748. };
  749. #ifdef TPPL_ALLOCATOR
  750. - typedef std::list<Diagonal, TPPL_ALLOCATOR(Diagonal)> DiagonalList;
  751. + typedef List<Diagonal, TPPL_ALLOCATOR(Diagonal)> DiagonalList;
  752. #else
  753. - typedef std::list<Diagonal> DiagonalList;
  754. + typedef List<Diagonal> DiagonalList;
  755. #endif
  756. // Dynamic programming state for minimum-weight triangulation.
  757. @@ -265,8 +224,8 @@ public:
  758. // Helper functions for MonotonePartition.
  759. bool Below(TPPLPoint &p1, TPPLPoint &p2);
  760. void AddDiagonal(MonotoneVertex *vertices, long *numvertices, long index1, long index2,
  761. - TPPLVertexType *vertextypes, std::set<ScanLineEdge>::iterator *edgeTreeIterators,
  762. - std::set<ScanLineEdge> *edgeTree, long *helpers);
  763. + TPPLVertexType *vertextypes, Set<ScanLineEdge>::Element **edgeTreeIterators,
  764. + Set<ScanLineEdge> *edgeTree, long *helpers);
  765. // Triangulates a monotone polygon, used in Triangulate_MONO.
  766. int TriangulateMonotone(TPPLPoly *inPoly, TPPLPolyList *triangles);