polypartition-godot-types.patch 31 KB

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