diff Render.cpp @ 1391:cc9a3a24d61d

Moved stru11, stru12 and some SW Rendering stuff to the archives. stru148 -> struct Polygon
author Nomad
date Thu, 18 Jul 2013 14:42:54 +0200
parents 613c77e51e38
children 8ea496564034
line wrap: on
line diff
--- a/Render.cpp	Thu Jul 18 04:08:20 2013 +0200
+++ b/Render.cpp	Thu Jul 18 14:42:54 2013 +0200
@@ -221,1461 +221,13 @@
   return result;
 }
 
-//----- (00487389) --------------------------------------------------------
-void Render::ExecOutdoorDrawSW()
-{
-  unsigned __int16 *v0; // ebx@1
-  unsigned int v1; // esi@1
-  stru148 *v2; // eax@1
-  Span *v3; // edi@6
-  stru148 *v4; // esi@9
-  Texture *v5; // ebp@10
-  int v6; // esi@16
-  unsigned int v7; // edx@16
-  char *v8; // ecx@17
-  unsigned int v9; // edi@22
-  int v10; // eax@26
-  int v11; // eax@27
-  unsigned int v12; // ebp@32
-  Span *v13; // esi@33
-  int v14; // ecx@37
-  int v15; // eax@40
-  Texture *v16; // ebp@51
-  //unsigned int v17; // eax@51
-  int v18; // eax@54
-  char v19; // al@56
-  unsigned int v20; // eax@57
-  int v21; // ecx@57
-  unsigned int v22; // eax@57
-  stru149 *v23; // eax@65
-  int v24; // eax@67
-  ODMFace *v25; // eax@78
-  signed int v26; // edx@79
-  signed int v27; // ecx@79
-  unsigned int v28; // eax@106
-  unsigned int v29; // ebp@117
-  Span *v30; // esi@118
-  unsigned int v31; // ST04_4@124
-  int v33; // [sp+18h] [bp-44h]@80
-  signed int v34; // [sp+1Ch] [bp-40h]@3
-  signed int v35; // [sp+20h] [bp-3Ch]@79
-  Span **v36; // [sp+24h] [bp-38h]@4
-  unsigned int v37; // [sp+28h] [bp-34h]@1
-  unsigned __int16 *a1; // [sp+2Ch] [bp-30h]@1
-  int a1a; // [sp+2Ch] [bp-30h]@26
-  unsigned int a1b; // [sp+2Ch] [bp-30h]@116
-  char v41; // [sp+30h] [bp-2Ch]@57
-
-  v0 = pRenderer->pTargetSurface;
-  v1 = pOutdoorCamera->numStru148s;
-  a1 = pRenderer->pTargetSurface;
-  v2 = array_77EC08.data();
-  v37 = pOutdoorCamera->numStru148s;
-  if ( !(pParty->uFlags & 2) )
-  {
-    v1 = uNumElementsIn80AA28;
-    v2 = ptr_80AA28[0];
-    v37 = uNumElementsIn80AA28;
-  }
-  v34 = 0;
-  if ( (signed int)v1 > 0 )
-  {
-    v36 = &v2->prolly_head;
-    do
-    {
-      if ( pParty->uFlags & 2 )
-        v3 = *v36;
-      else
-        v3 = ptr_80AA28[v34]->prolly_head;
-      if ( v3 )
-      {
-        v4 = v3->pParent;
-        if ( v4 )
-        {
-          v5 = v4->pTexture;
-          if ( v5 )
-          {
-            if ( v3->field_8 >= (signed int)pViewport->uViewportTL_X || v3->field_C != pViewport->uViewportTL_X )
-            {
-              LOBYTE(v4->field_32) |= 2u;
-              v14 = *(int *)&v4->flags;
-              if ( v14 & 0x10 && v4->field_59 != 5 )
-              {
-                dword_80AA20 = (v4->terrain_grid_z - 64) << 25;
-                dword_80AA1C = dword_80AA20 + 0x1FF0000;
-                dword_80AA14 = (v4->terrain_grid_x << 25) + 0x7FFF0000;
-                dword_80AA18 = dword_80AA14 - 0x1FF0000;
-                byte_80AA10 = ((unsigned int)pOutdoor->ActuallyGetSomeOtherTileInfo(
-                                               v4->terrain_grid_z,
-                                               v4->terrain_grid_x - 1) >> 9) & 1;
-                if ( *(int *)&v4->flags & 2 || (v15 = *(int *)&v4->flags, BYTE1(v15) & 1) )
-                {
-                  if ( *(int *)&v4->flags & 2 )
-                  {
-                    while ( 1 )
-                    {
-                      if ( pOutdoorCamera->outdoor_no_wavy_water )
-                        sr_sub_48408A_prolly_odm_water_no_waves(v3);
-                      else
-                        sr_sub_485407_prolly_odm_water_wavy(v3);
-                      v3->field_E = LOWORD(unnamed_6BE060[1]);
-                      if ( v4->prolly_tail == v3 )
-                        break;
-                      v3 = v3->pNext;
-                    }
-                  }
-                  else
-                  {
-                    while ( 1 )
-                    {
-                      v16 = v4->pTexture;
-                      v4->pTexture = pBitmaps_LOD->LoadTexturePtr("wtrtyl");
-                      if ( pOutdoorCamera->outdoor_no_wavy_water )
-                        sr_sub_48408A_prolly_odm_water_no_waves(v3);
-                      else
-                        sr_sub_485407_prolly_odm_water_wavy(v3);
-                      v18 = v4->terrain_grid_z - 64;
-                      v4->pTexture = v16;
-                      dword_80AA20 = v18 << 25;
-                      dword_80AA1C = (v18 << 25) + 0x1FF0000;
-                      dword_80AA14 = (v4->terrain_grid_x << 25) + 0x7FFF0000;
-                      dword_80AA18 = dword_80AA14 - 0x1FF0000;
-                      byte_80AA10 = ((unsigned int)pOutdoor->ActuallyGetSomeOtherTileInfo(
-                                                     v4->terrain_grid_z,
-                                                     v4->terrain_grid_x - 1) >> 9) & 1;
-                      sr_sub_484442(v3);
-                      v3->field_E = LOWORD(unnamed_6BE060[1]);
-                      if ( v4->prolly_tail == v3 )
-                        break;
-                      v3 = v3->pNext;
-                    }
-                  }
-                }
-                else
-                {
-                  while ( sr_sub_48408A_prolly_odm_water_no_waves(v3) )
-                  {
-                    v3->field_E = LOWORD(unnamed_6BE060[1]);
-                    if ( v4->prolly_tail == v3 )
-                      break;
-                    v3 = v3->pNext;
-                  }
-                }
-              }
-              else
-              {
-                v19 = v4->field_59;
-                if ( v19 != 5 )
-                {
-                  if ( v14 & 2 )
-                  {
-                    while ( 1 )
-                    {
-                      v28 = pBitmaps_LOD->LoadTexture("wtrtyla");
-                      v4->pTexture = (Texture *)(v28 != -1 ? &pBitmaps_LOD->pTextures[v28] : 0);
-                      if ( !sr_sub_4847EB(v3) )
-                        break;
-                      v4->pTexture = v5;
-                      if ( !sr_sub_484442(v3) )
-                        break;
-                      v3->field_E = LOWORD(unnamed_6BE060[1]);
-                      if ( v4->prolly_tail == v3 )
-                        break;
-                      v3 = v3->pNext;
-                      v5 = v4->pTexture;
-                    }
-                  }
-                  else
-                  {
-                    if ( v19 == 1 )
-                    {
-                      dword_80AA20 = (v4->terrain_grid_z - 64) << 25;
-                      dword_80AA1C = dword_80AA20 + 33488896;
-                      dword_80AA14 = (v4->terrain_grid_x << 25) + 0x7FFF0000;
-                      dword_80AA18 = dword_80AA14 - 33488896;
-                      byte_80AA10 = ((unsigned int)pOutdoor->ActuallyGetSomeOtherTileInfo(
-                                                     v4->terrain_grid_z,
-                                                     v4->terrain_grid_x - 1) >> 9) & 1;
-                      while ( 1 )
-                      {
-                        if ( !sr_sub_4847EB(v3) )
-                          sr_sub_48585C_mb_DrawSpan(v3, &pRenderer->pTargetSurface[v3->field_8 + 640 * v3->field_A], 0);
-                        v3->field_E = LOWORD(unnamed_6BE060[1]);
-                        if ( v4->prolly_tail == v3 )
-                          break;
-                        v3 = v3->pNext;
-                      }
-                    }
-                  }
-                  goto LABEL_14;
-                }
-                v4->ptr_38 = (stru149 *)&v41;
-                v4->_479295();
-                v20 = GetTickCount();
-                v21 = *(int *)&v4->flags;
-                v22 = v20 >> 3;
-                if ( BYTE1(v21) & 4 )
-                {
-                  v4->sTextureDeltaV -= v22 & v4->pTexture->uHeightMinus1;
-                }
-                else
-                {
-                  if ( BYTE1(v21) & 8 )
-                    v4->sTextureDeltaV += v22 & v4->pTexture->uHeightMinus1;
-                }
-                if ( BYTE1(v21) & 0x10 )
-                {
-                  v4->sTextureDeltaU -= v22 & v4->pTexture->uWidthMinus1;
-                }
-                else
-                {
-                  if ( BYTE1(v21) & 0x20 )
-                    v4->sTextureDeltaU += v22 & v4->pTexture->uWidthMinus1;
-                }
-                v23 = v4->ptr_38;
-                v4->field_52 = 32;
-                v4->field_5A = 5;
-                if ( (double)abs(v23->field_C) > 52428.8 )
-                {
-                  v4->field_52 = 8;
-                  v4->field_5A = 3;
-                }
-                v24 = *(int *)&v4->flags;
-                if ( !(v24 & 0x10000) )
-                {
-                  if ( !(v24 & 2) )
-                  {
-                    v25 = v4->pODMFace;
-                    if ( v25->uPolygonType == 1 )
-                    {
-                      v26 = v25->pTextureUIDs[0];
-                      dword_80AA1C = v26;
-                      dword_80AA20 = v26;
-                      v27 = v25->pTextureVIDs[0];
-                      dword_80AA14 = v27;
-                      dword_80AA18 = v27;
-                      v35 = 1;
-                      if ( v25->uNumVertices > 1u )
-                      {
-                        v33 = (int)&v25->pTextureVIDs[1];
-                        do
-                        {
-                          if ( dword_80AA20 > *(short *)(v33 - 40) )
-                            dword_80AA20 = *(short *)(v33 - 40);
-                          if ( v26 < *(short *)(v33 - 40) )
-                          {
-                            v26 = *(short *)(v33 - 40);
-                            dword_80AA1C = *(short *)(v33 - 40);
-                          }
-                          if ( dword_80AA18 > *(short *)v33 )
-                            dword_80AA18 = *(short *)v33;
-                          if ( v27 < *(short *)v33 )
-                          {
-                            v27 = *(short *)v33;
-                            dword_80AA14 = *(short *)v33;
-                          }
-                          ++v35;
-                          v33 += 2;
-                        }
-                        while ( v35 < v25->uNumVertices );
-                        v0 = a1;
-                      }
-                      dword_80AA20 = (dword_80AA20 + v4->sTextureDeltaU) << 16;
-                      dword_80AA1C = ((v26 + v4->sTextureDeltaU) << 16) - 65536;
-                      dword_80AA18 = (dword_80AA18 + v4->sTextureDeltaV) << 16;
-                      dword_80AA14 = ((v27 + v4->sTextureDeltaV) << 16) - 65536;
-                    }
-                    while ( 1 )
-                    {
-                      if ( !sr_sub_482E07(v3, v0) )
-                        sr_sub_48585C_mb_DrawSpan(v3, &v0[v3->field_8 + 640 * v3->field_A], 0);
-                      v3->field_E = LOWORD(unnamed_6BE060[1]);
-                      if ( v4->prolly_tail == v3 )
-                        break;
-                      v3 = v3->pNext;
-                    }
-                    goto LABEL_14;
-                  }
-                  while ( 1 )
-                  {
-LABEL_74:
-                    if ( !sr_sub_4839BD(v3, v0) )
-                      sr_sub_48585C_mb_DrawSpan(v3, &v0[v3->field_8 + 640 * v3->field_A], 0);
-                    v3->field_E = LOWORD(unnamed_6BE060[1]);
-                    if ( v4->prolly_tail == v3 )
-                      break;
-                    v3 = v3->pNext;
-                  }
-                  goto LABEL_14;
-                }
-                if ( v24 & 2 )
-                  goto LABEL_74;
-                while ( 1 )
-                {
-                  if ( !sr_sub_482A94(v3) )
-                    sr_sub_48585C_mb_DrawSpan(v3, &v0[v3->field_8 + 640 * v3->field_A], 0);
-                  v3->field_E = LOWORD(unnamed_6BE060[1]);
-                  if ( v4->prolly_tail == v3 )
-                    break;
-                  v3 = v3->pNext;
-                }
-              }
-            }
-            else
-            {
-              v3->field_E = LOWORD(unnamed_6BE060[1]);
-            }
-          }
-        }
-      }
-LABEL_14:
-      ++v34;
-      LOWORD(v2) = v34;
-      v36 += 67;
-    }
-    while ( v34 < (signed int)v37 );
-  }
-  if ( pParty->uFlags & 2 )
-  {
-    v6 = pOutdoorCamera->numStru148s;
-    v7 = 0;
-    uNumElementsIn80AA28 = 0;
-    if ( pOutdoorCamera->numStru148s > 0 )
-    {
-      v8 = (char *)&array_77EC08[0].flags;
-      do
-      {
-        v2 = *(stru148 **)v8;
-        if ( (unsigned int)v2 & 0x20000 )
-        {
-          ++v7;
-          *(int *)v8 = (unsigned int)v2 & 0xFFFDFFFF;
-          LOWORD(v2) = (short)v8 - 48;
-          *(&uNumElementsIn80AA28 + v7) = (unsigned int)(v8 - 48);
-        }
-        v8 += 268;
-        --v6;
-      }
-      while ( v6 );
-      uNumElementsIn80AA28 = v7;
-    }
-  }
-  v9 = pOutdoorCamera->uNumSpans;
-  unnamed_6BE060[0] = pOutdoorCamera->uNumSpans;
-  if (pOutdoorCamera->numStru148s >= 1999)
-    return;
-
-  array_77EC08[1999]._48607B(&stru_8019C8);
-  array_77EC08[1999].ptr_38->sky_48694B();
-
-  if (pOutdoor->uMainTile_BitmapID == -1)
-  {
-    array_77EC08[1999].pTexture = nullptr;
-    return;
-  }
-  else
-    array_77EC08[1999].pTexture = pBitmaps_LOD->GetTexture(pOutdoor->uMainTile_BitmapID);
-  array_77EC08[1999].dimming_level = 23 - (-20 * pOutdoor->vSunlight.z >> 16);
-  if ( array_77EC08[1999].dimming_level > 20 )
-    array_77EC08[1999].dimming_level = 20;
-  v10 = stru_5C6E00->Sin(pIndoorCamera->sRotationX);
-  array_77EC08[1999].v_18.y = 0;
-  array_77EC08[1999].v_18.x = v10;
-  array_77EC08[1999].v_18.z = stru_5C6E00->Cos(pIndoorCamera->sRotationX);
-  array_77EC08[1999].field_24 = 2048 - (pIndoorCamera->pos.z << 16);
-  a1a = (signed __int64)((double)(pIndoorCamera->pos.z * pOutdoorCamera->int_fov_rad)
-                       / ((double)pOutdoorCamera->int_fov_rad + 8192.0)
-                       + (double)pViewport->uScreenCenterY);
-  cos((double)pIndoorCamera->sRotationX * 0.0030664064);
-  sin((double)pIndoorCamera->sRotationX * 0.0030664064);
-  array_77EC08[1999]._48607B(&stru_8019C8);
-  array_77EC08[1999].ptr_38->sky_48694B();
-
-  if (pOutdoor->uSky_TextureID == -1)
-  {
-    array_77EC08[1999].pTexture = nullptr;
-    return;
-  }
-  else
-    array_77EC08[1999].pTexture = pBitmaps_LOD->GetTexture(pOutdoor->uSky_TextureID);
-  array_77EC08[1999].dimming_level = 0;
-  v11 = stru_5C6E00->Sin(pIndoorCamera->sRotationX + 16);
-  array_77EC08[1999].v_18.y = 0;
-  array_77EC08[1999].v_18.x = -v11;
-  array_77EC08[1999].v_18.z = -stru_5C6E00->Cos(pIndoorCamera->sRotationX + 16);
-  LOWORD(v2) = 224 * LOWORD(pMiscTimer->uTotalGameTimeElapsed);
-  array_77EC08[1999].field_24 = 0x2000000u;
-  array_77EC08[1999].sTextureDeltaU = 224 * pMiscTimer->uTotalGameTimeElapsed;
-  array_77EC08[1999].sTextureDeltaV = 224 * pMiscTimer->uTotalGameTimeElapsed;
-  if ( day_attrib & DAY_ATTRIB_FOG
-    && (LOWORD(v2) = LOWORD(pParty->uCurrentHour), pParty->uCurrentHour >= 5)
-    && pParty->uCurrentHour < 0x15
-    || bUnderwater )
-  {
-    v2 = (stru148 *)*(short *)PaletteManager::Get_Mist_or_Red_LUT(array_77EC08[1999].pTexture->palette_id2, 31, 1);
-    a1b = (unsigned int)v2;
-    if ( (signed int)v9 <= 0 )
-      return;
-    v29 = v9;
-    while ( 1 )
-    {
-      v30 = &pSpans[v29 - 1];
-      v2 = (stru148 *)v30->field_E;
-      if ( v2 != (stru148 *)unnamed_6BE060[1] )
-      {
-        LOWORD(v2) = LOWORD(pViewport->uViewportTL_X);
-        if ( v30->field_8 >= (signed int)pViewport->uViewportTL_X )
-          goto LABEL_124;
-        if ( v30->field_C == pViewport->uViewportTL_X )
-        {
-          v30->field_E = LOWORD(unnamed_6BE060[1]);
-        }
-        else
-        {
-          v30->field_8 = LOWORD(pViewport->uViewportTL_X);
-          v30->field_C -= LOWORD(pViewport->uViewportTL_X);
-          if ( v30->field_C >= 0 )
-          {
-LABEL_124:
-            v31 = v30->field_C;
-            v30->pParent = &array_77EC08[1999];
-            fill_pixels_fast(
-              a1b,
-              &pRenderer->pTargetSurface[v30->field_8 + pRenderer->uTargetSurfacePitch * v30->field_A],
-              v31);
-            j_memset32(-65536, &pRenderer->pActiveZBuffer[v30->field_8 + 640 * v30->field_A], v30->field_C);
-            goto LABEL_125;
-          }
-          LOWORD(v2) = LOWORD(unnamed_6BE060[1]);
-          v30->field_E = LOWORD(unnamed_6BE060[1]);
-        }
-      }
-LABEL_125:
-      --v29;
-      --v9;
-      if ( !v9 )
-        return;
-    }
-  }
-  if ( (signed int)v9 > 0 )
-  {
-    v12 = v9;
-    do
-    {
-      v13 = &pSpans[v12 - 1];
-      v2 = (stru148 *)v13->field_E;
-      if ( v2 != (stru148 *)unnamed_6BE060[1] )
-      {
-        LOWORD(v2) = LOWORD(pViewport->uViewportTL_X);
-        if ( v13->field_8 >= (signed int)pViewport->uViewportTL_X )
-          goto LABEL_109;
-        if ( v13->field_C != pViewport->uViewportTL_X )
-        {
-          v13->field_8 = LOWORD(pViewport->uViewportTL_X);
-          v13->field_C -= LOWORD(pViewport->uViewportTL_X);
-          if ( v13->field_C >= 0 )
-          {
-LABEL_109:
-            if ( pOutdoorCamera->bNoSky )
-            {
-              const_1_0();
-            }
-            else
-            {
-              v13->pParent = &array_77EC08[1999];
-              if ( !Render::DrawSkySW(v13, &array_77EC08[1999], a1a) )
-                j_memset32(-65536, &pRenderer->pActiveZBuffer[v13->field_8 + 640 * v13->field_A], v13->field_C);
-            }
-          }
-          LOWORD(v2) = LOWORD(unnamed_6BE060[1]);
-          v13->field_E = LOWORD(unnamed_6BE060[1]);
-          goto LABEL_114;
-        }
-        v13->field_E = LOWORD(unnamed_6BE060[1]);
-      }
-LABEL_114:
-      --v12;
-      --v9;
-    }
-    while ( v9 );
-  }
-}
-
-//----- (00485044) --------------------------------------------------------
-int Render::DrawSkySW(Span *a1, stru148 *a2, int a3)
-{
-  stru148 *v3; // esi@1
-  Span *v4; // edi@1
-  float v5; // ST2C_4@1
-  signed int result; // eax@2
-  int v7; // ST40_4@3
-  stru149 *v8; // eax@3
-  int v9; // ebx@3
-  int v10; // ecx@3
-  int v11; // edx@3
-  int v12; // eax@3
-  int v13; // ST28_4@5
-  int v14; // eax@5
-  signed __int64 v15; // qtt@11
-  int v16; // ST28_4@11
-  int v17; // eax@11
-  signed int v18; // ecx@11
-  int v19; // ST40_4@11
-  int v20; // ST3C_4@11
-  int v21; // ST30_4@11
-  void *v22; // eax@11
-  Texture *v23; // esi@11
-  int v24; // ecx@11
-  unsigned int v25; // esi@11
-  int v26; // edi@11
-  unsigned __int16 *v27; // eax@11
-  int *v28; // ebx@12
-  int v29; // edx@13
-  unsigned __int16 v30; // cx@13
-  int v31; // edx@14
-  unsigned __int16 v32; // cx@14
-  unsigned __int8 v33; // sf@15
-  unsigned __int8 v34; // of@15
-  double v35; // [sp+14h] [bp-38h]@1
-  int v36; // [sp+18h] [bp-34h]@3
-  signed int v37; // [sp+18h] [bp-34h]@11
-  int v38; // [sp+1Ch] [bp-30h]@3
-  signed int v39; // [sp+1Ch] [bp-30h]@11
-  int v40; // [sp+20h] [bp-2Ch]@3
-  void *v41; // [sp+20h] [bp-2Ch]@11
-  int v42; // [sp+24h] [bp-28h]@3
-  unsigned __int8 *v43; // [sp+24h] [bp-28h]@11
-  int v44; // [sp+28h] [bp-24h]@11
-  int v45; // [sp+2Ch] [bp-20h]@3
-  signed int v46; // [sp+30h] [bp-1Ch]@3
-  __int16 v47; // [sp+30h] [bp-1Ch]@11
-  signed int v48; // [sp+34h] [bp-18h]@3
-  int v49; // [sp+34h] [bp-18h]@11
-  int v50; // [sp+38h] [bp-14h]@3
-  unsigned __int16 *v51; // [sp+38h] [bp-14h]@11
-  int v52; // [sp+3Ch] [bp-10h]@4
-  int a1a; // [sp+40h] [bp-Ch]@3
-  int v54; // [sp+44h] [bp-8h]@3
-  int v55; // [sp+48h] [bp-4h]@3
-  int v56; // [sp+54h] [bp+8h]@11
-  int *v57; // [sp+54h] [bp+8h]@11
-
-  v3 = a2;
-  v4 = a1;
-  v5 = (double)(pViewport->uViewportBR_X - pViewport->uViewportTL_X) * 0.5 / tan(0.6457717418670654) + 0.5;
-  v35 = v5 + 6.7553994e15;
-  if ( LODWORD(v35) )
-  {
-    v55 = 65536 / SLODWORD(v35);
-    v7 = 65536 / SLODWORD(v35) * (a3 - v4->field_A);
-    v8 = v3->ptr_38;
-    v42 = ((unsigned __int64)(v3->ptr_38->field_14 * (signed __int64)v7) >> 16) + v8->field_C;
-    v40 = ((unsigned __int64)(v8->field_20 * (signed __int64)v7) >> 16) + v3->ptr_38->field_18;
-    v38 = pOutdoorCamera->camera_rotation_y_int_sine;
-    HIDWORD(v35) = pOutdoorCamera->camera_rotation_y_int_cosine;
-    v45 = v4->field_C;
-    v9 = ((unsigned __int64)(v3->v_18.z * (signed __int64)v7) >> 16) + v3->v_18.x;
-    v10 = 65536 / SLODWORD(v35) * (pViewport->uScreenCenterX - v4->field_8);
-    v48 = 0;
-    v50 = 65536 / SLODWORD(v35) * (pViewport->uScreenCenterX - v4->field_8);
-    v46 = -v3->field_24;
-    v11 = v4->field_A - 1;
-    v54 = v11;
-    v12 = 65536 / SLODWORD(v35) * (a3 - v11);
-    a1a = 65536 / SLODWORD(v35) * (a3 - v11);
-    while ( 1 )
-    {
-      v52 = v9;
-      if ( v9 )
-      {
-        v13 = abs(v46 >> 14);
-        v14 = abs(v9);
-        v11 = v54;
-        v10 = v50;
-        if ( v13 <= v14 )
-          break;
-        v12 = a1a;
-      }
-      if ( v11 <= (signed int)pViewport->uViewportTL_Y )
-        break;
-      v9 = ((unsigned __int64)(v3->v_18.z * (signed __int64)v12) >> 16) + v3->v_18.x;
-      --v54;
-      a1a += v55;
-      v12 = a1a;
-      v11 = v54;
-      v48 = 1;
-    }
-    if ( v48 )
-      v52 = ((unsigned __int64)(v3->v_18.z * (signed __int64)(v55 * (a3 + (signed int)v4->field_A - 2 * v11))) >> 16)
-          + v3->v_18.x;
-    LODWORD(v15) = v46 << 16;
-    HIDWORD(v15) = v46 >> 16;
-    v16 = v42 + ((unsigned __int64)(v3->ptr_38->field_10 * (signed __int64)v10) >> 16);
-    v17 = v40 + ((unsigned __int64)(v3->ptr_38->field_1C * (signed __int64)v10) >> 16);
-    v18 = v15 / v52;
-    v43 = v3->pTexture->pLevelOfDetail0_prolly_alpha_mask;
-    v19 = v3->sTextureDeltaU + ((signed int)((unsigned __int64)(v16 * v15 / v52) >> 16) >> 3);
-    v56 = v15 / v52;
-    v20 = v3->sTextureDeltaV + ((signed int)((unsigned __int64)(v17 * v15 / v52) >> 16) >> 3);
-    v21 = (unsigned __int64)(v55 * (signed __int64)v56) >> 16;
-    v39 = (signed int)((unsigned __int64)(v21 * (signed __int64)v38) >> 16) >> 3;
-    v37 = (signed int)((unsigned __int64)(v21 * (signed __int64)v36) >> 16) >> 3;
-    v22 = sr_sub_47C178(v18, v3, 0, 1);
-    v23 = v3->pTexture;
-    v41 = v22;
-    v47 = 16 - v23->uWidthLn2;
-    v44 = v23->uTextureWidth - 1;
-    v49 = (v23->uTextureHeight << 16) - 65536;
-    v24 = v4->field_8;
-    v51 = &pRenderer->pTargetSurface[v24 + pRenderer->uTargetSurfacePitch * v4->field_A];
-    v57 = &pRenderer->pActiveZBuffer[v24 + 640 * v4->field_A];
-    v25 = v19;
-    v26 = v20;
-    v27 = v51;
-    if ( !(v45 & 1) )
-      goto LABEL_15;
-    --v45;
-    v27 = v51 - 1;
-    v28 = v57;
-    ++v57;
-    while ( 1 )
-    {
-      *v28 = -65536;
-      v31 = v44 & (v25 >> 16);
-      v27 += 2;
-      v25 += v39;
-      v32 = *((short *)v41 + *(&v43[v31] + ((v49 & (unsigned int)v26) >> v47)));
-      v26 += v37;
-      *(v27 - 1) = v32;
-LABEL_15:
-      v34 = __OFSUB__(v45, 2);
-      v33 = v45 - 2 < 0;
-      v45 -= 2;
-      if ( v33 ^ v34 )
-        break;
-      v29 = v44 & (v25 >> 16);
-      v25 += v39;
-      v30 = *((short *)v41 + *(&v43[v29] + ((v49 & (unsigned int)v26) >> v47)));
-      v26 += v37;
-      v28 = v57;
-      *v27 = v30;
-      v57 += 2;
-      v28[1] = -65536;
-    }
-    result = 1;
-  }
-  else
-  {
-    result = 0;
-  }
-  return result;
-}
-
-//----- (0047F5C6) --------------------------------------------------------
-float Render::DrawBezierTerrain()
-{
- //__debugbreak();Ritor1: it's temporarily
-  //return 0;
-  
-  unsigned int pDirectionIndicator1; // ebx@1
-  unsigned int pDirectionIndicator2; // edi@1
-  unsigned int v2; // eax@1
-  int v3; // eax@3
-  int v4; // edi@3
-  int v5; // ebx@3
-  int v6; // esi@3
-  unsigned int v7; // eax@3
-  int v8; // eax@4
-  unsigned int v9; // eax@6
-  int v10; // eax@7
-  //int v11; // ebx@9
-  //int v12; // edi@9
-  int v13; // eax@21
-  int v14; // eax@31
-  int v15; // edi@33
-  int v16; // eax@34
-  int v17; // edx@34
-  int v18; // ebx@34
-  int v19; // eax@36
-  int v20; // eax@39
-  int v21; // ecx@43
-  //char v22; // zf@44
-  int v23; // ecx@47
-  //int v24; // edi@52
-  int v25; // eax@54
-  int v26; // ecx@54
-  int v27; // eax@56
-  int v28; // edx@60
-  int v29; // ecx@61
-  int v30; // ecx@64
-  int v31; // ecx@68
-  int v32; // eax@70
-  //int v33; // ecx@71
-  int v34; // eax@73
-  int v35; // ecx@77
-  int v36; // ecx@81
-  int v37; // ecx@86
-  int v38; // eax@88
-  int v39; // ecx@88
-  int v40; // eax@90
-  int v41; // edx@94
-  //int v42; // ecx@95
-  int v43; // ecx@98
-  int v44; // ecx@102
-  int v45; // eax@104
-  int v46; // eax@107
-  int v47; // ecx@111
-  int v48; // ecx@115
-  int v49; // edi@120
-  int v50; // eax@122
-  int v51; // ecx@122
-  int v52; // eax@124
-  int v53; // edx@128
-  int v54; // ecx@129
-  int v55; // ecx@132
-  int v56; // eax@139
-  int v57; // ecx@140
-  int v58; // eax@142
-  int v59; // ecx@146
-  //int v60; // ecx@147
-  int v61; // ecx@150
-  int v62; // ecx@155
-  int v63; // eax@157
-  int v64; // ecx@157
-  int v65; // eax@159
-  int v66; // edx@163
-  int v67; // ecx@164
-  int v68; // ecx@167
-  //int v69; // eax@173
-  int v70; // edi@178
-  //int v71; // eax@178
-  //int v72; // ecx@178
-  //int x; // ebx@180
-  //int v74; // eax@182
-  //int v75; // eax@184
-  IndoorCameraD3D *pIndoorCameraD3D_3; // ecx@184
-  int uStartZ; // ecx@184
-  int v79; // ebx@185
-  int v127; // esi@185
-  int v86; // edi@196
-  //int v87; // eax@196
-  //int v88; // ecx@196
-  //int v89; // eax@198
-  //int v90; // ecx@200
-  int v92; // ebx@203
-  //int v93; // ST08_4@204
-  int v97; // ST08_4@204
-  float result; // eax@212
-  //struct 
-  //{
-  int v106; // [sp+Ch] [bp-68h]@191
-  int v103; // [sp+10h] [bp-64h]@190
-  int v104; // [sp+12h] [bp-62h]@190
-  //} v102;
-  int v105; // [sp+1Ch] [bp-58h]@1
-  int v107; // [sp+20h] [bp-54h]@3
-  int uEndZ; // [sp+24h] [bp-50h]@3
-  int v108; // [sp+28h] [bp-4Ch]@9
-  int v109; // [sp+2Ch] [bp-48h]@9
-  int v110; // [sp+30h] [bp-44h]@9
-  int v111; // [sp+34h] [bp-40h]@3
-  int v112; // [sp+38h] [bp-3Ch]@6
-  IndoorCameraD3D *pIndoorCameraD3D_4; // [sp+3Ch] [bp-38h]@9
-  int v114; // [sp+40h] [bp-34h]@9
-  int v115; // [sp+44h] [bp-30h]@9
-  int v116; // [sp+48h] [bp-2Ch]@9
-  //int v117; // [sp+4Ch] [bp-28h]@9
-  int v118; // [sp+50h] [bp-24h]@9
-  int v119; // [sp+54h] [bp-20h]@1
-  int v120; // [sp+58h] [bp-1Ch]@1
-  int i; // [sp+5Ch] [bp-18h]@1
-  int v122; // [sp+60h] [bp-14h]@1
-  int v123; // [sp+64h] [bp-10h]@1
-  int v124; // [sp+68h] [bp-Ch]@1
-  int v125; // [sp+6Ch] [bp-8h]@9
-  int v126; // [sp+70h] [bp-4h]@9
-
-  v105 = pIndoorCamera->sRotationY / ((signed int)stru_5C6E00->uIntegerHalfPi / 2);//2
-  pDirectionIndicator1 = stru_5C6E00->uDoublePiMask & (stru_5C6E00->uIntegerDoublePi - pIndoorCamera->sRotationY);//1536
-  pDirectionIndicator2 = stru_5C6E00->uDoublePiMask & (stru_5C6E00->uIntegerPi + pDirectionIndicator1);//512
-  v124 = ((pIndoorCamera->uMapGridCellX << 16) + 3 * stru_5C6E00->Cos(stru_5C6E00->uDoublePiMask & (stru_5C6E00->uIntegerPi + pDirectionIndicator1))) >> 16;//88
-  v123 = ((pIndoorCamera->uMapGridCellZ << 16) + 3 * stru_5C6E00->Sin(pDirectionIndicator2)) >> 16;// 66
-  v120 = pOutdoorCamera->outdoor_grid_band_3 + v124;//+- range X
-  v119 = pOutdoorCamera->outdoor_grid_band_3 + v123;
-  v2 = pOutdoorCamera->uCameraFovInDegrees + 15;//90
-  i = v124 - pOutdoorCamera->outdoor_grid_band_3;
-  v122 = v123 - pOutdoorCamera->outdoor_grid_band_3;
-
-  if ( v2 > 90 )
-    v2 = 90;
-  v3 = (v2 << 11) / 720;
-  v4 = stru_5C6E00->uDoublePiMask & (pDirectionIndicator1 - v3);
-  v5 = stru_5C6E00->uDoublePiMask & (v3 + pDirectionIndicator1);
-
-  v106 = stru_5C6E00->Cos(v4);
-  uEndZ = stru_5C6E00->Sin(v4);
-
-  v111 = stru_5C6E00->Cos(v5);
-  v6 = stru_5C6E00->Sin(v5);
-
-  v7 = v4 & stru_5C6E00->uPiMask;
-  if ( (v4 & stru_5C6E00->uPiMask) >= stru_5C6E00->uIntegerHalfPi )
-    v8 = -stru_5C6E00->pTanTable[stru_5C6E00->uIntegerPi - v7];
-  else
-    v8 = stru_5C6E00->pTanTable[v7];
-  v112 = abs(v8);
-
-  v9 = v5 & stru_5C6E00->uPiMask;
-  if ( (v5 & stru_5C6E00->uPiMask) >= stru_5C6E00->uIntegerHalfPi )
-    v10 = -stru_5C6E00->pTanTable[stru_5C6E00->uIntegerPi - v9];
-  else
-    v10 = stru_5C6E00->pTanTable[v9];
-  v108 = abs(v10);
-
-  //v11 = v124;
-  //v12 = v123;
-  v114 = 0;
-  v115 = 0;
-  pIndoorCameraD3D_4 = 0;
-  v125 = 0;
-  v126 = v124;
-  v118 = v123;
-
-  v110 = (v106 >= 0 ? 1: -1);//2 * (v106 >= 0) - 1;
-  v109 = (uEndZ >= 0 ? 1: -1);//2 * (v107 >= 0) - 1;
-  uEndZ = (v111 >= 0 ? 1: -1);//2 * (v111 >= 0) - 1;
-  v106 = (v6 >= 0 ? 1: -1);//2 * (v6 >= 0) - 1;
-
-  uint _i = 1;
-  uint j = 1;
-
-  terrain_76DDC8[0] = -1;
-  terrain_76DFC8[0] = -1;
-  terrain_76E1C8[0] = -1;
-  terrain_76E3C8[0] = -1;
-
-  for( uint _i = 1; _i < 128; _i++)
-  {
-    if ( v112 >= 0x10000 )
-    {
-      int v1, v2;
-      /*v111 = 4294967296i64 / v112;
-      v114 += v111;
-      if ( v114 >= 65536 )
-      {
-        v11 += v110;
-        v114 = (unsigned __int16)v114;
-      }
-      v12 += v109;*/
-    }
-    else
-    {
-      v124 += v110;
-      v115 += v112;
-      if ( v112 + v115 >= 65536 )
-      {
-        v123 += v109;
-        v115 = (unsigned __int16)v115;
-      }
-    }
-    if ( v124 < _i || v124 > v120 || v123 < v122 || v123 > v119 )
-      break;
-    //v13 = v116++;
-    terrain_76E3C8[_i] = v124;
-    terrain_76E1C8[_i] = v123;
-  }
-
-  for( j = 1; j < 128; j++ )
-  {
-    if ( v108 >= 65536 )
-    {
-      v111 = 4294967296i64 / v108;
-      v114 += v111;//
-      if ( v111 + v114 >= 65536 )
-      {
-        v126 += uEndZ;
-        v114 = (unsigned __int16)v114;//
-      }
-      v118 += v106;
-    }
-    else
-    {
-      v125 += v108;
-      v126 += uEndZ;
-      if ( v125 >= 65536 )
-      {
-        v118 += v106;
-        v125 = (unsigned __int16)v125;
-      }
-    }
-    //if ( v117 >= 128 )
-      //break;
-    if ( v126 < _i )
-      break;
-    if ( v126 > v120 )
-      break;
-    v14 = v118;
-    if ( v118 < v122 )
-      break;
-    if ( v118 > v119 )
-      break;
-    terrain_76DFC8[j] = v126;
-    terrain_76DDC8[j] = v14;
-  }
-  v16 = 0;
-  v126 = 0;
-  v17 = j - 1;
-  v18 = _i - 1;
-
-  switch ( v105 )
-  {
-    case 0:
-    case 7:
-    {
-      //v116 = terrain_76DFC8[v17];
-      if ( v120 > terrain_76DFC8[v17] )
-      {
-        v125 = v120;
-        memset32(terrain_76D9C8.data(), v119 + 1, 4 * (v120 - terrain_76DFC8[v17] + 1));
-        v19 = v120;
-        do
-          terrain_76DBC8[v126++] = v19--;
-        while ( v19 >= terrain_76DFC8[v17] );
-        if ( terrain_76DFC8[v17] == terrain_76DDC8[v17 + 127] )
-        {
-          do
-            v20 = terrain_76DDC8[v17-- -1];
-          while ( v20 == terrain_76DDC8[v17 -1] );
-        }
-        v16 = v126;
-        --v17;
-      }
-      if ( v17 < 0 )
-        v17 = 0;
-      v21 = terrain_76DFC8[v17];
-      while ( 1 )
-      {
-        v125 = terrain_76DFC8[v17];
-        if ( v21 < v124 )
-          break;
-        terrain_76DBC8[v16] = v21;
-        //v22 = terrain_76DDC8[v17] == 65535;
-        terrain_76D9C8[v16] = terrain_76DDC8[v17] + 1;
-        if ( terrain_76DDC8[v17] == 65535 )
-        {
-          terrain_76D9C8[v16] = v123 + 1;
-          break;
-        }
-        if ( !v17 )
-          break;
-        if ( terrain_76DFC8[v17] == terrain_76DDC8[v17 - 1] )
-        {
-          do
-            v23 = terrain_76DDC8[v17-- -1];
-          while ( v23 == terrain_76DDC8[v17 -1] );
-        }
-        --v17;
-        v21 = v125 - 1;
-        ++v16;
-      }
-      v16 = 0;
-      //v24 = terrain_76E3C8[v18];
-      v126 = 0;
-      if ( v120 > terrain_76E3C8[v18] )
-      {
-        v125 = v120;
-        memset32(terrain_76D5C8.data(), v122, 4 * (v120 - terrain_76E3C8[v18] + 1));
-        do
-        {
-          v25 = v126;
-          v26 = v125--;
-          ++v126;
-          terrain_76D7C8[v25] = v26;
-        }
-        while ( v125 >= terrain_76E3C8[v18] );
-        if ( terrain_76E3C8[v18] == terrain_76E1C8[v18 -1] )
-        {
-          do
-            v27 = terrain_76E1C8[v18-- -1];
-          while ( v27 == terrain_76E1C8[v18 -1] );
-        }
-        v16 = v126;
-        --v18;
-      }
-      if ( v18 < 0 )
-        v18 = 0;
-      v28 = terrain_76E3C8[v18];
-      while ( v28 >= v124 )
-      {
-        v29 = terrain_76E1C8[v18];
-        terrain_76D7C8[v16] = v28;
-        terrain_76D5C8[v16] = v29;
-        if ( v29 == 65535 )
-        {
-          v31 = v123;
-          terrain_76D5C8[v16] = v31;
-          break;
-        }
-        if ( !v18 )
-          break;
-        if ( terrain_76E3C8[v18] == terrain_76E1C8[v18 -1] )
-        {
-          do
-            v30 = terrain_76E1C8[v18-- -1];
-          while ( v30 == terrain_76E1C8[v18 -1] );
-        }
-        --v18;
-        --v28;
-        ++v16;
-      }
-      break;
-    }
-    case 1:
-    case 2:
-    {
-      //v116 = terrain_76DDC8[v17];
-      if ( v122 < terrain_76DDC8[v17] )
-      {
-        v106 = v122;
-        memset32(terrain_76DBC8.data(), v120 + 1, 4 * (terrain_76DDC8[v17] - v122 + 1));
-        for ( v32 = v122; v32 <= terrain_76DDC8[v17]; v32++)
-          terrain_76D9C8[v126++] = v32;
-        if ( terrain_76DDC8[v17] == terrain_76DBC8[v17 -1] )
-        {
-          do
-            v34 = terrain_76DBC8[v17-- -1];
-          while ( v34 == terrain_76DBC8[v17 -1] );
-        }
-        v16 = v126;
-        --v17;
-      }
-      if ( v17 < 0 )
-        v17 = 0;
-      v35 = terrain_76DDC8[v17];
-      v125 = terrain_76DDC8[v17];
-      while ( v35 <= v123 )
-      {
-        //v22 = terrain_76DFC8[v17] == 65535;
-        terrain_76DBC8[v16] = terrain_76DFC8[v17] + 1;
-        terrain_76D9C8[v16] = v125;
-        if ( terrain_76DFC8[v17] == 65535 )
-        {
-          terrain_76DBC8[v16] = v124 + 1;
-          break;
-        }
-        if ( !v17 )
-          break;
-        if ( terrain_76DDC8[v17] == terrain_76DBC8[v17 -1] )
-        {
-          do
-            v36 = terrain_76DBC8[v17-- -1];
-          while ( v36 == terrain_76DBC8[v17 -1] );
-        }
-        --v17;
-        ++v125;
-        v35 = v125;
-        ++v16;
-      }
-      v16 = 0;
-      v126 = 0;
-      v37 = terrain_76E1C8[v18];
-      if ( v122 < v37 )
-      {
-        v114 = v122;
-        memset32(terrain_76D7C8.data(), i, 4 * (v37 - v122 + 1));
-        do
-        {
-          v38 = v126;
-          v39 = v114;
-          ++v126;
-          ++v114;
-          terrain_76D5C8[v38] = v39;
-        }
-        while ( v114 <= terrain_76E1C8[v18] );
-        if ( terrain_76E1C8[v18] == terrain_76DFC8[v18 -1] )
-        {
-          do
-            v40 = terrain_76DFC8[v18-- -1];
-          while ( v40 == terrain_76DFC8[v18 -1] );
-        }
-        v16 = v126;
-        --v18;
-      }
-      if ( v18 < 0 )
-        v18 = 0;
-      v41 = terrain_76E1C8[v18];
-      while ( v41 <= v123 )
-      {
-        terrain_76D5C8[v16] = v41;
-        terrain_76D7C8[v16] = terrain_76E3C8[v18];
-        if ( terrain_76E3C8[v18] == 65535 )
-        {
-          terrain_76D7C8[v16] = v124;
-          break;
-        }
-        if ( !v18 )
-          break;
-        if ( terrain_76E1C8[v18] == terrain_76DFC8[v18 -1] )
-        {
-          do
-            v43 = terrain_76DFC8[v18-- -1];
-          while ( v43 == terrain_76DFC8[v18 -1] );
-        }
-        --v18;
-        ++v41;
-        ++v16;
-      }
-      break;
-    }
-    case 5:
-    case 6:
-    {
-      //v116 = terrain_76DDC8[v17];
-      if ( v119 > terrain_76DDC8[v17] )
-      {
-        v106 = v119;
-        memset32(terrain_76DBC8.data(), i, 4 * (v119 - terrain_76DDC8[v17] + 1));
-        for ( v45 = v119; v45 >= terrain_76DDC8[v17]; v45--)
-          terrain_76D9C8[v126++] = v45;
-        if ( terrain_76DDC8[v17] == terrain_76DBC8[v17 -1] )
-        {
-          do
-            v46 = terrain_76DBC8[v17-- -1];
-          while ( v46 == terrain_76DBC8[v17 -1] );
-        }
-        v16 = v126;
-        --v17;
-      }
-      if ( v17 < 0 )
-        v17 = 0;
-      v47 = terrain_76DDC8[v17];
-      v125 = terrain_76DDC8[v17];
-      while ( v47 >= v123 )
-      {
-        //v22 = terrain_76DFC8[v17] == 65535;
-        terrain_76DBC8[v16] = terrain_76DFC8[v17];
-        terrain_76D9C8[v16] = v125;
-        if ( terrain_76DFC8[v17] == 65535 )
-        {
-          terrain_76DBC8[v16] = v124;
-          break;
-        }
-        if ( !v17 )
-          break;
-        if ( terrain_76DDC8[v17] == terrain_76DBC8[v17 -1] )
-        {
-          do
-            v48 = terrain_76DBC8[v17-- -1];
-          while ( v48 == terrain_76DBC8[v17 -1] );
-        }
-        --v17;
-        --v125;
-        v47 = v125;
-        ++v16;
-      }
-      v16 = 0;
-      v49 = terrain_76E1C8[v18];
-      v126 = 0;
-      if ( v119 > v49 )
-      {
-        v125 = v119;
-        memset32(terrain_76D7C8.data(), v120 + 1, 4 * (v119 - v49 + 1));
-        do
-        {
-          v50 = v126;
-          v51 = v125--;
-          ++v126;
-          terrain_76D5C8[v50] = v51;
-        }
-        while ( v125 >= terrain_76E1C8[v18] );
-        if ( terrain_76E1C8[v18] == terrain_76DFC8[v18 -1] )
-        {
-          do
-            v52 = terrain_76DFC8[v18-- -1];
-          while ( v52 == terrain_76DFC8[v18 -1] );
-        }
-        v16 = v126;
-        --v18;
-      }
-      if ( v18 < 0 )
-        v18 = 0;
-      v53 = terrain_76E1C8[v18];
-      while ( v53 >= v123 )
-      {
-        v54 = terrain_76E3C8[v18];
-        terrain_76D5C8[v16] = v53;
-        terrain_76D7C8[v16] = v54 + 1;
-        if ( v54 == 65535 )
-        {
-          terrain_76D7C8[v16] = v124 + 1;
-          break;
-        }
-        if ( !v18 )
-          break;
-        if ( terrain_76E1C8[v18] == terrain_76DFC8[v18 -1] )
-        {
-          do
-            v55 = terrain_76DFC8[v18-- -1];
-          while ( v55 == terrain_76DFC8[v18 -1] );
-        }
-        --v18;
-        --v53;
-        ++v16;
-      }
-      break;
-    }
-    case 3:
-    case 4:
-    {
-      //v116 = terrain_76DFC8[v17];
-      if ( i < terrain_76DFC8[v17] )
-      {
-        v106 = i;
-        memset32(terrain_76D9C8.data(), v122, 4 * (terrain_76DFC8[v17] - i + 1));
-        v56 = i;
-        do
-        {
-          v57 = v126++;
-          terrain_76DBC8[v57] = v56++;
-        }
-        while ( v56 <= terrain_76DFC8[v17] );
-        if ( terrain_76DFC8[v17] == terrain_76DDC8[v17 -1] )
-        {
-          do
-            v58 = terrain_76DDC8[v17-- -1];
-          while ( v58 == terrain_76DDC8[v17 -1] );
-        }
-        v16 = v126;
-        --v17;
-      }
-      if ( v17 < 0 )
-        v17 = 0;
-      v59 = terrain_76DFC8[v17];
-      while ( 1 )
-      {
-        v125 = v59;
-        if ( v59 > v124 )
-          break;
-        terrain_76DBC8[v16] = v59;
-        //v60 = terrain_76DDC8[v17];
-        terrain_76D9C8[v16] = terrain_76DDC8[v17];
-        if ( terrain_76DDC8[v17] == 65535 )
-        {
-          terrain_76D9C8[v16] = v123;
-          break;
-        }
-        if ( !v17 )
-          break;
-        if ( terrain_76DFC8[v17] == terrain_76DDC8[v17 -1] )
-        {
-          do
-            v61 = terrain_76DDC8[v17-- -1];
-          while ( v61 == terrain_76DDC8[v17 -1] );
-        }
-        --v17;
-        v59 = v125 + 1;
-        ++v16;
-      }
-      v16 = 0;
-      v126 = 0;
-      v62 = terrain_76E3C8[v18];
-      if ( i < v62 )
-      {
-        v114 = i;
-        memset32(terrain_76D5C8.data(), v119 + 1, 4 * (v62 - i + 1));
-        do
-        {
-          v63 = v126;
-          v64 = v114;
-          ++v126;
-          ++v114;
-          terrain_76D7C8[v63] = v64;
-        }
-        while ( v114 <= terrain_76E3C8[v18] );
-        if ( terrain_76E3C8[v18] == terrain_76E1C8[v18 -1] )
-        {
-          do
-            v65 = terrain_76E1C8[v18-- -1];
-          while ( v65 == terrain_76E1C8[v18 -1] );
-        }
-        v16 = v126;
-        --v18;
-      }
-      if ( v18 < 0 )
-        v18 = 0;
-      v66 = terrain_76E3C8[v18];
-      while ( v66 <= v124 )
-      {
-        v67 = terrain_76E1C8[v18];
-        terrain_76D7C8[v16] = v66;
-        terrain_76D5C8[v16] = v67 + 1;
-        if ( terrain_76E1C8[v18] == 65535 )
-        {
-          v31 = v123 + 1;
-          terrain_76D5C8[v16] = v31;
-          break;
-        }
-        if ( !v18 )
-          break;
-        if ( terrain_76E3C8[v18] == terrain_76E1C8[v18 -1] )
-        {
-          do
-            v68 = terrain_76E1C8[v18-- -1];
-          while ( v68 == terrain_76E1C8[v18 -1] );
-        }
-        --v18;
-        ++v66;
-        ++v16;
-      }
-      break;
-    }
-    default:
-      break;
-  }
-  //v69 = v16 - 1;
-  ptr_801A08 = pVerticesSR_806210;
-  ptr_801A04 = pVerticesSR_801A10;
-  //v126 = v69;
-
-  if ( v105 && v105 != 7 && v105 != 3 && v105 != 4 )//áëîê
-  {
-    for ( i = v16 - 1; i >= 1; --i )
-    {
-      //v70 = i;
-      //v71 = terrain_76D7C8[i];//88
-      //v72 = terrain_76DBC8[i];//0
-      if ( terrain_76D7C8[i] < terrain_76DBC8[i] )//swap
-      {
-        terrain_76DBC8[i] = terrain_76D7C8[i];
-        terrain_76D7C8[i] = terrain_76DBC8[i];
-      }
-      //x = terrain_76DBC8[i];//0
-      v111 = 0;
-      if ( terrain_76DBC8[i] <= 0 )
-        terrain_76DBC8[i] = -terrain_76DBC8[i];
-      //v74 = terrain_76D7C8[i];
-      if ( terrain_76D7C8[i] <= 0 )
-        terrain_76D7C8[i] = -terrain_76D7C8[i];
-      uEndZ = terrain_76D7C8[i] + 2;
-      //pIndoorCameraD3D_3 = pGame->pIndoorCameraD3D;
-      //uEndZ = v75;
-      //pIndoorCameraD3D_4 = pIndoorCameraD3D_3;
-      uStartZ = terrain_76DBC8[i] - 2;
-      if ( terrain_76DBC8[i] - 2 < uEndZ )
-      {
-        v127 = 0;
-        //v79 = (v73 - 66) << 9;
-        //v116 = v77;
-        //pHeight = v79;
-        v111 = uEndZ - uStartZ;
-        for (int z = uStartZ; z < uEndZ; ++z)
-        {
-          ptr_801A08[v127].vWorldPosition.x = (-64 + terrain_76DBC8[i]) * 512;//pTerrainVertices[z * 128 + x].vWorldPosition.x = (-64 + (signed)x) * 512;
-          ptr_801A08[v127].vWorldPosition.y = (64 - terrain_76D9C8[i]) * 512;
-          ptr_801A08[v127].vWorldPosition.z = pOutdoor->GetHeightOnTerrain( z, terrain_76D9C8[i]);
-
-          ptr_801A04[v127].vWorldPosition.x = (-64 + terrain_76DBC8[i]) * 512;
-          ptr_801A04[v127].vWorldPosition.y = (63 - terrain_76D9C8[i]) * 512;
-          ptr_801A04[v127].vWorldPosition.z = pOutdoor->GetHeightOnTerrain( z, terrain_76D9C8[i] + 1);
-
-          if ( !byte_4D864C || !(pGame->uFlags & 0x80) )
-          {
-            pIndoorCameraD3D_4->ViewTransform(&ptr_801A08[v127], 1);
-            pIndoorCameraD3D_4->ViewTransform(&ptr_801A04[v127], 1);
-
-            pIndoorCameraD3D_4->Project(&ptr_801A08[v127], 1, 0);
-            pIndoorCameraD3D_4->Project(&ptr_801A04[v127], 1, 0);
-          }
-          //v79 += 512;
-          v127 ++;
-          //++v116;
-          //pHeight = v79;
-       }
-        //while ( v116 < v107 );
-      }
-      v103 = abs((int)pIndoorCamera->uMapGridCellZ - terrain_76D9C8[i]);
-      v104 = abs((int)pIndoorCamera->uMapGridCellX - terrain_76DBC8[i]);
-      if ( pRenderer->pRenderD3D )//Ritor1: do comment to test
-        Render::DrawTerrainD3D(v111, 0, v103, v104);
-        //Render::RenderTerrainD3D();
-      else
-        Render::DrawTerrainSW(v111, 0, v103, v104);
-    }
-  }
-  else
-  {
-    for ( i = v16 - 1; i >= 1; --i )
-    {
-      //v86 = i;
-      //v87 = terrain_76D5C8[i];
-      //v88 = terrain_76D9C8[i];
-      if ( terrain_76D5C8[i] < terrain_76D9C8[i] )
-      {
-        terrain_76D9C8[i] = terrain_76D5C8[i];
-        terrain_76D5C8[i] = terrain_76D9C8[i];
-      }
-      //v89 = terrain_76D9C8[i];
-      v111 = 0;
-      if ( terrain_76D9C8[i] <= 0 )
-        terrain_76D9C8[i] = -terrain_76D9C8[i];
-      //v90 = terrain_76D5C8[i];
-      if ( terrain_76D5C8[i] <= 0 )
-        terrain_76D5C8[i] = -terrain_76D5C8[i];
-      pIndoorCameraD3D_4 = pGame->pIndoorCameraD3D;
-      v107 = terrain_76D5C8[i] + 2;
-      if ( terrain_76D9C8[i] - 2 < terrain_76D5C8[i] + 2 )
-      {
-        v86 = 0;
-        //v116 = terrain_76D9C8[i] - 2;
-        v92 = (66 - terrain_76D9C8[i]) << 9;
-        //pHeight = (66 - terrain_76D9C8[i]) << 9;
-        v111 = terrain_76D5C8[i] + 2 - (terrain_76D9C8[i] - 2);
-        //do
-        for ( v116 = terrain_76D9C8[i] - 2; v116 < v107; ++v116 )
-        {
-          ptr_801A08[v86].vWorldPosition.x = (terrain_76DBC8[v86] - 64) << 9;
-          ptr_801A08[v86].vWorldPosition.y = v92;
-          ptr_801A08[v86].vWorldPosition.z = pOutdoor->GetHeightOnTerrain(terrain_76DBC8[v86], v116);
-
-          ptr_801A04[v86].vWorldPosition.x = (terrain_76DBC8[v86] - 63) << 9;
-          ptr_801A04[v86].vWorldPosition.y = v92;
-          ptr_801A04[v86].vWorldPosition.z = pOutdoor->GetHeightOnTerrain(terrain_76DBC8[v86] + 1, v116);
-          if ( !byte_4D864C || !(pGame->uFlags & 0x80) )
-          {
-           pIndoorCameraD3D_4->ViewTransform((RenderVertexSoft *)(char *)ptr_801A08 + v86, 1);
-           pIndoorCameraD3D_4->ViewTransform((RenderVertexSoft *)(char *)ptr_801A04 + v86, 1);
-           pIndoorCameraD3D_4->Project((RenderVertexSoft *)(char *)ptr_801A08 + v86, 1, 0);
-           pIndoorCameraD3D_4->Project((RenderVertexSoft *)(char *)ptr_801A04 + v86, 1, 0);
-          }
-          v92 -= 512;
-          v86 += 48;
-          //++v116;
-          //pHeight = v92;
-        }
-        //while ( v116 < v107 );
-      }
-      v103 = abs((int)pIndoorCamera->uMapGridCellX - terrain_76DBC8[v86]);
-	  v104 = abs((int)pIndoorCamera->uMapGridCellZ - terrain_76D9C8[v86]);
-	  if ( pRenderer->pRenderD3D )
-        Render::DrawTerrainD3D(v111, 1, v103, v104);
-      else
-        Render::DrawTerrainSW(v111, 1, v103, v104);
-    }
-  }
-  result = v126;
-  pOutdoorCamera->field_40 = v126;
-  return result;
-}
-// 47FFC4: inconsistent fpu stack
-// 4D864C: using guessed type char byte_4D864C;
-
 
 void Render::RenderTerrainD3D() // New function
 {
   char result; // al@3
   int v6; // ecx@8
- struct stru148 *pTile; // ebx@8
- struct stru148 *v16;
+ struct Polygon *pTile; // ebx@8
+ struct Polygon *v16;
   unsigned int v18; // edi@22
   int v35; // edi@63
   int v37; // eax@73
@@ -1731,7 +283,7 @@
   {
     for (unsigned int x = 0; x < 127; ++x)
     {
-      pTile = &array_77EC08[pOutdoorCamera->numStru148s];
+      pTile = &array_77EC08[pOutdoorCamera->uNumPolygons];
       pTile->flags = 0;
       pTile->field_32 = 0;
       pTile->uTileBitmapID = pOutdoor->DoGetTileTexture(x, z);
@@ -1785,9 +337,9 @@
       pTile->dimming_level = 20.0 - floorf(20.0 * _f + 0.5f);
 //-----------------------------------------------------------------------------------------------
 
-      ++pOutdoorCamera->numStru148s;
+      ++pOutdoorCamera->uNumPolygons;
       ++pOutdoorCamera->field_44;
-      assert(pOutdoorCamera->numStru148s < 20000);
+      assert(pOutdoorCamera->uNumPolygons < 20000);
 
       pTile->uBModelID = 0;
       pTile->uBModelFaceID = 0;
@@ -1826,7 +378,7 @@
         //pTile->DrawBorderTiles();
 //--------------------------------------------------------------------------------------------------------------------------------
 
-      --pOutdoorCamera->numStru148s;
+      --pOutdoorCamera->uNumPolygons;
       --pOutdoorCamera->field_44;
     }
   }
@@ -1848,7 +400,7 @@
   double v13; // ST2C_8@6
   int v14; // eax@6
   double v15; // st7@6
-  stru148 *pTile; // ebx@12
+  struct Polygon *pTile; // ebx@12
   unsigned __int16 v17; // ax@12
   int v18; // eax@13
   signed int v22; // eax@13
@@ -1868,9 +420,9 @@
   char v35; // zf@47
   unsigned int v36; // eax@50
   int v37; // eax@54
-  //stru148 *v38; // ecx@55
+  //Polygon *v38; // ecx@55
   unsigned int v39; // eax@59
-  stru148 *v40; // ebx@62
+  struct Polygon *v40; // ebx@62
   unsigned __int16 pTileBitmapsID; // ax@62
   int v42; // eax@63
   LightmapBuilder *v43; // ecx@63
@@ -1889,7 +441,7 @@
   unsigned int v56; // eax@101
   int v57; // eax@105
   unsigned int v58; // eax@109
-  stru148 *v59; // esi@112
+  struct Polygon *v59; // esi@112
   unsigned __int16 v60; // ax@112
   int v61; // eax@113
   signed int v62; // eax@113
@@ -1901,7 +453,7 @@
   double v68; // st5@120
   double v69; // st7@133
   int v70; // edi@138
-  stru148 *v71; // esi@147
+  struct Polygon *v71; // esi@147
   unsigned int v72; // ecx@147
   unsigned int v73; // eax@150
   int v74; // eax@154
@@ -2012,7 +564,7 @@
         if ( v8->vWorldPosition.y != pVertices->vWorldPosition.y || pVertices->vWorldPosition.y != pVertices2->vWorldPosition.y 
              || pVertices2->vWorldPosition.y != v101->vWorldPosition.y )
           break;*/
-        pTile = &array_77EC08[pOutdoorCamera->numStru148s];
+        pTile = &array_77EC08[pOutdoorCamera->uNumPolygons];
         pTile->uTileBitmapID = pOutdoor->GetTileTexture(sX, sY);
         if ( pTile->uTileBitmapID != -1 )
         {
@@ -2031,16 +583,16 @@
                             (((float)pOutdoor->vSunlight.y / 65536.0) * norm->y) -
                             (((float)pOutdoor->vSunlight.z / 65536.0) * norm->z)) * 20.0;
           //v25 = thisf + 6.7553994e15;
-          //v27 = pOutdoorCamera->numStru148s > 1999;
-          //v26 = pOutdoorCamera->numStru148s - 1999 < 0;
+          //v27 = pOutdoorCamera->uNumPolygons > 1999;
+          //v26 = pOutdoorCamera->uNumPolygons - 1999 < 0;
           pTile->dimming_level = floorf(thisf + 0.5f);
-          if ( pOutdoorCamera->numStru148s >= 1999 )
+          if ( pOutdoorCamera->uNumPolygons >= 1999 )
             return;
-          ++pOutdoorCamera->numStru148s;
+          ++pOutdoorCamera->uNumPolygons;
           //if ( !sub_481FC9(v8, pVertices, v101, v16) )//Ritor1: It's temporary
           //goto LABEL_126;
           //{
-            //--pOutdoorCamera->numStru148s;
+            //--pOutdoorCamera->uNumPolygons;
             //goto LABEL_162;
           //}
           memcpy(&array_50AC10[0], v102, 0x30u);
@@ -2145,7 +697,7 @@
         if ( ++v88 >= v84 )
           return;
       }
