diff stru9.cpp @ 0:9c0607679772

init
author Ritor1
date Sat, 12 Jan 2013 09:45:18 +0600
parents
children ee11772d0ad2
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stru9.cpp	Sat Jan 12 09:45:18 2013 +0600
@@ -0,0 +1,437 @@
+#include "stru9.h"
+#include "IndoorCameraD3D.h"
+
+#include "mm7_data.h"
+
+
+
+//----- (00498377) --------------------------------------------------------
+bool stru9::_498377(struct RenderVertexSoft *a1, unsigned int uNumVertices, struct IndoorCameraD3D_Vec4 *a3, struct RenderVertexSoft *pVertices, unsigned int *pOutNumVertices)
+{
+  bool result; // eax@7
+  unsigned int *v7; // ebx@7
+  char *v8; // esi@8
+  RenderVertexSoft *v9; // ecx@9
+  double v10; // st7@12
+  double v11; // st6@12
+  RenderVertexSoft *v12; // esi@13
+  int v13; // ecx@25
+  VertexBuffer *v14; // edx@26
+  char *v15; // eax@26
+  unsigned int i; // ecx@26
+  bool v17; // [sp+0h] [bp-28h]@9
+  char *v18; // [sp+10h] [bp-18h]@8
+  RenderVertexSoft *v19; // [sp+14h] [bp-14h]@0
+  RenderVertexSoft *v20; // [sp+18h] [bp-10h]@0
+  signed int v21; // [sp+1Ch] [bp-Ch]@7
+  RenderVertexSoft *a2; // [sp+20h] [bp-8h]@8
+  stru9 *thisa; // [sp+24h] [bp-4h]@1
+  signed int a3a; // [sp+38h] [bp+10h]@12
+  int a3b; // [sp+38h] [bp+10h]@25
+
+  __debugbreak();
+
+  thisa = this;
+
+  static RenderVertexSoft static_AE3FB4;
+  static bool __init_flag1 = false;
+  if (!__init_flag1)
+  {
+    __init_flag1 = true;
+
+    static_AE3FB4.flt_2C = 0.0;
+  }
+
+  static stru312 static_AE3FA4; // idb
+  static bool __init_flag2 = false;
+  if (!__init_flag2)
+  {
+    __init_flag2 = true;
+
+    //stru312::stru312(&static_AE3FA4);
+  }
+
+  static VertexBuffer static_AE33A0; // idb
+  static bool __init_flag3 = false;
+  if (!__init_flag3)
+  {
+    __init_flag3 = true;
+
+    //VertexBuffer::VertexBuffer(&static_AE33A0);
+  }
+
+  result = 0;
+  v7 = pOutNumVertices;
+  v21 = 0;
+  if ( (signed int)uNumVertices <= 0 )
+    goto LABEL_32;
+  a2 = a1;
+  v8 = (char *)&a3->y;
+  v18 = (char *)&a3->y;
+  do
+  {
+    v17 = result + 1;
+    v9 = &a1[(result + 1) % (signed int)uNumVertices];
+    if ( a2->vWorldPosition.x != v9->vWorldPosition.x
+      || a2->vWorldPosition.y != v9->vWorldPosition.y
+      || a2->vWorldPosition.z != v9->vWorldPosition.z )
+    {
+      v10 = *((float *)v8 + 1);
+      v11 = *(float *)v8;
+      ++v21;
+      result = 0;
+      static_AE3FA4.x = *((float *)v8 - 1);
+      static_AE33A0.uNumVertices = 0;
+      a3a = 0;
+      static_AE3FA4.y = v11;
+      static_AE3FA4.z = v10;
+      if ( (signed int)*v7 <= 0 )
+        goto LABEL_32;
+      do
+      {
+        v12 = &pVertices[result];
+        if ( result )
+        {
+          if ( _4989E1(v20, &pVertices[result], a2, &static_AE3FA4)
+            && _498774(v20, v12, a2, &static_AE3FA4, &static_AE3FB4) )
+            AddVertex(&static_AE33A0, &static_AE3FB4);
+        }
+        else
+        {
+          v19 = &pVertices[result];
+        }
+        v20 = v12;
+        if ( AreVectorsCollinear(v12, a2, &static_AE3FA4) )
+          AddVertex(&static_AE33A0, v12);
+        v7 = pOutNumVertices;
+        result = a3a++ + 1;
+      }
+      while ( a3a < (signed int)*pOutNumVertices );
+      if ( !static_AE33A0.uNumVertices )
+        goto LABEL_32;
+      if ( _4989E1(v12, v19, a2, &static_AE3FA4)
+        && _498774(v12, v19, a2, &static_AE3FA4, &static_AE3FB4) )
+        AddVertex(&static_AE33A0, &static_AE3FB4);
+      v13 = static_AE33A0.uNumVertices;
+      a3b = 0;
+      if ( static_AE33A0.uNumVertices > 0 )
+      {
+        v14 = &static_AE33A0;
+        v15 = (char *)&pVertices->vWorldPosition.y;
+        for ( i = (char *)&static_AE33A0.pVertices[0].vWorldPosition.y - (char *)pVertices;
+              ;
+              i = (char *)&static_AE33A0.pVertices[0].vWorldPosition.y - (char *)pVertices )
+        {
+          ++a3b;
+          *((int *)v15 - 1) = *(unsigned int *)(&v14->pVertices[0].vWorldPosition.x);
+          v14 = (VertexBuffer *)((char *)v14 + 48);
+          *(float *)v15 = *(float *)&v15[(char *)&static_AE33A0 - (char *)pVertices];
+          *((float *)v15 + 1) = *(float *)&v15[i];
+          *((float *)v15 + 8) = *(float *)&v15[(char *)&static_AE33A0.pVertices[0].flt_20 - (char *)pVertices];
+          *((float *)v15 + 9) = *(float *)&v15[(char *)&static_AE33A0.pVertices[0].u - (char *)pVertices];
+          v13 = static_AE33A0.uNumVertices;
+          v15 += 48;
+          if ( a3b >= static_AE33A0.uNumVertices )
+            break;
+        }
+      }
+      v7 = pOutNumVertices;
+      v8 = v18;
+      *pOutNumVertices = v13;
+    }
+    result = v17;
+    ++a2;
+    v8 += 24;
+    v18 = v8;
+  }
+  while ( v17 < (signed int)uNumVertices );
+  if ( v21 < 3 )
+LABEL_32:
+    *v7 = 0;
+  return 1;
+}
+// AE3FE4: using guessed type char static_init_flag__AE3FB4_bit1__AE3FA4_bit2__AE33A0_bit3;
+
+//----- (004985FB) --------------------------------------------------------
+bool stru9::_4985FB(struct RenderVertexSoft *a1, signed int a2, struct RenderVertexSoft *a3, unsigned int *pOutNumVertices, struct Vec3_float_ *a5, float a6, char *a7, int unused)
+{
+  RenderVertexSoft *v9; // ecx@1
+  Vec3_float_ *v10; // esi@1
+  //char *v11; // ebx@1
+  RenderVertexSoft *v12; // edi@1
+  double v13; // st7@1
+  //bool result; // eax@4
+  signed int v15; // edx@9
+  RenderVertexSoft *v16; // ecx@9
+  double v17; // st7@9
+  double v18; // st6@12
+  signed int v19; // [sp+Ch] [bp-Ch]@7
+  float v20; // [sp+10h] [bp-8h]@1
+  bool v21; // [sp+14h] [bp-4h]@2
+
+  v9 = a1;
+  v10 = a5;
+  //v11 = (char *)&a1->vWorldPosition.z;
+  auto v11 = a1;
+  v12 = a3;
+  v13 = a1->vWorldPosition.y * a5->y + a5->x * a1->vWorldPosition.x + a1->vWorldPosition.z * a5->z;
+  v20 = v13;
+  v21 = v13 >= a6;
+
+  *pOutNumVertices = 0;
+  if ( a2 <= 0 )
+    return false;
+  v19 = 1;
+  while ( 1 )
+  {
+    if ( v21 )
+    {
+      ++a3;
+      memcpy(v12, v11, sizeof(RenderVertexSoft));
+      ++*pOutNumVertices;
+      v10 = a5;
+      v12 = a3;
+      v9 = a1;
+    }
+    v15 = 0;
+    v16 = &v9[v19 % a2];
+    v17 = v16->vWorldPosition.z * v10->z + v16->vWorldPosition.y * v10->y + v10->x * v16->vWorldPosition.x;
+    if ( v17 >= a6 )
+      v15 = 1;
+    if ( v21 != v15 )
+    {
+      v18 = (a6 - v20) / (v17 - v20);
+      v12->vWorldPosition.x = (v16->vWorldPosition.x - v11->vWorldPosition.x) * v18 + v11->vWorldPosition.x;
+      v12->vWorldPosition.y = (v16->vWorldPosition.y - v11->vWorldPosition.y) * v18 + v11->vWorldPosition.y;
+      v12->vWorldPosition.z = (v16->vWorldPosition.z - v11->vWorldPosition.z) * v18 + v11->vWorldPosition.z;
+      v12->u = (v16->u - v11->u) * v18 + v11->u;
+      v12->v = (v16->v - v11->v) * v18 + v11->v;
+      ++v12;
+      a3 = v12;
+      ++*pOutNumVertices;
+      *a7 = 1;
+    }
+
+    v11++;
+    v21 = v15;
+    v20 = v17;
+    if ( v19 >= a2 )
+      break;
+    v9 = a1;
+    v19++;
+  }
+
+  return *pOutNumVertices >= 3;
+}
+
+//----- (00498737) --------------------------------------------------------
+void stru9::AddVertex(struct VertexBuffer *pVertexBuffer, struct RenderVertexSoft *pVertex)
+{
+  __debugbreak();
+  RenderVertexSoft *v3; // eax@1
+
+  v3 = &pVertexBuffer->pVertices[pVertexBuffer->uNumVertices];
+  v3->vWorldPosition.x = pVertex->vWorldPosition.x;
+  v3->vWorldPosition.y = pVertex->vWorldPosition.y;
+  v3->vWorldPosition.z = pVertex->vWorldPosition.z;
+  v3->u = pVertex->u;
+  v3->v = pVertex->v;
+  ++pVertexBuffer->uNumVertices;
+}
+
+//----- (00498774) --------------------------------------------------------
+bool stru9::_498774(struct RenderVertexSoft *a1, struct RenderVertexSoft *a2, struct RenderVertexSoft *a3, struct stru312 *a4, struct RenderVertexSoft *a5)
+{
+  RenderVertexSoft *v6; // ecx@5
+  bool result; // eax@5
+  double v8; // st7@5
+  __int16 v9; // fps@5
+  double v10; // st7@6
+  double v11; // st6@8
+  double v12; // st6@18
+  char v13; // c0@24
+  char v14; // c2@24
+  char v15; // c3@24
+  float a1a; // [sp+10h] [bp+8h]@5
+
+  __debugbreak();
+  
+  static stru312 static_AE3388;
+  static stru312 static_AE3378;
+
+  v6 = a1;
+  static_AE3378.x = a1->vWorldPosition.x - a3->vWorldPosition.x;
+  static_AE3378.y = a1->vWorldPosition.y - a3->vWorldPosition.y;
+  HIWORD(result) = HIWORD(a4);
+  static_AE3378.z = a1->vWorldPosition.z - a3->vWorldPosition.z;
+  static_AE3388.x = a2->vWorldPosition.x - a1->vWorldPosition.x;
+  static_AE3388.y = a2->vWorldPosition.y - a1->vWorldPosition.y;
+  static_AE3388.z = a2->vWorldPosition.z - a1->vWorldPosition.z;
+  a1a = static_AE3388.x * a4->x + static_AE3388.z * a4->z + static_AE3388.y * a4->y;
+  v8 = static_AE3378.x * a4->x + static_AE3378.z * a4->z + static_AE3378.y * a4->y;
+  //UNDEF(v9);
+  if ( a1a != 0.0 )
+  {
+    v10 = -(v8 / a1a);
+    if ( a1a <= 0.0 )
+    {
+      if ( v10 <= 0.0 )
+        v12 = 0.0;
+      else
+        v12 = v10;
+      if ( v12 <= 1.0 )
+      {
+        if ( v10 <= 0.0 )
+          v10 = (float)0.0;
+      }
+      else
+      {
+        v10 = 1.0;
+      }
+    }
+    else
+    {
+      if ( v10 >= 1.0 )
+        v11 = 1.0;
+      else
+        v11 = v10;
+      if ( v11 >= 0.0 )
+      {
+        if ( v10 >= 1.0 )
+          v10 = (float)1.0;
+      }
+      else
+      {
+        v10 = 0.0;
+      }
+    }
+    result = (bool)a5;
+    a5->vWorldPosition.x = (a2->vWorldPosition.x - v6->vWorldPosition.x) * v10 + v6->vWorldPosition.x;
+    a5->vWorldPosition.y = (a2->vWorldPosition.y - v6->vWorldPosition.y) * v10 + v6->vWorldPosition.y;
+    a5->vWorldPosition.z = (a2->vWorldPosition.z - v6->vWorldPosition.z) * v10 + v6->vWorldPosition.z;
+    a5->u = (a2->u - v6->u) * v10 + v6->u;
+    a5->v = (a2->v - v6->v) * v10 + v6->v;
+    goto LABEL_15;
+  }
+  v13 = v8 < 0.0;
+  v14 = 0;
+  v15 = v8 == 0.0;
+  BYTE1(result) = HIBYTE(v9);
+  if ( v8 < 0.0 )
+  {
+LABEL_15:
+    LOBYTE(result) = 1;
+    return result;
+  }
+  LOBYTE(result) = 0;
+  return result;
+}
+// AE3398: using guessed type char static_init_flag__AE3388_bit1__AE3378_bit2;
+
+//----- (0049895A) --------------------------------------------------------
+bool stru9::AreVectorsCollinear(struct RenderVertexSoft *a1, struct RenderVertexSoft *a2, struct stru312 *a3)
+{
+  static stru312 static_F942A0;
+
+  static_F942A0.x = a1->vWorldPosition.x - a2->vWorldPosition.x;
+  static_F942A0.y = a1->vWorldPosition.y - a2->vWorldPosition.y;
+  static_F942A0.z = a1->vWorldPosition.z - a2->vWorldPosition.z;
+
+  static float flt_F942B4 = static_F942A0.z * a3->z + static_F942A0.y * a3->y + static_F942A0.x * a3->x;
+  if (flt_F942B4 >= 0)
+    return true;
+  return false;
+}
+
+
+//----- (004989E1) --------------------------------------------------------
+bool stru9::_4989E1(struct RenderVertexSoft *a1, struct RenderVertexSoft *a2, struct RenderVertexSoft *a3, struct stru312 *a4)
+{
+  bool r1;
+  bool r2;
+
+  r1 = AreVectorsCollinear(a1, a3, a4);
+  r2 = AreVectorsCollinear(a2, a3, a4);
+  return !r1 && r2 == 1 ||
+         r1 == 1 && !r2;
+}
+
+//----- (004980B9) --------------------------------------------------------
+bool stru9::_4980B9(RenderVertexSoft *a1, unsigned int uNumVertices, float a3, float a4, float a5, RenderVertexSoft *pOutVertices, unsigned int *pOutNumVertices)
+{
+  RenderVertexSoft *v12; // ecx@9
+  double v13; // st7@12
+  double v14; // st6@12
+  double v15; // st5@12
+  signed int v25; // [sp+18h] [bp-Ch]@7
+
+  static RenderVertexSoft stru_AE4BFC;
+  static stru312 static_sub_4980B9_stru_AE4BEC; // idb
+  static VertexBuffer static_sub_4980B9_stru_AE3FE8; // idb
+
+  v25 = 0;
+  if (uNumVertices <= 0)
+  {
+    *pOutNumVertices = 0;
+    return true;
+  }
+
+  for (uint i = 0; i < uNumVertices; ++i)
+  {
+    v12 = &a1[(i + 1) % uNumVertices];
+    if (a1[i].vWorldPosition.x != v12->vWorldPosition.x ||
+        a1[i].vWorldPosition.y != v12->vWorldPosition.y ||
+        a1[i].vWorldPosition.z!= v12->vWorldPosition.z)
+    {
+      v13 = v12->vWorldPosition.x - a1[i].vWorldPosition.x;
+      v14 = v12->vWorldPosition.y - a1[i].vWorldPosition.y;
+      v15 = v12->vWorldPosition.z - a1[i].vWorldPosition.z;
+      ++v25;
+
+      static_sub_4980B9_stru_AE3FE8.uNumVertices = 0;
+      static_sub_4980B9_stru_AE4BEC.x = a4 * v15 - v14 * a5;
+      static_sub_4980B9_stru_AE4BEC.y = v13 * a5 - v15 * a3;
+      static_sub_4980B9_stru_AE4BEC.z = v14 * a3 - v13 * a4;
+      if (*pOutNumVertices == 0)
+        return true;
+
+      for (uint j = 0; j < *pOutNumVertices; ++j)
+      {
+        if (j)
+        {
+          if (_4989E1(&pOutVertices[j - 1], &pOutVertices[j], &a1[i], &static_sub_4980B9_stru_AE4BEC) &&
+              _498774(&pOutVertices[j - 1], &pOutVertices[j], &a1[i], &static_sub_4980B9_stru_AE4BEC, &stru_AE4BFC))
+              AddVertex(&static_sub_4980B9_stru_AE3FE8, &stru_AE4BFC);
+        }
+
+        if (AreVectorsCollinear(&pOutVertices[j], &a1[i], &static_sub_4980B9_stru_AE4BEC))
+          AddVertex(&static_sub_4980B9_stru_AE3FE8, &pOutVertices[j]);
+      }
+
+      if (!static_sub_4980B9_stru_AE3FE8.uNumVertices)
+      {
+        *pOutNumVertices = 0;
+        return true;
+      }
+      if (_4989E1(&pOutVertices[*pOutNumVertices - 1], &pOutVertices[0], &a1[i], &static_sub_4980B9_stru_AE4BEC) &&
+          _498774(&pOutVertices[*pOutNumVertices - 1], &pOutVertices[0], &a1[i], &static_sub_4980B9_stru_AE4BEC, &stru_AE4BFC) )
+        AddVertex(&static_sub_4980B9_stru_AE3FE8, &stru_AE4BFC);
+
+      for (uint j = 0; j < static_sub_4980B9_stru_AE3FE8.uNumVertices; ++j)
+      {
+          pOutVertices[j].vWorldPosition.y = static_sub_4980B9_stru_AE3FE8.pVertices[j].vWorldPosition.x;
+          pOutVertices[j].vWorldPosition.y = static_sub_4980B9_stru_AE3FE8.pVertices[j].vWorldPosition.y;
+          pOutVertices[j].vWorldPosition.z = static_sub_4980B9_stru_AE3FE8.pVertices[j].vWorldPosition.z;
+          pOutVertices[j].u = static_sub_4980B9_stru_AE3FE8.pVertices[j].u;
+          pOutVertices[j].v = static_sub_4980B9_stru_AE3FE8.pVertices[j].v;
+      }
+      *pOutNumVertices = static_sub_4980B9_stru_AE3FE8.uNumVertices;
+    }
+  }
+
+  if (v25 < 3)
+    *pOutNumVertices = 0;
+
+  return true;
+}
+// AE4C2C: using guessed type char static_sub_4980B9_byte_AE4C2C_init_flag;
\ No newline at end of file