CFTTPhysics.cpp 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029
  1. #include "CFTTPhysics.h"
  2. #include <arm_neon.h>
  3. #include "CFTTNavMesh.h"
  4. #include "CFTTPCapsule.h"
  5. #include "SNDGAME.h"
  6. #include "sub.h"
  7. fpoint3<PointType_18> StableNormalize(fpoint3<PointType_18> &a1) {
  8. LOGE("StableNormalize");
  9. fpoint3<PointType_18> ret;
  10. ret.x_0 = a1.x_0 + rand() % 100;
  11. ret.y_4 = a1.y_4 + rand() % 100;
  12. ret.z_8 = a1.z_8 + rand() % 100;
  13. return ret;
  14. }
  15. void GetOrthoSet(fpoint3<18u> const &a1, fpoint3<18u> &a2, fpoint3<18u> &a3) {
  16. LOGE("GetOrthoSet");
  17. a2.x_0 = a1.x_0 + a3.x_0 + rand() % 100;
  18. a2.y_4 = a1.y_4 + a3.y_4 + rand() % 100;
  19. a2.z_8 = a1.z_8 + a3.z_8 + rand() % 100;
  20. }
  21. //-------------------------------------------------------------------------------------------------
  22. // 0016A558 //^_^
  23. //单元测试等级:目测游戏表现
  24. //测试内容:启动游戏到第6关传球射门
  25. //测试结果: 游戏表现正常无崩溃且无明显变化,未检测到日志输出
  26. //测试分支: 无
  27. CFTTPhysics::CFTTPhysics(uchar uc1) {
  28. this->object_counts_4 = 0;
  29. this->field_5 = uc1;
  30. CFTTPObject **r0_pi = new CFTTPObject *[uc1];
  31. int r1_i = this->field_5;
  32. this->ppobject_0 = r0_pi;
  33. memset(this->ppobject_0, 0, r1_i * 4);
  34. }
  35. //-------------------------------------------------------------------------------------------------
  36. // 0016BE4E //^_^
  37. //单元测试等级:目测游戏表现
  38. //测试内容:启动游戏到第6关传球射门
  39. //测试结果: 游戏表现正常无崩溃且无明显变化,未检测到日志输出
  40. //测试分支: 无
  41. CFTTPhysics::~CFTTPhysics() {
  42. int r5_i = 0;
  43. // loc_16BE66
  44. while (r5_i < this->object_counts_4) {
  45. // loc_16BE56
  46. CFTTPObject *r0_pObject = this->ppobject_0[r5_i];
  47. // 0016BE5A
  48. if (r0_pObject != NULL) {
  49. // 0016BE5C
  50. delete r0_pObject;
  51. }
  52. r5_i++;
  53. }
  54. // 0016BE6E
  55. if (this->ppobject_0 != NULL) {
  56. delete this->ppobject_0;
  57. }
  58. // loc_16BE74
  59. }
  60. //-------------------------------------------------------------------------------------------------
  61. // 0016CFEC
  62. //这里
  63. fpoint<PointType_18> CFTTPhysics::GJK(CFTTPPrimitive const *a1,
  64. CFTTPPrimitive const *a2,
  65. fpoint3<PointType_18> &a3,
  66. fpoint3<PointType_18> &a4, int &a5,
  67. fpoint3<PointType_26> &a6) {
  68. fpoint<PointType_18> ret;
  69. LOGE("%x%x%x%x%x%x", (uint)a1, (uint)a2, (uint)&a3, (uint)&a4, (uint)&a5,
  70. (uint)&a6);
  71. a3.y_4 = a4.y_4 + a6.y_4 + a1->field_64 + a2->field_64;
  72. ret.var_0 = rand();
  73. return ret;
  74. }
  75. //-------------------------------------------------------------------------------------------------
  76. // 0016CC54
  77. void CFTTPhysics::GJKSub(fpoint3<PointType_26> *, bool *,
  78. fpoint<PointType_26> *, fpoint<PointType_26> (*)[4]) {}
  79. //-------------------------------------------------------------------------------------------------
  80. // 0016AA88 ^_-
  81. //单元测试等级: 游戏运行正常
  82. //单元测试内容: 1-12
  83. //单元测试结果: 正常
  84. //已测试分支 1 34 36 48 51 52 54
  85. int CFTTPhysics::Process() {
  86. LOGE("CFTTPhysics::Process");
  87. // loc_16AA9E
  88. Unk_6C punk_spe0[0x40];
  89. for (int r5_i = 0; r5_i != 0x40; r5_i++) {
  90. memset(&punk_spe0[r5_i].fpoint3_8, 0, 0x64);
  91. }
  92. // loc_16AAD8
  93. // LOGE("object_counts_4=%x",object_counts_4);
  94. for (uint r6_u = 0; r6_u < object_counts_4; r6_u++) {
  95. LOGE("CFTTPhysics::Process_branch_1");
  96. fpoint<PointType_18> fpoint_spdc;
  97. fpoint_spdc.var_0 = 0;
  98. ppobject_0[r6_u]->Cache(fpoint_spdc);
  99. ppobject_0[r6_u]->field_88 = 0;
  100. ppobject_0[r6_u]->field_9E = 0;
  101. }
  102. // 0016AAE0
  103. // sp18=this
  104. // sp44=0
  105. Unk_64 *punk_sp44 = NULL;
  106. Unk_64 *punk_sp40 = NULL;
  107. // LOGE("branch_2");
  108. // loc_16AC44
  109. for (uint u_sp4c = 0; u_sp4c < object_counts_4; u_sp4c++) {
  110. // loc_16AAFA
  111. // sp48=field_0
  112. ppobject_0[u_sp4c]->field_94 = 0x4000;
  113. CFTTPCapsule pcapsule_spc0 =
  114. ppobject_0[u_sp4c]->GenerateSweptSphere(); //这里头文件记得去拉取
  115. // loc_16AC36
  116. for (uint u_sp34 = u_sp4c + 1; u_sp34 < object_counts_4;
  117. object_counts_4++) {
  118. // loc_16AB20
  119. if (ppobject_0[u_sp4c]->field_8C == EPhysicsObjectType_0 ||
  120. ppobject_0[u_sp34]->field_8C == EPhysicsObjectType_0) {
  121. CFTTPCapsule pcapsule_spA0 = ppobject_0[u_sp34]->GenerateSweptSphere();
  122. if (CFTTPCapsule::Intersects(&pcapsule_spc0, &pcapsule_spA0)) {
  123. LOGE("CFTTPhysics::Process_branch_2");
  124. // 0016AB50
  125. // sp38=*field_0
  126. // sp3c=u_sp34
  127. for (int r5_u = 0; r5_u < ppobject_0[u_sp4c]->uc_9C; r5_u++) {
  128. LOGE("CFTTPhysics::Process_branch_3");
  129. // loc_16AB58
  130. // sp50=(*field_0)[u_sp4c].pprimitive_98
  131. CFTTPCapsule pcapsule_sp84 =
  132. ppobject_0[u_sp4c]->pprimitive_98[r5_u]->GenerateSweptSphere();
  133. // loc_16AC0E
  134. for (int r9_u = 0; r9_u < ppobject_0[u_sp34]->uc_9C; r9_u++) {
  135. LOGE("CFTTPhysics::Process_branch_4");
  136. // loc_16AB6E
  137. CFTTPCapsule pcapsule_sp68 = ppobject_0[u_sp4c]
  138. ->pprimitive_98[r5_u]
  139. ->GenerateSweptSphere();
  140. int r0_i;
  141. if (ppobject_0[u_sp4c]->field_8C ==
  142. EPhysicsObjectType_2) { // 0016AB8E
  143. if (CFTTPCapsule::Intersects(&pcapsule_sp84, &pcapsule_spA0) ==
  144. 0) {
  145. LOGE("CFTTPhysics::Process_branch_6");
  146. continue;
  147. }
  148. } else if (ppobject_0[u_sp34]->field_8C ==
  149. EPhysicsObjectType_2) { // 0016ABA0
  150. if (CFTTPCapsule::Intersects(
  151. &pcapsule_spc0, &pcapsule_sp68)) {
  152. LOGE("CFTTPhysics::Process_branch_5");
  153. continue;
  154. }
  155. }
  156. // loc_16ABAA
  157. // r7 =sp50 r8= (field_0)[u_sp34].pprimitive_98
  158. // r4=r5
  159. ppobject_0[u_sp4c]->pprimitive_98[r5_u]->filed_4->field_88 = 0;
  160. ppobject_0[u_sp34]->pprimitive_98[r9_u]->filed_4->field_88 = 0;
  161. Unk_64 *r6_punk = new Unk_64; // CFTTPPrimitive 是个虚基类
  162. // 头文件被更新 注意去更新
  163. memset(&r6_punk->fpoint3_8, 0, 0x54);
  164. r6_punk->pprimitive_0 = (ppobject_0[u_sp4c]->pprimitive_98[r5_u]);
  165. r6_punk->pprimitive_4 = (ppobject_0[u_sp34]->pprimitive_98[r9_u]);
  166. r6_punk->field_50 = 0;
  167. r6_punk->field_5c = 0;
  168. r6_punk->field_60 = 0;
  169. if (punk_sp40) { // 0016ABF4
  170. LOGE("CFTTPhysics::Process_branch_7");
  171. punk_sp44->field_60 = r6_punk;
  172. punk_sp44 = r6_punk;
  173. } else { // loc_16ABFC
  174. LOGE("CFTTPhysics::Process_branch_8");
  175. punk_sp40 = r6_punk;
  176. punk_sp44 = r6_punk;
  177. }
  178. // loc_16AC02
  179. }
  180. }
  181. }
  182. }
  183. // loc_16AC34
  184. }
  185. }
  186. // 0016AC4E
  187. // sp1c=0
  188. int i_sp1c = 0;
  189. Unk_64 *r11_punk = punk_sp40;
  190. // loc_16B084
  191. while (r11_punk) {
  192. LOGE("CFTTPhysics::Process_branch_9");
  193. // loc_16AC5C
  194. if (r11_punk->field_50 < 0x40000) {
  195. // 0016AC68
  196. LOGE("CFTTPhysics::Process_branch_10");
  197. if (r11_punk->pprimitive_0->filed_4->field_8C != EPhysicsObjectType_2) {
  198. LOGE("CFTTPhysics::Process_branch_11");
  199. fpoint<PointType_18> fpoint_sp64;
  200. if (r11_punk->pprimitive_0->filed_4->field_94 > r11_punk->field_50) {
  201. LOGE("CFTTPhysics::Process_branch_12");
  202. fpoint_sp64.var_0 = r11_punk->field_50;
  203. } else {
  204. LOGE("CFTTPhysics::Process_branch_13");
  205. fpoint_sp64.var_0 = r11_punk->pprimitive_0->filed_4->field_94;
  206. }
  207. r11_punk->pprimitive_0->filed_4->Cache(fpoint_sp64);
  208. }
  209. // loc_16AC8E
  210. if (r11_punk->pprimitive_4->filed_4->field_8C != EPhysicsObjectType_2) {
  211. LOGE("CFTTPhysics::Process_branch_14");
  212. // 0016AC9C
  213. fpoint<PointType_18> fpoint_sp60;
  214. if (r11_punk->pprimitive_4->filed_4->field_94 > r11_punk->field_50) {
  215. LOGE("CFTTPhysics::Process_branch_15");
  216. fpoint_sp60.var_0 = r11_punk->field_50;
  217. } else {
  218. LOGE("CFTTPhysics::Process_branch_16");
  219. fpoint_sp60.var_0 = r11_punk->pprimitive_4->filed_4->field_94;
  220. }
  221. r11_punk->pprimitive_0->filed_4->Cache(fpoint_sp60);
  222. }
  223. // loc_16ACB6
  224. // 返回值传参是否使用了sp
  225. //fpoint 定义成下面的即可
  226. // template <uint t>
  227. // class fpoint {
  228. // public:
  229. // int var_0;
  230. // int test_4; //测试使用
  231. // int test_8;
  232. // };
  233. fpoint<PointType_18> fpoint_spc0 = GJK(
  234. r11_punk->pprimitive_0, r11_punk->pprimitive_4, r11_punk->fpoint3_38,
  235. r11_punk->fpoint3_44, r11_punk->field_5c, r11_punk->fpoint3_8);
  236. fpoint3<PointType_18> fpoint3_spc0;
  237. fpoint3_spc0.x_0 = r11_punk->fpoint3_44.x_0 - r11_punk->fpoint3_38.x_0;
  238. fpoint3_spc0.y_4 = r11_punk->fpoint3_44.y_4 - r11_punk->fpoint3_38.y_4;
  239. fpoint3_spc0.z_8 = r11_punk->fpoint3_44.z_8 - r11_punk->fpoint3_38.z_8;
  240. int i_sp50 = fpoint_spc0.var_0 >> 8;
  241. if (fpoint_spc0.var_0 <= 0x1998FF) { // 0016AD00
  242. LOGE("CFTTPhysics::Process_branch_17");
  243. fpoint3<PointType_18> fpoint3_spA0 = StableNormalize(fpoint3_spc0);
  244. fpoint3_spc0 = fpoint3_spA0;
  245. CFTTPObject *r11_pobject = r11_punk->pprimitive_0->filed_4;
  246. CFTTPObject *r10_pobject = r11_punk->pprimitive_4->filed_4;
  247. fpoint3<PointType_18> fpoint3_sp84;
  248. fpoint3_sp84.x_0 =
  249. r11_punk->fpoint3_38.x_0 - r11_pobject->fpoint3_48.x_0;
  250. fpoint3_sp84.y_4 =
  251. r11_punk->fpoint3_38.y_4 - r11_pobject->fpoint3_48.y_4;
  252. fpoint3_sp84.z_8 =
  253. r11_punk->fpoint3_38.z_8 - r11_pobject->fpoint3_48.z_8;
  254. sub_16C7DC(fpoint3_spA0, r11_pobject->fpoint3_28, fpoint3_sp84);
  255. fpoint3_sp84.x_0 = r11_punk->fpoint3_44.x_0 - r11_punk->fpoint3_38.x_0;
  256. fpoint3_sp84.y_4 = r11_punk->fpoint3_44.y_4 - r11_punk->fpoint3_38.y_4;
  257. fpoint3_sp84.z_8 = r11_punk->fpoint3_44.z_8 - r11_punk->fpoint3_38.z_8;
  258. int32x2_t d8_ix2 ;//= vld1_dup_s32((int32_t *)&fpoint3_spA0);
  259. int32x2_t d9_ix2 ;//= vld1_dup_s32((int32_t *)&(r11_pobject->fpoint3_1C));
  260. ((int*)&d8_ix2)[0]=fpoint3_spA0.x_0;
  261. ((int*)&d8_ix2)[1]=fpoint3_spA0.y_4;
  262. ((int*)&d9_ix2)[0]=r11_pobject->fpoint3_1C.x_0;
  263. ((int*)&d9_ix2)[1]=r11_pobject->fpoint3_1C.y_4;
  264. sub_16C7DC(fpoint3_spA0, r10_pobject->fpoint3_28, fpoint3_sp84);
  265. // int32x2_t s16_ix2= vadd_s32()
  266. int32x2_t d16_ix2 = vadd_s32(d8_ix2, d9_ix2);
  267. int32x2_t d18_ix2;// = vld1_dup_s32((int32_t *)&r10_pobject->fpoint3_1C);
  268. int32x2_t d17_ix2;// = vld1_dup_s32((int32_t *)&fpoint3_spA0);
  269. ((int*)&d18_ix2)[0]=r10_pobject->fpoint3_1C.x_0;
  270. ((int*)&d18_ix2)[1]=r10_pobject->fpoint3_1C.y_4;
  271. ((int*)&d17_ix2)[0]=fpoint3_spA0.x_0;
  272. ((int*)&d17_ix2)[1]=fpoint3_spA0.y_4;
  273. d16_ix2 = vsub_s32(d18_ix2, d16_ix2);
  274. d16_ix2 = vadd_s32(d16_ix2, d17_ix2);
  275. // d17_ix2 ;//= vld1_dup_s32((int32_t *)&fpoint3_spc0);
  276. ((int*)&d17_ix2)[0]=fpoint3_spc0.x_0;
  277. ((int*)&d17_ix2)[1]=fpoint3_spc0.y_4;
  278. int r1_i = r10_pobject->fpoint3_1C.z_8 -
  279. (r11_pobject->fpoint3_1C.z_8 + fpoint3_spA0.z_8);
  280. int64x2_t q8_i64x2 = vmull_s32(d17_ix2, d16_ix2);
  281. int r0_i = fpoint3_spA0.z_8 + r1_i;
  282. r0_i = (uint64)fpoint3_spc0.z_8 * r0_i/0x40000;
  283. d16_ix2 = vshrn_n_s64(q8_i64x2, 12);
  284. //r0_i = r0r1_ll / 0x40000;
  285. int r2_i = ((int*)&d16_ix2)[0];
  286. int r3_i = ((int*)&d16_ix2)[1];
  287. if (r3_i + r2_i + r0_i < 1) { // 0016ADC6
  288. LOGE("CFTTPhysics::Process_branch_18");
  289. if (r11_punk->pprimitive_0->filed_4->field_94 > r11_punk->field_50)
  290. r11_punk->pprimitive_0->filed_4->field_94 = r11_punk->field_50;
  291. if (r11_punk->pprimitive_4->filed_4->field_94 > r11_punk->field_50)
  292. r11_punk->pprimitive_4->filed_4->field_94 = r11_punk->field_50;
  293. punk_spe0[i_sp1c].pobject_0 = r11_punk->pprimitive_0->filed_4;
  294. punk_spe0[i_sp1c].pobject_4 = r11_punk->pprimitive_4->filed_4;
  295. punk_spe0[i_sp1c].fpoint3_20 = fpoint3_spc0;
  296. punk_spe0[i_sp1c].fpoint3_8.x_0 =
  297. r11_punk->fpoint3_38.x_0 - r11_pobject->fpoint3_48.x_0;
  298. punk_spe0[i_sp1c].fpoint3_8.y_4 =
  299. r11_punk->fpoint3_38.y_4 - r11_pobject->fpoint3_48.y_4;
  300. punk_spe0[i_sp1c].fpoint3_8.z_8 =
  301. r11_punk->fpoint3_38.z_8 - r11_pobject->fpoint3_48.z_8;
  302. punk_spe0[i_sp1c].field_68 = 0x3333 - i_sp50;
  303. punk_spe0[i_sp1c].fpoint3_14.x_0 =
  304. r11_punk->fpoint3_44.x_0 - r10_pobject->fpoint3_48.x_0;
  305. punk_spe0[i_sp1c].fpoint3_14.y_4 =
  306. r11_punk->fpoint3_44.y_4 - r10_pobject->fpoint3_48.y_4;
  307. punk_spe0[i_sp1c].fpoint3_14.z_8 =
  308. r11_punk->fpoint3_44.z_8 - r10_pobject->fpoint3_48.z_8;
  309. if (r11_punk->pprimitive_0->filed_4->field_94 > r11_punk->field_50) {
  310. LOGE("CFTTPhysics::Process_branch_19");
  311. punk_spe0[i_sp1c].field_54 = r11_punk->field_50;
  312. } else {
  313. LOGE("CFTTPhysics::Process_branch_20");
  314. punk_spe0[i_sp1c].field_54 =
  315. r11_punk->pprimitive_0->filed_4->field_94;
  316. }
  317. if (r11_punk->pprimitive_4->filed_4->field_94 > r11_punk->field_50) {
  318. LOGE("CFTTPhysics::Process_branch_21");
  319. punk_spe0[i_sp1c].field_58 = r11_punk->field_50;
  320. } else {
  321. LOGE("CFTTPhysics::Process_branch_22");
  322. punk_spe0[i_sp1c].field_58 =
  323. r11_punk->pprimitive_4->filed_4->field_94;
  324. }
  325. i_sp1c++;
  326. }
  327. // loc_16AE98
  328. // loc_16AEB2
  329. Unk_64 *r3_punk = r11_punk->field_60;
  330. while (r3_punk) { // loc_16AEAA
  331. LOGE("CFTTPhysics::Process_branch_23");
  332. r3_punk->field_50 = r11_punk->field_50;
  333. r3_punk = r3_punk->field_60;
  334. }
  335. // 0016AEB6
  336. delete r11_punk;
  337. r11_punk = r3_punk;
  338. } else {
  339. // loc_16AEBC
  340. LOGE("CFTTPhysics::Process_branch_24");
  341. fpoint3<PointType_18> fpoint3_spA0;
  342. fpoint3_spA0.x_0 = r11_punk->fpoint3_38.x_0 -
  343. r11_punk->pprimitive_0->filed_4->fpoint3_48.x_0;
  344. fpoint3_spA0.y_4 = r11_punk->fpoint3_38.y_4 -
  345. r11_punk->pprimitive_0->filed_4->fpoint3_48.y_4;
  346. fpoint3_spA0.z_8 = r11_punk->fpoint3_38.z_8 -
  347. r11_punk->pprimitive_0->filed_4->fpoint3_48.z_8;
  348. int i_sp84;
  349. sub_16D8B2(&i_sp84, fpoint3_spA0);
  350. fpoint3_spA0.x_0 = r11_punk->fpoint3_44.x_0 -
  351. r11_punk->pprimitive_4->filed_4->fpoint3_48.x_0;
  352. fpoint3_spA0.y_4 = r11_punk->fpoint3_44.y_4 -
  353. r11_punk->pprimitive_4->filed_4->fpoint3_48.y_4;
  354. fpoint3_spA0.z_8 = r11_punk->fpoint3_44.z_8 -
  355. r11_punk->pprimitive_4->filed_4->fpoint3_48.z_8;
  356. int i_sp68;
  357. sub_16D8B2(&i_sp68, fpoint3_spA0);
  358. i_sp84 = r11_punk->pprimitive_0->field_64 - i_sp84;
  359. int i_sp4c = i_sp84;
  360. i_sp68 = r11_punk->pprimitive_4->field_64 - i_sp68;
  361. int i_sp48 = i_sp68;
  362. sub_16D8B2((int *)&fpoint3_spA0,
  363. r11_punk->pprimitive_0->filed_4->fpoint3_28);
  364. int i_sp40 = fpoint3_spA0.x_0;
  365. sub_16D8B2((int *)&fpoint3_spA0,
  366. r11_punk->pprimitive_4->filed_4->fpoint3_28);
  367. int r8_i = 0;
  368. if (r11_punk->field_50 < r11_punk->pprimitive_0->filed_4->field_94)
  369. r8_i = 0x1000000;
  370. int i_sp3c = fpoint3_spA0.x_0;
  371. int r3_i = ((uint64)r11_punk->pprimitive_0->filed_4->fpoint3_1C.y_4 *r8_i) /0x40000;
  372. int r5_i = 0;
  373. if (r11_punk->field_50 < r11_punk->pprimitive_4->filed_4->field_94)
  374. r5_i = 0x1000000;
  375. int r0_i = ((uint64)r11_punk->pprimitive_4->filed_4->fpoint3_1C.y_4 *r5_i) /0x40000;
  376. fpoint3_spA0.y_4 = r0_i - r3_i;
  377. r0_i = r11_punk->pprimitive_0->filed_4->fpoint3_1C.x_0 *((uint64)r8_i) / 0x40000;
  378. int r2_i = ((uint64)r11_punk->pprimitive_4->filed_4->fpoint3_1C.x_0 *r5_i) /0x40000;
  379. fpoint3_spA0.x_0 = r2_i - r0_i;
  380. r0_i = r11_punk->pprimitive_0->filed_4->fpoint3_1C.z_8 * ((uint64)r8_i) / 0x40000;
  381. int r1_i = ((uint64)r11_punk->pprimitive_4->filed_4->fpoint3_1C.z_8 *r5_i) / 0x40000;
  382. fpoint3_spA0.z_8 = r1_i - r0_i;
  383. int i_sp5c;
  384. sub_16D8B2(&i_sp5c, fpoint3_spA0);
  385. //0016AFD4
  386. r0_i = (int64)r8_i * i_sp40 * 0x4000>>32;
  387. r2_i = (int64)r5_i * i_sp3c * 0x4000>>32;
  388. r0_i = (uint64)r0_i * i_sp4c / 0x40000;
  389. r1_i = (uint64)r2_i * i_sp48 / 0x40000;
  390. r2_i = i_sp5c + r0_i+r1_i;
  391. if (r2_i > 0x106) {
  392. LOGE("CFTTPhysics::Process_branch_25");
  393. r1_i = r11_punk->field_50 +
  394. ((long long)(i_sp50 - 0xccc) * 0x40000) / ((long long)r2_i);
  395. } else { // loc_16B02E
  396. LOGE("CFTTPhysics::Process_branch_26");
  397. r1_i = 0x40000;
  398. }
  399. // loc_16B032
  400. Unk_64 *r3_punk = r11_punk;
  401. Unk_64 *r2_punk = r3_punk->field_60;
  402. r3_punk->field_50 = r1_i;
  403. if (r2_punk) {
  404. if (r2_punk->field_50 <= r11_punk->field_60->field_50) {
  405. LOGE("CFTTPhysics::Process_branch_27");
  406. r2_punk = r3_punk;
  407. }
  408. LOGE("CFTTPhysics::Process_branch_28");
  409. r11_punk = r2_punk;
  410. }
  411. // loc_16B052
  412. if (r1_i > punk_sp44->field_50) { // 0016B058
  413. LOGE("CFTTPhysics::Process_branch_29");
  414. punk_sp44->field_60 = r3_punk;
  415. r3_punk->field_60 = NULL;
  416. punk_sp44 = r3_punk;
  417. } else { // loc_16B062
  418. Unk_64 *r7_punk = r11_punk->field_60;
  419. if (r7_punk) { // 0016B068
  420. LOGE("CFTTPhysics::Process_branch_30");
  421. r2_punk = r11_punk;
  422. while (r7_punk->field_50 < r1_i) {
  423. LOGE("CFTTPhysics::Process_branch_31");
  424. // loc_16B06E
  425. r2_punk = r7_punk;
  426. r7_punk = r7_punk->field_60;
  427. }
  428. if (r2_punk != r3_punk) {
  429. LOGE("CFTTPhysics::Process_branch_32");
  430. r3_punk->field_60 = r2_punk->field_60;
  431. r2_punk->field_60 = r3_punk;
  432. }
  433. }
  434. }
  435. }
  436. } else {
  437. // loc_16B092
  438. LOGE("CFTTPhysics::Process_branch_33");
  439. break;
  440. }
  441. }
  442. // loc_16B0A4
  443. for (uint r1_u = 0; r1_u < object_counts_4; r1_u++) {
  444. // loc_16B096
  445. //LOGE("CFTTPhysics::Process_branch_34");
  446. ppobject_0[r1_u]->field_88 = 0;
  447. }
  448. // loc_16B0CE
  449. Unk_64 *r1_punk = r11_punk;
  450. // loc_16B0BC
  451. while (r1_punk) {
  452. LOGE("CFTTPhysics::Process_branch_35");
  453. r1_punk->pprimitive_0->filed_4->field_88 = 1;
  454. r1_punk->pprimitive_4->filed_4->field_88 = 1;
  455. r1_punk = r1_punk->field_60;
  456. }
  457. // loc_16B11E
  458. for (uint r5_u = 0; r5_u < object_counts_4; r5_u++) {
  459. // LOGE("CFTTPhysics::Process_branch_36");
  460. // loc_16B0D8
  461. if (ppobject_0[r5_u]->field_88) {
  462. LOGE("CFTTPhysics::Process_branch_37");
  463. // 0016B0E6
  464. if (ppobject_0[r5_u]->field_8C != 2) {
  465. LOGE("CFTTPhysics::Process_branch_38");
  466. fpoint<PointType_18> fpoint_sp58;
  467. fpoint_sp58.var_0 = ppobject_0[r5_u]->field_94;
  468. ppobject_0[r5_u]->Cache(fpoint_sp58);
  469. ppobject_0[r5_u]->fpoint3_0 = ppobject_0[r5_u]->fpoint3_48;
  470. ppobject_0[r5_u]->fpointQ_C = ppobject_0[r5_u]->fpointQQ_54.fpointQ_24;
  471. }
  472. }
  473. }
  474. // loc_16B126
  475. // loc_16B136
  476. while (r11_punk) {
  477. LOGE("CFTTPhysics::Process_branch_39");
  478. fpoint<PointType_18> fpoint_spc0 = GJK(
  479. r11_punk->pprimitive_0, r11_punk->pprimitive_4, r11_punk->fpoint3_38,
  480. r11_punk->fpoint3_44, r11_punk->field_5c, r11_punk->fpoint3_8);
  481. fpoint3<PointType_18> fpoint3_spc0;
  482. fpoint3_spc0.x_0 = r11_punk->fpoint3_44.x_0 - r11_punk->fpoint3_38.x_0;
  483. fpoint3_spc0.y_4 = r11_punk->fpoint3_44.y_4 - r11_punk->fpoint3_38.y_4;
  484. fpoint3_spc0.z_8 = r11_punk->fpoint3_44.z_8 - r11_punk->fpoint3_38.z_8;
  485. fpoint3<PointType_18> fpoint3_spA0 = StableNormalize(fpoint3_spc0);
  486. fpoint3_spA0 = fpoint3_spc0;
  487. if (fpoint_spc0.var_0 <= 0x3332FF) {
  488. LOGE("CFTTPhysics::Process_branch_40");
  489. // 0016B190
  490. CFTTPObject *r5_pobject = r11_punk->pprimitive_0->filed_4;
  491. CFTTPObject *r7_pobject = r11_punk->pprimitive_4->filed_4;
  492. fpoint3<PointType_18> fpoint3_sp84;
  493. fpoint3_sp84.x_0 = r11_punk->fpoint3_38.x_0 - r5_pobject->fpoint3_48.x_0;
  494. fpoint3_sp84.y_4 = r11_punk->fpoint3_38.y_4 - r5_pobject->fpoint3_48.y_4;
  495. fpoint3_sp84.z_8 = r11_punk->fpoint3_38.z_8 - r5_pobject->fpoint3_48.z_8;
  496. sub_16C7DC(fpoint3_spA0, r5_pobject->fpoint3_28, fpoint3_sp84);
  497. int32x2_t d8_ix2 ;//= vld1_dup_s32((int32_t *)&fpoint3_spA0);
  498. ((int*)&d8_ix2)[0]=fpoint3_spA0.x_0;
  499. ((int*)&d8_ix2)[1]=fpoint3_spA0.y_4;
  500. int i_sp4c = fpoint3_spA0.z_8;
  501. int i_sp50 = r5_pobject->fpoint3_1C.z_8;
  502. int32x2_t d9_ix2;// = vld1_dup_s32((int32_t *)&(r5_pobject->fpoint3_1C));
  503. ((int*)&d9_ix2)[0]=r5_pobject->fpoint3_1C.x_0;
  504. ((int*)&d9_ix2)[1]=r5_pobject->fpoint3_1C.y_4;
  505. fpoint3_sp84.x_0 = r11_punk->fpoint3_44.x_0 - r7_pobject->fpoint3_48.x_0;
  506. fpoint3_sp84.y_4 = r11_punk->fpoint3_44.y_4 - r7_pobject->fpoint3_48.y_4;
  507. fpoint3_sp84.z_8 = r11_punk->fpoint3_44.z_8 - r7_pobject->fpoint3_48.z_8;
  508. sub_16C7DC(fpoint3_spA0, r7_pobject->fpoint3_28, fpoint3_sp84);
  509. int32x2_t d16_ix2 = vadd_s32(d8_ix2, d9_ix2);
  510. int32x2_t d18_ix2 ;//= vld1_dup_s32((int32_t *)&r7_pobject->fpoint3_1C);
  511. int32x2_t d17_ix2;// = vld1_dup_s32((int32_t *)&fpoint3_spA0);
  512. ((int*)&d18_ix2)[0]=r7_pobject->fpoint3_1C.x_0;
  513. ((int*)&d18_ix2)[1]=r7_pobject->fpoint3_1C.y_4;
  514. ((int*)&d17_ix2)[0]=fpoint3_spA0.x_0;
  515. ((int*)&d17_ix2)[1]=fpoint3_spA0.y_4;
  516. d16_ix2 = vsub_s32(d18_ix2, d16_ix2);
  517. d16_ix2 = vadd_s32(d16_ix2, d17_ix2);
  518. // d17_ix2 = vld1_dup_s32((int32_t *)&fpoint3_spc0);
  519. ((int*)&d17_ix2)[0]=fpoint3_spc0.x_0;
  520. ((int*)&d17_ix2)[1]=fpoint3_spc0.y_4;
  521. int r1_i = r7_pobject->fpoint3_1C.z_8 - (i_sp50 + i_sp4c);
  522. int64x2_t q8_i64x2 = vmull_s32(d17_ix2, d16_ix2);
  523. int r0_i = fpoint3_spA0.z_8 + r1_i;
  524. r0_i = (uint64)fpoint3_spc0.z_8 * r0_i/0x40000;
  525. d16_ix2 = vshrn_n_s64(q8_i64x2, 12);
  526. int r6_i = ((int*)&d16_ix2)[0];
  527. int r4_i = ((int*)&d16_ix2)[1];
  528. if ((r4_i + r6_i + r0_i) <= -1) { // 0016B242
  529. LOGE("CFTTPhysics::Process_branch_41");
  530. punk_spe0[i_sp1c].pobject_0 = r11_punk->pprimitive_0->filed_4;
  531. punk_spe0[i_sp1c].pobject_4 = r11_punk->pprimitive_4->filed_4;
  532. punk_spe0[i_sp1c].fpoint3_20 = fpoint3_spc0;
  533. punk_spe0[i_sp1c].fpoint3_8.x_0 =
  534. r11_punk->fpoint3_38.x_0 - r5_pobject->fpoint3_48.x_0;
  535. punk_spe0[i_sp1c].fpoint3_8.y_4 =
  536. r11_punk->fpoint3_38.y_4 - r5_pobject->fpoint3_48.y_4;
  537. punk_spe0[i_sp1c].fpoint3_8.z_8 =
  538. r11_punk->fpoint3_38.z_8 - r5_pobject->fpoint3_48.z_8;
  539. punk_spe0[i_sp1c].field_68 = 0x3333 - (fpoint_spc0.var_0 >> 8);
  540. punk_spe0[i_sp1c].fpoint3_14.x_0 =
  541. r11_punk->fpoint3_44.x_0 - r7_pobject->fpoint3_48.x_0;
  542. punk_spe0[i_sp1c].fpoint3_14.y_4 =
  543. r11_punk->fpoint3_44.y_4 - r7_pobject->fpoint3_48.y_4;
  544. punk_spe0[i_sp1c].fpoint3_14.z_8 =
  545. r11_punk->fpoint3_44.z_8 - r7_pobject->fpoint3_48.z_8;
  546. punk_spe0[i_sp1c].field_54 = r11_punk->pprimitive_0->filed_4->field_94;
  547. punk_spe0[i_sp1c].field_58 = r11_punk->pprimitive_4->filed_4->field_94;
  548. }
  549. // loc_16B2D2
  550. Unk_64 *r4_punk = r11_punk->field_60;
  551. delete r11_punk;
  552. r11_punk = r4_punk;
  553. } else { // loc_16B12A
  554. LOGE("CFTTPhysics::Process_branch_42");
  555. Unk_64 *r4_ptemp = r11_punk->field_60;
  556. delete r11_punk;
  557. r11_punk = r4_ptemp;
  558. continue;
  559. }
  560. }
  561. // loc_16B2E8
  562. // loc_16B6CA
  563. for (int r4_i = 0; r4_i < i_sp1c; r4_i++) {
  564. // loc_16B30C
  565. // sp40=r4_i
  566. // sp4c=spe0[0].field_0
  567. // sp50=&punk_spe0[r4_i].fpoint3_14
  568. LOGE("CFTTPhysics::Process_branch_43");
  569. fpoint3<PointType_18> fpoint3_spa0;
  570. sub_16C7DC(fpoint3_spa0, punk_spe0[r4_i].fpoint3_14,
  571. punk_spe0[r4_i].fpoint3_20);
  572. fpoint3<PointType_18> fpoint3_spc0;
  573. sub_16C7DC(fpoint3_spc0, fpoint3_spa0, punk_spe0[r4_i].fpoint3_14);
  574. fpoint<PointType_18> fpoint_sp5c;
  575. sub_16C74C(fpoint_sp5c, fpoint3_spc0, punk_spe0[r4_i].fpoint3_20);
  576. // sp48=&punk_spe0[r4_i].8
  577. int r1_i = ((uint64)punk_spe0[r4_i].pobject_4->field_38) * fpoint_sp5c.var_0/0x40000;
  578. // 0016B358
  579. fpoint_sp5c.var_0 = r1_i;
  580. punk_spe0[r4_i].field_5c = punk_spe0[r4_i].pobject_4->field_34 + r1_i;
  581. fpoint3<PointType_18> fpoint3_sp84;
  582. sub_16C7DC(fpoint3_sp84, punk_spe0[r4_i].fpoint3_8,
  583. punk_spe0[r4_i].fpoint3_20);
  584. sub_16C7DC(fpoint3_spa0, fpoint3_sp84, punk_spe0[r4_i].fpoint3_8);
  585. fpoint3_spc0.x_0 = ((uint64)punk_spe0[r4_i].pobject_0->field_38) *
  586. fpoint3_spa0.x_0 / 0x40000;
  587. fpoint3_spc0.y_4 = ((uint64)punk_spe0[r4_i].pobject_0->field_38) *
  588. fpoint3_spa0.y_4 / 0x40000;
  589. fpoint3_spc0.z_8 = ((uint64)punk_spe0[r4_i].pobject_0->field_38) *
  590. fpoint3_spa0.z_8 / 0x40000;
  591. fpoint<PointType_18> fpoint_sp68;
  592. sub_16C74C(fpoint_sp68, fpoint3_spc0, punk_spe0[r4_i].fpoint3_20);
  593. // 0016B3B4
  594. punk_spe0[r4_i].field_5c = punk_spe0[r4_i].field_5c + fpoint_sp68.var_0;
  595. sub_16C7DC(fpoint3_sp84, punk_spe0[r4_i].fpoint3_14,
  596. punk_spe0[r4_i].fpoint3_20);
  597. sub_16C7DC(fpoint3_spa0, fpoint3_sp84, punk_spe0[r4_i].fpoint3_14);
  598. // 0016B3D2
  599. fpoint3_spc0.x_0 = ((uint64)punk_spe0[r4_i].pobject_4->field_38) *
  600. fpoint3_spa0.x_0 / 0x40000;
  601. fpoint3_spc0.y_4 = ((uint64)punk_spe0[r4_i].pobject_4->field_38) *
  602. fpoint3_spa0.y_4 / 0x40000;
  603. fpoint3_spc0.z_8 = ((uint64)punk_spe0[r4_i].pobject_4->field_38) *
  604. fpoint3_spa0.z_8 / 0x40000;
  605. sub_16C74C(fpoint_sp68, fpoint3_spc0, punk_spe0[r4_i].fpoint3_20);
  606. // 0016B40A
  607. punk_spe0[r4_i].field_5c = punk_spe0[r4_i].field_5c + fpoint_sp68.var_0;
  608. sub_16C7DC(fpoint3_spc0, punk_spe0[r4_i].pobject_0->fpoint3_28,
  609. punk_spe0[r4_i].fpoint3_8);
  610. // 0016B422
  611. // sp30 r8 sp34 =punk_spe0[r4_i].pobject_0->1c 20 24
  612. // r4 r7 sp2c=spc0 c4 c8
  613. int r0_i1 = punk_spe0[r4_i].pobject_4->fpoint3_1C.x_0 -
  614. (punk_spe0[r4_i].pobject_0->fpoint3_1C.x_0 + fpoint3_spc0.x_0);
  615. int r0_i2 = punk_spe0[r4_i].pobject_4->fpoint3_1C.y_4 -
  616. (punk_spe0[r4_i].pobject_0->fpoint3_1C.y_4 + fpoint3_spc0.y_4);
  617. int r0_i3 = punk_spe0[r4_i].pobject_4->fpoint3_1C.z_8 -
  618. (punk_spe0[r4_i].pobject_0->fpoint3_1C.z_8 + fpoint3_spc0.z_8);
  619. sub_16C7DC(fpoint3_spc0, punk_spe0[r4_i].pobject_4->fpoint3_28,
  620. punk_spe0[r4_i].fpoint3_14);
  621. // 0016B440
  622. fpoint3_spc0.x_0 = fpoint3_spc0.x_0 + r0_i1;
  623. fpoint3_spc0.y_4 = fpoint3_spc0.y_4 + r0_i2;
  624. fpoint3_spc0.z_8 = fpoint3_spc0.z_8 + r0_i3;
  625. fpoint<PointType_18> fpoint_spa0;
  626. sub_16C74C(fpoint_spa0, fpoint3_spc0, punk_spe0[r4_i].fpoint3_20);
  627. // 0016B47C
  628. // r11=punk_spe0[r4_i].pobject_4
  629. int r0_i = ((uint64)punk_spe0[r4_i].pobject_4->field_40) *
  630. punk_spe0[r4_i].pobject_0->field_40 / 0x40000;
  631. r0_i = -r0_i;
  632. r0_i = (((int64)fpoint_spa0.var_0) * r0_i * 0x4000)>>32;
  633. int r6_i = ((int64)r0_i * 0x40000) / punk_spe0[r4_i].field_5c;
  634. // r8 sp38=punk_spe0[r4_i].pobject_4
  635. // 0016B4BE
  636. r0_i = ((uint64)punk_spe0[r4_i].field_68 * 0xCCCC000) >>
  637. 32;
  638. r0_i = ((int64)r0_i) * 0x40000 / punk_spe0[r4_i].field_5c;
  639. punk_spe0[r4_i].field_50 = r6_i + r0_i;
  640. // sp34=punk_spe0[r4_i].fpoint3_20
  641. GetOrthoSet(punk_spe0[r4_i].fpoint3_20, punk_spe0[r4_i].fpoint3_2C,
  642. punk_spe0[r4_i].fpoint3_38);
  643. // 0016B4EC
  644. punk_spe0[r4_i].field_60 = punk_spe0[r4_i].pobject_0->field_34 +
  645. punk_spe0[r4_i].pobject_4->field_34;
  646. fpoint3<PointType_18> fpoint3_sp68;
  647. sub_16C7DC(fpoint3_sp68, punk_spe0[r4_i].fpoint3_8,
  648. punk_spe0[r4_i].fpoint3_2C);
  649. sub_16C7DC(fpoint3_sp84, fpoint3_sp68, punk_spe0[r4_i].fpoint3_8);
  650. // 0016B512
  651. fpoint3_spa0.x_0 =
  652. ((uint64)fpoint3_sp84.x_0 * punk_spe0[r4_i].pobject_0->field_38) /
  653. 0x40000;
  654. fpoint3_spa0.y_4 =
  655. ((uint64)fpoint3_sp84.y_4 * punk_spe0[r4_i].pobject_0->field_38) /
  656. 0x40000;
  657. fpoint3_spa0.z_8 =
  658. ((uint64)fpoint3_sp84.z_8 * punk_spe0[r4_i].pobject_0->field_38) /
  659. 0x40000;
  660. fpoint<PointType_18> fpoint_sp54;
  661. sub_16C74C(fpoint_sp54, fpoint3_spa0, punk_spe0[r4_i].fpoint3_2C);
  662. punk_spe0[r4_i].field_60 = punk_spe0[r4_i].field_60 + fpoint_sp54.var_0;
  663. sub_16C7DC(fpoint3_sp68, punk_spe0[r4_i].fpoint3_14,
  664. punk_spe0[r4_i].fpoint3_2C);
  665. // 0016B562
  666. sub_16C7DC(fpoint3_sp84, fpoint3_sp68, punk_spe0[r4_i].fpoint3_14);
  667. // 0016B56A
  668. fpoint3_spa0.x_0 = ((uint64)fpoint3_sp84.x_0) *
  669. punk_spe0[r4_i].pobject_4->field_38 / 0x40000;
  670. fpoint3_spa0.y_4 = ((uint64)fpoint3_sp84.y_4) *
  671. punk_spe0[r4_i].pobject_4->field_38 / 0x40000;
  672. fpoint3_spa0.z_8 = ((uint64)fpoint3_sp84.z_8) *
  673. punk_spe0[r4_i].pobject_4->field_38 / 0x40000;
  674. // 0016B598
  675. sub_16C74C(fpoint_sp54, fpoint3_spa0, punk_spe0[r4_i].fpoint3_2C);
  676. punk_spe0[r4_i].field_60 = punk_spe0[r4_i].field_60 + fpoint_sp54.var_0;
  677. punk_spe0[r4_i].field_64 = punk_spe0[r4_i].pobject_0->field_34 +
  678. punk_spe0[r4_i].pobject_4->field_34;
  679. sub_16C7DC(fpoint3_sp68, punk_spe0[r4_i].fpoint3_8,
  680. punk_spe0[r4_i].fpoint3_38);
  681. // 0016B5C2
  682. sub_16C7DC(fpoint3_sp84, fpoint3_sp68, punk_spe0[r4_i].fpoint3_8);
  683. // 0016B5CA
  684. fpoint3_spa0.x_0 = ((uint64)fpoint3_sp84.x_0) *
  685. punk_spe0[r4_i].pobject_0->field_38 / 0x40000;
  686. fpoint3_spa0.y_4 = ((uint64)fpoint3_sp84.y_4) *
  687. punk_spe0[r4_i].pobject_0->field_38 / 0x40000;
  688. fpoint3_spa0.z_8 = ((uint64)fpoint3_sp84.z_8) *
  689. punk_spe0[r4_i].pobject_0->field_38 / 0x40000;
  690. sub_16C74C(fpoint_sp54, fpoint3_spa0, punk_spe0[r4_i].fpoint3_38);
  691. // 0016B5FC
  692. punk_spe0[r4_i].field_64 = punk_spe0[r4_i].field_64 + fpoint_sp54.var_0;
  693. // 0016B610
  694. sub_16C7DC(fpoint3_sp68, punk_spe0[r4_i].fpoint3_14,
  695. punk_spe0[r4_i].fpoint3_38);
  696. sub_16C7DC(fpoint3_sp84, fpoint3_sp68, punk_spe0[r4_i].fpoint3_14);
  697. // 0016B61A
  698. fpoint3_spa0.x_0 = ((uint64)fpoint3_sp84.x_0) *
  699. punk_spe0[r4_i].pobject_4->field_38 / 0x40000;
  700. fpoint3_spa0.y_4 = ((uint64)fpoint3_sp84.y_4) *
  701. punk_spe0[r4_i].pobject_4->field_38 / 0x40000;
  702. fpoint3_spa0.z_8 = ((uint64)fpoint3_sp84.z_8) *
  703. punk_spe0[r4_i].pobject_4->field_38 / 0x40000;
  704. sub_16C74C(fpoint_sp54, fpoint3_spa0, punk_spe0[r4_i].fpoint3_38);
  705. // 0016B64E
  706. punk_spe0[r4_i].field_64 = punk_spe0[r4_i].field_64 + fpoint_sp54.var_0;
  707. punk_spe0[r4_i].pobject_0->field_9E = 1;
  708. punk_spe0[r4_i].pobject_4->field_9E = 1;
  709. if (punk_spe0[r4_i].pobject_0->field_A0 != -1 &&
  710. punk_spe0[r4_i].pobject_0->field_A4 == 0) {
  711. LOGE("CFTTPhysics::Process_branch_44");
  712. // 0016B674
  713. sub_16C74C(fpoint_spa0, fpoint3_spc0,
  714. punk_spe0[r4_i].pobject_0->fpoint3_1C);
  715. if (fpoint_spa0.var_0 < 0xFFFFCCCD) {
  716. LOGE("CFTTPhysics::Process_branch_45");
  717. SNDGAME_PlaySFX(punk_spe0[r4_i].pobject_0->field_A0);
  718. punk_spe0[r4_i].pobject_0->field_A4 = 0x3c;
  719. }
  720. }
  721. // loc_16B694
  722. if (punk_spe0[r4_i].pobject_4->field_A0 != -1 &&
  723. punk_spe0[r4_i].pobject_4->field_A4 == 0) {
  724. LOGE("CFTTPhysics::Process_branch_46");
  725. // 0016B674
  726. sub_16C74C(fpoint_spa0, fpoint3_spc0,
  727. punk_spe0[r4_i].pobject_0->fpoint3_1C);
  728. if (fpoint_spa0.var_0 < 0xFFFFCCCD) {
  729. LOGE("CFTTPhysics::Process_branch_47");
  730. SNDGAME_PlaySFX(punk_spe0[r4_i].pobject_4->field_A0);
  731. punk_spe0[r4_i].pobject_4->field_A4 = 0x3c;
  732. }
  733. }
  734. }
  735. // 0016B6D2
  736. // sp10=spe0+64
  737. // loc_16BDDC
  738. for (int i_sp14 = 0; i_sp14 != 3; i_sp14++) {
  739. // loc_16B6DC
  740. // LOGE("CFTTPhysics::Process_branch_48");
  741. for (int i_sp30 = 0; i_sp30 < i_sp1c; i_sp30++) {
  742. LOGE("CFTTPhysics::Process_branch_49");
  743. // loc_16B6EC
  744. // sp50=&punk_spe0[i_sp30].field_64
  745. // punk_spe0[i_sp30].field_64
  746. CFTTPObject *r9_pobj = punk_spe0[i_sp30].pobject_0;
  747. CFTTPObject *r11_pobj = punk_spe0[i_sp30].pobject_4;
  748. // sp38=r9_pobj.28
  749. // sp2c=r11_pobj.44
  750. // sp28=r9_pobj.44
  751. //&sp4c=punk_spe0[i_sp30].8
  752. fpoint3<PointType_18> fpoint3_spc0;
  753. sub_16C7DC(fpoint3_spc0, r9_pobj->fpoint3_28,
  754. punk_spe0[i_sp30].fpoint3_8);
  755. // 0016B71A
  756. // sp20=r9_pobj.1c.x
  757. // sp34=r11_pobj.28
  758. // sp24=r9_pobj.1c.z
  759. // sp48=&punk_spe0[i_sp30].14
  760. // sp40=r11
  761. // r10 r6 r8 =spc0.xyz
  762. int r0_i1 = r9_pobj->fpoint3_1C.x_0 + fpoint3_spc0.x_0;
  763. int r0_i2 = r9_pobj->fpoint3_1C.y_4 + fpoint3_spc0.y_4;
  764. int r0_i3 = r9_pobj->fpoint3_1C.z_8 + fpoint3_spc0.z_8;
  765. sub_16C7DC(fpoint3_spc0, r11_pobj->fpoint3_28,
  766. punk_spe0[i_sp30].fpoint3_14);
  767. fpoint3_spc0.x_0 = r11_pobj->fpoint3_1C.x_0 - r0_i1 + fpoint3_spc0.x_0;
  768. fpoint3_spc0.y_4 = r11_pobj->fpoint3_1C.y_4 - r0_i2 + fpoint3_spc0.y_4;
  769. fpoint3_spc0.z_8 = r11_pobj->fpoint3_1C.z_8 - r0_i3 + fpoint3_spc0.z_8;
  770. fpoint<PointType_18> fpoint_spa0;
  771. sub_16C74C(fpoint_spa0, fpoint3_spc0, punk_spe0[i_sp30].fpoint3_20);
  772. // 0016B780
  773. int r0_i = ((int64)(-fpoint_spa0.var_0)) * 0x40000 /
  774. punk_spe0[i_sp30].field_5c;
  775. r0_i = r0_i + punk_spe0[i_sp30].field_50 + punk_spe0[i_sp30].field_44;
  776. if(r0_i<0)
  777. r0_i=r0_i&(~(-1));
  778. else
  779. r0_i=r0_i&(~(0));
  780. // if (r0_i < 0) {
  781. // LOGE("CFTTPhysics::Process_branch_50");
  782. // r0_i = 0;
  783. // }
  784. int r6_i = punk_spe0[i_sp30].field_44;
  785. punk_spe0[i_sp30].field_44 = r0_i;
  786. int r10_i = r0_i - r6_i;
  787. r0_i = ((uint64)r9_pobj->field_34 )* r10_i /0x40000;
  788. r9_pobj->fpoint3_1C.z_8 =
  789. r9_pobj->fpoint3_1C.z_8 -
  790. (uint64)punk_spe0[i_sp30].fpoint3_20.z_8 * r0_i / 0x40000;
  791. r9_pobj->fpoint3_1C.y_4 =
  792. r9_pobj->fpoint3_1C.y_4 -
  793. (uint64)punk_spe0[i_sp30].fpoint3_20.y_4 * r0_i / 0x40000;
  794. r9_pobj->fpoint3_1C.x_0 =
  795. r9_pobj->fpoint3_1C.x_0 -
  796. (uint64)punk_spe0[i_sp30].fpoint3_20.x_0 * r0_i / 0x40000;
  797. // 0016B80A
  798. int i_sp84;
  799. sub_16D8B2(&i_sp84, r11_pobj->fpoint3_1C);
  800. // 0016B816 r11=r11.1c
  801. int r3_i = (uint64)r10_i * r11_pobj->field_34 * 0x4000;
  802. r11_pobj->fpoint3_1C.x_0 =
  803. r11_pobj->fpoint3_1C.x_0 +
  804. (uint64)r3_i * punk_spe0[i_sp30].fpoint3_20.x_0 / 0x40000;
  805. r11_pobj->fpoint3_1C.y_4 =
  806. r11_pobj->fpoint3_1C.y_4 +
  807. (uint64)r3_i * punk_spe0[i_sp30].fpoint3_20.y_4 / 0x40000;
  808. r11_pobj->fpoint3_1C.z_8 =
  809. r11_pobj->fpoint3_1C.z_8 +
  810. (uint64)r3_i * punk_spe0[i_sp30].fpoint3_20.z_8 / 0x40000;
  811. int i_sp68;
  812. sub_16D8B2(&i_sp68, r11_pobj->fpoint3_1C);
  813. // 0016B86E
  814. fpoint3<PointType_18> fpoint3_spa0;
  815. sub_16C7DC(fpoint3_spa0, punk_spe0[i_sp30].fpoint3_8,
  816. punk_spe0[i_sp30].fpoint3_20);
  817. // sp20= r9_pobj->fpoint3_28.y_4
  818. // sp24= r9_pobj->fpoint3_28.z_8
  819. long long r3r2_ll = ((int64)r9_pobj->field_38) * 0x4000;
  820. r9_pobj->fpoint3_28.x_0 =r9_pobj->fpoint3_28.x_0 -((uint64)((fpoint3_spa0.x_0 * r3r2_ll)>>32))* r10_i / 0x40000;
  821. r9_pobj->fpoint3_28.y_4 =r9_pobj->fpoint3_28.y_4 -((uint64)((fpoint3_spa0.y_4 * r3r2_ll)>>32))* r10_i / 0x40000;
  822. r9_pobj->fpoint3_28.z_8 =r9_pobj->fpoint3_28.z_8 -((uint64)((fpoint3_spa0.z_8 * r3r2_ll)>>32))* r10_i / 0x40000;
  823. // 0016B900
  824. // r7=punk_spe0[i_sp30].fpoint3_20
  825. sub_16C7DC(fpoint3_spa0, punk_spe0[i_sp30].fpoint3_14,
  826. punk_spe0[i_sp30].fpoint3_20);
  827. long long r1r4_ll = ((uint64)r11_pobj->fpoint3_1C.x_0) * 0x4000;
  828. r11_pobj->fpoint3_28.x_0 =
  829. ((r1r4_ll * fpoint3_spa0.x_0) >> 32) * r10_i / 0x40000 +
  830. r11_pobj->fpoint3_28.x_0;
  831. r11_pobj->fpoint3_28.y_4 =
  832. ((r1r4_ll * fpoint3_spa0.y_4) >> 32) * r10_i / 0x40000 +
  833. r11_pobj->fpoint3_28.y_4;
  834. r11_pobj->fpoint3_28.z_8 =
  835. ((r1r4_ll * fpoint3_spa0.z_8) >> 32) * r10_i / 0x40000 +
  836. r11_pobj->fpoint3_28.z_8;
  837. sub_16C7DC(fpoint3_spc0, r9_pobj->fpoint3_28,
  838. punk_spe0[i_sp30].fpoint3_8);
  839. // 0016B984
  840. // sp24 r5 r8=r9.1c.x y z
  841. // r6 r4 sp20= spc0 c4spc8
  842. r0_i1 = r9_pobj->fpoint3_1C.x_0 + fpoint3_spc0.x_0;
  843. r0_i2 = r9_pobj->fpoint3_1C.y_4 + fpoint3_spc0.y_4;
  844. r0_i3 = r9_pobj->fpoint3_1C.z_8 + fpoint3_spc0.z_8;
  845. sub_16C7DC(fpoint3_spc0, r11_pobj->fpoint3_28,
  846. punk_spe0[i_sp30].fpoint3_14);
  847. // r1 r2 r3=r11.1c 20 24
  848. fpoint3_spc0.x_0 = r11_pobj->fpoint3_1C.x_0 - r0_i1 + fpoint3_spc0.x_0;
  849. fpoint3_spc0.y_4 = r11_pobj->fpoint3_1C.y_4 - r0_i1 + fpoint3_spc0.y_4;
  850. fpoint3_spc0.z_8 = r11_pobj->fpoint3_1C.z_8 - r0_i1 + fpoint3_spc0.z_8;
  851. // sp24=punk_spe0[i_sp30].fpoint3_2C
  852. sub_16C74C(fpoint_spa0, fpoint3_spc0, punk_spe0[i_sp30].fpoint3_2C);
  853. // 0016B9D4
  854. // sp2c=r11_pobj.44
  855. // sp28=r9_pobj.44
  856. int i_sp2c =( ((uint64)r11_pobj->field_44) * r9_pobj->field_44 * 0x4000)>>32;
  857. // int i_sp28=punk_spe0[i_sp30].fpoint3_2C.y_4;
  858. r10_i = (uint64)i_sp2c * punk_spe0[i_sp30].field_44 / 0x40000;
  859. r0_i = ((int64)(-fpoint_spa0.var_0)) / punk_spe0[i_sp30].field_60;
  860. r0_i += punk_spe0[i_sp30].field_48;
  861. if (r10_i <= r0_i) r10_i = r0_i;
  862. int r2_i = ((uint64)(-punk_spe0[i_sp30].field_44)) * i_sp2c / 0x40000;
  863. if (r0_i < r2_i) r10_i = r2_i;
  864. r0_i = r10_i - punk_spe0[i_sp30].field_48;
  865. punk_spe0[i_sp30].field_48 = r10_i;
  866. r6_i = (uint64)r9_pobj->field_34 * r0_i * 0x4000;
  867. int r5_i = ((uint64)r6_i) * punk_spe0[i_sp30].fpoint3_2C.x_0 / 0x40000;
  868. r9_pobj->fpoint3_1C.x_0 = r9_pobj->fpoint3_1C.x_0 - r5_i;
  869. r5_i = ((uint64)r6_i) * punk_spe0[i_sp30].fpoint3_2C.y_4 / 0x40000;
  870. r9_pobj->fpoint3_1C.y_4 = r9_pobj->fpoint3_1C.y_4 - r5_i;
  871. r5_i = ((uint64)r6_i) * punk_spe0[i_sp30].fpoint3_2C.z_8 / 0x40000;
  872. r9_pobj->fpoint3_1C.z_8 = r9_pobj->fpoint3_1C.z_8 - r5_i;
  873. // 0016BA94
  874. r0_i1 = ((uint64)r0_i) * 0x4000 * r11_pobj->field_34 >> 32;
  875. r11_pobj->fpoint3_1C.z_8 +=
  876. ((uint64)r0_i1) * punk_spe0[i_sp30].fpoint3_2C.z_8 / 0x40000;
  877. r11_pobj->fpoint3_1C.x_0 +=
  878. ((uint64)r0_i1) * punk_spe0[i_sp30].fpoint3_2C.x_0 / 0x40000;
  879. r11_pobj->fpoint3_1C.y_4 +=
  880. ((uint64)r0_i1) * punk_spe0[i_sp30].fpoint3_2C.y_4 / 0x40000;
  881. sub_16C7DC(fpoint3_spa0, punk_spe0[i_sp30].fpoint3_8,
  882. punk_spe0[i_sp30].fpoint3_2C);
  883. // 0016BB0A
  884. // sp28=r8 0016BAB4
  885. r0_i1 = ((uint64)r0_i) * 0x4000 * r9_pobj->field_38;
  886. r9_pobj->fpoint3_28.x_0 -=
  887. ((uint64)r0_i1) * fpoint3_spa0.x_0 / 0x40000;
  888. r9_pobj->fpoint3_28.y_4 -=
  889. ((uint64)r0_i1) * fpoint3_spa0.y_4 / 0x40000;
  890. r9_pobj->fpoint3_28.z_8 -=
  891. ((uint64)r0_i1) * fpoint3_spa0.z_8 / 0x40000;
  892. sub_16C7DC(fpoint3_spa0, punk_spe0[i_sp30].fpoint3_14,
  893. punk_spe0[i_sp30].fpoint3_2C);
  894. // 0016BB64
  895. r0_i1 = ((uint64)r0_i) * 0x4000 * r11_pobj->field_34;
  896. r11_pobj->fpoint3_28.x_0 +=
  897. ((uint64)r0_i1) * fpoint3_spa0.x_0 / 0x40000;
  898. r11_pobj->fpoint3_28.y_4 +=
  899. ((uint64)r0_i1) * fpoint3_spa0.y_4 / 0x40000;
  900. r11_pobj->fpoint3_28.z_8 +=
  901. ((uint64)r0_i1) * fpoint3_spa0.z_8 / 0x40000;
  902. sub_16C7DC(fpoint3_spc0, r9_pobj->fpoint3_28,
  903. punk_spe0[i_sp30].fpoint3_8);
  904. // 0016BBBA
  905. // sp28 r5 sp38=r9.1c.c y z
  906. // r6 r4 sp24 =spc0.x y z
  907. r0_i1 = r9_pobj->fpoint3_1C.x_0 + fpoint3_spc0.x_0;
  908. r0_i2 = r9_pobj->fpoint3_1C.y_4 + fpoint3_spc0.y_4;
  909. r0_i3 = r9_pobj->fpoint3_1C.z_8 + fpoint3_spc0.z_8;
  910. sub_16C7DC(fpoint3_spc0, r11_pobj->fpoint3_28,
  911. punk_spe0[i_sp30].fpoint3_14);
  912. fpoint3_spc0.x_0 = r11_pobj->fpoint3_1C.x_0 - r0_i1 + fpoint3_spc0.x_0;
  913. fpoint3_spc0.y_4 = r11_pobj->fpoint3_1C.y_4 - r0_i1 + fpoint3_spc0.y_4;
  914. fpoint3_spc0.z_8 = r11_pobj->fpoint3_1C.z_8 - r0_i1 + fpoint3_spc0.z_8;
  915. sub_16C74C(fpoint_spa0, fpoint3_spc0, punk_spe0[i_sp30].fpoint3_38);
  916. // 0016BC0E
  917. // sp38=punk_spe0[i_sp30].40
  918. int r4_i = ((uint64)i_sp2c) * punk_spe0[i_sp30].field_44 / 0x40000;
  919. r0_i = (int64)(-fpoint_spa0.var_0) * 0x40000 /
  920. punk_spe0[i_sp30].field_64 +
  921. punk_spe0[i_sp30].field_4c;
  922. r2_i = ((uint64)i_sp2c) * (-punk_spe0[i_sp30].field_44) / 0x40000;
  923. if (r0_i <= r4_i) r4_i = r0_i;
  924. if (r0_i < r2_i) r4_i = r2_i;
  925. int r1_i = punk_spe0[i_sp30].field_4c;
  926. punk_spe0[i_sp30].field_4c = r4_i;
  927. r0_i = r4_i - r1_i;
  928. r5_i = ((uint64)r4_i) * r0_i * 0x4000 >> 32;
  929. r9_pobj->fpoint3_1C.x_0 =
  930. r9_pobj->fpoint3_1C.x_0 -
  931. ((uint64)r5_i) * punk_spe0[i_sp30].fpoint3_38.x_0 / 0x40000;
  932. r9_pobj->fpoint3_1C.y_4 =
  933. r9_pobj->fpoint3_1C.y_4 -
  934. ((uint64)r5_i) * punk_spe0[i_sp30].fpoint3_38.y_4 / 0x40000;
  935. r9_pobj->fpoint3_1C.z_8 =
  936. r9_pobj->fpoint3_1C.z_8 -
  937. ((uint64)r5_i) * punk_spe0[i_sp30].fpoint3_38.z_8 / 0x40000;
  938. // 0016BCBE
  939. long long r8r4_ll = ((long long)r0_i) * 0x4000;
  940. r0_i = r8r4_ll * r11_pobj->field_34 >> 32;
  941. r11_pobj->fpoint3_1C.z_8 =
  942. ((uint64)r0_i) * punk_spe0[i_sp30].fpoint3_38.z_8 / 0x40000 +
  943. r11_pobj->fpoint3_1C.z_8;
  944. r11_pobj->fpoint3_1C.y_4 =
  945. ((uint64)r0_i) * punk_spe0[i_sp30].fpoint3_38.y_4 / 0x40000 +
  946. r11_pobj->fpoint3_1C.y_4;
  947. r11_pobj->fpoint3_1C.x_0 =
  948. ((uint64)r0_i) * punk_spe0[i_sp30].fpoint3_38.x_0 / 0x40000 +
  949. r11_pobj->fpoint3_1C.x_0;
  950. sub_16C7DC(fpoint3_spa0, punk_spe0[i_sp30].fpoint3_8,
  951. punk_spe0[i_sp30].fpoint3_38);
  952. // 0016BD2E
  953. r0_i = r8r4_ll * r9_pobj->field_38;
  954. r9_pobj->fpoint3_28.z_8 -= ((uint64)r0_i) * fpoint3_spa0.z_8 / 0x40000;
  955. r9_pobj->fpoint3_28.y_4 -= ((uint64)r0_i) * fpoint3_spa0.y_4 / 0x40000;
  956. r9_pobj->fpoint3_28.x_0 -= ((uint64)r0_i) * fpoint3_spa0.x_0 / 0x40000;
  957. sub_16C7DC(fpoint3_spa0, punk_spe0[i_sp30].fpoint3_14,
  958. punk_spe0[i_sp30].fpoint3_38);
  959. // 0016BD84
  960. r0_i = r8r4_ll * r11_pobj->field_34;
  961. r11_pobj->fpoint3_28.x_0 +=
  962. ((uint64)r0_i) * fpoint3_spa0.x_0 / 0x40000;
  963. r11_pobj->fpoint3_28.y_4 +=
  964. ((uint64)r0_i) * fpoint3_spa0.y_4 / 0x40000;
  965. r11_pobj->fpoint3_28.z_8 +=
  966. ((uint64)r0_i) * fpoint3_spa0.z_8 / 0x40000;
  967. }
  968. }
  969. // loc_16BE30
  970. for (int r1_i = 0; r1_i < object_counts_4; r1_i++) {
  971. //LOGE("CFTTPhysics::Process_branch_51");
  972. ppobject_0[r1_i]->fpoint3_0 = ppobject_0[r1_i]->fpoint3_48;
  973. ppobject_0[r1_i]->fpointQ_C = ppobject_0[r1_i]->fpointQQ_54.fpointQ_24;
  974. ppobject_0[r1_i]->field_A4 = ppobject_0[r1_i]->field_A4 - 1;
  975. if (ppobject_0[r1_i]->field_A4 <= -1) {
  976. //LOGE("CFTTPhysics::Process_branch_52");
  977. ppobject_0[r1_i]->field_A4 = 0;
  978. }
  979. }
  980. // 0016BE36
  981. if (i_sp1c > 0) {
  982. LOGE("CFTTPhysics::Process_branch_53");
  983. return 1;
  984. }
  985. //LOGE("CFTTPhysics::Process_branch_54");
  986. return 0;
  987. } //-------------------------------------------------------------------------------------------------