-    /*  v40 = &array_77EC08[pOutdoorCamera->numStru148s];
+    /*  v40 = &array_77EC08[pOutdoorCamera->uNumPolygons];
       v40->uTileBitmapID = pOutdoor->GetTileTexture(sX, sY);
       if ( v40->uTileBitmapID == -1 )
         goto LABEL_162;
@@ -2173,13 +725,13 @@
       v40->dimming_level = LOBYTE(v50);
       if ( LOBYTE(v50) < 0 )
         v40->dimming_level = 0;
-      if ( pOutdoorCamera->numStru148s >= 1999 )
+      if ( pOutdoorCamera->uNumPolygons >= 1999 )
         return;
-      ++pOutdoorCamera->numStru148s;
+      ++pOutdoorCamera->uNumPolygons;
       /*if ( !sub_481FC9(pVertices, pVertices2, v8, v40) ) // Ritor1: It's temporary
         //goto LABEL_77;
         {
-          --pOutdoorCamera->numStru148s;
+          --pOutdoorCamera->uNumPolygons;
           goto LABEL_112;
         }*/
       /*memcpy(&array_50AC10[0], v102, 0x30u);
@@ -2204,7 +756,7 @@
       /*if ( !(byte_76D5C0 & 2) )
       {
         byte_76D5C0 |= 2;
-        stru148(stru_76D590);
+        Polygon(stru_76D590);
         atexit(loc_48118F);
       }*/
       /*v96 = pGame->pLightmapBuilder;
@@ -2217,7 +769,7 @@
         if ( pGame->pIndoorCameraD3D->_4371C3(array_50AC10, &uNumVertices, 0) == 1 && !uNumVertices )
         {
 //LABEL_77:
-          --pOutdoorCamera->numStru148s;
+          --pOutdoorCamera->uNumPolygons;
           goto LABEL_112;
         }
         thisb->ViewTransform(array_50AC10, uNumVertices);
@@ -2280,8 +832,8 @@
         pRenderer->DrawTerrainPolygon(v40->uNumVertices, v40, pBitmaps_LOD->pHardwareTextures[v58], 0, v81);
       }
 LABEL_112:
-      v59 = &array_77EC08[pOutdoorCamera->numStru148s];
-      //a8 = (RenderVertexSoft *)&array_77EC08[pOutdoorCamera->numStru148s];
+      v59 = &array_77EC08[pOutdoorCamera->uNumPolygons];
+      //a8 = (RenderVertexSoft *)&array_77EC08[pOutdoorCamera->uNumPolygons];
       v59->uTileBitmapID = pOutdoor->GetTileTexture(sX, sY);
       if ( v59->uTileBitmapID  == -1 )
         goto LABEL_162;
@@ -2302,13 +854,13 @@
       v59->dimming_level = floorf(thish + 0.5f);
       if ( v59->dimming_level < 0 )
         v59->dimming_level = 0;
-      if ( pOutdoorCamera->numStru148s >= 1999 )
+      if ( pOutdoorCamera->uNumPolygons >= 1999 )
         return;
-      ++pOutdoorCamera->numStru148s;
+      ++pOutdoorCamera->uNumPolygons;
       if ( !sub_481FC9(v101, v102, pVertices2, v59) )
       {
 //LABEL_126:
-        --pOutdoorCamera->numStru148s;
+        --pOutdoorCamera->uNumPolygons;
         goto LABEL_162;
       }
       memcpy(&array_50AC10[0], v102, 0x30u);
@@ -2340,7 +892,7 @@
         if ( pGame->pIndoorCameraD3D->_4371C3(array_50AC10, (unsigned int *)&v100, 0) == 1 && !v100 )
           //goto LABEL_126;
         {
-          --pOutdoorCamera->numStru148s;
+          --pOutdoorCamera->uNumPolygons;
           goto LABEL_162;
         }
         thisc->ViewTransform(array_50AC10, v100);
@@ -2398,10 +950,10 @@
             //v77 = (int)v71;
             //v76 = v71->uNumVertices;
             //goto LABEL_161;
-            pRenderer->DrawTerrainPolygon(v71->uNumVertices, (stru148 *)v71, v78, 0, v80);
+            pRenderer->DrawTerrainPolygon(v71->uNumVertices, (Polygon *)v71, v78, 0, v80);
             goto LABEL_162;
           }
-          v38 = (stru148 *)v71;
+          v38 = (Polygon *)v71;
           goto LABEL_56;
         }
         v73 = sr_424EE0_MakeFanFromTriangle(v72);
@@ -2411,508 +963,7 @@
       goto LABEL_154;
     }
   }*/
