base=0x0 target=0x718d0 fn=465104
unsigned __int64 __fastcall sub_718D0(
        unsigned int a1,
        unsigned int a2,
        unsigned int a3,
        float *a4,
        float *a5,
        float *a6,
        float a7,
        float a8,
        float a9,
        float *a10,
        float *a11,
        unsigned int *a12,
        int *a13,
        char a14)
{
  float v18; // xmm0_4
  double v19; // xmm1_8
  double v20; // xmm0_8
  double v21; // xmm0_8
  float v22; // xmm3_4
  __int64 v23; // rsi
  __int64 v24; // rdi
  float *v25; // rbp
  float v26; // xmm6_4
  float v27; // xmm0_4
  float v28; // xmm7_4
  float v29; // xmm4_4
  float v30; // xmm6_4
  float v31; // xmm1_4
  float v32; // xmm0_4
  float v33; // xmm5_4
  float v34; // xmm0_4
  float v35; // xmm4_4
  float v36; // xmm7_4
  float v37; // xmm0_4
  float v38; // xmm4_4
  float v39; // xmm5_4
  float v40; // xmm0_4
  float v41; // xmm5_4
  float v42; // xmm4_4
  float v43; // xmm1_4
  float v44; // xmm7_4
  float v45; // xmm8_4
  float v46; // xmm5_4
  float v47; // xmm0_4
  float v48; // xmm5_4
  float v49; // xmm9_4
  float v50; // xmm0_4
  float v51; // xmm4_4
  int v52; // xmm5_4
  int v53; // xmm6_4
  float v54; // xmm0_4
  float v55; // xmm4_4
  float v56; // xmm0_4
  float v57; // xmm1_4
  int v58; // xmm4_4
  double v59; // xmm1_8
  double v60; // xmm0_8
  float v61; // xmm0_4
  float v62; // xmm12_4
  float v63; // xmm11_4
  double v64; // xmm1_8
  float v65; // xmm10_4
  float v66; // xmm9_4
  float v67; // xmm8_4
  float v68; // xmm0_4
  __int64 v69; // rax
  float v70; // xmm4_4
  float *v71; // rcx
  float v72; // xmm6_4
  float v73; // xmm7_4
  float v74; // xmm0_4
  float v75; // xmm5_4
  float v76; // xmm6_4
  float v77; // xmm0_4
  float v78; // xmm6_4
  float v79; // xmm7_4
  float v80; // xmm5_4
  float v81; // xmm6_4
  float v82; // xmm4_4
  float v83; // xmm4_4
  float v84; // xmm5_4
  float v85; // xmm4_4
  double v86; // xmm1_8
  float *v87; // rdx
  int v88; // xmm0_4
  char *v89; // rax
  double v90; // xmm0_8
  float v91; // xmm1_4
  float v92; // xmm1_4
  float v93; // xmm6_4
  float v94; // xmm5_4
  float v95; // xmm4_4
  float v96; // xmm0_4
  double v97; // xmm1_8
  float v98; // xmm6_4
  float v99; // xmm7_4
  double v100; // xmm3_8
  __int64 v101; // rdx
  float *v102; // rax
  float v103; // xmm0_4
  float v104; // xmm6_4
  float v105; // xmm4_4
  float v106; // xmm7_4
  float v107; // xmm5_4
  float v108; // xmm6_4
  float v109; // xmm4_4
  float v110; // xmm4_4
  char *v111; // rbp
  double v112; // xmm0_8
  float *v113; // rbp
  float v114; // xmm9_4
  float v115; // xmm8_4
  float v116; // xmm7_4
  float v117; // xmm7_4
  __int64 v118; // rcx
  float *v119; // rdx
  float v120; // xmm0_4
  float v121; // xmm4_4
  float v122; // xmm7_4
  float v123; // xmm2_4
  float v124; // xmm5_4
  float v125; // xmm4_4
  float v126; // xmm1_4
  float v127; // xmm3_4
  float v128; // xmm2_4
  float v129; // xmm0_4
  float v130; // xmm2_4
  char *v131; // rbp
  float v132; // xmm1_4
  unsigned __int64 result; // rax
  float v134; // xmm5_4
  float v135; // xmm4_4
  float v136; // xmm1_4
  float v137; // [rsp+10h] [rbp-188h]
  float *v138; // [rsp+10h] [rbp-188h]
  float v139; // [rsp+10h] [rbp-188h]
  float v141; // [rsp+30h] [rbp-168h]
  int v143; // [rsp+40h] [rbp-158h]
  __int64 v144; // [rsp+48h] [rbp-150h]
  float v145; // [rsp+50h] [rbp-148h]
  float v146; // [rsp+50h] [rbp-148h]
  __int64 v147; // [rsp+68h] [rbp-130h]
  int v149; // [rsp+90h] [rbp-108h]
  __int64 v150; // [rsp+B8h] [rbp-E0h]
  int v152; // [rsp+C0h] [rbp-D8h]
  float v153; // [rsp+C4h] [rbp-D4h]
  double cosx; // [rsp+D0h] [rbp-C8h] BYREF
  double sinx; // [rsp+D8h] [rbp-C0h] BYREF
  float v156; // [rsp+E4h] [rbp-B4h] BYREF
  float v157; // [rsp+E8h] [rbp-B0h]
  float v158; // [rsp+ECh] [rbp-ACh]
  __int128 v159; // [rsp+F0h] [rbp-A8h] BYREF
  float v160; // [rsp+100h] [rbp-98h] BYREF
  float v161; // [rsp+104h] [rbp-94h]
  float v162; // [rsp+108h] [rbp-90h]
  float v163; // [rsp+10Ch] [rbp-8Ch]
  __int128 v164; // [rsp+110h] [rbp-88h] BYREF
  __int128 v165; // [rsp+120h] [rbp-78h]
  void *v166; // [rsp+130h] [rbp-68h] BYREF
  __int128 v167; // [rsp+138h] [rbp-60h]
  __int64 v168; // [rsp+148h] [rbp-50h]
  float v169; // [rsp+150h] [rbp-48h]
  unsigned __int64 v170; // [rsp+158h] [rbp-40h]

  *(_QWORD *)&v19 = *((unsigned int *)a4 + 1);
  v18 = (float)(a4[2] * a4[2]) + (float)((float)(*(float *)&v19 * *(float *)&v19) + (float)(*a4 * *a4));
  v170 = __readfsqword(0x28u);
  *(float *)&v19 = fsqrt(v18);
  if ( v18 < 0.0 )
  {
    v139 = a7;
    sqrtf(v18);
    a7 = v139;
    *(_QWORD *)&v19 = LODWORD(v19);
  }
  v20 = -acos((float)(fminf(fabs(a7), *(float *)&v19) / a7));
  v21 = v20 + v20;
  v22 = v21;
  v137 = v22;
  if ( (a14 & 4) != 0 )
    v137 = -v22;
  v23 = 312LL * (int)a3;
  v24 = 28664LL * (int)a1;
  v147 = (int)a1;
  v150 = 28664LL * (int)a1;
  v149 = *(_DWORD *)((char *)&unk_CEFE1A0 + v24 + v23 + 872);
  v144 = v24 + 636;
  v25 = (float *)((char *)&unk_CEFE1A0 + v24 + v23 + 636);
  sub_C4F0(&v166, v25, (char *)&unk_CEFE1A0 + 312 * (int)a2 + v24 + 636);
  sub_6E690(&v160, &v166, v21, v19, COERCE_DOUBLE(0x80000000LL), 0.0);
  v26 = a4[1];
  v27 = a5[1] * v26;
  v28 = a4[2];
  v29 = a5[4] * v26;
  v30 = v26 * a5[7];
  v31 = (float)((float)(*a5 * *a4) + v27) + (float)(a5[2] * v28);
  v32 = a5[3] * *a4;
  v33 = *a4 * a5[6];
  v156 = v31;
  v34 = v32 + v29;
  v35 = a5[5] * v28;
  v36 = v28 * a5[8];
  v37 = v34 + v35;
  v157 = v37;
  v38 = (float)(v30 + v33) + v36;
  v158 = v38;
  if ( (a14 & 4) != 0 || v37 <= -0.0625 )
  {
    v39 = v37;
    v40 = v37 * v37;
    v41 = -v39;
  }
  else
  {
    v157 = -0.0625;
    v40 = 0.00390625;
    v41 = 0.0625;
  }
  *((float *)&v167 + 2) = v41;
  *((float *)&v167 + 1) = -v31;
  *((float *)&v167 + 3) = -v38;
  v42 = (float)(v38 * v38) + (float)((float)(v31 * v31) + v40);
  v43 = fsqrt(v42);
  if ( v42 < 0.0 )
    sqrtf(v42);
  if ( v43 == 0.0 )
  {
    v44 = 0.0;
    *(_QWORD *)((char *)&v167 + 4) = 0;
    HIDWORD(v167) = 0;
    v45 = 0.0;
    v46 = 0.0;
  }
  else
  {
    v44 = *((float *)&v167 + 1) * (float)(1.0 / v43);
    v45 = *((float *)&v167 + 2) * (float)(1.0 / v43);
    v46 = (float)(1.0 / v43) * *((float *)&v167 + 3);
    *((float *)&v167 + 1) = v44;
    *((float *)&v167 + 2) = v45;
    *((float *)&v167 + 3) = v46;
  }
  *(float *)&v168 = (float)(*(float *)&dword_2EA0F4 * v46) - (float)(*(float *)&dword_2EA0F8 * v45);
  *((float *)&v168 + 1) = (float)(*(float *)&dword_2EA0F8 * v44) - (float)(v46 * *(float *)&dword_2EA0F0);
  v169 = (float)(*(float *)&dword_2EA0F0 * v45) - (float)(*(float *)&dword_2EA0F4 * v44);
  v47 = (float)(v169 * v169)
      + (float)((float)(*(float *)&v168 * *(float *)&v168) + (float)(*((float *)&v168 + 1) * *((float *)&v168 + 1)));
  v48 = fsqrt(v47);
  if ( v47 < 0.0 )
  {
    v145 = v48;
    sqrtf(v47);
    v48 = v145;
  }
  if ( v48 == 0.0 )
  {
    v49 = 0.0;
    v168 = 0;
    v169 = 0.0;
    v50 = 0.0;
    v51 = 0.0;
  }
  else
  {
    v49 = *(float *)&v168 * (float)(1.0 / v48);
    v50 = *((float *)&v168 + 1) * (float)(1.0 / v48);
    v51 = (float)(1.0 / v48) * v169;
    *(float *)&v168 = v49;
    *((float *)&v168 + 1) = v50;
    v169 = v51;
  }
  v52 = HIDWORD(v167);
  v53 = DWORD1(v167);
  *(float *)&v166 = (float)(*((float *)&v167 + 2) * v51) - (float)(*((float *)&v167 + 3) * v50);
  *((float *)&v166 + 1) = (float)(*((float *)&v167 + 3) * v49) - (float)(v51 * *((float *)&v167 + 1));
  *(float *)&v167 = (float)(v50 * *((float *)&v167 + 1)) - (float)(*((float *)&v167 + 2) * v49);
  v54 = (float)(*(float *)&v167 * *(float *)&v167)
      + (float)((float)(*(float *)&v166 * *(float *)&v166) + (float)(*((float *)&v166 + 1) * *((float *)&v166 + 1)));
  v55 = fsqrt(v54);
  if ( v54 < 0.0 )
  {
    v146 = v55;
    sqrtf(v54);
    v52 = HIDWORD(v167);
    v53 = DWORD1(v167);
    v55 = v146;
  }
  if ( v55 == 0.0 )
  {
    v56 = 0.0;
    LODWORD(v166) = 0;
    v57 = 0.0;
  }
  else
  {
    *(float *)&v166 = *(float *)&v166 * (float)(1.0 / v55);
    v57 = *((float *)&v166 + 1) * (float)(1.0 / v55);
    v56 = (float)(1.0 / v55) * *(float *)&v167;
  }
  v58 = v168;
  *((float *)&v167 + 1) = v57;
  *(_QWORD *)&v59 = HIDWORD(v168);
  *(float *)&v168 = v56;
  HIDWORD(v167) = HIDWORD(v168);
  HIDWORD(v166) = v53;
  LODWORD(v167) = v58;
  HIDWORD(v168) = v52;
  sub_C280(&v166, &dword_2EA0E0, a8);
  *(_QWORD *)&v60 = LODWORD(v137) ^ 0x80000000LL;
  *(float *)&v60 = *(float *)&v60 * 0.5;
  v153 = *(float *)&v60;
  sub_C280(&v166, &dword_2EA0F0, *(float *)&v60);
  sub_6E690(&v159, &v166, v60, v59, COERCE_DOUBLE(0x80000000LL), 0.0);
  v61 = *(float *)&v159;
  v62 = *((float *)&v159 + 1);
  v63 = *((float *)&v159 + 2);
  *(_QWORD *)&v64 = HIDWORD(v159);
  v164 = v159;
  if ( (a14 & 8) != 0 )
  {
    v166 = &unk_3F800000;
    *(_QWORD *)&v167 = 0;
    *((_QWORD *)&v167 + 1) = &unk_3F800000;
    v168 = 0;
    v169 = COERCE_FLOAT((_DWORD)&unk_3F800000);
    sub_C280(&v166, &dword_2EA0E0, a8);
    sub_C280(&v166, &dword_2EA0F0, v153);
    sub_6E690(&v164, &v166, COERCE_DOUBLE((unsigned __int64)LODWORD(v153)), v64, COERCE_DOUBLE(0x80000000LL), 0.0);
    LODWORD(v64) = HIDWORD(v159);
    v61 = *(float *)&v159;
    v62 = *((float *)&v159 + 1);
    v63 = *((float *)&v159 + 2);
  }
  v65 = -v160;
  v66 = -v161;
  v67 = -v162;
  if ( (float)((float)((float)((float)(v61 * v160) + (float)(v62 * v161)) + (float)(v63 * v162))
             + (float)(*(float *)&v64 * v163)) < 0.0 )
  {
    v67 = v162;
    v66 = v161;
    v65 = v160;
    v163 = -v163;
  }
  v160 = v65;
  v161 = v66;
  v162 = v67;
  sub_6FBC0(&v159, &v160, &v159);
  v68 = sub_71230(&v156, &v159);
  v69 = v149;
  *(_QWORD *)&v86 = LODWORD(v156);
  v70 = *v25;
  LODWORD(v141) = LODWORD(a9) ^ 0x80000000;
  v71 = (float *)((char *)&unk_24EAC1C0 + 144 * v149 + 16);
  v72 = fminf(a9, fmaxf(COERCE_FLOAT(LODWORD(a9) ^ 0x80000000), v68));
  v73 = v25[4];
  *(float *)&v86 = v156 * v72;
  v74 = v72;
  v75 = v157 * v72;
  v76 = v25[3];
  v77 = v74 * v158;
  v156 = *(float *)&v86;
  v78 = v76 * v75;
  v157 = v75;
  v79 = v73 * v75;
  v80 = v75 * v25[5];
  v158 = v77;
  v81 = (float)(v25[6] * v77) + (float)((float)(v70 * *(float *)&v86) + v78);
  v82 = v25[1] * *(float *)&v86;
  *(float *)&v86 = *(float *)&v86 * v25[2];
  *v71 = v81;
  v83 = (float)(v82 + v79) + (float)(v25[7] * v77);
  *(float *)&v86 = (float)(*(float *)&v86 + v80) + (float)(v77 * v25[8]);
  v71[1] = v83;
  v71[2] = *(float *)&v86;
  v84 = (float)(0.5 * *a6) + v81;
  *v71 = v84;
  v85 = v83 + (float)(0.5 * a6[1]);
  v71[1] = v85;
  *(float *)&v86 = *(float *)&v86 + (float)(0.5 * a6[2]);
  v71[2] = *(float *)&v86;
  if ( a3 == 10 )
  {
    v87 = (float *)((char *)&unk_CEFE1A0 + v150 + 26608);
  }
  else
  {
    if ( a3 != 13 )
      goto LABEL_28;
    v87 = (float *)((char *)&unk_CEFE1A0 + v150 + 26620);
  }
  *v71 = v84 + *v87;
  *((float *)&unk_24EAC1C0 + 36 * v149 + 5) = v85 + v87[1];
  *(float *)&v86 = *(float *)&v86 + v87[2];
  *((_DWORD *)&unk_24EAC1C0 + 36 * v149 + 6) = LODWORD(v86);
LABEL_28:
  if ( (a14 & 0x10) != 0 )
  {
    *(_QWORD *)&v86 = 1065353216;
    sub_2A0F0(a1, a2, a3, *a11, 1.0);
    sub_6EB30(a1, a2, a3, (char *)&unk_24ADC1C0 + 244 * v149 + 120);
    v69 = v149;
  }
  v88 = *a13;
  *((_DWORD *)&unk_24EAC1C0 + 36 * v69 + 19) = 0;
  v89 = (char *)&unk_24ADC1C0 + 244 * v69;
  *((_DWORD *)v89 + 34) = v88;
  *(_QWORD *)&v90 = *a12;
  *((_DWORD *)v89 + 35) = LODWORD(v90);
  v152 = *((_DWORD *)&unk_CEFE1A0 + 7166 * (int)a1 + 78 * (int)(a3 + 1) + 218);
  sub_C4F0(&v166, (char *)&unk_CEFE1A0 + v144 + v23 + 312, v25);
  sub_6E690(&v160, &v166, v90, v86, COERCE_DOUBLE(0x80000000LL), 0.0);
  sincos((float)(0.5 * v137), &sinx, &cosx);
  *(_QWORD *)((char *)&v159 + 4) = 0;
  *(_QWORD *)((char *)&v165 + 4) = 0;
  *(float *)&v90 = sinx;
  LODWORD(v159) = LODWORD(v90);
  LODWORD(v165) = LODWORD(v90);
  v91 = cosx;
  *((float *)&v159 + 3) = v91;
  *((float *)&v165 + 3) = v91;
  v92 = v91 * v163;
  v93 = -v160;
  v94 = -v161;
  v95 = -v162;
  if ( (float)((float)((float)((float)(*(float *)&v90 * v160) + (float)(v161 * 0.0)) + (float)(v162 * 0.0)) + v92) < 0.0
    && v92 < 0.0 )
  {
    v95 = v162;
    v94 = v161;
    v93 = v160;
    v163 = -v163;
  }
  v138 = (float *)((char *)&unk_CEFE1A0 + v144 + v23 + 312);
  v160 = v93;
  v161 = v94;
  v162 = v95;
  sub_6FBC0(&v159, &v160, &v159);
  v96 = sub_71230(&v156, &v159);
  *(_QWORD *)&v97 = LODWORD(v156);
  v98 = v138[3];
  v99 = v138[4];
  *(_QWORD *)&v100 = LODWORD(a9);
  *(float *)&v100 = fminf(a9, fmaxf(v141, v96));
  v101 = 144LL * v152;
  v102 = (float *)((char *)&unk_24EAC1C0 + v101 + 16);
  v103 = *(float *)&v100 * v158;
  v156 = v156 * *(float *)&v100;
  v104 = v98 * (float)(v157 * *(float *)&v100);
  v157 = v157 * *(float *)&v100;
  v105 = v156 * *v138;
  v106 = v99 * v157;
  v107 = v157 * v138[5];
  v158 = v103;
  v108 = (float)(v138[6] * v103) + (float)(v105 + v104);
  v109 = v138[1] * v156;
  *(float *)&v97 = v156 * v138[2];
  *v102 = v108;
  v110 = (float)(v109 + v106) + (float)(v138[7] * v103);
  *(float *)&v97 = (float)(*(float *)&v97 + v107) + (float)(v103 * v138[8]);
  v102[1] = v110;
  v102[2] = *(float *)&v97;
  *v102 = (float)(0.5 * *a6) + v108;
  v102[1] = v110 + (float)(0.5 * a6[1]);
  *(float *)&v97 = *(float *)&v97 + (float)(0.5 * a6[2]);
  v102[2] = *(float *)&v97;
  *(_DWORD *)((char *)&unk_24EAC1C0 + v101 + 76) = 0;
  v111 = (char *)&unk_24ADC1C0 + 244 * v152;
  *((_DWORD *)v111 + 34) = a13[1];
  *(_QWORD *)&v112 = a12[1];
  *((_DWORD *)v111 + 35) = LODWORD(v112);
  v143 = *((_DWORD *)&unk_CEFE1A0 + 7166 * v147 + 78 * (int)(a3 + 2) + 218);
  v113 = (float *)((char *)&unk_CEFE1A0 + v144 + v23 + 624);
  sub_C4F0(&v166, v113, v138);
  sub_6E690(&v160, &v166, v112, v97, COERCE_DOUBLE(0x80000000LL), v100);
  *(_QWORD *)&v159 = 0;
  *((_QWORD *)&v159 + 1) = 0x3F80000000000000LL;
  if ( (a14 & 2) == 0 )
  {
    if ( (a14 & 8) == 0 )
      goto LABEL_33;
    goto LABEL_46;
  }
  DWORD2(v165) ^= 0x80000000;
  *(float *)&v165 = -*(float *)&v165;
  *((float *)&v165 + 1) = -*((float *)&v165 + 1);
  *(_QWORD *)&v164 = v164 ^ 0x8000000080000000LL;
  v159 = v165;
  *((float *)&v164 + 2) = -*((float *)&v164 + 2);
  sub_6FBC0(&v159, &v159, &v164);
  v134 = a10[1];
  v135 = a10[2];
  v136 = a10[3];
  if ( (float)((float)((float)((float)(*(float *)&v159 * *a10) + (float)(*((float *)&v159 + 1) * v134))
                     + (float)(*((float *)&v159 + 2) * v135))
             + (float)(*((float *)&v159 + 3) * v136)) < 0.0 )
  {
    *a10 = -*a10;
    a10[1] = -v134;
    a10[2] = -v135;
    a10[3] = -v136;
  }
  sub_6FBC0(&v159, &v159, a10);
  if ( (a14 & 8) != 0 )
  {
LABEL_46:
    DWORD2(v165) ^= 0x80000000;
    *(_QWORD *)&v164 = v164 ^ 0x8000000080000000LL;
    *(float *)&v165 = -*(float *)&v165;
    *((float *)&v165 + 1) = -*((float *)&v165 + 1);
    v159 = v165;
    *((float *)&v164 + 2) = -*((float *)&v164 + 2);
    sub_6FBC0(&v159, &v159, &v164);
  }
LABEL_33:
  v114 = -v160;
  v115 = -v161;
  v116 = -v162;
  if ( (float)((float)((float)((float)(*(float *)&v159 * v160) + (float)(*((float *)&v159 + 1) * v161))
                     + (float)(*((float *)&v159 + 2) * v162))
             + (float)(*((float *)&v159 + 3) * v163)) < 0.0 )
  {
    v116 = v162;
    v115 = v161;
    v114 = v160;
    v163 = -v163;
  }
  v162 = v116;
  v160 = v114;
  v161 = v115;
  sub_6FBC0(&v159, &v160, &v159);
  v117 = fminf(a9, fmaxf(v141, sub_71230(&v156, &v159)));
  v118 = 144LL * v143;
  v119 = (float *)((char *)&unk_24EAC1C0 + v118 + 16);
  v120 = v156 * v117;
  v121 = v157 * v117;
  v122 = v117 * v158;
  v123 = v113[3] * v121;
  v124 = v113[4] * v121;
  v125 = v121 * v113[5];
  v126 = v122 * v113[8];
  v127 = (float)((float)(*v113 * v120) + v123) + (float)(v113[6] * v122);
  v128 = v113[1] * v120;
  v129 = v120 * v113[2];
  *v119 = v127;
  v130 = (float)(v128 + v124) + (float)(v113[7] * v122);
  v131 = (char *)&unk_24ADC1C0 + 244 * v143;
  v132 = v126 + (float)(v129 + v125);
  v119[1] = v130;
  v119[2] = v132;
  *v119 = v127 + (float)(0.5 * *a6);
  v119[1] = v130 + (float)(0.5 * a6[1]);
  v119[2] = (float)(0.5 * a6[2]) + v132;
  *(_DWORD *)((char *)&unk_24EAC1C0 + v118 + 76) = 0;
  *((_DWORD *)v131 + 34) = a13[2];
  result = __readfsqword(0x28u) ^ v170;
  *((_DWORD *)v131 + 35) = a12[2];
  return result;
}
