CDynamicAABBTree.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. // CDynamicAABBTree - [2020-04-13 11:57:46]
  2. #ifndef _CDYNAMICAABBTREE_H_
  3. #define _CDYNAMICAABBTREE_H_
  4. #include "FTTPair.h"
  5. #include "FTTList.h"
  6. #include "FTTVector.h"
  7. #include "FTTUPtr.h"
  8. #include "TAABB.h"
  9. /*
  10. 00198C88 CDynamicAABBTree<uint>::CDynamicAABBTree(uint,float)
  11. 00198E3A CDynamicAABBTree<uint>::Query(TAABB const&)
  12. 00198E94 CDynamicAABBTree<uint>::Insert(TAABB,uint)
  13. 001A4ECC CDynamicAABBTree<uint>::Query(TDynamicAABBNode<uint> *,TAABB const&, FTTVector<FTTPair<uint,TDynamicAABBNode<uint> *>> &)
  14. 001A510A CDynamicAABBTree<uint>::Balance(TDynamicAABBNode<uint> *)
  15. 001A519E CDynamicAABBTree<uint>::RotateLeft(TDynamicAABBNode<uint> *)
  16. 001A522C CDynamicAABBTree<uint>::RotateRightLeft(TDynamicAABBNode<uint> *)
  17. 001A5318 CDynamicAABBTree<uint>::RotateRight(TDynamicAABBNode<uint> *)
  18. 001A53A8 CDynamicAABBTree<uint>::RotateLeftRight(TDynamicAABBNode<uint> *)
  19. 00198CFE CDynamicAABBTree<FTTList<TEdgeGroup>::Iterator>::CDynamicAABBTree(uint,float)
  20. 0019918C CDynamicAABBTree<FTTList<TEdgeGroup>::Iterator>::Query(TAABB const&)
  21. 00199294 CDynamicAABBTree<FTTList<TEdgeGroup>::Iterator>::Remove(TDynamicAABBNode<FTTList<TEdgeGroup>::Iterator> *)
  22. 0019933C CDynamicAABBTree<FTTList<TEdgeGroup>::Iterator>::Insert(TAABB,FTTList<TEdgeGroup>::Iterator)
  23. 001A549C CDynamicAABBTree<FTTList<TEdgeGroup>::Iterator>::Query(TDynamicAABBNode<FTTList<TEdgeGroup>::Iterator> *,TAABB const&,FTTVector<FTTPair<FTTList<TEdgeGroup>::Iterator,TDynamicAABBNode<FTTList<TEdgeGroup>::Iterator> *>> &)
  24. 001A5624 CDynamicAABBTree<FTTList<TEdgeGroup>::Iterator>::Balance(TDynamicAABBNode<FTTList<TEdgeGroup>::Iterator> *)
  25. 001A56CA CDynamicAABBTree<FTTList<TEdgeGroup>::Iterator>::RotateLeft(TDynamicAABBNode<FTTList<TEdgeGroup>::Iterator> *)
  26. 001A576C CDynamicAABBTree<FTTList<TEdgeGroup>::Iterator>::RotateRightLeft(TDynamicAABBNode<FTTList<TEdgeGroup>::Iterator> *)
  27. 001A5874 CDynamicAABBTree<FTTList<TEdgeGroup>::Iterator>::RotateRight(TDynamicAABBNode<FTTList<TEdgeGroup>::Iterator> *)
  28. 001A5914 CDynamicAABBTree<FTTList<TEdgeGroup>::Iterator>::RotateLeftRight(TDynamicAABBNode<FTTList<TEdgeGroup>::Iterator> *)
  29. 00000000 TDynamicAABBNode<uint> struc @ (sizeof=0x2C, mappedto_1869)
  30. 00000000 t_0:.long ?
  31. 00000004 aabb_8:TAABB ?
  32. 0000001C depth_20:.byte ?
  33. 0000001D field_21:.byte ?
  34. 0000001E field_22:.byte ?
  35. 0000001F field_23:.byte ?
  36. 00000020 LeftNode_24:.long ?
  37. 00000024 MiddleNode_28:.long ?
  38. 00000028 RightNode_2C:.long ?
  39. 0000002C TDynamicAABBNode<uint> ends
  40. */
  41. //-------------------------------------------------------------------------------------------------
  42. // 00198C88 CDynamicAABBTree<uint> 0x2C
  43. template <typename T>
  44. struct TDynamicAABBNode {
  45. TDynamicAABBNode() {
  46. LeftNode_24 = NULL;
  47. MiddleNode_28 = NULL;
  48. RightNode_2C = NULL;
  49. depth_20 = 0;
  50. }
  51. T t_0;
  52. TAABB aabb_8;
  53. uint8 depth_20;
  54. uint8 field_21;
  55. uint8 field_22;
  56. uint8 field_23;
  57. TDynamicAABBNode<T>* LeftNode_24;
  58. TDynamicAABBNode<T>* MiddleNode_28;
  59. TDynamicAABBNode<T>* RightNode_2C;
  60. };
  61. //-------------------------------------------------------------------------------------------------
  62. template <typename T>
  63. class CDynamicAABBTree {
  64. public:
  65. // 001a5624 001a510a ^_-
  66. TDynamicAABBNode<T>* Balance(TDynamicAABBNode<T>* node1) {
  67. TDynamicAABBNode<T>* node_r0 = node1->MiddleNode_28;
  68. TDynamicAABBNode<T>* node_r1 = node1->RightNode_2C;
  69. int tmp_r5 = node_r1->depth_20 - node_r0->depth_20;
  70. // 1a5638
  71. if (tmp_r5 != -2) {
  72. // 1a563c
  73. if (tmp_r5 == 2) {
  74. node_r0 = node_r1->RightNode_2C;
  75. node_r1 = node_r1->MiddleNode_28;
  76. // 1a5642 1a564e
  77. if (node_r0 && node_r1->depth_20 < node_r0->depth_20) {
  78. // 1a5656
  79. RotateLeft(node1);
  80. } else {
  81. // 1a56a6
  82. RotateRightLeft(node1);
  83. }
  84. } else {
  85. // 1a5678
  86. if (node_r1) {
  87. // 1a567a
  88. node1->depth_20 = max(node_r1->depth_20, node_r0->depth_20) + 1;
  89. memcpy(&node1->aabb_8, &node_r0->aabb_8, sizeof(TAABB));
  90. node1->aabb_8.Expand(node_r1->aabb_8);
  91. }
  92. return node1;
  93. }
  94. } else {
  95. // 1a565e
  96. if (node_r0->RightNode_2C &&
  97. node_r0->RightNode_2C->depth_20 < node_r0->MiddleNode_28->depth_20) {
  98. // 1a5672
  99. RotateRight(node1);
  100. } else {
  101. // 1a56b4
  102. RotateLeftRight(node1);
  103. }
  104. }
  105. // 1a56ba
  106. if (node_0.GetObj() == node1)
  107. node_0.SetObj(node1->LeftNode_24);
  108. return node1->LeftNode_24;
  109. }
  110. //-----------------------------------------------------------------------------------------------
  111. // 00198cfe 00198c88 ^_-
  112. // 00198C88 _ZN16CDynamicAABBTreeIjEC2Ejf CDynamicAABBTree<unsigned int>::CDynamicAABBTree(unsigned int, float)
  113. CDynamicAABBTree(unsigned int ui1, float f2) {
  114. node_8.SetObj(nullptr);
  115. field_C = f2;
  116. NodeCount_10 = ui1;
  117. TDynamicAABBNode<T>* r9_pNode = new TDynamicAABBNode<T>[ui1];
  118. // node_8.Delete();
  119. // FTTUPtr<TDynamicAABBNode<unsigned int> []>::operator=(TDynamicAABBNode<unsigned int>*)
  120. node_8 = (TDynamicAABBNode<T>(*)[])r9_pNode; // 00198CD4
  121. node_4.SetObj(node_8.GetObj());
  122. // 198d64
  123. for (uint tmp_r0 = 0; tmp_r0 < ui1 - 1; tmp_r0++) {
  124. // 198d58 loc_198CE2
  125. TDynamicAABBNode<T>* pNode = (TDynamicAABBNode<T>*)node_8.GetObj();
  126. pNode[tmp_r0].LeftNode_24 = &pNode[tmp_r0 + 1];
  127. }
  128. node_0.SetObj(nullptr);
  129. }
  130. //-----------------------------------------------------------------------------------------------
  131. // 0019933c 00198e94 ^_-
  132. TDynamicAABBNode<T>* Insert(TAABB aabb1, T t2) {
  133. TDynamicAABBNode<T>* node_r4 = node_4.GetObj();
  134. TDynamicAABBNode<T>* node_r6;
  135. node_4 = node_r4->LeftNode_24;
  136. node_r4->t_0 = t2;
  137. node_r4->aabb_8 = aabb1;
  138. node_r4->aabb_8.Inflate(field_C);
  139. node_r4->depth_20 = 0;
  140. TAABB* aabbptr_8;
  141. TDynamicAABBNode<T>* node_r8 = node_0.GetObj();
  142. // 199382
  143. if (node_r8) {
  144. // 19938a
  145. TDynamicAABBNode<T>* node_sl;
  146. // 199396
  147. while ((node_sl = node_r8->RightNode_2C) != NULL) {
  148. // 19939e
  149. TDynamicAABBNode<T>* node_fp = node_r8->MiddleNode_28;
  150. TAABB aabb_28(node_r8->aabb_8);
  151. // 1993c2
  152. aabb_28.Expand(node_r4->aabb_8);
  153. aabbptr_8 = &node_r8->aabb_8;
  154. // 1993cc
  155. float tmp_s16 = node_r8->aabb_8.SurfaceArea();
  156. // 1993d6
  157. float tmp_s18 = aabb_28.SurfaceArea();
  158. tmp_s16 = (tmp_s18 - tmp_s16) + (tmp_s18 - tmp_s16);
  159. float tmp_s0;
  160. // 1993e6
  161. if (node_fp->RightNode_2C) {
  162. // 1993ee
  163. TAABB aabb_10(node_fp->aabb_8);
  164. // 199408
  165. aabb_10.Expand(node_r4->aabb_8);
  166. // 19940e 199418
  167. tmp_s0 = aabb_10.SurfaceArea() - node_fp->aabb_8.SurfaceArea();
  168. // 199424
  169. } else {
  170. // 199426
  171. TAABB aabb_10(node_fp->aabb_8);
  172. // 199440
  173. aabb_10.Expand(node_r4->aabb_8);
  174. // 199446
  175. tmp_s0 = aabb_10.SurfaceArea();
  176. // 19944a
  177. }
  178. float tmp_s20 = tmp_s18 + tmp_s18;
  179. tmp_s18 = tmp_s16 * tmp_s0;
  180. // 19945a
  181. if (node_sl->RightNode_2C) {
  182. // 19945c
  183. TAABB aabb_10(node_sl->aabb_8);
  184. // 199476
  185. aabb_10.Expand(node_r4->aabb_8);
  186. // 19947c 199486
  187. tmp_s0 = aabb_10.SurfaceArea() + node_sl->aabb_8.SurfaceArea();
  188. } else {
  189. // 199494
  190. TAABB aabb_10(node_sl->aabb_8);
  191. // 1994ae
  192. aabb_10.Expand(node_r4->aabb_8);
  193. // 1994b4
  194. tmp_s0 = aabb_10.SurfaceArea();
  195. }
  196. tmp_s0 += tmp_s16;
  197. // 1994bc 1994ca
  198. if (tmp_s20 < tmp_s18 && tmp_s20 < tmp_s0)
  199. break;
  200. // 1994d4
  201. if (tmp_s18 < tmp_s0)
  202. node_r8 = node_r8->MiddleNode_28;
  203. else
  204. node_r8 = node_r8->RightNode_2C;
  205. // 1994e6
  206. if (!node_r8)
  207. goto FuncExit; //-> 19956c
  208. }
  209. // 199396
  210. if (node_sl == NULL)
  211. aabbptr_8 = &node_r8->aabb_8;
  212. // 199506
  213. node_r6 = node_4.GetObj();
  214. node_4 = node_r6->LeftNode_24;
  215. node_r6->LeftNode_24 = node_r8->LeftNode_24;
  216. node_r6->MiddleNode_28 = node_r8;
  217. node_r6->RightNode_2C = node_r4;
  218. memcpy(&node_r6->aabb_8, aabbptr_8, sizeof(TAABB));
  219. // 199530
  220. node_r6->aabb_8.Expand(node_r4->aabb_8);
  221. // 19953c
  222. node_r6->depth_20 = max(node_r8->depth_20, node_r4->depth_20) + 1;
  223. // 19954a
  224. if (node_r8 != node_0.GetObj()) { // 19954e
  225. TDynamicAABBNode<T>* node_r0 = node_r8->LeftNode_24;
  226. // 199556
  227. if (node_r0->MiddleNode_28 == node_r8)
  228. node_r0->MiddleNode_28 = node_r6;
  229. else
  230. node_r0->RightNode_2C = node_r6;
  231. } else {
  232. // 19955e
  233. node_0 = node_r6;
  234. }
  235. node_r4->LeftNode_24 = node_r6;
  236. node_r8->LeftNode_24 = node_r6;
  237. // 19956a
  238. node_r8 = node_r4;
  239. FuncExit:
  240. // 19956c
  241. // 19957e
  242. for (; node_r8->LeftNode_24;) {
  243. // 199574
  244. node_r8 = Balance(node_r8->LeftNode_24);
  245. }
  246. return node_r4;
  247. } else {
  248. // 1994f0
  249. node_0 = node_r4;
  250. node_r4->LeftNode_24 = NULL;
  251. return node_r4;
  252. }
  253. }
  254. //-----------------------------------------------------------------------------------------------
  255. // 0019918c 00198e3a ^_-
  256. // 00198E3A _ZN16CDynamicAABBTreeIjE5QueryERK5TAABB
  257. FTTVector<FTTPair<T, TDynamicAABBNode<T>*>> Query(TAABB const& aabb1) {
  258. FTTVector<FTTPair<T, TDynamicAABBNode<T>*>> vector;
  259. // 1991a4 1991aa 1991ae
  260. if (node_0.GetObj() != nullptr && TAABB::Overlap(node_0.GetObj()->aabb_8, aabb1)) {
  261. Query(node_0.GetObj(), aabb1, vector);
  262. }
  263. return vector;
  264. }
  265. //-----------------------------------------------------------------------------------------------
  266. // 001a549c 001a4ecc ^_-
  267. void Query(TDynamicAABBNode<T>* node1, const TAABB& aabb2, FTTVector<FTTPair<T, TDynamicAABBNode<T>*>>& vector3) {
  268. // 1a54aa
  269. if (node1->RightNode_2C) {
  270. // 1a54b2
  271. bool tmp_r7 = TAABB::Overlap(node1->MiddleNode_28->aabb_8, aabb2);
  272. // 1a54be
  273. bool tmp_r4 = TAABB::Overlap(node1->RightNode_2C->aabb_8, aabb2);
  274. // 1a54c4
  275. if (tmp_r7) {
  276. // 1a54ce
  277. Query(node1->MiddleNode_28, aabb2, vector3);
  278. }
  279. // 1a54d2
  280. if (tmp_r4) {
  281. // 1a54e2
  282. Query(node1->RightNode_2C, aabb2, vector3);
  283. }
  284. } else { // 1a54e6
  285. FTTPair<T, TDynamicAABBNode<T>*> pair_0(T(node1->t_0), node1);
  286. vector3.Insert((FTTPair<T, TDynamicAABBNode<T>*> &&) pair_0);
  287. }
  288. }
  289. //-----------------------------------------------------------------------------------------------
  290. // 00199294 ^_-
  291. void Remove(TDynamicAABBNode<T>* node1) {
  292. TDynamicAABBNode<T>* node_r0 = node_0.GetObj();
  293. TDynamicAABBNode<T>* node_r1;
  294. TDynamicAABBNode<T>* node_r2;
  295. // 19929c
  296. if (node_r0 != node1) { // 1992a0
  297. // 1992a2
  298. if (node1->LeftNode_24 != node_0.GetObj()) {
  299. // 1992a6
  300. node_r2 = node1->LeftNode_24;
  301. node_r1 = node_r2->LeftNode_24;
  302. node_r0 = node_r2->MiddleNode_28;
  303. // 1992aa
  304. if (node_r0 == node1)
  305. node_r0 = node_r2->RightNode_2C;
  306. // 1992b6
  307. if (node_r1->MiddleNode_28 != node_r2)
  308. node_r1->RightNode_2C = node_r0;
  309. else
  310. node_r1->MiddleNode_28 = node_r0;
  311. node_r0->LeftNode_24 = node_r1;
  312. node_r2->LeftNode_24 = node_4.GetObj();
  313. node_4.SetObj(node_r2);
  314. for (; node_r1;) {
  315. // 1992ce
  316. node_r1 = Balance(node_0.GetObj())->LeftNode_24;
  317. }
  318. } else {
  319. // 1992e2
  320. node_r1 = node_r0->MiddleNode_28;
  321. // 1992e6
  322. if (node_r1 == node1)
  323. node_r1 = node_r0->RightNode_2C;
  324. node_0 = node_r1;
  325. node_r1->LeftNode_24 = NULL;
  326. node_r0->LeftNode_24 = node_4.GetObj();
  327. node_4.SetObj(node_r0);
  328. }
  329. } else {
  330. // 1992dc
  331. node_0.SetObj(NULL);
  332. }
  333. node1->LeftNode_24 = node_4.GetObj();
  334. node_4.SetObj(node1);
  335. return;
  336. }
  337. //-----------------------------------------------------------------------------------------------
  338. // 001a56ca 001a519e ^_-
  339. void RotateLeft(TDynamicAABBNode<T>* node1) {
  340. TDynamicAABBNode<T>* node_r4 = node1->RightNode_2C;
  341. TDynamicAABBNode<T>* node_r0 = node1->LeftNode_24;
  342. TDynamicAABBNode<T>* node_r2 = node_r4->MiddleNode_28;
  343. node1->LeftNode_24 = node_r4;
  344. node1->RightNode_2C = node_r2;
  345. // 1a56d4
  346. if (node_r2)
  347. node_r2->LeftNode_24 = node1;
  348. node_r4->LeftNode_24 = node_r0;
  349. node_r4->MiddleNode_28 = node1;
  350. // 1a56dc
  351. if (node_r0) {
  352. // 1a56e6 1a56e8
  353. if (node_r0->MiddleNode_28 && node_r0->MiddleNode_28 == node1)
  354. node_r0->MiddleNode_28 = node_r4;
  355. // 1a56f0 1a56f2
  356. if (node_r0->RightNode_2C && node_r0->RightNode_2C == node1)
  357. node_r0->RightNode_2C = node_r4;
  358. }
  359. node_r0 = node1->MiddleNode_28;
  360. TDynamicAABBNode<T>* node_ip = node1->RightNode_2C;
  361. // 1a5704
  362. node1->depth_20 = max(node_r0->depth_20, node_ip->depth_20) + 1;
  363. memcpy(&node1->aabb_8, &node_r0->aabb_8, sizeof(TAABB));
  364. // 1a572c
  365. node1->aabb_8.Expand(node_ip->aabb_8);
  366. node_r0 = node_r4->MiddleNode_28;
  367. TDynamicAABBNode<T>* node_r1 = node_r4->RightNode_2C;
  368. // 1a573e
  369. node_r4->depth_20 = max(node_r0->depth_20, node_r1->depth_20) + 1;
  370. memcpy(&node_r4->aabb_8, &node_r0->aabb_8, sizeof(TAABB));
  371. // 1a5766
  372. node_r4->aabb_8.Expand(node_r1->aabb_8);
  373. }
  374. //-----------------------------------------------------------------------------------------------
  375. // 001a5914 001a53a8 ^_-
  376. void RotateLeftRight(TDynamicAABBNode<T>* node1) {
  377. TDynamicAABBNode<T>* node_ip = node1->LeftNode_24;
  378. TDynamicAABBNode<T>* node_r1 = node1->MiddleNode_28;
  379. TDynamicAABBNode<T>* node_lr = node1->RightNode_2C;
  380. TDynamicAABBNode<T>* node_r2 = node_r1->MiddleNode_28;
  381. TDynamicAABBNode<T>* node_r5 = node_r1->RightNode_2C;
  382. TDynamicAABBNode<T>* node_r0 = node_r5->MiddleNode_28;
  383. TDynamicAABBNode<T>* node_r3 = node_r5->RightNode_2C;
  384. node_r1->RightNode_2C = node_r0;
  385. node_r1->LeftNode_24 = node_r5;
  386. node_r5->LeftNode_24 = node_ip;
  387. node_r5->MiddleNode_28 = node_r1;
  388. node_r5->RightNode_2C = node1;
  389. node1->LeftNode_24 = node_r5;
  390. node1->MiddleNode_28 = node_r3;
  391. node1->RightNode_2C = node_lr;
  392. // 1a5928
  393. if (node_r2)
  394. node_r2->LeftNode_24 = node_r1;
  395. // 1a5940
  396. if (node_r0)
  397. node_r0->LeftNode_24 = node_r1;
  398. // 1a5944
  399. if (node_r3)
  400. node_r3->LeftNode_24 = node1;
  401. // 1a5948
  402. if (node_lr)
  403. node_lr->LeftNode_24 = node1;
  404. // 1a5952
  405. if (node_ip) {
  406. // 1a595c 1a595e
  407. if (node_ip->MiddleNode_28 && node_ip->MiddleNode_28 == node1)
  408. node_ip->MiddleNode_28 = node_r5;
  409. // 1a596a 1a596c
  410. if (node_ip->RightNode_2C && node_ip->RightNode_2C == node1)
  411. node_ip->RightNode_2C = node_r5;
  412. }
  413. node_r0 = node_r1->MiddleNode_28;
  414. node_ip = node_r1->RightNode_2C;
  415. node_r1->depth_20 = max(node_ip->depth_20, node_r0->depth_20) + 1;
  416. memcpy(&node_r1->aabb_8, &node_r0->aabb_8, sizeof(TAABB));
  417. // 1a59ae
  418. node_r1->aabb_8.Expand(node_ip->aabb_8);
  419. node_r0 = node1->MiddleNode_28;
  420. node_r1 = node1->RightNode_2C;
  421. node1->depth_20 = max(node_r0->depth_20, node_r1->depth_20) + 1;
  422. memcpy(&node1->aabb_8, &node_r0->aabb_8, sizeof(TAABB));
  423. // 1a59e2
  424. node1->aabb_8.Expand(node_r1->aabb_8);
  425. node_r0 = node_r5->MiddleNode_28;
  426. node_r1 = node_r5->RightNode_2C;
  427. node_r5->depth_20 = max(node_r0->depth_20, node_r1->depth_20) + 1;
  428. memcpy(&node_r5->aabb_8, &node_r0->aabb_8, sizeof(TAABB));
  429. // 1a5a1c
  430. node_r5->aabb_8.Expand(node_r1->aabb_8);
  431. }
  432. //-----------------------------------------------------------------------------------------------
  433. // 001a5874 001a5318 ^_-
  434. void RotateRight(TDynamicAABBNode<T>* node1) {
  435. TDynamicAABBNode<T>* node_r0 = node1->LeftNode_24;
  436. TDynamicAABBNode<T>* node_r4 = node1->MiddleNode_28;
  437. TDynamicAABBNode<T>* node_r2 = node_r4->RightNode_2C;
  438. node1->LeftNode_24 = node_r4;
  439. node1->MiddleNode_28 = node_r2;
  440. // 1a587c
  441. if (node_r2)
  442. node_r2->LeftNode_24 = node1;
  443. node_r4->RightNode_2C = node1;
  444. node_r4->LeftNode_24 = node_r0;
  445. // 1a5886
  446. if (node_r0) {
  447. // 1a5890 1a5892
  448. if (node_r0->MiddleNode_28 && node_r0->MiddleNode_28 == node1)
  449. node_r0->MiddleNode_28 = node_r4;
  450. // 1a589a 1a589c
  451. if (node_r0->RightNode_2C && node_r0->RightNode_2C == node1)
  452. node_r0->RightNode_2C = node_r4;
  453. }
  454. node_r0 = node1->MiddleNode_28;
  455. TDynamicAABBNode<T>* node_ip = node1->RightNode_2C;
  456. node1->depth_20 = max(node_ip->depth_20, node_r0->depth_20) + 1;
  457. memcpy(&node1->aabb_8, &node_r0->aabb_8, sizeof(TAABB));
  458. // 1a58d6
  459. node1->aabb_8.Expand(node_ip->aabb_8);
  460. node_r0 = node_r4->MiddleNode_28;
  461. TDynamicAABBNode<T>* node_r1 = node_r4->RightNode_2C;
  462. node_r4->depth_20 = max(node_r0->depth_20, node_r1->depth_20) + 1;
  463. memcpy(&node_r4->aabb_8, &node_r0->aabb_8, sizeof(TAABB));
  464. // 1a5910
  465. node_r1->aabb_8.Expand(node_r1->aabb_8);
  466. }
  467. //-----------------------------------------------------------------------------------------------
  468. // 001a576c 001a522c ^_-
  469. void RotateRightLeft(TDynamicAABBNode<T>* node1) {
  470. TDynamicAABBNode<T>* node_ip = node1->LeftNode_24;
  471. TDynamicAABBNode<T>* node_lr = node1->MiddleNode_28;
  472. TDynamicAABBNode<T>* node_r5 = node1->RightNode_2C;
  473. TDynamicAABBNode<T>* node_r4 = node_r5->MiddleNode_28;
  474. TDynamicAABBNode<T>* node_r2 = node_r5->RightNode_2C;
  475. TDynamicAABBNode<T>* node_r0 = node_r4->MiddleNode_28;
  476. TDynamicAABBNode<T>* node_r3 = node_r4->RightNode_2C;
  477. node1->RightNode_2C = node_r0;
  478. node1->LeftNode_24 = node_r4;
  479. node_r4->LeftNode_24 = node_ip;
  480. node_r4->MiddleNode_28 = node1;
  481. node_r4->RightNode_2C = node_r5;
  482. node_r5->LeftNode_24 = node_r4;
  483. node_r5->MiddleNode_28 = node_r3;
  484. node_r5->RightNode_2C = node_r2;
  485. // 1a5772
  486. if (node_lr)
  487. node_lr->LeftNode_24 = node1;
  488. // 1a5796
  489. if (node_r0)
  490. node_r0->LeftNode_24 = node1;
  491. // 1a579a
  492. if (node_r3)
  493. node_r3->LeftNode_24 = node_r5;
  494. // 1a579e
  495. if (node_r2)
  496. node_r2->LeftNode_24 = node_r5;
  497. // 1a57a2
  498. if (node_ip) {
  499. // 1a57ac 1a57ae
  500. if (node_ip->MiddleNode_28 && node_ip->MiddleNode_28 == node1)
  501. node_ip->MiddleNode_28 = node_r4;
  502. // 1a57ba 1a57bc
  503. if (node_ip->RightNode_2C && node_ip->RightNode_2C == node1)
  504. node_ip->RightNode_2C = node_r4;
  505. }
  506. node_r0 = node1->MiddleNode_28;
  507. node_ip = node1->RightNode_2C;
  508. node1->depth_20 = max(node_r0->depth_20, node_ip->depth_20) + 1;
  509. memcpy(&node1->aabb_8, &node_r0->aabb_8, sizeof(TAABB));
  510. // 1a57fe
  511. node1->aabb_8.Expand(node_ip->aabb_8);
  512. node_r0 = node_r5->MiddleNode_28;
  513. TDynamicAABBNode<T>* node_r1 = node_r5->RightNode_2C;
  514. node_r5->depth_20 = max(node_r0->depth_20, node_r1->depth_20) + 1;
  515. memcpy(&node_r5->aabb_8, &node_r0->aabb_8, sizeof(TAABB));
  516. // 1a5832
  517. node_r5->aabb_8.Expand(node_r1->aabb_8);
  518. node_r0 = node_r4->MiddleNode_28;
  519. node_r1 = node_r4->RightNode_2C;
  520. node_r4->depth_20 = max(node_r0->depth_20, node_r1->depth_20) + 1;
  521. memcpy(&node_r4->aabb_8, &node_r0->aabb_8, sizeof(TAABB));
  522. // 1a586c
  523. node_r4->aabb_8.Expand(node_r1->aabb_8);
  524. }
  525. //-----------------------------------------------------------------------------------------------
  526. FTTUPtr<TDynamicAABBNode<T>> node_0;
  527. FTTUPtr<TDynamicAABBNode<T>[]> node_4;
  528. FTTUPtr<TDynamicAABBNode<T>[]> node_8;
  529. float field_C;
  530. unsigned int NodeCount_10;
  531. };
  532. #endif //_CDYNAMICAABBTREE_H_