-// 47F44B: using guessed type int __stdcall WorldPosToGridCellX(int);
-// 47F458: using guessed type int __stdcall WorldPosToGridCellZ(int);
-// 4D864C: using guessed type char byte_4D864C;
-// 76D5C0: using guessed type char static_sub_0048034E_byte_76D5C0__init_flag;
-
-//----- (00481212) --------------------------------------------------------
-void Render::DrawTerrainSW(int a1, int a2, int a3, int a4)
-{
-  int v3; // esi@1
-  int v4; // ecx@1
-  int v5; // ST10_4@1
-  int v6; // edi@1
-  int v7; // ebx@2
-  int v8; // eax@2
-  int v9; // eax@3
-  RenderVertexSoft *v10; // edi@3
-  RenderVertexSoft *v11; // ebx@4
-  RenderVertexSoft *v12; // ecx@4
-  float v13; // eax@6
-  int v14; // eax@6
-  double v15; // st7@6
-  double v16; // st7@6
-  stru148 *v17; // ebx@12
-  unsigned __int16 v18; // ax@12
-  int v19; // eax@13
-  float v20; // ecx@13
-  stru220 *v21; // eax@13
-  int v22; // eax@13
-  signed int v23; // eax@13
-  Vec3_float_ *v24; // eax@15
-  double v25; // st7@18
-  double v26; // st5@24
-  double v27; // st5@24
-  double v28; // st5@24
-  double v29; // st5@24
-  Game *v30; // eax@25
-  RenderVertexSoft *v31; // edi@29
-  double v32; // st7@31
-  int v33; // esi@35
-  RenderVertexSoft *v34; // edx@36
-  RenderVertexSoft *v35; // ecx@36
-  signed int v36; // eax@39
-  signed int v37; // esi@40
-  stru148 *v38; // ebx@43
-  unsigned __int16 v39; // ax@43
-  int v40; // eax@44
-  float v41; // ecx@44
-  stru220 *v42; // eax@44
-  int v43; // eax@44
-  int v44; // eax@44
-  signed int v45; // eax@44
-  Vec3_float_ *v46; // eax@46
-  double v47; // st7@49
-  double v48; // st5@57
-  double v49; // st5@57
-  double v50; // st5@57
-  Game *v51; // eax@58
-  RenderVertexSoft *v52; // edi@62
-  double v53; // st7@63
-  int v54; // esi@66
-  signed int v55; // eax@69
-  signed int v56; // esi@71
-  unsigned __int16 v57; // ax@75
-  stru220 *v58; // eax@76
-  signed int v59; // eax@76
-  Vec3_float_ *v60; // eax@77
-  double v61; // st7@80
-  double v62; // st5@88
-  double v63; // st5@88
-  double v64; // st5@88
-  Game *v65; // eax@89
-  double v66; // st7@94
-  RenderVertexSoft *v67; // [sp-Ch] [bp-C4h]@36
-  stru148 *v68; // [sp-8h] [bp-C0h]@36
-  int v69; // [sp-4h] [bp-BCh]@36
-  float v70; // [sp+Ch] [bp-ACh]@88
-  double v71; // [sp+10h] [bp-A8h]@6
-  double v72; // [sp+18h] [bp-A0h]@82
-  double v73; // [sp+20h] [bp-98h]@6
-  double v74; // [sp+28h] [bp-90h]@51
-  double v75; // [sp+30h] [bp-88h]@6
-  double v76; // [sp+38h] [bp-80h]@20
-  double v77; // [sp+40h] [bp-78h]@6
-  float v78; // [sp+48h] [bp-70h]@57
-  float v79; // [sp+4Ch] [bp-6Ch]@6
-  float v80; // [sp+50h] [bp-68h]@6
-  int v81; // [sp+54h] [bp-64h]@1
-  int v82; // [sp+58h] [bp-60h]@6
-  int v83; // [sp+5Ch] [bp-5Ch]@82
-  int v84; // [sp+60h] [bp-58h]@20
-  int v85; // [sp+64h] [bp-54h]@1
-  int v86; // [sp+68h] [bp-50h]@1
-  int v87; // [sp+6Ch] [bp-4Ch]@51
-  float v88; // [sp+70h] [bp-48h]@51
-  int v89; // [sp+74h] [bp-44h]@6
-  int v90; // [sp+78h] [bp-40h]@1
-  float a3a; // [sp+7Ch] [bp-3Ch]@24
-  stru220 *v92; // [sp+80h] [bp-38h]@2
-  float v93; // [sp+84h] [bp-34h]@44
-  int v94; // [sp+88h] [bp-30h]@6
-  float v95; // [sp+8Ch] [bp-2Ch]@1
-  float v96; // [sp+90h] [bp-28h]@1
-  float v97; // [sp+94h] [bp-24h]@1
-  int X; // [sp+98h] [bp-20h]@1
-  float v99; // [sp+9Ch] [bp-1Ch]@6
-  int v100; // [sp+A0h] [bp-18h]@6
-  unsigned __int64 v101; // [sp+A4h] [bp-14h]@6
-  RenderVertexSoft *v102; // [sp+ACh] [bp-Ch]@6
-  RenderVertexSoft *v103; // [sp+B0h] [bp-8h]@6
-  RenderVertexSoft *v104; // [sp+B4h] [bp-4h]@3
-  float pNormalc; // [sp+C0h] [bp+8h]@6
-  float pNormald; // [sp+C0h] [bp+8h]@6
-  Vec3_float_ *pNormal; // [sp+C0h] [bp+8h]@17
-  Vec3_float_ *pNormala; // [sp+C0h] [bp+8h]@48
-  Vec3_float_ *pNormalb; // [sp+C0h] [bp+8h]@77
-
-  v3 = a1;
-  //v4 = *(short *)(a3 + 4);
-  //v5 = *(short *)(a3 + 6);
-  v85 = a2;
-  v86 = a3; //v4;
-  X = abs(a4); //v5
-  v6 = 0;
-  v90 = 0;
-  v81 = v3 - 1;
-  v95 = (double)pOutdoor->vSunlight.x / 65536.0;
-  v96 = (double)pOutdoor->vSunlight.y / 65536.0;
-  v97 = (double)pOutdoor->vSunlight.z / 65536.0;
-  if ( v3 - 1 > 0 )
-  {
-    while ( 1 )
-    {
-      v7 = abs(X);
-      v8 = abs(v86);
-      --X;
-      v92 = &stru_76E5C8[(v7 << 7) + v8];
-      if ( !v92->field_0
-        || ((v9 = v6, v10 = &pVerticesSR_806210[v6], v104 = v10, !v85) ? (v11 = &pVerticesSR_801A10[v9],
-                                                                          v12 = &pVerticesSR_806210[v9 + 1]) : (v11 = &pVerticesSR_806210[v9 + 1], v12 = &pVerticesSR_801A10[v9]),
-            ((v103 = &pVerticesSR_801A10[v9 + 1],
-              v13 = v10->vWorldPosition.x,
-              v102 = v12,
-              v80 = v13,
-              v73 = v13 + 6.7553994e15,
-              v101 = __PAIR__((unsigned int)v11, LODWORD(v73)),
-              v79 = v10->vWorldPosition.y,
-              v75 = v79 + 6.7553994e15,
-              v100 = LODWORD(v75),
-              pNormalc = (v12->vWorldPosition.x + v10->vWorldPosition.x) * 0.5,
-              v71 = pNormalc + 6.7553994e15,
-              v89 = LODWORD(v71),
-              v14 = WorldPosToGridCellX(COERCE_UNSIGNED_INT64(pNormalc + 6.7553994e15)),
-              v15 = v11->vWorldPosition.y + v10->vWorldPosition.y,
-              v94 = v14,
-              pNormald = v15 * 0.5,
-              v16 = pNormald + 6.7553994e15,
-              v77 = v16,
-              v82 = LODWORD(v77),
-              LODWORD(v99) = WorldPosToGridCellZ(LODWORD(v16)),
-              WorldPosToGridCellX(v101),
-              WorldPosToGridCellZ(v100),
-              !byte_4D864C)
-          || !(pGame->uFlags & 0x80))
-         && !sub_481EFA(v10, v11, v102, v103, 1)) )
-        goto LABEL_105;
-      if ( v10->vWorldPosition.z != v11->vWorldPosition.z
-        || v11->vWorldPosition.z != v103->vWorldPosition.z
-        || v103->vWorldPosition.z != v102->vWorldPosition.z )
-        break;
-      v17 = &array_77EC08[pOutdoorCamera->numStru148s];
-      v18 = pOutdoor->GetTileTexture(v101, v100);
-      v17->uTileBitmapID = v18;
-      if ( v18 != -1 )
-      {
-        v19 = pOutdoor->GetSomeOtherTileInfo(v101, v100);
-        LOWORD(v19) = v19 | 0x8010;
-        v20 = v99;
-        *(int *)&v17->flags = v19;
-        v21 = v92;
-        v17->field_59 = 1;
-        v17->terrain_grid_x = LOBYTE(v20);
-        v17->field_34 = v21->distance;
-        v22 = v94;
-        v17->terrain_grid_z = v94;
-        v23 = pTerrainNormalIndices[2 * (LODWORD(v20) + (v22 << 7)) + 1];
-        if ( v23 < 0 || v23 > (signed int)(uNumTerrainNormals - 1) )
-          v24 = 0;
-        else
-          v24 = &pTerrainNormals[v23];
-        pNormal = v24;
-        if ( v24 )
-        {
-          v25 = -(v97 * v24->z + v96 * v24->y + v95 * v24->x);
-          if ( v25 < 0.0 )
-            v25 = 0.0;
-          v99 = v25 * 31.0;
-          v76 = v99 + 6.7553994e15;
-          v84 = LODWORD(v76);
-          v17->dimming_level = 31 - LOBYTE(v76);
-        }
-        else
-        {
-          v17->dimming_level = 0;
-        }
-        if ( pOutdoorCamera->numStru148s >= 1999 )
-          return;
-        ++pOutdoorCamera->numStru148s;
-        if ( !sub_481FC9(v10, (RenderVertexSoft *)HIDWORD(v101), v102, v17) )
-          goto LABEL_104;
-        v26 = 1.0 / (v104->vWorldViewPosition.x + 0.0000001);
-        memcpy(array_50AC10, v104, 0x30u);
-        array_50AC10[0]._rhw = v26;
-        array_50AC10[0].u = 0.0;
-        array_50AC10[0].v = 0.0;
-        v27 = *(float *)(HIDWORD(v101) + 12) + 0.0000001;
-        memcpy(&array_50AC10[1], (void *)HIDWORD(v101), sizeof(array_50AC10[1]));
-        array_50AC10[1]._rhw = 1.0 / v27;
-        array_50AC10[1].u = 0.0;
-        array_50AC10[1].v = 1.0;
-        v28 = v103->vWorldViewPosition.x + 0.0000001;
-        memcpy(&array_50AC10[2], v103, sizeof(array_50AC10[2]));
-        array_50AC10[2]._rhw = 1.0 / v28;
-        array_50AC10[2].u = 1.0;
-        array_50AC10[2].v = 1.0;
-        v29 = v102->vWorldViewPosition.x + 0.0000001;
-        memcpy(&array_50AC10[3], v102, sizeof(array_50AC10[3]));
-        array_50AC10[3]._rhw = 1.0 / v29;
-        array_50AC10[3].u = 1.0;
-        array_50AC10[3].v = 0.0;
-        pGame->pLightmapBuilder->StackLights_TerrainFace(pNormal, &a3a, array_50AC10, 4u, 1);
-        if ( stru_F8AD28.uNumLightsApplied <= 0 )
-        {
-          v17->field_108 = 0;
-        }
-        else
-        {
-          v30 = pGame;
-          v17->field_108 = 1;
-          pGame->pLightmapBuilder->_45CA88(&stru_F8AD28, array_50AC10, 4, pNormal);
-        }
-        if ( v104->vWorldViewPosition.x < 8.0
-          || *(float *)(HIDWORD(v101) + 12) < 8.0
-          || (v31 = v102, v102->vWorldViewPosition.x < 8.0)
-          || v103->vWorldViewPosition.x < 8.0 )
-        {
-          v36 = sr_4250FE(4u);
-        }
-        else
-        {
-          v32 = (double)pOutdoorCamera->shading_dist_mist;
-          if ( v32 >= v104->vWorldViewPosition.x
-            && v32 >= *(float *)(HIDWORD(v101) + 12)
-            && v32 >= v102->vWorldViewPosition.x
-            && v32 >= v103->vWorldViewPosition.x )
-          {
-            v33 = sr_4254D2(4);
-            v17->uNumVertices = v33;
-            if ( !v33 )
-              goto LABEL_104;
-            v34 = (RenderVertexSoft *)HIDWORD(v101);
-            v35 = v104;
-            v69 = 0;
-            v68 = v17;
-            v67 = v31;
-            goto LABEL_37;
-          }
-          v36 = sr_4252E8(4u);
-        }
-        v37 = v36;
-        if ( !v36 )
-          goto LABEL_104;
-LABEL_41:
-        OutdoorCamera::Project(v37);
-LABEL_102:
-        v33 = sr_4254D2(v37);
-        v17->uNumVertices = v33;
-        if ( !v33 )
-          goto LABEL_104;
-        v17->_48276F_sr();
-        goto LABEL_38;
-      }
-LABEL_105:
-      v6 = v90++ + 1;
-      if ( v90 >= v81 )
-        return;
-    }
-    v38 = &array_77EC08[pOutdoorCamera->numStru148s];
-    v39 = pOutdoor->GetTileTexture(v101, v100);
-    v38->uTileBitmapID = v39;
-    if ( v39 == -1 )
-      goto LABEL_105;
-    v40 = pOutdoor->GetSomeOtherTileInfo(v101, v100);
-    BYTE1(v40) |= 0x80u;
-    v41 = v99;
-    *(int *)&v38->flags = v40;
-    v42 = v92;
-    v38->field_59 = 1;
-    v38->terrain_grid_x = LOBYTE(v41);
-    v38->field_34 = v42->distance;
-    v43 = v94;
-    v38->terrain_grid_z = v94;
-    v44 = 2 * (LODWORD(v41) + (v43 << 7));
-    LODWORD(v93) = v44 * 2;
-    v45 = pTerrainNormalIndices[v44 + 1];
-    if ( v45 < 0 || v45 > (signed int)(uNumTerrainNormals - 1) )
-      v46 = 0;
-    else
-      v46 = &pTerrainNormals[v45];
-    pNormala = v46;
-    if ( v46 )
-    {
-      v47 = -(v97 * v46->z + v96 * v46->y + v95 * v46->x);
-      if ( v47 < 0.0 )
-        v47 = 0.0;
-      v88 = v47 * 31.0;
-      v74 = v88 + 6.7553994e15;
-      v87 = LODWORD(v74);
-      v38->dimming_level = 31 - LOBYTE(v74);
-    }
-    else
-    {
-      v38->dimming_level = 0;
-    }
-    if ( v38->dimming_level < 0 )
-      v38->dimming_level = 0;
-    if ( pOutdoorCamera->numStru148s >= 1999 )
-      return;
-    ++pOutdoorCamera->numStru148s;
-    if ( !sub_481FC9((RenderVertexSoft *)HIDWORD(v101), v103, v104, v38) )
-      goto LABEL_74;
-    v48 = 1.0 / (v104->vWorldViewPosition.x + 0.0000001);
-    memcpy(array_50AC10, v104, 0x30u);
-    array_50AC10[0]._rhw = v48;
-    array_50AC10[0].u = 0.0;
-    array_50AC10[0].v = 0.0;
-    v49 = *(float *)(HIDWORD(v101) + 12) + 0.0000001;
-    memcpy(&array_50AC10[1], (void *)HIDWORD(v101), sizeof(array_50AC10[1]));
-    array_50AC10[1]._rhw = 1.0 / v49;
-    array_50AC10[1].u = 0.0;
-    array_50AC10[1].v = 1.0;
-    v50 = v103->vWorldViewPosition.x + 0.0000001;
-    memcpy(&array_50AC10[2], v103, sizeof(array_50AC10[2]));
-    array_50AC10[2]._rhw = 1.0 / v50;
-    array_50AC10[2].u = 1.0;
-    array_50AC10[2].v = 1.0;
-    pGame->pLightmapBuilder->StackLights_TerrainFace(pNormala, &v78, array_50AC10, 3u, 0);
-    if ( stru_F8AD28.uNumLightsApplied <= 0 )
-    {
-      v38->field_108 = 0;
-    }
-    else
-    {
-      v51 = pGame;
-      v38->field_108 = 1;
-      pGame->pLightmapBuilder->_45CA88(&stru_F8AD28, array_50AC10, 3, pNormala);
-    }
-    if ( v104->vWorldViewPosition.x < 8.0
-      || *(float *)(HIDWORD(v101) + 12) < 8.0
-      || (v52 = v103, v103->vWorldViewPosition.x < 8.0) )
-    {
-      v55 = sr_4250FE(3u);
-    }
-    else
-    {
-      v53 = (double)pOutdoorCamera->shading_dist_mist;
-      if ( v53 >= v104->vWorldViewPosition.x
-        && v53 >= *(float *)(HIDWORD(v101) + 12)
-        && v53 >= v103->vWorldViewPosition.x )
-      {
-        v54 = sr_4254D2(3);
-        v38->uNumVertices = v54;
-        if ( v54 )
-        {
-          sr_sub_4829B9((RenderVertexSoft *)HIDWORD(v101), v52, v104, v38, 0);
-LABEL_68:
-          sr_sub_481DB2(array_508690, v54, v38);
-LABEL_75:
-          v17 = &array_77EC08[pOutdoorCamera->numStru148s];
-          v57 = pOutdoor->GetTileTexture(v101, v100);
-          v17->uTileBitmapID = v57;
-          if ( v57 == -1 )
-            goto LABEL_105;
-          *(int *)&v17->flags = pOutdoor->GetSomeOtherTileInfo(v101, v100);
-          v58 = v92;
-          v17->field_59 = 1;
-          v17->field_34 = v58->distance;
-          v17->terrain_grid_z = v94;
-          v17->terrain_grid_x = LOBYTE(v99);
-          v59 = *(unsigned __int16 *)((char *)pTerrainNormalIndices.data() + LODWORD(v93));
-          if ( v59 > (signed int)(uNumTerrainNormals - 1) )
-          {
-            pNormalb = 0;
-            v60 = 0;
-          }
-          else
-          {
-            v60 = &pTerrainNormals[v59];
-            pNormalb = v60;
-          }
-          if ( v60 )
-          {
-            v61 = -(v97 * v60->z + v96 * v60->y + v95 * v60->x);
-            if ( v61 < 0.0 )
-              v61 = 0.0;
-            v93 = v61 * 31.0;
-            v72 = v93 + 6.7553994e15;
-            v83 = LODWORD(v72);
-            v17->dimming_level = 31 - LOBYTE(v72);
-          }
-          else
-          {
-            v17->dimming_level = 0;
-          }
-          if ( v17->dimming_level < 0 )
-            v17->dimming_level = 0;
-          if ( pOutdoorCamera->numStru148s >= 1999 )
-            return;
-          ++pOutdoorCamera->numStru148s;
-          if ( !sub_481FC9(v102, v104, v103, v17) )
-          {
-LABEL_104:
-            --pOutdoorCamera->numStru148s;
-            goto LABEL_105;
-          }
-          v62 = 1.0 / (v104->vWorldViewPosition.x + 0.0000001);
-          memcpy(array_50AC10, v104, 0x30u);
-          array_50AC10[0]._rhw = v62;
-          array_50AC10[0].u = 0.0;
-          array_50AC10[0].v = 0.0;
-          v63 = v103->vWorldViewPosition.x + 0.0000001;
-          memcpy(&array_50AC10[1], v103, sizeof(array_50AC10[1]));
-          array_50AC10[1]._rhw = 1.0 / v63;
-          array_50AC10[1].u = 1.0;
-          array_50AC10[1].v = 1.0;
-          v64 = v102->vWorldViewPosition.x + 0.0000001;
-          memcpy(&array_50AC10[2], v102, sizeof(array_50AC10[2]));
-          array_50AC10[2]._rhw = 1.0 / v64;
-          array_50AC10[2].u = 1.0;
-          array_50AC10[2].v = 0.0;
-          pGame->pLightmapBuilder->StackLights_TerrainFace(pNormalb, &v70, array_50AC10, 3u, 1);
-          if ( stru_F8AD28.uNumLightsApplied <= 0 )
-          {
-            v17->field_108 = 0;
-          }
-          else
-          {
-            v65 = pGame;
-            v17->field_108 = 1;
-            pGame->pLightmapBuilder->_45CA88(&stru_F8AD28, array_50AC10, 3, pNormalb);
-          }
-          if ( v104->vWorldViewPosition.x < 8.0 || v103->vWorldViewPosition.x < 8.0 || v102->vWorldViewPosition.x < 8.0 )
-          {
-            v37 = sr_4250FE(3u);
-            OutdoorCamera::Project(v37);
-            if ( !v37 )
-              goto LABEL_104;
-            goto LABEL_102;
-          }
-          v66 = (double)pOutdoorCamera->shading_dist_mist;
-          if ( v66 < v104->vWorldViewPosition.x || v66 < v103->vWorldViewPosition.x || v66 < v102->vWorldViewPosition.x )
-          {
-            v37 = sr_4252E8(3u);
-            if ( !v37 )
-              goto LABEL_105;
-            goto LABEL_41;
-          }
-          v33 = sr_4254D2(3);
-          v17->uNumVertices = v33;
-          if ( !v33 )
-            goto LABEL_104;
-          v34 = v104;
-          v35 = v102;
-          v69 = 0;
-          v68 = v17;
-          v67 = v103;
-LABEL_37:
-          sr_sub_4829B9(v35, v34, v67, v68, v69);
-LABEL_38:
-          sr_sub_481DB2(array_508690, v33, v17);
-          goto LABEL_105;
-        }
-        goto LABEL_74;
-      }
-      v55 = sr_4252E8(3u);
-    }
-    v56 = v55;
-    if ( v55 )
-    {
-      OutdoorCamera::Project(v55);
-      v54 = sr_4254D2(v56);
-      v38->uNumVertices = v54;
-      if ( v54 )
-      {
-        v38->_48276F_sr();
-        goto LABEL_68;
-      }
-    }
-LABEL_74:
-    --pOutdoorCamera->numStru148s;
-    goto LABEL_75;
-  }
-}
+
 
 //----- (0047BACF) --------------------------------------------------------
 void Render::TransformBillboardsAndSetPalettesODM()
