diff stru10.cpp @ 0:8b8875f5b359

Initial commit
author Nomad
date Fri, 05 Oct 2012 16:07:14 +0200
parents
children fde5c5acb66e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stru10.cpp	Fri Oct 05 16:07:14 2012 +0200
@@ -0,0 +1,1321 @@
+#include "stru10.h"
+#include "Render.h"
+#include "Indoor.h"
+#include "Game.h"
+#include "Party.h"
+
+#include "mm7_data.h"
+
+
+
+
+//----- (0049CE9E) --------------------------------------------------------
+void stru10::_49CE9E(BLVFace *pFace, RenderVertexSoft *a2, signed int a3, RenderVertexSoft *a4)
+{
+  char *v5; // eax@1
+  signed int v6; // edx@1
+  unsigned int v7; // eax@3
+  signed int v8; // ecx@11
+  signed int v9; // esi@11
+  RenderVertexSoft *v10; // edx@12
+  double v11; // st6@14
+  RenderVertexSoft *v12; // edx@19
+  signed int v13; // ecx@19
+  signed int v14; // esi@19
+  RenderVertexSoft *v15; // edi@20
+  double v16; // st6@22
+  signed int v17; // ecx@27
+  signed int v18; // edi@27
+  char *v19; // esi@28
+  double v20; // st6@30
+  signed int v21; // ecx@35
+  signed int v22; // edi@35
+  char *v23; // esi@36
+  double v24; // st7@38
+  signed int v25; // ecx@45
+  signed int v26; // esi@45
+  RenderVertexSoft *v27; // edx@46
+  double v28; // st6@48
+  signed int v29; // ecx@53
+  signed int v30; // esi@53
+  RenderVertexSoft *v31; // edi@54
+  double v32; // st6@56
+  signed int v33; // ecx@61
+  signed int v34; // edi@61
+  char *v35; // esi@62
+  double v36; // st6@64
+  signed int v37; // edi@69
+  char *v38; // esi@70
+  double v39; // st7@72
+  RenderVertexSoft *v40; // esi@77
+  signed int v41; // ecx@79
+  signed int v42; // esi@79
+  char *v43; // edx@80
+  double v44; // st6@82
+  RenderVertexSoft *v45; // eax@87
+  signed int v46; // ecx@87
+  signed int v47; // edi@87
+  char *v48; // esi@88
+  double v49; // st6@90
+  signed int v50; // ecx@96
+  signed int v51; // edi@96
+  char *v52; // esi@97
+  double v53; // st6@99
+  signed int v54; // ecx@105
+  signed int v55; // edi@105
+  char *v56; // esi@106
+  double v57; // st7@108
+  RenderVertexSoft a2a[64]; // [sp+0h] [bp-C18h]@1
+  float v59; // [sp+C00h] [bp-18h]@4
+  float v60; // [sp+C04h] [bp-14h]@9
+  float v61; // [sp+C08h] [bp-10h]@4
+  float v62; // [sp+C0Ch] [bp-Ch]@9
+  float v63; // [sp+C10h] [bp-8h]@4
+  float v64; // [sp+C14h] [bp-4h]@4
+  float a1a; // [sp+C20h] [bp+8h]@11
+  float a1b; // [sp+C20h] [bp+8h]@19
+  float a1c; // [sp+C20h] [bp+8h]@27
+  float a1d; // [sp+C20h] [bp+8h]@35
+  float a1e; // [sp+C20h] [bp+8h]@45
+  float a1f; // [sp+C20h] [bp+8h]@53
+  float a1g; // [sp+C20h] [bp+8h]@61
+  float a1h; // [sp+C20h] [bp+8h]@69
+  float a1i; // [sp+C20h] [bp+8h]@79
+  float a1j; // [sp+C20h] [bp+8h]@87
+  float a1k; // [sp+C20h] [bp+8h]@96
+  float a1l; // [sp+C20h] [bp+8h]@105
+
+  v5 = (char *)&a2a[0].flt_2C;
+  v6 = 64;
+  do
+  {
+    *(float *)v5 = 0.0;
+    v5 += 48;
+    --v6;
+  }
+  while ( v6 );
+  stru10::_49D379(pFace, a2a);
+  v7 = pFace->uAttributes;
+  if ( v7 & 0x100 )
+  {
+    v63 = a2a[0].vWorldPosition.x;
+    v59 = a2a[2].vWorldPosition.x;
+    v61 = a2a[1].vWorldPosition.y;
+    v64 = a2a[3].vWorldPosition.y;
+    goto LABEL_10;
+  }
+  if ( v7 & 0x200 )
+  {
+    v63 = a2a[0].vWorldPosition.x;
+    v59 = a2a[2].vWorldPosition.x;
+  }
+  else
+  {
+    if ( !(v7 & 0x400) )
+      goto LABEL_10;
+    v61 = a2a[0].vWorldPosition.y;
+    v64 = a2a[2].vWorldPosition.y;
+  }
+  v62 = a2a[1].vWorldPosition.z;
+  v60 = a2a[3].vWorldPosition.z;
+LABEL_10:
+  if ( v7 & 0x100 )
+  {
+    v8 = -1;
+    a1a = 3.4028235e38;
+    v9 = 0;
+    if ( a3 > 0 )
+    {
+      v10 = a2;
+      do
+      {
+        if ( v10->vWorldPosition.x <= (double)v63 )
+          v11 = v63 - v10->vWorldPosition.x;
+        else
+          v11 = v10->vWorldPosition.x - v63;
+        if ( v11 < a1a )
+        {
+          a1a = v11;
+          v8 = v9;
+        }
+        ++v9;
+        ++v10;
+      }
+      while ( v9 < a3 );
+    }
+    v12 = a4;
+    a1b = 3.4028235e38;
+    memcpy(a4, &a2[v8], 0x30u);
+    v13 = -1;
+    v14 = 0;
+    if ( a3 > 0 )
+    {
+      v15 = a2;
+      do
+      {
+        if ( v15->vWorldPosition.x <= (double)v59 )
+          v16 = v59 - v15->vWorldPosition.x;
+        else
+          v16 = v15->vWorldPosition.x - v59;
+        if ( v16 < a1b )
+        {
+          a1b = v16;
+          v13 = v14;
+        }
+        ++v14;
+        ++v15;
+      }
+      while ( v14 < a3 );
+    }
+    a1c = 3.4028235e38;
+    memcpy(&a4[2], &a2[v13], sizeof(a4[2]));
+    v17 = -1;
+    v18 = 0;
+    if ( a3 > 0 )
+    {
+      v19 = (char *)&a2->vWorldPosition.y;
+      do
+      {
+        if ( *(float *)v19 <= (double)v61 )
+          v20 = v61 - *(float *)v19;
+        else
+          v20 = *(float *)v19 - v61;
+        if ( v20 < a1c )
+        {
+          a1c = v20;
+          v17 = v18;
+        }
+        ++v18;
+        v19 += 48;
+      }
+      while ( v18 < a3 );
+    }
+    a1d = 3.4028235e38;
+    memcpy(&a4[1], &a2[v17], sizeof(a4[1]));
+    v21 = -1;
+    v22 = 0;
+    if ( a3 > 0 )
+    {
+      v23 = (char *)&a2->vWorldPosition.y;
+      do
+      {
+        if ( *(float *)v23 <= (double)v64 )
+          v24 = v64 - *(float *)v23;
+        else
+          v24 = *(float *)v23 - v64;
+        if ( v24 < a1d )
+        {
+          a1d = v24;
+          v21 = v22;
+        }
+        ++v22;
+        v23 += 48;
+      }
+      while ( v22 < a3 );
+    }
+LABEL_77:
+    v40 = &a2[v21];
+    goto LABEL_115;
+  }
+  if ( v7 & 0x200 )
+  {
+    v25 = -1;
+    a1e = 3.4028235e38;
+    v26 = 0;
+    if ( a3 > 0 )
+    {
+      v27 = a2;
+      do
+      {
+        if ( v27->vWorldPosition.x <= (double)v63 )
+          v28 = v63 - v27->vWorldPosition.x;
+        else
+          v28 = v27->vWorldPosition.x - v63;
+        if ( v28 < a1e )
+        {
+          a1e = v28;
+          v25 = v26;
+        }
+        ++v26;
+        ++v27;
+      }
+      while ( v26 < a3 );
+    }
+    v12 = a4;
+    a1f = 3.4028235e38;
+    memcpy(a4, &a2[v25], 0x30u);
+    v29 = -1;
+    v30 = 0;
+    if ( a3 > 0 )
+    {
+      v31 = a2;
+      do
+      {
+        if ( v31->vWorldPosition.x <= (double)v59 )
+          v32 = v59 - v31->vWorldPosition.x;
+        else
+          v32 = v31->vWorldPosition.x - v59;
+        if ( v32 < a1f )
+        {
+          a1f = v32;
+          v29 = v30;
+        }
+        ++v30;
+        ++v31;
+      }
+      while ( v30 < a3 );
+    }
+    a1g = 3.4028235e38;
+    memcpy(&a4[2], &a2[v29], sizeof(a4[2]));
+    v33 = -1;
+    v34 = 0;
+    if ( a3 > 0 )
+    {
+      v35 = (char *)&a2->vWorldPosition.z;
+      do
+      {
+        if ( *(float *)v35 <= (double)v62 )
+          v36 = v62 - *(float *)v35;
+        else
+          v36 = *(float *)v35 - v62;
+        if ( v36 < a1g )
+        {
+          a1g = v36;
+          v33 = v34;
+        }
+        ++v34;
+        v35 += 48;
+      }
+      while ( v34 < a3 );
+    }
+    a1h = 3.4028235e38;
+    memcpy(&a4[1], &a2[v33], sizeof(a4[1]));
+    v21 = -1;
+    v37 = 0;
+    if ( a3 > 0 )
+    {
+      v38 = (char *)&a2->vWorldPosition.z;
+      do
+      {
+        if ( *(float *)v38 <= (double)v60 )
+          v39 = v60 - *(float *)v38;
+        else
+          v39 = *(float *)v38 - v60;
+        if ( v39 < a1h )
+        {
+          a1h = v39;
+          v21 = v37;
+        }
+        ++v37;
+        v38 += 48;
+      }
+      while ( v37 < a3 );
+    }
+    goto LABEL_77;
+  }
+  if ( !(v7 & 0x400) )
+    return;
+  v41 = -1;
+  a1i = 3.4028235e38;
+  v42 = 0;
+  if ( a3 > 0 )
+  {
+    v43 = (char *)&a2->vWorldPosition.y;
+    do
+    {
+      if ( *(float *)v43 <= (double)v61 )
+        v44 = v61 - *(float *)v43;
+      else
+        v44 = *(float *)v43 - v61;
+      if ( v44 < a1i )
+      {
+        a1i = v44;
+        v41 = v42;
+      }
+      ++v42;
+      v43 += 48;
+    }
+    while ( v42 < a3 );
+  }
+  v45 = a2;
+  v12 = a4;
+  a1j = 3.4028235e38;
+  memcpy(a4, &a2[v41], 0x30u);
+  v46 = -1;
+  v47 = 0;
+  if ( a3 > 0 )
+  {
+    v48 = (char *)&a2->vWorldPosition.y;
+    do
+    {
+      if ( *(float *)v48 <= (double)v64 )
+        v49 = v64 - *(float *)v48;
+      else
+        v49 = *(float *)v48 - v64;
+      if ( v49 < a1j )
+      {
+        a1j = v49;
+        v46 = v47;
+      }
+      ++v47;
+      v48 += 48;
+    }
+    while ( v47 < a3 );
+    v45 = a2;
+  }
+  a1k = 3.4028235e38;
+  memcpy(&a4[2], &v45[v46], sizeof(a4[2]));
+  v50 = -1;
+  v51 = 0;
+  if ( a3 > 0 )
+  {
+    v52 = (char *)&v45->vWorldPosition.z;
+    do
+    {
+      if ( *(float *)v52 <= (double)v62 )
+        v53 = v62 - *(float *)v52;
+      else
+        v53 = *(float *)v52 - v62;
+      if ( v53 < a1k )
+      {
+        a1k = v53;
+        v50 = v51;
+      }
+      ++v51;
+      v52 += 48;
+    }
+    while ( v51 < a3 );
+    v45 = a2;
+  }
+  a1l = 3.4028235e38;
+  memcpy(&a4[1], &v45[v50], sizeof(a4[1]));
+  v54 = -1;
+  v55 = 0;
+  if ( a3 > 0 )
+  {
+    v56 = (char *)&v45->vWorldPosition.z;
+    do
+    {
+      if ( *(float *)v56 <= (double)v60 )
+        v57 = v60 - *(float *)v56;
+      else
+        v57 = *(float *)v56 - v60;
+      if ( v57 < a1l )
+      {
+        a1l = v57;
+        v54 = v55;
+      }
+      ++v55;
+      v56 += 48;
+    }
+    while ( v55 < a3 );
+    v45 = a2;
+  }
+  v40 = &v45[v54];
+LABEL_115:
+  memcpy(&v12[3], v40, sizeof(v12[3]));
+}
+
+//----- (0049D379) --------------------------------------------------------
+int stru10::_49D379(BLVFace *pFace, RenderVertexSoft *pVertices)
+{
+  BLVFace *v3; // edx@1
+  Vec3_short_ *v4; // ecx@1
+  int v5; // eax@2
+  unsigned __int16 *v6; // esi@3
+  char *v7; // eax@3
+  int v8; // ebx@4
+  int v9; // edi@4
+  int v10; // ebx@4
+  int v11; // edi@4
+  double v12; // st7@4
+  int v13; // edi@4
+  unsigned __int16 *v14; // esi@7
+  char *v15; // eax@7
+  int v16; // ebx@8
+  int v17; // edi@8
+  int v18; // ebx@8
+  int v19; // edi@8
+  double v20; // st7@8
+  int v21; // edi@8
+  unsigned __int16 *v22; // esi@11
+  char *v23; // eax@11
+  int v24; // ebx@12
+  int v25; // edi@12
+  int v26; // ebx@12
+  int v27; // edi@12
+  double v28; // st7@12
+  int v29; // edi@12
+  int v30; // eax@13
+  double v31; // st7@13
+  char *v32; // esi@14
+  int v33; // edi@14
+  int v34; // eax@24
+  Vec3_short_ *v35; // eax@24
+  signed int v36; // ecx@24
+  signed int v37; // eax@24
+  Vec3_short_ *v38; // eax@24
+  signed int v39; // ecx@24
+  signed int v40; // eax@24
+  Vec3_short_ *v41; // eax@24
+  signed int v42; // ecx@24
+  signed int v43; // eax@24
+  Vec3_short_ *v44; // eax@24
+  signed int v45; // ecx@24
+  signed int result; // eax@24
+  char v47; // [sp+10h] [bp-350h]@3
+  RenderVertexSoft v48; // [sp+30Ch] [bp-54h]@24
+  int v49; // [sp+33Ch] [bp-24h]@16
+  int v50; // [sp+340h] [bp-20h]@20
+  int v51; // [sp+344h] [bp-1Ch]@18
+  int v52; // [sp+348h] [bp-18h]@22
+  unsigned __int16 *v53; // [sp+34Ch] [bp-14h]@3
+  Vec3_short_ *v54; // [sp+350h] [bp-10h]@3
+  float v55; // [sp+354h] [bp-Ch]@1
+  float v56; // [sp+358h] [bp-8h]@4
+  Vec3_short_ *v57; // [sp+35Ch] [bp-4h]@4
+  int pFacea; // [sp+368h] [bp+8h]@2
+  int pFaceb; // [sp+368h] [bp+8h]@6
+  int pFacec; // [sp+368h] [bp+8h]@10
+  float pFaced; // [sp+368h] [bp+8h]@13
+  signed int pFacee; // [sp+368h] [bp+8h]@24
+  signed int pFacef; // [sp+368h] [bp+8h]@24
+  signed int pFaceg; // [sp+368h] [bp+8h]@24
+  signed int pFaceh; // [sp+368h] [bp+8h]@24
+
+  v3 = pFace;
+  v4 = pIndoor->pVertices;
+  LODWORD(v55) = pFace->uAttributes;
+  if ( BYTE1(v55) & 1 )
+  {
+    v5 = pFace->uNumVertices;
+    pFacea = 0;
+    if ( v5 > 0 )
+    {
+      v6 = v3->pVertexIDs;
+      v7 = &v47;
+      v53 = (unsigned short *)((char *)v3->pXInterceptDisplacements - (char *)v6);
+      v54 = (Vec3_short_ *)((char *)v3->pYInterceptDisplacements - (char *)v6);
+      do
+      {
+        v8 = *(unsigned __int16 *)((char *)v53 + (int)v6);
+        v57 = &v4[*v6];
+        LODWORD(v56) = v57->x + v8;
+        v9 = *(__int16 *)((char *)&v54->x + (int)v6);
+        v10 = v57->y;
+        *((float *)v7 - 1) = (double)SLODWORD(v56);
+        v57 = (Vec3_short_ *)(v10 + v9);
+        v11 = pFacea;
+        v12 = (double)(signed int)v57;
+        ++pFacea;
+        *((int *)v7 + 1) = v11;
+        v13 = v3->uNumVertices;
+        *(float *)v7 = v12;
+        v7 += 12;
+        ++v6;
+      }
+      while ( pFacea < v13 );
+    }
+  }
+  if ( BYTE1(v55) & 2 )
+  {
+    pFaceb = 0;
+    if ( (signed int)v3->uNumVertices > 0 )
+    {
+      v14 = v3->pVertexIDs;
+      v15 = &v47;
+      v53 = (unsigned short *)((char *)v3->pXInterceptDisplacements - (char *)v14);
+      LODWORD(v56) = (char *)v3->pZInterceptDisplacements - (char *)v14;
+      do
+      {
+        v16 = *(unsigned __int16 *)((char *)v53 + (int)v14);
+        v54 = &v4[*v14];
+        v57 = (Vec3_short_ *)(v54->x + v16);
+        v17 = *(signed __int16 *)((char *)v14 + LODWORD(v56));
+        v18 = v54->z;
+        *((float *)v15 - 1) = (double)(signed int)v57;
+        v57 = (Vec3_short_ *)(v18 + v17);
+        v19 = pFaceb;
+        v20 = (double)(signed int)v57;
+        ++pFaceb;
+        *((int *)v15 + 1) = v19;
+        v21 = v3->uNumVertices;
+        *(float *)v15 = v20;
+        v15 += 12;
+        ++v14;
+      }
+      while ( pFaceb < v21 );
+    }
+  }
+  if ( BYTE1(v55) & 4 )
+  {
+    pFacec = 0;
+    if ( (signed int)v3->uNumVertices > 0 )
+    {
+      v22 = v3->pVertexIDs;
+      v23 = &v47;
+      v54 = (Vec3_short_ *)((char *)v3->pYInterceptDisplacements - (char *)v22);
+      LODWORD(v56) = (char *)v3->pZInterceptDisplacements - (char *)v22;
+      do
+      {
+        v24 = *(__int16 *)((char *)&v54->x + (int)v22);
+        LODWORD(v55) = (unsigned int)&v4[*v22];
+        v57 = (Vec3_short_ *)(*(short *)(LODWORD(v55) + 2) + v24);
+        v25 = *(signed __int16 *)((char *)v22 + LODWORD(v56));
+        v26 = *(short *)(LODWORD(v55) + 4);
+        *((float *)v23 - 1) = (double)(signed int)v57;
+        v57 = (Vec3_short_ *)(v26 + v25);
+        v27 = pFacec;
+        v28 = (double)(signed int)v57;
+        ++pFacec;
+        *((int *)v23 + 1) = v27;
+        v29 = v3->uNumVertices;
+        *(float *)v23 = v28;
+        v23 += 12;
+        ++v22;
+      }
+      while ( pFacec < v29 );
+    }
+  }
+  v30 = v3->uNumVertices;
+  pFaced = 3.4028235e38;
+  v56 = 3.4028235e38;
+  v31 = -3.4028235e38;
+  v55 = -3.4028235e38;
+  if ( v30 > 0 )
+  {
+    v32 = &v47;
+    v33 = v30;
+    do
+    {
+      if ( *((float *)v32 - 1) < (double)pFaced )
+      {
+        LODWORD(pFaced) = *((int *)v32 - 1);
+        v49 = *((int *)v32 + 1);
+      }
+      if ( *((float *)v32 - 1) > (double)v55 )
+      {
+        LODWORD(v55) = *((int *)v32 - 1);
+        v51 = *((int *)v32 + 1);
+      }
+      if ( *(float *)v32 < (double)v56 )
+      {
+        LODWORD(v56) = *(int *)v32;
+        v50 = *((int *)v32 + 1);
+      }
+      if ( v31 < *(float *)v32 )
+      {
+        v31 = *(float *)v32;
+        v52 = *((int *)v32 + 1);
+      }
+      v32 += 12;
+      --v33;
+    }
+    while ( v33 );
+  }
+  v34 = v3->pVertexIDs[v49];
+  v48.flt_2C = 0.0;
+  v35 = &v4[v34];
+  pFacee = v35->x;
+  v36 = v35->y;
+  v37 = v35->z;
+  v48.vWorldPosition.x = (double)pFacee;
+  v48.vWorldPosition.y = (double)v36;
+  v48.vWorldPosition.z = (double)v37;
+  memcpy(pVertices, &v48, 0x30u);
+  v48.flt_2C = 0.0;
+  v38 = &pIndoor->pVertices[v3->pVertexIDs[v50]];
+  pFacef = v38->x;
+  v39 = v38->y;
+  v40 = v38->z;
+  v48.vWorldPosition.x = (double)pFacef;
+  v48.vWorldPosition.y = (double)v39;
+  v48.vWorldPosition.z = (double)v40;
+  memcpy(&pVertices[1], &v48, sizeof(pVertices[1]));
+  v48.flt_2C = 0.0;
+  v41 = &pIndoor->pVertices[v3->pVertexIDs[v51]];
+  pFaceg = v41->x;
+  v42 = v41->y;
+  v43 = v41->z;
+  v48.vWorldPosition.x = (double)pFaceg;
+  v48.vWorldPosition.y = (double)v42;
+  v48.vWorldPosition.z = (double)v43;
+  memcpy(&pVertices[2], &v48, sizeof(pVertices[2]));
+  v48.flt_2C = 0.0;
+  v44 = &pIndoor->pVertices[v3->pVertexIDs[v52]];
+  pFaceh = v44->x;
+  v45 = v44->y;
+  result = v44->z;
+  v48.vWorldPosition.x = (double)pFaceh;
+  v48.vWorldPosition.y = (double)v45;
+  v48.vWorldPosition.z = (double)result;
+  memcpy(&pVertices[3], &v48, sizeof(pVertices[3]));
+  return result;
+}
+
+
+//----- (0049C9E3) --------------------------------------------------------
+bool stru10::_49C9E3(BLVFace *a3, RenderVertexSoft *arg4, unsigned int uNumVertices, RenderVertexSoft *arg0)
+{
+  __debugbreak();
+  return 0;
+  /*IndoorCameraD3D *v6; // edi@1
+  PolygonType v7; // al@1
+  unsigned int v8; // edx@7
+  char v10; // zf@10
+  float v13; // ST14_4@20
+  stru10 *v15; // ecx@21
+  RenderVertexSoft *v16; // ST0C_4@21
+  bool result; // eax@21
+  float v18; // ST14_4@24
+  stru10 *v19; // edi@29
+  float v20; // ST14_4@30
+  float v21; // ST14_4@30
+  float v22; // ST14_4@30
+  float v23; // ST14_4@30
+  float v24; // ST14_4@31
+  RenderVertexSoft v25; // [sp+10h] [bp-90h]@24
+  RenderVertexSoft v26; // [sp+40h] [bp-60h]@20
+  IndoorCameraD3D *thisa; // [sp+70h] [bp-30h]@1
+  stru10 *v31; // [sp+84h] [bp-1Ch]@1
+  float v32; // [sp+88h] [bp-18h]@8
+  Vec3_float_ a1; // [sp+8Ch] [bp-14h]@1
+  float v35; // [sp+9Ch] [bp-4h]@8
+
+  _ESI = a3;
+  v31 = this;
+  __asm
+  {
+    fld     dword ptr [esi]
+    fld     dword ptr [esi+4]
+    fldz
+  }
+  v6 = pGame->pIndoorCameraD3D;
+  v7 = a3->uPolygonType;
+  __asm
+  {
+    fstp    [ebp+var_28]
+    fldz
+  }
+  thisa = v6;
+  __asm
+  {
+    fstp    [ebp+var_24]
+    fldz
+    fstp    [ebp+a1.x]
+    fldz
+    fstp    [ebp+a1.y]
+    fldz
+    fstp    [ebp+a1.z]
+  }
+  if ( v7 == 1 )
+  {
+    __asm
+    {
+      fchs
+      fstp    [ebp+a1.x]
+      fstp    [ebp+a1.y]
+      fldz
+      fstp    [ebp+a1.z]
+    }
+    a1.Normalize();
+    __asm
+    {
+      fldz
+      fstp    [ebp+var_28]
+      fld1
+    }
+LABEL_6:
+    __asm { fstp    [ebp+var_24] }
+    goto LABEL_7;
+  }
+  __asm
+  {
+    fstp    st
+    fstp    st
+  }
+  if ( v7 == 3 || v7 == 5 )
+  {
+    __asm
+    {
+      fld1
+      fstp    [ebp+a1.x]
+      fldz
+      fstp    [ebp+a1.y]
+      fldz
+      fstp    [ebp+a1.z]
+      fld1
+      fstp    [ebp+var_28]
+      fldz
+    }
+    goto LABEL_6;
+  }
+LABEL_7:
+  v8 = _ESI->uAttributes;
+  _ECX = arg4;
+  __asm { fld     ds:flt_4D84F0 }
+  if ( BYTE1(v8) & 1 )
+  {
+    __asm
+    {
+      fld     dword ptr [ecx+60h]
+      fadd    dword ptr [ecx]
+      fmul    st, st(1)
+      fstp    [ebp+arg4]
+      fld     dword ptr [ecx+94h]
+      fadd    dword ptr [ecx+34h]
+      fmul    st, st(1)
+      fstp    [ebp+var_18]
+      fld     dword ptr [ecx+68h]
+      fadd    dword ptr [ecx+8]
+      fmul    st, st(1)
+      fstp    [ebp+var_4]
+      fld     [ebp+arg4]
+      fsub    dword ptr [ecx]
+      fstp    [ebp+a3]
+      fld     [ebp+var_18]
+      fsub    dword ptr [ecx+34h]
+      fstp    [ebp+var_8]
+    }
+  }
+  if ( BYTE1(v8) & 2 )
+  {
+    __asm
+    {
+      fld     dword ptr [ecx+60h]
+      fadd    dword ptr [ecx]
+    }
+    v10 = _ESI->uPolygonType == 1;
+    __asm
+    {
+      fmul    st, st(1)
+      fstp    [ebp+arg4]
+      fld     dword ptr [ecx+64h]
+      fadd    dword ptr [ecx+4]
+      fmul    st, st(1)
+      fstp    [ebp+var_18]
+      fld     dword ptr [ecx+98h]
+      fadd    dword ptr [ecx+38h]
+      fmul    st, st(1)
+      fstp    [ebp+var_4]
+      fld     [ebp+arg4]
+      fsub    dword ptr [ecx]
+      fstp    [ebp+a3]
+      fld     [ebp+var_4]
+      fsub    dword ptr [ecx+38h]
+      fstp    [ebp+var_8]
+    }
+    if ( v10 )
+    {
+      __asm
+      {
+        fld     [ebp+a1.x]
+        fcomp   ds:dword_4D84A8
+        fnstsw  ax
+      }
+      if ( __SETP__(HIBYTE(_AX) & 0x44, 0) )
+      {
+        __asm
+        {
+          fld     [ebp+a3]
+          fdiv    [ebp+a1.x]
+          fstp    [ebp+a3]
+        }
+      }
+    }
+  }
+  if ( BYTE1(v8) & 4 )
+  {
+    __asm
+    {
+      fld     dword ptr [ecx+60h]
+      fadd    dword ptr [ecx]
+    }
+    v10 = _ESI->uPolygonType == 1;
+    __asm
+    {
+      fmul    st, st(1)
+      fstp    [ebp+arg4]
+      fld     dword ptr [ecx+64h]
+      fadd    dword ptr [ecx+4]
+      fmul    st, st(1)
+      fstp    [ebp+var_18]
+      fld     dword ptr [ecx+98h]
+      fadd    dword ptr [ecx+38h]
+      fmul    st, st(1)
+      fstp    [ebp+var_4]
+      fstp    st
+      fld     [ebp+var_18]
+      fsub    dword ptr [ecx+4]
+      fstp    [ebp+a3]
+      fld     [ebp+var_4]
+      fsub    dword ptr [ecx+38h]
+      fstp    [ebp+var_8]
+    }
+    if ( v10 )
+    {
+      __asm
+      {
+        fld     [ebp+a1.x]
+        fcomp   ds:dword_4D84A8
+        fnstsw  ax
+      }
+      if ( __SETP__(HIBYTE(_AX) & 0x44, 0) )
+      {
+        __asm
+        {
+          fld     [ebp+a3]
+          fdiv    [ebp+a1.y]
+          fstp    [ebp+a3]
+        }
+      }
+    }
+  }
+  else
+  {
+    __asm { fstp    st }
+  }
+  if ( byte_4D864C && pGame->uFlags & 8 )
+  {
+    __asm { fldz }
+    LODWORD(v26.vWorldPosition.x) = arg4;
+    __asm { fstp    [ebp+var_60.flt_2C] }
+    v26.vWorldPosition.y = v32;
+    __asm { fldz }
+    v26.vWorldPosition.z = v35;
+    __asm { fstp    [esp+0A0h+var_A0] }
+    v6->do_draw_debug_line_sw(_ECX, 0xFF00u, &v26, 0xFF0000u, 0, v13);
+  }
+  __asm
+  {
+    fld     [ebp+var_8]
+    fmul    ds:flt_4D84E8
+    fld     [ebp+var_8]
+    fmul    [ebp+var_28]
+    fld     [ebp+var_8]
+    fmul    [ebp+var_24]
+  }
+  _EBX = arg0;
+  v15 = v31;
+  __asm
+  {
+    fst     [ebp+var_20]
+    fld     [ebp+a3]
+    fmul    [ebp+a1.x]
+    fld     [ebp+a3]
+    fmul    [ebp+a1.y]
+    fld     [ebp+a3]
+    fmul    [ebp+a1.z]
+  }
+  v16 = arg0;
+  __asm
+  {
+    fstp    [ebp+var_8]
+    fld     [ebp+arg4]
+    fsub    st, st(2)
+    fld     st
+    fadd    st, st(6)
+    fstp    dword ptr [ebx]
+    fld     [ebp+var_18]
+    fsub    st, st(2)
+    fld     st
+    fadd    st, st(6)
+    fstp    dword ptr [ebx+4]
+    fld     [ebp+var_4]
+    fsub    [ebp+var_8]
+    fst     [ebp+a3]
+    fadd    st, st(5)
+    fstp    dword ptr [ebx+8]
+    fld     st(1)
+    fsub    st, st(7)
+    fstp    dword ptr [ebx+30h]
+    fsub    st, st(5)
+    fstp    dword ptr [ebx+34h]
+    fstp    st
+    fld     [ebp+a3]
+    fsub    st, st(3)
+    fstp    dword ptr [ebx+38h]
+    fld     st(1)
+    fadd    [ebp+arg4]
+    fst     [ebp+a3]
+    fsub    st, st(5)
+    fstp    dword ptr [ebx+60h]
+    fadd    [ebp+var_18]
+    fstp    st(2)
+    fstp    st
+    fld     st
+    fsub    st, st(2)
+    fstp    dword ptr [ebx+64h]
+    fld     [ebp+var_8]
+    fadd    [ebp+var_4]
+    fst     [ebp+arg0]
+    fsub    [ebp+var_20]
+    fstp    dword ptr [ebx+68h]
+    fld     [ebp+a3]
+    fadd    st, st(3)
+    fstp    dword ptr [ebx+90h]
+    fadd    st, st(1)
+    fstp    dword ptr [ebx+94h]
+    fstp    st
+    fstp    st
+    fld     [ebp+arg0]
+    fadd    [ebp+var_20]
+    fstp    dword ptr [ebx+98h]
+    fldz
+    fstp    [ebp+a1.x]
+    fldz
+    fstp    [ebp+a1.y]
+    fldz
+    fstp    [ebp+a1.z]
+  }
+  result = this->_49C8DC(v16, &a1, (float *)&a3);
+  if ( result )
+  {
+    if ( byte_4D864C )
+    {
+      HIWORD(result) = HIWORD(pGame);
+      if ( pGame->uFlags & 8 )
+      {
+        __asm
+        {
+          fldz
+          fstp    [ebp+var_60.flt_2C]
+          fld     ds:flt_4D8770
+          fld     [ebp+a1.x]
+          fmul    st, st(1)
+        }
+        LODWORD(v25.vWorldPosition.x) = (uint)arg4;
+        v25.vWorldPosition.y = v32;
+        __asm
+        {
+          fstp    [ebp+var_60.vWorldPosition.x]
+          fld     [ebp+a1.y]
+          fmul    st, st(1)
+        }
+        v25.vWorldPosition.z = v35;
+        __asm
+        {
+          fstp    [ebp+var_60.vWorldPosition.y]
+          fld     [ebp+a1.z]
+          fmul    st, st(1)
+          fstp    [ebp+var_60.vWorldPosition.z]
+          fstp    st
+          fldz
+          fstp    [ebp+var_90.flt_2C]
+          fldz
+          fstp    [esp+0A0h+var_A0]
+        }
+        pGame->pIndoorCameraD3D->do_draw_debug_line_sw(&v25, 0xFFFFFFFFu, &v26, 0xFFFF00u, 0, v18);
+      }
+    }
+    __asm { fild    pBLVRenderParams->vPartyPos.z }
+    memcpy(&v25, _EBX, sizeof(v25));
+    __asm
+    {
+      fsubr   [ebp+var_90.vWorldPosition.z]
+      fmul    [ebp+a1.z]
+      fild    pBLVRenderParams->vPartyPos.y
+      fsubr   [ebp+var_90.vWorldPosition.y]
+      fmul    [ebp+a1.y]
+      faddp   st(1), st
+      fild    pBLVRenderParams->vPartyPos.x
+      fsubr   [ebp+var_90.vWorldPosition.x]
+      fmul    [ebp+a1.x]
+      faddp   st(1), st
+      fcomp   ds:flt_4D84E8
+      fnstsw  ax
+    }
+    if ( !__SETP__(BYTE1(result) & 5, 0) )
+    {
+      result = (bool)&_EBX[1];
+      memcpy(&v25, &_EBX[1], sizeof(v25));
+      memcpy(&_EBX[1], &_EBX[3], sizeof(_EBX[1]));
+      memcpy(&_EBX[3], &v25, sizeof(_EBX[3]));
+    }
+    if ( byte_4D864C && pGame->uFlags & 8 )
+    {
+      v19 = v31;
+      if ( !LOBYTE(v31->field_4) )
+      {
+        __asm
+        {
+          fldz
+          fstp    [ebp+var_60.flt_2C]
+          fild    pParty->vPosition.x
+        }
+        a3 = (BLVFace *)(pParty->vPosition.y + pParty->sEyelevel);
+        __asm
+        {
+          fstp    [ebp+var_60.vWorldPosition.x]
+          fild    pParty->vPosition.z
+          fstp    [ebp+var_60.vWorldPosition.y]
+          fild    [ebp+a3]
+          fstp    [ebp+var_60.vWorldPosition.z]
+          fldz
+          fstp    [esp+0A0h+var_A0]
+        }
+        IndoorCameraD3D::do_draw_debug_line_sw(pGame->pIndoorCameraD3D, &v26, 0xFF0000u, _EBX, 0xFF0000u, 0, v20);
+        __asm
+        {
+          fldz
+          fstp    [esp+0A0h+var_A0]
+        }
+        IndoorCameraD3D::do_draw_debug_line_sw(pGame->pIndoorCameraD3D, &v26, 0xFF00u, _EBX + 1, 0xFF00u, 0, v21);
+        __asm
+        {
+          fldz
+          fstp    [esp+0A0h+var_A0]
+        }
+        IndoorCameraD3D::do_draw_debug_line_sw(pGame->pIndoorCameraD3D, &v26, 0xFFu, _EBX + 2, 0xFFu, 0, v22);
+        __asm
+        {
+          fldz
+          fstp    [esp+0A0h+var_A0]
+        }
+        IndoorCameraD3D::do_draw_debug_line_sw(pGame->pIndoorCameraD3D, &v26, 0xFFFFFFu, _EBX + 3, 0xFFFFFFu, 0, v23);
+        LOBYTE(v19->field_4) = 1;
+      }
+      __asm
+      {
+        fld     ds:flt_4D86E8
+        fstp    [esp+0A0h+var_A0]
+      }
+      IndoorCameraD3D::debug_outline_sw(thisa, _EBX, uNumVertices, 0x1EFF1Eu, v24);
+    }
+    LOBYTE(result) = 1;
+  }
+  return result;*/
+}
+
+
+
+//----- (0049C5B0) --------------------------------------------------------
+stru10::stru10()
+{
+  LOBYTE(this->field_4) = 0;
+}
+
+//----- (0049C5BD) --------------------------------------------------------
+stru10::~stru10()
+{
+}
+
+//----- (0049C5DA) --------------------------------------------------------
+char stru10::_49C5DA(BLVFace *a2, RenderVertexSoft *a3, int *a4, IndoorCameraD3D_Vec4 *a5, RenderVertexSoft *a6)
+{
+  stru10 *v6; // edi@1
+  char *v7; // eax@1
+  signed int v8; // ecx@1
+  IndoorCameraD3D *v9; // esi@3
+  char result; // al@6
+  RenderVertexSoft a4a[4]; // [sp+Ch] [bp-C0h]@1
+
+  v6 = this;
+  v7 = (char *)&a4a[0].flt_2C;
+  v8 = 4;
+  do
+  {
+    *(float *)v7 = 0.0;
+    v7 += 48;
+    --v8;
+  }
+  while ( v8 );
+  v9 = pGame->pIndoorCameraD3D;
+  _49CE9E(a2, a3, *a4, a4a);
+  if ( byte_4D864C && pGame->uFlags & 8 )
+    pGame->pIndoorCameraD3D->debug_outline_sw(a4a, 4u, 0xFF1E1Eu, 0.000099999997);
+  result = _49C9E3(a2, a4a, 4u, a6);
+  if ( result )
+    result = _49C720(a6, a5);
+  return result;
+}
+// 4D864C: using guessed type char byte_4D864C;
+
+//----- (0049C681) --------------------------------------------------------
+char stru10::_49C681(BLVFace *pFace, IndoorCameraD3D_Vec4 *a3, RenderVertexSoft *pArrayOf4)
+{
+  stru10 *v4; // edi@1
+  char *v5; // eax@1
+  signed int v6; // ecx@1
+  IndoorCameraD3D *v7; // esi@3
+  char result; // al@6
+  RenderVertexSoft a2a[4]; // [sp+Ch] [bp-C0h]@1
+
+  v4 = this;
+  v5 = (char *)&a2a[0].flt_2C;
+  v6 = 4;
+  do
+  {
+    *(float *)v5 = 0.0;
+    v5 += 48;
+    --v6;
+  }
+  while ( v6 );
+  v7 = pGame->pIndoorCameraD3D;
+  _49D379(pFace, a2a);
+  if ( byte_4D864C && pGame->uFlags & 8 )
+    pGame->pIndoorCameraD3D->debug_outline_sw(a2a, 4u, 0xFF1E1Eu, 0.000099999997);
+  result = _49C9E3(pFace, a2a, 4u, pArrayOf4);
+  if ( result )
+    result = _49C720(pArrayOf4, a3);
+  return result;
+}
+// 4D864C: using guessed type char byte_4D864C;
+
+//----- (0049C720) --------------------------------------------------------
+char stru10::_49C720(RenderVertexSoft *a2, IndoorCameraD3D_Vec4 *a4)
+{
+  char result; // al@2
+  Vec3_float_ a3; // [sp+4h] [bp-34h]@1
+  float v5; // [sp+30h] [bp-8h]@1
+  stru10 *thisa; // [sp+34h] [bp-4h]@1
+
+  v5 = 0.0;
+  a3.x = (double)pBLVRenderParams->vPartyPos.x;
+  a3.y = (double)pBLVRenderParams->vPartyPos.y;
+  thisa = this;
+  a3.z = (double)pBLVRenderParams->vPartyPos.z;
+  if ( _49C7C5(a2, a2 + 1, &a3, a4)
+    && _49C7C5(a2 + 1, a2 + 2, &a3, a4 + 1)
+    && _49C7C5(a2 + 2, a2 + 3, &a3, a4 + 2) )
+    result = _49C7C5(a2 + 3, a2, &a3, a4 + 3) != 0;
+  else
+    result = 0;
+  return result;
+}
+
+//----- (0049C7C5) --------------------------------------------------------
+bool stru10::_49C7C5(RenderVertexSoft *a1, RenderVertexSoft *a2, Vec3_float_ *a3, IndoorCameraD3D_Vec4 *a4)
+{
+  double v5; // st7@1
+  double v6; // st6@1
+  double v7; // st5@1
+  Vec3_float_ *result; // eax@1
+  __int16 v9; // fps@3
+  char v10; // c0@3
+  char v11; // c2@3
+  char v12; // c3@3
+  float v13; // ecx@5
+  double v14; // st7@5
+  double v15; // st6@5
+  Vec3_float_ v1; // [sp+4h] [bp-48h]@1
+  Vec3_float_ v2; // [sp+10h] [bp-3Ch]@1
+  float v18; // [sp+20h] [bp-2Ch]@1
+  float v19; // [sp+24h] [bp-28h]@1
+  Vec3_float_ v20; // [sp+28h] [bp-24h]@1
+  Vec3_float_ v21; // [sp+34h] [bp-18h]@1
+  Vec3_float_ a1a; // [sp+40h] [bp-Ch]@1
+
+  a1a.x = 0.0;
+  a1a.y = 0.0;
+  a1a.z = 0.0;
+  v21.x = a3->x;
+  v21.y = a3->y;
+  v21.z = a3->z;
+  v5 = a1->vWorldPosition.x;
+  v6 = a1->vWorldPosition.y;
+  v2.z = a1->vWorldPosition.z;
+  v7 = a2->vWorldPosition.x;
+  v18 = a2->vWorldPosition.y;
+  v19 = a2->vWorldPosition.z;
+  v20.x = v5 - v21.x;
+  v20.y = v6 - v21.y;
+  v20.z = v2.z - v21.z;
+  LODWORD(v1.x) = (int)v20.x;
+  v1.y = v20.y;
+  v1.z = v20.z;
+  v20.x = v7 - v5;
+  v20.y = v18 - v6;
+  v20.z = v19 - v2.z;
+  result = Vec3_float_::Cross(&v1, &v2, v20.x, v20.y, v20.z);
+  a1a.x = result->x;
+  a1a.y = result->y;
+  a1a.z = result->z;
+  if ( a1a.x != 0.0
+    || a1a.y != 0.0
+    || (/*UNDEF(v9),*/ v10 = a1a.z < 0.0, v11 = 0, v12 = a1a.z == 0.0, BYTE1(result) = HIBYTE(v9), a1a.z != 0.0) )
+  {
+    a1a.Normalize();
+    result = (Vec3_float_ *)a4;
+    v13 = a1a.y;
+    a4->x = a1a.x;
+    v14 = v21.z * a1a.z;
+    v15 = v21.y * a1a.y;
+    a4->y = v13;
+    a4->z = a1a.z;
+    a4->dot = v14 + v15 + v21.x * a1a.x;
+    LOBYTE(result) = 1;
+  }
+  else
+  {
+    LOBYTE(result) = 0;
+  }
+  return (bool)result;
+}
+
+//----- (0049C8DC) --------------------------------------------------------
+bool stru10::_49C8DC(RenderVertexSoft *arg0, Vec3_float_ *a2, float *a3)
+{
+  double v4; // st7@1
+  double v5; // st6@1
+  double v6; // st5@1
+  Vec3_float_ *result; // eax@1
+  __int16 v8; // fps@3
+  char v9; // c0@3
+  char v10; // c2@3
+  char v11; // c3@3
+  float v12; // ecx@5
+  double v13; // st7@5
+  double v14; // st6@5
+  Vec3_float_ v1; // [sp+8h] [bp-3Ch]@1
+  Vec3_float_ v2; // [sp+14h] [bp-30h]@1
+  float v17; // [sp+24h] [bp-20h]@1
+  float v18; // [sp+28h] [bp-1Ch]@1
+  float v19; // [sp+2Ch] [bp-18h]@1
+  float v20; // [sp+30h] [bp-14h]@1
+  float v21; // [sp+34h] [bp-10h]@1
+  Vec3_float_ a1; // [sp+38h] [bp-Ch]@1
+
+  v19 = arg0->vWorldPosition.x;
+  v20 = arg0->vWorldPosition.y;
+  v21 = arg0->vWorldPosition.z;
+  v4 = arg0[1].vWorldPosition.x;
+  v5 = arg0[1].vWorldPosition.y;
+  v2.z = arg0[1].vWorldPosition.z;
+  v6 = arg0[2].vWorldPosition.x;
+  v17 = arg0[2].vWorldPosition.y;
+  v18 = arg0[2].vWorldPosition.z;
+  a1.x = v4 - v19;
+  a1.y = v5 - v20;
+  a1.z = v2.z - v21;
+  LODWORD(v1.x) = (int)a1.x;
+  v1.y = a1.y;
+  v1.z = a1.z;
+  a1.x = v6 - v4;
+  a1.y = v17 - v5;
+  a1.z = v18 - v2.z;
+  result = Vec3_float_::Cross(&v1, &v2, a1.x, a1.y, a1.z);
+  a1.x = result->x;
+  a1.y = result->y;
+  a1.z = result->z;
+  if ( a1.x != 0.0
+    || a1.y != 0.0
+    || (/*UNDEF(v8),*/ v9 = a1.z < 0.0, v10 = 0, v11 = a1.z == 0.0, BYTE1(result) = HIBYTE(v8), a1.z != 0.0) )
+  {
+    a1.Normalize();
+    v12 = a1.y;
+    a2->x = a1.x;
+    v13 = v21 * a1.z;
+    v14 = v20 * a1.y;
+    a2->y = v12;
+    a2->z = a1.z;
+    result = (Vec3_float_ *)a3;
+    *a3 = -(v13 + v14 + v19 * a1.x);
+    LOBYTE(result) = 1;
+  }
+  else
+  {
+    LOBYTE(result) = 0;
+  }
+  return (bool)result;
+}