@@ -4355,7 +2406,7 @@
 }
 
 //----- (004A2050) --------------------------------------------------------
-void Render::DrawPolygon(unsigned int uNumVertices, stru148 *a3, ODMFace *a4, IDirect3DTexture2 *pTexture)
+void Render::DrawPolygon(unsigned int uNumVertices, struct Polygon *a3, ODMFace *a4, IDirect3DTexture2 *pTexture)
 {
   Render *v5; // edi@1
   unsigned int v6; // ebx@1
@@ -7134,7 +5185,7 @@
   return ::GetActorTintColor(tint, a4, a2, a5, a6);
 }
 
-/*void Render::DrawTerrainPolygon_new(stru148 *a3, IDirect3DTexture2 *pTexture)//new function
+/*void Render::DrawTerrainPolygon_new(Polygon *a3, IDirect3DTexture2 *pTexture)//new function
 {
   int v5; // ebx@1
   int v6; // edi@1
@@ -7249,7 +5300,7 @@
 }*/
 
 //----- (004A26BC) --------------------------------------------------------
-void Render::DrawTerrainPolygon(unsigned int uNumVertices, stru148 *a4, IDirect3DTexture2 *a5, bool transparent, bool clampAtTextureBorders)
+void Render::DrawTerrainPolygon(unsigned int uNumVertices, struct Polygon *a4, IDirect3DTexture2 *a5, bool transparent, bool clampAtTextureBorders)
 {
   //RenderVertexSoft *pVertices; // esi@0
   //int v7; // edi@1
@@ -7481,7 +5532,7 @@
 // 4D864C: using guessed type char byte_4D864C;
 
 //----- (004A2DA3) --------------------------------------------------------
-void Render::DrawSkyPolygon(unsigned int uNumVertices, stru148 *a3, IDirect3DTexture2 *pTexture)
+void Render::DrawSkyPolygon(unsigned int uNumVertices, struct Polygon *a3, IDirect3DTexture2 *pTexture)
 {
   int v7; // eax@7
   float v13; // ST3C_4@8
@@ -7523,7 +5574,7 @@
 }
 
 //----- (004A2ED5) --------------------------------------------------------
-void Render::_4A2ED5(signed int a2, stru148 *a3, IDirect3DTexture2 *pHwTex)
+void Render::_4A2ED5(signed int a2, struct Polygon *a3, IDirect3DTexture2 *pHwTex)
 {
   signed int v4; // edi@2
   int v5; // eax@3
@@ -7628,9 +5679,9 @@
   int v57; // ST10_4@55
   Texture *v58; // eax@55
   signed int v59; // [sp-4h] [bp-178h]@17
-  stru148 *v60; // [sp+0h] [bp-174h]@17
+  struct Polygon *v60; // [sp+0h] [bp-174h]@17
   IDirect3DTexture2 *v61; // [sp+4h] [bp-170h]@17
-  stru148 v62; // [sp+14h] [bp-160h]@6
+  struct Polygon v62; // [sp+14h] [bp-160h]@6
   unsigned int v63; // [sp+120h] [bp-54h]@7
   double v64; // [sp+124h] [bp-50h]@7
   unsigned int v65; // [sp+128h] [bp-4Ch]@1
@@ -9253,6 +7304,8 @@
   double v39; // [sp+94h] [bp-Ch]@6
   float v40; // [sp+9Ch] [bp-4h]@6
 
+  __debugbreak();
+
   auto ecx0 = this;
   v3 = 0;
   if ( ecx0->pRenderD3D )