diff Render.cpp @ 1439:468f434a8d8a

Слияние
author Ritor1
date Mon, 22 Jul 2013 18:00:58 +0600
parents bc99e1a48bea 8ea496564034
children b67a3e0d6fc3
line wrap: on
line diff
--- a/Render.cpp	Mon Jul 22 18:00:34 2013 +0600
+++ b/Render.cpp	Mon Jul 22 18:00:58 2013 +0600
@@ -221,1459 +221,27 @@
   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
 {
-  int pTextureID; // ecx@8
-  struct stru148 *pTile; // ebx@8
+  char result; // al@3
+  int v6; // ecx@8
+ struct Polygon *pTile; // ebx@8
+ struct Polygon *v16;
+  unsigned int v18; // edi@22
+  int v35; // edi@63
+  int v37; // eax@73
+  int v39; // eax@80
+  char v40; // [sp-18h] [bp-70h]@2
+  int v41; // [sp-14h] [bp-6Ch]@2
+  int v42; // [sp-10h] [bp-68h]@2
+  int v43; // [sp-Ch] [bp-64h]@2
+  const char *v44; // [sp-8h] [bp-60h]@2
+  int v45; // [sp-4h] [bp-5Ch]@2
+  int v56;
+  int v57; // [sp+38h] [bp-20h]@36
+  int v64; // [sp+57h] [bp-1h]@2
+  int v62;
 
   //warning: the game uses CW culling by default, ccw is incosistent
   pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_CCW);
@@ -1711,11 +279,11 @@
 //--------------------------------------------------------------------------------------------------------------------
 
   //
-  for (unsigned int z = 0; z < 128; ++z)
-  {
-    for (unsigned int x = 0; x < 128; ++x)
-    {
-      pTile = &array_77EC08[pOutdoorCamera->numStru148s];
+  for (unsigned int z = 0; z < 127; ++z)
+  {
+    for (unsigned int x = 0; x < 127; ++x)
+    {
+      pTile = &array_77EC08[pOutdoorCamera->uNumPolygons];
       pTile->flags = 0;
       pTile->field_32 = 0;
       pTile->uTileBitmapID = pOutdoor->DoGetTileTexture(x, z);
@@ -1769,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);// numStru148s -   (numFaces)
+      assert(pOutdoorCamera->uNumPolygons < 20000);
 
       pTile->uBModelID = 0;
       pTile->uBModelFaceID = 0;
@@ -1789,28 +357,28 @@
         if ( pTile->flags & 2 && pTile->uTileBitmapID == pRenderer->hd_water_tile_id)
         {
           //transparent = false;
-          pTextureID = pRenderer->pHDWaterBitmapIDs[pRenderer->hd_water_current_frame];
+          v6 = pRenderer->pHDWaterBitmapIDs[pRenderer->hd_water_current_frame];
         }
         else
         {
-          pTextureID = pTile->uTileBitmapID;
+          v6 = pTile->uTileBitmapID;
           if ( !_strnicmp(pBitmaps_LOD->pTextures[pTile->uTileBitmapID].pName, "wtrdr", 5) )
             transparent = true;
         }
 
-      assert(pTextureID < 1000); // many random crashes here
+      assert(v6 < 1000); // many random crashes here
 
       // for all shore tiles - draw a tile water under them since they're half-empty
       if (!_strnicmp(pBitmaps_LOD->pTextures[pTile->uTileBitmapID].pName, "wtrdr", 5))  // all shore tile filenames are wtrdrXXX
         pTile->DrawBorderTiles();
 
-      pRenderer->DrawTerrainPolygon(pTile->uNumVertices, pTile, pBitmaps_LOD->pHardwareTextures[pTextureID], transparent, true);
+      pRenderer->DrawTerrainPolygon(pTile->uNumVertices, pTile, pBitmaps_LOD->pHardwareTextures[v6], transparent, true);
       }
       //else //    
         //pTile->DrawBorderTiles();
 //--------------------------------------------------------------------------------------------------------------------------------
 
-      --pOutdoorCamera->numStru148s;
+      --pOutdoorCamera->uNumPolygons;
       --pOutdoorCamera->field_44;
     }
   }
@@ -1832,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
@@ -1852,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
@@ -1873,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
@@ -1885,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
@@ -1996,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 )
         {
@@ -2015,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);
@@ -2129,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;
@@ -2157,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);
@@ -2188,7 +756,7 @@
       /*if ( !(byte_76D5C0 & 2) )
       {
         byte_76D5C0 |= 2;
-        stru148(stru_76D590);
+        Polygon(stru_76D590);
         atexit(loc_48118F);
       }*/
       /*v96 = pGame->pLightmapBuilder;
@@ -2201,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);
@@ -2264,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;
@@ -2286,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);
@@ -2324,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);
@@ -2382,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);
@@ -2395,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()
@@ -3699,9 +1766,9 @@
           local_0.x = v3;
           local_0.y = (double)*(signed int *)v0;
           local_0.z = (double)*((signed int *)v0 + 1);
-          local_0.flt_10 = 0.0;
-          local_0.flt_14 = 0.0;
-          local_0.flt_18 = 0.0;
+          local_0.r = 0.0;
+          local_0.g = 0.0;
+          local_0.b = 0.0;
           local_0.flt_28 = 1.0;
           local_0.timeToLive = (rand() & 0x80) + 128;
           local_0.uTextureID = pBitmaps_LOD->LoadTexture("effpar01");
@@ -4339,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
@@ -4406,10 +2473,10 @@
     if ( v7->std__vector_000004_size)
       a2 = 0xFFFFFFFF;
     pGame->AlterGamma_ODM(a4, &a2);
-    if ( byte_4D864C && pGame->uFlags & 1 )
+    if ( byte_4D864C && pGame->uFlags & GAME_FLAGS_1_01)
     {
       v8 = ::GetActorTintColor(a3->dimming_level, 0, array_50AC10[0].vWorldViewPosition.x, 0, 0);
-      v7->_45D74F_MessWithLight(v8, 0);
+      v7->DrawLightmaps(/*v8, 0*/);
     }
     else
     {
@@ -4501,7 +2568,7 @@
         //v50 = (const char *)v5->pRenderD3D->pDevice;
         ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_NONE));
         //(*(void (**)(void))(*(int *)v50 + 88))();
-        v53->_45D74F_MessWithLight(-1, 0);
+        v53->DrawLightmaps(/*-1, 0*/);
 	    for (uint i = 0; i < uNumVertices; ++i)
 		{
 		  d3d_vertex_buffer[i].diffuse = a2;
@@ -7063,10 +5130,7 @@
       pRenderD3D->ClearTarget(true, 0x00F08020, true, 1.0);
       pRenderer->uNumBillboardsToDraw = 0;
       pRenderD3D->pDevice->BeginScene();
-      if (!pRenderD3D->DoesRaiseExceptions())
-      {
-        MessageBoxW(nullptr, L"Error executing scratch 3D operations", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\screen16_3d.cpp:360", 0);
-      }
+
       if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor )
         uFogColor = GetLevelFogColor();
       else
@@ -7121,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
@@ -7236,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
@@ -7314,10 +5378,10 @@
   /*  v9 = pGame->pLightmapBuilder;
     v65 = v9;
     v10 = v9->std__vector_000004_size;*/
-    if ( byte_4D864C && pGame->uFlags & 1 )
+    if ( byte_4D864C && pGame->uFlags & GAME_FLAGS_1_01)
     {
       v11 = ::GetActorTintColor(a4->dimming_level, 0, array_50AC10[0].vWorldViewPosition.x, 0, 0);
-      pGame->pLightmapBuilder->_45D74F_MessWithLight(v11, 0);
+      pGame->pLightmapBuilder->DrawLightmaps(/*v11, 0*/);
     }
     else
     {
@@ -7411,7 +5475,7 @@
         //v63 = (const char *)v7->pRenderD3D->pDevice;
         ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_NONE));
         //(*(void (**)(void))(*(int *)v63 + 88))();
-        pGame->pLightmapBuilder->_45D74F_MessWithLight(-1, 0);
+        pGame->pLightmapBuilder->DrawLightmaps(/*-1, 0*/);
 	    for (uint i = 0; i < uNumVertices; ++i)
 	    {
 		  d3d_vertex_buffer[i].diffuse = -1;
@@ -7468,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
@@ -7510,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
@@ -7553,6 +5617,433 @@
   }
 }
 
+
+//----- (00479A53) --------------------------------------------------------
+void Render::DrawIndoorPolygonNoLight(unsigned int uNumVertices, unsigned int uFaceID)
+{
+  BLVFace *pFace; // esi@1
+  unsigned int v3; // edi@1
+  PolygonType v4; // al@1
+  double v5; // st7@3
+  signed __int64 v6; // qax@3
+  PolygonType v7; // cl@3
+  int v8; // esi@7
+  int v9; // eax@7
+  unsigned int v10; // eax@7
+  double v11; // st6@7
+  int v12; // edx@7
+  int v13; // eax@7
+  char *v14; // esi@8
+  void *v15; // ecx@9
+  int v16; // eax@9
+  int v17; // edi@9
+  double v18; // st7@9
+  signed int v19; // ebx@9
+  void *v20; // ecx@9
+  int v21; // ebx@11
+  int v22; // eax@14
+  signed __int64 v23; // qtt@16
+  double v24; // st7@16
+  unsigned __int8 v25; // sf@16
+  unsigned __int8 v26; // of@16
+  Render *v27; // ecx@17
+  double v28; // st7@20
+  char *v29; // ebx@20
+  char *v30; // edx@20
+  unsigned __int8 v31; // c0@21
+  unsigned __int8 v32; // c3@21
+  double v33; // st6@23
+  char *v34; // esi@30
+  const void *v35; // ecx@31
+  int v36; // eax@31
+  const void *v37; // edi@31
+  signed __int64 v38; // qax@31
+  int v39; // ecx@31
+  int v40; // ebx@33
+  int v41; // eax@36
+  signed __int64 v42; // qtt@39
+  int v43; // eax@39
+  char v44; // zf@39
+  double v45; // st7@39
+  double v46; // st7@39
+  unsigned int v47; // edx@40
+  double v48; // st7@41
+  RenderVertexSoft *v49; // ebx@41
+  void *v50; // edi@43
+  double v51; // st7@46
+  RenderVertexSoft *v52; // edx@46
+  void *v53; // edi@48
+  char *v54; // ebx@52
+  unsigned int v55; // eax@53
+  unsigned int v56; // eax@55
+  int v57; // ST10_4@55
+  Texture *v58; // eax@55
+  signed int v59; // [sp-4h] [bp-178h]@17
+  struct Polygon *v60; // [sp+0h] [bp-174h]@17
+  IDirect3DTexture2 *v61; // [sp+4h] [bp-170h]@17
+  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
+  unsigned int v66; // [sp+12Ch] [bp-48h]@7
+  float v67; // [sp+130h] [bp-44h]@7
+  __int64 v68; // [sp+134h] [bp-40h]@3
+  __int64 v69; // [sp+13Ch] [bp-38h]@3
+  int v70; // [sp+144h] [bp-30h]@3
+  int X; // [sp+148h] [bp-2Ch]@9
+  int v72; // [sp+14Ch] [bp-28h]@7
+  float v73; // [sp+150h] [bp-24h]@16
+  unsigned int v74; // [sp+154h] [bp-20h]@3
+  RenderVertexSoft *v75; // [sp+158h] [bp-1Ch]@3
+  float v76; // [sp+15Ch] [bp-18h]@9
+  int v77; // [sp+160h] [bp-14h]@9
+  int v78; // [sp+164h] [bp-10h]@7
+  void *v79; // [sp+168h] [bp-Ch]@9
+  float v80; // [sp+16Ch] [bp-8h]@3
+  const void *v81; // [sp+170h] [bp-4h]@7
+
+  __debugbreak();
+
+  pFace = &pIndoor->pFaces[uFaceID];
+  v65 = uFaceID;
+  v3 = uNumVertices;
+  v4 = pFace->uPolygonType;
+  if ( v4 == POLYGON_InBetweenFloorAndWall || v4 == POLYGON_Floor )
+  {
+    if ( (signed int)uNumVertices > 0 )
+    {
+      v54 = (char *)&array_507D30[0].u;
+      LODWORD(v80) = uNumVertices;
+      do
+      {
+        v69 = (GetTickCount() >> 5) - pBLVRenderParams->vPartyPos.x;
+        *(float *)v54 = (double)v69 + *(float *)v54;
+        *(float *)v54 = *(float *)v54 * 0.25;
+        v55 = GetTickCount();
+        v54 += 48;
+        v44 = LODWORD(v80)-- == 1;
+        v68 = pBLVRenderParams->vPartyPos.y + (v55 >> 5);
+        *((float *)v54 - 11) = ((double)v68 + *((float *)v54 - 11)) * 0.25;
+      }
+      while ( !v44 );
+      uFaceID = v65;
+    }
+    v56 = 8 * uFaceID;
+    LOBYTE(v56) = PID(OBJECT_BModel,uFaceID);
+    v57 = v56;
+    v58 = pFace->GetTexture();
+    pRenderer->DrawIndoorPolygon(v3, pFace, pBitmaps_LOD->pHardwareTextures[pFace->uBitmapID], v58, v57, -1, 0);
+    return;
+  }
+  HIDWORD(v69) = pIndoorCamera->sRotationX;
+  HIDWORD(v68) = pIndoorCamera->pos.z;
+  *(float *)&v74 = (double)pBLVRenderParams->uViewportCenterY;
+  v70 = (signed __int64)((double)(pBLVRenderParams->field_40 * pBLVRenderParams->vPartyPos.z)
+                       / (((double)pBLVRenderParams->field_40 + 16192.0)
+                        * 65536.0)
+                       + *(float *)&v74);
+  v5 = (double)pIndoorCamera->sRotationX * 0.0030664064;
+  *(float *)&v75 = v5;
+  v80 = cos(v5) * 16192.0;
+  v6 = (signed __int64)(*(float *)&v74
+                      - (double)pBLVRenderParams->field_40
+                      / ((v80 + 0.0000001)
+                       * 65535.0)
+                      * (sin(*(float *)&v75) * -16192.0 - (double)SHIDWORD(v68)));
+  v7 = pFace->uPolygonType;
+  if ( v7 == 4 || v7 == 3 )
+    v70 = v6;
+  stru_8019C8._48653D(65536, 0, 0, 0, 65536, 0);
+  v62._48607B(&stru_8019C8);
+  v62.uTileBitmapID = pFace->uBitmapID;
+  v62.pTexture = (Texture *)((signed __int16)v62.uTileBitmapID != -1 ? &pBitmaps_LOD->pTextures[(signed __int16)v62.uTileBitmapID] : 0);
+  if ( !v62.pTexture )
+    return;
+  v8 = pBLVRenderParams->sPartyRotX;
+  v62.dimming_level = 0;
+  v62.uNumVertices = v3;
+  v9 = stru_5C6E00->Sin(pBLVRenderParams->sPartyRotX + 16);
+  v62.v_18.y = 0;
+  v62.v_18.x = -v9;
+  v62.v_18.z = -stru_5C6E00->Cos(v8 + 16);
+  v10 = pBLVRenderParams->uViewportZ - pBLVRenderParams->uViewportX;
+  memcpy(&array_507D30[v3], array_507D30, sizeof(array_507D30[v3]));
+  LODWORD(v80) = v10;
+  v62.field_24 = 33554432;
+  v64 = (double)(signed int)v10 * 0.5;
+  v72 = 65536 / (signed int)(signed __int64)(v64 / tan(0.6457717418670654) + 0.5);
+  LODWORD(v80) = v62.pTexture->uTextureWidth;
+  v11 = 1.0 / (double)SLODWORD(v80);
+  LODWORD(v80) = v62.pTexture->uTextureHeight;
+  v12 = v62.pTexture->uWidthMinus1;
+  v13 = v62.pTexture->uHeightMinus1;
+  v67 = v11;
+  v63 = 224 * pMiscTimer->uTotalGameTimeElapsed & v13;
+  v66 = 224 * pMiscTimer->uTotalGameTimeElapsed & v12;
+  v78 = 0;
+  v81 = 0;
+  *((float *)&v68 + 1) = 1.0 / (double)SLODWORD(v80);
+  if ( (signed int)v62.uNumVertices <= 0 )
+  {
+LABEL_17:
+    v61 = pBitmaps_LOD->pHardwareTextures[(signed __int16)v62.uTileBitmapID];
+    v27 = pRenderer;
+    v60 = &v62;
+    v59 = v62.uNumVertices;
+    goto LABEL_18;
+  }
+  v14 = (char *)&array_507D30[0].vWorldViewProjY;
+  while ( 2 )
+  {
+    v15 = (void *)(v72 * (v70 - (unsigned __int64)(signed __int64)*(float *)v14));
+    LODWORD(v80) = v62.ptr_38->field_14;
+    v77 = (unsigned __int64)(SLODWORD(v80) * (signed __int64)(signed int)v15) >> 16;
+    v16 = v77 + v62.ptr_38->field_C;
+    v77 = (int)v15;
+    v74 = v16;
+    LODWORD(v80) = v62.ptr_38->field_20;
+    v77 = (unsigned __int64)(SLODWORD(v80) * (signed __int64)(signed int)v15) >> 16;
+    v79 = v15;
+    v75 = (RenderVertexSoft *)(v77 + v62.ptr_38->field_18);
+    LODWORD(v80) = v62.v_18.z;
+    v79 = (void *)((unsigned __int64)(v62.v_18.z * (signed __int64)(signed int)v15) >> 16);
+    v17 = v72 * (pBLVRenderParams->uViewportCenterX - (unsigned __int64)(signed __int64)*((float *)v14 - 1));
+    v18 = *(float *)v14 - 1.0;
+    v19 = -v62.field_24;
+    v77 = -v62.field_24;
+    X = (int)((char *)v79 + v62.v_18.x);
+    LODWORD(v76) = (signed __int64)v18;
+    v20 = (void *)(v72 * (v70 - LODWORD(v76)));
+    while ( 1 )
+    {
+      v79 = v20;
+      if ( !X )
+        goto LABEL_14;
+      v21 = abs(v19 >> 14);
+      if ( v21 <= abs(X) )
+        break;
+      if ( SLODWORD(v76) <= (signed int)pViewport->uViewportTL_Y )
+        break;
+      v19 = v77;
+      v20 = v79;
+LABEL_14:
+      LODWORD(v80) = v62.v_18.z;
+      v79 = (void *)((unsigned __int64)(v62.v_18.z * (signed __int64)(signed int)v20) >> 16);
+      v22 = (unsigned __int64)(v62.v_18.z * (signed __int64)(signed int)v20) >> 16;
+      --LODWORD(v76);
+      v20 = (char *)v20 + v72;
+      X = v22 + v62.v_18.x;
+      v78 = 1;
+    }
+    if ( !v78 )
+    {
+      LODWORD(v23) = v77 << 16;
+      HIDWORD(v23) = v77 >> 16;
+      v79 = (void *)(v23 / X);
+      v77 = v17;
+      LODWORD(v80) = v62.ptr_38->field_10;
+      v77 = v17;
+      LODWORD(v76) = v74 + ((unsigned __int64)(SLODWORD(v80) * (signed __int64)v17) >> 16);
+      LODWORD(v80) = v62.ptr_38->field_1C;
+      v75 = (RenderVertexSoft *)((char *)v75 + ((unsigned __int64)(SLODWORD(v80) * (signed __int64)v17) >> 16));
+      v77 = (unsigned __int64)(SLODWORD(v76) * v23 / X) >> 16;
+      LODWORD(v73) = (unsigned __int64)((signed int)v75 * v23 / X) >> 16;
+      v14 += 48;
+      LODWORD(v80) = v66 + ((signed int)((unsigned __int64)(SLODWORD(v76) * v23 / X) >> 16) >> 4);
+      v81 = (char *)v81 + 1;
+      v24 = (double)SLODWORD(v80) * 0.000015259022;
+      LODWORD(v80) = v63 + ((signed int)((unsigned __int64)((signed int)v75 * v23 / X) >> 16) >> 4);
+      v26 = __OFSUB__((int)v81, v62.uNumVertices);
+      v25 = (signed int)((char *)v81 - v62.uNumVertices) < 0;
+      *((float *)v14 - 10) = v24 * v67;
+      *((float *)v14 - 9) = (double)SLODWORD(v80) * 0.000015259022 * *((float *)&v68 + 1);
+      *((float *)v14 - 11) = 65536.0 / (double)(signed int)v79;
+      if ( !(v25 ^ v26) )
+        goto LABEL_17;
+      continue;
+    }
+    break;
+  }
+  LODWORD(v73) = 0;
+  v80 = v76;
+  if ( (signed int)v62.uNumVertices > 0 )
+  {
+    v28 = (double)SLODWORD(v76);
+    LODWORD(v76) = (int)(char *)array_50AC10 + 28;
+    v29 = (char *)&array_50AC10[0].vWorldViewProjX;
+    v30 = (char *)&array_507D30[1].vWorldViewProjY;
+    v79 = array_50AC10;
+    v81 = array_507D30;
+    v78 = v62.uNumVertices;
+    do
+    {
+      v31 = v28 < *((float *)v30 - 12);
+      v32 = v28 == *((float *)v30 - 12);
+      ++LODWORD(v73);
+      memcpy(v79, v81, 0x30u);
+      v79 = (char *)v79 + 48;
+      LODWORD(v76) += 48;
+      v29 += 48;
+      if ( v31 | v32 || v28 >= *(float *)v30 )
+      {
+        if ( v28 >= *((float *)v30 - 12) || v28 <= *(float *)v30 )
+          goto LABEL_28;
+        v33 = (*((float *)v30 - 1) - *((float *)v30 - 13)) * v28 / (*(float *)v30 - *((float *)v30 - 12))
+            + *((float *)v30 - 1);
+      }
+      else
+      {
+        v33 = (*((float *)v30 - 13) - *((float *)v30 - 1)) * v28 / (*((float *)v30 - 12) - *(float *)v30)
+            + *((float *)v30 - 13);
+      }
+      *(float *)v29 = v33;
+      v79 = (char *)v79 + 48;
+      v29 += 48;
+      ++LODWORD(v73);
+      *(unsigned int *)LODWORD(v76) = v28;
+      LODWORD(v76) += 48;
+LABEL_28:
+      v81 = (char *)v81 + 48;
+      v30 += 48;
+      --v78;
+    }
+    while ( v78 );
+  }
+  if ( SLODWORD(v73) <= 0 )
+    goto LABEL_40;
+  v34 = (char *)&array_50AC10[0].vWorldViewProjY;
+  v65 = v77 >> 14;
+  HIDWORD(v69) = LODWORD(v73);
+  do
+  {
+    v35 = (const void *)(v72 * (v70 - (unsigned __int64)(signed __int64)*(float *)v34));
+    v78 = v62.ptr_38->field_14;
+    v81 = (const void *)((unsigned __int64)(v78 * (signed __int64)(signed int)v35) >> 16);
+    v36 = (int)((char *)v81 + v62.ptr_38->field_C);
+    v81 = v35;
+    v74 = v36;
+    v78 = v62.ptr_38->field_20;
+    v81 = (const void *)((unsigned __int64)(v78 * (signed __int64)(signed int)v35) >> 16);
+    v78 = (int)v35;
+    v75 = (RenderVertexSoft *)((char *)v81 + v62.ptr_38->field_18);
+    v81 = (const void *)v62.v_18.z;
+    v78 = (unsigned __int64)(v62.v_18.z * (signed __int64)(signed int)v35) >> 16;
+    v37 = (const void *)(v72
+                       * (pBLVRenderParams->uViewportCenterX - (unsigned __int64)(signed __int64)*((float *)v34 - 1)));
+    v38 = (signed __int64)(*(float *)v34 - 1.0);
+    v81 = 0;
+    LODWORD(v76) = v38;
+    v39 = v72 * (v70 - v38);
+    while ( 1 )
+    {
+      v78 = v39;
+      if ( !X )
+        goto LABEL_36;
+      v40 = abs(X);
+      if ( abs((signed __int64)v65) <= v40 )
+        break;
+      if ( SLODWORD(v76) <= (signed int)pViewport->uViewportTL_Y )
+        break;
+      v39 = v78;
+LABEL_36:
+      v78 = v62.v_18.z;
+      v41 = (unsigned __int64)(v62.v_18.z * (signed __int64)v39) >> 16;
+      --LODWORD(v76);
+      v39 += v72;
+      X = v41 + v62.v_18.x;
+      v81 = (const void *)1;
+    }
+    if ( v81 )
+    {
+      v79 = (void *)v62.v_18.z;
+      v78 = 2 * LODWORD(v76);
+      v81 = (const void *)((unsigned __int64)(v62.v_18.z
+                                            * (signed __int64)(signed int)(signed __int64)(((double)v70
+                                                                                          - ((double)(2 * LODWORD(v76))
+                                                                                           - *(float *)v34))
+                                                                                         * (double)v72)) >> 16);
+      X = (int)((char *)v81 + v62.v_18.x);
+    }
+    LODWORD(v42) = v77 << 16;
+    HIDWORD(v42) = v77 >> 16;
+    v79 = (void *)(v42 / X);
+    v81 = v37;
+    v78 = v62.ptr_38->field_10;
+    v81 = (const void *)((unsigned __int64)(v78 * (signed __int64)(signed int)v37) >> 16);
+    v43 = v74 + ((unsigned __int64)(v78 * (signed __int64)(signed int)v37) >> 16);
+    v74 = (unsigned int)v37;
+    LODWORD(v76) = v43;
+    v78 = v62.ptr_38->field_1C;
+    v75 = (RenderVertexSoft *)((char *)v75 + ((unsigned __int64)(v78 * (signed __int64)(signed int)v37) >> 16));
+    v74 = (unsigned __int64)(v43 * v42 / X) >> 16;
+    v81 = (const void *)((unsigned __int64)((signed int)v75 * v42 / X) >> 16);
+    v34 += 48;
+    v78 = v66 + ((signed int)v74 >> 4);
+    v44 = HIDWORD(v69)-- == 1;
+    v45 = (double)v78 * 0.000015259022;
+    v78 = v63 + ((signed int)((unsigned __int64)((signed int)v75 * v42 / X) >> 16) >> 4);
+    *((float *)v34 - 10) = v45 * v67;
+    *((float *)v34 - 9) = (double)v78 * 0.000015259022 * *((float *)&v68 + 1);
+    v46 = (double)(signed int)v79;
+    *((float *)v34 - 16) = 0.000015258789 * v46;
+    *((float *)v34 - 11) = 65536.0 / v46;
+  }
+  while ( !v44 );
+LABEL_40:
+  v47 = 0;
+  if ( SLODWORD(v73) > 0 )
+  {
+    v48 = (double)SLODWORD(v80);
+    v75 = array_507D30;
+    v49 = array_50AC10;
+    HIDWORD(v69) = LODWORD(v73);
+    do
+    {
+      if ( v48 >= v49->vWorldViewProjY )
+      {
+        v50 = v75;
+        ++v47;
+        ++v75;
+        memcpy(v50, v49, 0x30u);
+      }
+      ++v49;
+      --HIDWORD(v69);
+    }
+    while ( HIDWORD(v69) );
+  }
+  v62.uNumVertices = v47;
+  pRenderer->_4A2ED5(v47, &v62, pBitmaps_LOD->pHardwareTextures[(signed __int16)v62.uTileBitmapID]);
+  *(float *)&v74 = 0.0;
+  if ( SLODWORD(v73) > 0 )
+  {
+    v51 = (double)SLODWORD(v80);
+    v75 = array_507D30;
+    v52 = array_50AC10;
+    v80 = v73;
+    do
+    {
+      if ( v51 <= v52->vWorldViewProjY )
+      {
+        v53 = v75;
+        ++v74;
+        ++v75;
+        memcpy(v53, v52, 0x30u);
+      }
+      ++v52;
+      --LODWORD(v80);
+    }
+    while ( v80 != 0.0 );
+  }
+  v62.uNumVertices = v74;
+  v61 = pBitmaps_LOD->pHardwareTextures[(signed __int16)v62.uTileBitmapID];
+  v60 = &v62;
+  v59 = v74;
+  v27 = pRenderer;
+LABEL_18:
+  v27->_4A2ED5(v59, v60, v61);
+}
+
+
 //----- (004A2FC0) --------------------------------------------------------
 void Render::DrawIndoorPolygon(unsigned int uNumVertices, BLVFace *pFace, IDirect3DTexture2 *pHwTex, Texture *pTex, int uPackedID, unsigned int uColor, int a8)
 {
@@ -7612,7 +6103,7 @@
     else uColor = uCorrectedColor = 0xFF109010;
   }
 
-  if (byte_4D864C && pGame->uFlags & 1)
+  if (byte_4D864C && pGame->uFlags & GAME_FLAGS_1_01)
   {
       __debugbreak();
       ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, false));
@@ -7637,7 +6128,7 @@
               d3d_vertex_buffer,
               uNumVertices,
               28));
-      pGame->pLightmapBuilder->_45D74F_MessWithLight(-1, 0);
+      pGame->pLightmapBuilder->DrawLightmaps(/*-1, 0*/);
   }
   else
   {
@@ -7717,7 +6208,7 @@
                 28));
 
         ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_NONE));
-        pGame->pLightmapBuilder->_45D74F_MessWithLight(-1, 0);
+        pGame->pLightmapBuilder->DrawLightmaps(/*-1, 0*/);
 
         for (uint i = 0; i < uNumVertices; ++i)
           d3d_vertex_buffer[i].diffuse = uCorrectedColor;
@@ -7825,54 +6316,54 @@
       v12 = ::GetActorTintColor(dimming_level, 0, pSoftBillboard->zbuffer_depth, 0, 0);
     }
     //v13 = (double)v25;
-    pBillboardRenderListD3D[v7].pQuards[0].specular = 0;
-    pBillboardRenderListD3D[v7].pQuards[0].diffuse = v12;
-    pBillboardRenderListD3D[v7].pQuards[0].pos.x = pSoftBillboard->uScreenSpaceX - v31 * a1;
+    pBillboardRenderListD3D[v7].pQuads[0].specular = 0;
+    pBillboardRenderListD3D[v7].pQuads[0].diffuse = v12;
+    pBillboardRenderListD3D[v7].pQuads[0].pos.x = pSoftBillboard->uScreenSpaceX - v31 * a1;
     //v14 = (double)v24;
     //v32 = v14;
-    pBillboardRenderListD3D[v7].pQuards[0].pos.y = pSoftBillboard->uScreenSpaceY - v27 * v29;
+    pBillboardRenderListD3D[v7].pQuads[0].pos.y = pSoftBillboard->uScreenSpaceY - v27 * v29;
     v15 = 1.0 - 1.0 / (pSoftBillboard->zbuffer_depth * 0.061758894);
-    pBillboardRenderListD3D[v7].pQuards[0].pos.z = v15;
+    pBillboardRenderListD3D[v7].pQuads[0].pos.z = v15;
     v16 = 1.0 / pSoftBillboard->zbuffer_depth;
-    pBillboardRenderListD3D[v7].pQuards[0].rhw = 1.0 / pSoftBillboard->zbuffer_depth;
-    pBillboardRenderListD3D[v7].pQuards[0].texcoord.x = 0.0;
-    pBillboardRenderListD3D[v7].pQuards[0].texcoord.y = 0.0;
+    pBillboardRenderListD3D[v7].pQuads[0].rhw = 1.0 / pSoftBillboard->zbuffer_depth;
+    pBillboardRenderListD3D[v7].pQuads[0].texcoord.x = 0.0;
+    pBillboardRenderListD3D[v7].pQuads[0].texcoord.y = 0.0;
     v17 = (double)((pSprite->uBufferWidth >> 1) - pSprite->uAreaX);
     v18 = (double)(pSprite->uBufferHeight - pSprite->uAreaY - pSprite->uAreaHeight);
     if ( pSoftBillboard->uFlags & 4 )
       v17 = v17 * -1.0;
-    pBillboardRenderListD3D[v7].pQuards[1].specular = 0;
-    pBillboardRenderListD3D[v7].pQuards[1].diffuse = v12;
-    pBillboardRenderListD3D[v7].pQuards[1].pos.x = pSoftBillboard->uScreenSpaceX - v17 * a1;
-    pBillboardRenderListD3D[v7].pQuards[1].pos.y = pSoftBillboard->uScreenSpaceY - v18 * v29;
-    pBillboardRenderListD3D[v7].pQuards[1].pos.z = v15;
-    pBillboardRenderListD3D[v7].pQuards[1].rhw = v16;
-    pBillboardRenderListD3D[v7].pQuards[1].texcoord.x = 0.0;
-    pBillboardRenderListD3D[v7].pQuards[1].texcoord.y = 1.0;
+    pBillboardRenderListD3D[v7].pQuads[1].specular = 0;
+    pBillboardRenderListD3D[v7].pQuads[1].diffuse = v12;
+    pBillboardRenderListD3D[v7].pQuads[1].pos.x = pSoftBillboard->uScreenSpaceX - v17 * a1;
+    pBillboardRenderListD3D[v7].pQuads[1].pos.y = pSoftBillboard->uScreenSpaceY - v18 * v29;
+    pBillboardRenderListD3D[v7].pQuads[1].pos.z = v15;
+    pBillboardRenderListD3D[v7].pQuads[1].rhw = v16;
+    pBillboardRenderListD3D[v7].pQuads[1].texcoord.x = 0.0;
+    pBillboardRenderListD3D[v7].pQuads[1].texcoord.y = 1.0;
     v19 = pSprite->uBufferHeight - pSprite->uAreaY - pSprite->uAreaHeight;
     v20 = (double)(pSprite->uAreaX + pSprite->uAreaWidth + (pSprite->uBufferWidth >> 1) - pSprite->uBufferWidth);
     if ( pSoftBillboard->uFlags & 4 )
       v20 = v20 * -1.0;
-    pBillboardRenderListD3D[v7].pQuards[2].specular = 0;
-    pBillboardRenderListD3D[v7].pQuards[2].diffuse = v12;
-    pBillboardRenderListD3D[v7].pQuards[2].pos.x = v20 * a1 + pSoftBillboard->uScreenSpaceX;
-    pBillboardRenderListD3D[v7].pQuards[2].pos.y = pSoftBillboard->uScreenSpaceY - (double)v19 * v29;
-    pBillboardRenderListD3D[v7].pQuards[2].pos.z = v15;
-    pBillboardRenderListD3D[v7].pQuards[2].rhw = v16;
-    pBillboardRenderListD3D[v7].pQuards[2].texcoord.x = 1.0;
-    pBillboardRenderListD3D[v7].pQuards[2].texcoord.y = 1.0;
+    pBillboardRenderListD3D[v7].pQuads[2].specular = 0;
+    pBillboardRenderListD3D[v7].pQuads[2].diffuse = v12;
+    pBillboardRenderListD3D[v7].pQuads[2].pos.x = v20 * a1 + pSoftBillboard->uScreenSpaceX;
+    pBillboardRenderListD3D[v7].pQuads[2].pos.y = pSoftBillboard->uScreenSpaceY - (double)v19 * v29;
+    pBillboardRenderListD3D[v7].pQuads[2].pos.z = v15;
+    pBillboardRenderListD3D[v7].pQuads[2].rhw = v16;
+    pBillboardRenderListD3D[v7].pQuads[2].texcoord.x = 1.0;
+    pBillboardRenderListD3D[v7].pQuads[2].texcoord.y = 1.0;
     v21 = pSprite->uBufferHeight - pSprite->uAreaY;
     v22 = (double)(pSprite->uAreaX + pSprite->uAreaWidth + (pSprite->uBufferWidth >> 1) - pSprite->uBufferWidth);
     if ( pSoftBillboard->uFlags & 4 )
       v22 = v22 * -1.0;
-    pBillboardRenderListD3D[v7].pQuards[3].specular = 0;
-    pBillboardRenderListD3D[v7].pQuards[3].diffuse = v12;
-    pBillboardRenderListD3D[v7].pQuards[3].pos.x = v22 * a1 + pSoftBillboard->uScreenSpaceX;
-    pBillboardRenderListD3D[v7].pQuards[3].pos.y = pSoftBillboard->uScreenSpaceY - (double)v21 * v29;
-    pBillboardRenderListD3D[v7].pQuards[3].pos.z = v15;
-    pBillboardRenderListD3D[v7].pQuards[3].rhw = v16;
-    pBillboardRenderListD3D[v7].pQuards[3].texcoord.x = 1.0;
-    pBillboardRenderListD3D[v7].pQuards[3].texcoord.y = 0.0;
+    pBillboardRenderListD3D[v7].pQuads[3].specular = 0;
+    pBillboardRenderListD3D[v7].pQuads[3].diffuse = v12;
+    pBillboardRenderListD3D[v7].pQuads[3].pos.x = v22 * a1 + pSoftBillboard->uScreenSpaceX;
+    pBillboardRenderListD3D[v7].pQuads[3].pos.y = pSoftBillboard->uScreenSpaceY - (double)v21 * v29;
+    pBillboardRenderListD3D[v7].pQuads[3].pos.z = v15;
+    pBillboardRenderListD3D[v7].pQuads[3].rhw = v16;
+    pBillboardRenderListD3D[v7].pQuads[3].texcoord.x = 1.0;
+    pBillboardRenderListD3D[v7].pQuads[3].texcoord.y = 0.0;
     //v23 = pSprite->pTexture;
     pBillboardRenderListD3D[v7].uNumVertices = 4;
     pBillboardRenderListD3D[v7].z_order = pSoftBillboard->zbuffer_depth;
@@ -7951,7 +6442,7 @@
       v19 = stru_5C6E00->Sin(angle);
       v20 = stru_5C6E00->Sin(angle);
       v21 = stru_5C6E00->Cos(angle);
-      pBillboardRenderListD3D[v8].pQuards[0].pos.x = (((double)(unsigned __int16)v18 * 0.000015259022
+      pBillboardRenderListD3D[v8].pQuads[0].pos.x = (((double)(unsigned __int16)v18 * 0.000015259022
                                                        + (double)(v18 >> 16))
                                                        * v16
                                                        - ((double)(unsigned __int16)v19 * 0.000015259022
@@ -7963,20 +6454,20 @@
            - 12.0)
           * v11
           + (double)a2->uScreenSpaceY;
-      pBillboardRenderListD3D[v8].pQuards[0].specular = 0;
-      pBillboardRenderListD3D[v8].pQuards[0].diffuse = uDiffuse;
-      pBillboardRenderListD3D[v8].pQuards[0].pos.y = v22;
-      pBillboardRenderListD3D[v8].pQuards[0].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 0.061758894);
-      pBillboardRenderListD3D[v8].pQuards[0].rhw = 1.0 / a2->zbuffer_depth;
-      pBillboardRenderListD3D[v8].pQuards[0].texcoord.x = 0.0;
-      pBillboardRenderListD3D[v8].pQuards[0].texcoord.y = 0.0;
+      pBillboardRenderListD3D[v8].pQuads[0].specular = 0;
+      pBillboardRenderListD3D[v8].pQuads[0].diffuse = uDiffuse;
+      pBillboardRenderListD3D[v8].pQuads[0].pos.y = v22;
+      pBillboardRenderListD3D[v8].pQuads[0].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 0.061758894);
+      pBillboardRenderListD3D[v8].pQuads[0].rhw = 1.0 / a2->zbuffer_depth;
+      pBillboardRenderListD3D[v8].pQuads[0].texcoord.x = 0.0;
+      pBillboardRenderListD3D[v8].pQuads[0].texcoord.y = 0.0;
       v31 = (double)(a2->uScreenSpaceX + 12) - (double) a2->uScreenSpaceX;
       v32 = (double)a2->uScreenSpaceY - (double)(a2->uScreenSpaceY - 12);
       v25 = stru_5C6E00->Cos(angle);
       v26 = stru_5C6E00->Sin(angle);
       v27 = stru_5C6E00->Sin(angle);
       v28 = stru_5C6E00->Cos(angle);
-      pBillboardRenderListD3D[v8].pQuards[1].pos.x = (((double)(unsigned __int16)v25 * 0.000015259022
+      pBillboardRenderListD3D[v8].pQuads[1].pos.x = (((double)(unsigned __int16)v25 * 0.000015259022
                                                        + (double)(v25 >> 16))
                                                        * v31
                                                        - ((double)(unsigned __int16)v26 * 0.000015259022
@@ -7988,47 +6479,47 @@
            - 12.0)
           * v11
           + (double)a2->uScreenSpaceY;
-      pBillboardRenderListD3D[v8].pQuards[1].pos.z = pRenderer->pBillboardRenderListD3D[v8].pQuards[0].pos.z;
-      v30 = pBillboardRenderListD3D[v8].pQuards[0].rhw;
-      pBillboardRenderListD3D[v8].pQuards[1].pos.y = v29;
-      pBillboardRenderListD3D[v8].pQuards[1].specular = 0;
-      pBillboardRenderListD3D[v8].pQuards[1].rhw = v30;
-      pBillboardRenderListD3D[v8].pQuards[1].diffuse = uDiffuse;
-      pBillboardRenderListD3D[v8].pQuards[1].texcoord.x = 0.0;
-      pBillboardRenderListD3D[v8].pQuards[1].texcoord.y = 1.0;
+      pBillboardRenderListD3D[v8].pQuads[1].pos.z = pRenderer->pBillboardRenderListD3D[v8].pQuads[0].pos.z;
+      v30 = pBillboardRenderListD3D[v8].pQuads[0].rhw;
+      pBillboardRenderListD3D[v8].pQuads[1].pos.y = v29;
+      pBillboardRenderListD3D[v8].pQuads[1].specular = 0;
+      pBillboardRenderListD3D[v8].pQuads[1].rhw = v30;
+      pBillboardRenderListD3D[v8].pQuads[1].diffuse = uDiffuse;
+      pBillboardRenderListD3D[v8].pQuads[1].texcoord.x = 0.0;
+      pBillboardRenderListD3D[v8].pQuads[1].texcoord.y = 1.0;
       v23 = (double)(a2->uScreenSpaceX - 12) - (double) a2->uScreenSpaceX;
       v24 = (double)a2->uScreenSpaceY - (double)(a2->uScreenSpaceY - 12);
       v33 = stru_5C6E00->Cos(angle);
       v34 = stru_5C6E00->Sin(angle);
       v35 = stru_5C6E00->Sin(angle);
       v36 = stru_5C6E00->Cos(angle);
-      pBillboardRenderListD3D[v8].pQuards[2].pos.x = (((double)(unsigned __int16)v33 * 0.000015259022
+      pBillboardRenderListD3D[v8].pQuads[2].pos.x = (((double)(unsigned __int16)v33 * 0.000015259022
                                                         + (double)(v33 >> 16))
                                                         * v23
                                                         - ((double)(unsigned __int16)v34 * 0.000015259022
                                                         + (double)(v34 >> 16))
                                                         * v24)
                                                         * v11 + (double) a2->uScreenSpaceX;
-      v37 = pBillboardRenderListD3D[v8].pQuards[0].pos.z;
+      v37 = pBillboardRenderListD3D[v8].pQuads[0].pos.z;
       v38 = (((double)(unsigned __int16)v36 * 0.000015259022 + (double)(v36 >> 16)) * v24
            + ((double)(unsigned __int16)v35 * 0.000015259022 + (double)(v35 >> 16)) * v23
            - 12.0)
           * v11
           + (double)a2->uScreenSpaceY;
-      pBillboardRenderListD3D[v8].pQuards[2].specular = 0;
-      pBillboardRenderListD3D[v8].pQuards[2].pos.z = v37;
-      pBillboardRenderListD3D[v8].pQuards[2].rhw = pBillboardRenderListD3D[v8].pQuards[0].rhw;
-      pBillboardRenderListD3D[v8].pQuards[2].diffuse = uDiffuse;
-      pBillboardRenderListD3D[v8].pQuards[2].pos.y = v38;
-      pBillboardRenderListD3D[v8].pQuards[2].texcoord.x = 1.0;
-      pBillboardRenderListD3D[v8].pQuards[2].texcoord.y = 1.0;
+      pBillboardRenderListD3D[v8].pQuads[2].specular = 0;
+      pBillboardRenderListD3D[v8].pQuads[2].pos.z = v37;
+      pBillboardRenderListD3D[v8].pQuads[2].rhw = pBillboardRenderListD3D[v8].pQuads[0].rhw;
+      pBillboardRenderListD3D[v8].pQuads[2].diffuse = uDiffuse;
+      pBillboardRenderListD3D[v8].pQuads[2].pos.y = v38;
+      pBillboardRenderListD3D[v8].pQuads[2].texcoord.x = 1.0;
+      pBillboardRenderListD3D[v8].pQuads[2].texcoord.y = 1.0;
       v39 = (double)(a2->uScreenSpaceX + 12) - (double) a2->uScreenSpaceX;
       v40 = (double)(a2->uScreenSpaceY - 25) - (double)(a2->uScreenSpaceY - 12);
       v41 = stru_5C6E00->Cos(angle);
       v42 = stru_5C6E00->Sin(angle);
       v43 = stru_5C6E00->Sin(angle);
       v44 = stru_5C6E00->Cos(angle);
-      pBillboardRenderListD3D[v8].pQuards[3].pos.x = (((double)(unsigned __int16)v41 * 0.000015259022
+      pBillboardRenderListD3D[v8].pQuads[3].pos.x = (((double)(unsigned __int16)v41 * 0.000015259022
                                                         + (double)(v41 >> 16))
                                                         * v39
                                                         - ((double)(unsigned __int16)v42 * 0.000015259022
@@ -8040,17 +6531,17 @@
            - 12.0)
           * v11
           + (double)a2->uScreenSpaceY;
-      v46 = pBillboardRenderListD3D[v8].pQuards[0].pos.z;
-      pBillboardRenderListD3D[v8].pQuards[3].specular = 0;
-      pBillboardRenderListD3D[v8].pQuards[3].pos.z = v46;
-      pBillboardRenderListD3D[v8].pQuards[3].rhw = pBillboardRenderListD3D[v8].pQuards[0].rhw;
-      pBillboardRenderListD3D[v8].pQuards[3].diffuse = uDiffuse;
+      v46 = pBillboardRenderListD3D[v8].pQuads[0].pos.z;
+      pBillboardRenderListD3D[v8].pQuads[3].specular = 0;
+      pBillboardRenderListD3D[v8].pQuads[3].pos.z = v46;
+      pBillboardRenderListD3D[v8].pQuads[3].rhw = pBillboardRenderListD3D[v8].pQuads[0].rhw;
+      pBillboardRenderListD3D[v8].pQuads[3].diffuse = uDiffuse;
       pBillboardRenderListD3D[v8].pTexture = a3;
       pBillboardRenderListD3D[v8].z_order = a2->zbuffer_depth;
       pBillboardRenderListD3D[v8].uNumVertices = 4;
-      pBillboardRenderListD3D[v8].pQuards[3].pos.y = v45;
-      pBillboardRenderListD3D[v8].pQuards[3].texcoord.x = 1.0;
-      pBillboardRenderListD3D[v8].pQuards[3].texcoord.y = 0.0;
+      pBillboardRenderListD3D[v8].pQuads[3].pos.y = v45;
+      pBillboardRenderListD3D[v8].pQuads[3].texcoord.x = 1.0;
+      pBillboardRenderListD3D[v8].pQuads[3].texcoord.y = 0.0;
     }
   }
 }
@@ -8125,7 +6616,7 @@
     v20 = stru_5C6E00->Sin(angle);
     v21 = stru_5C6E00->Sin(angle);
     v22 = stru_5C6E00->Cos(angle);
-    pBillboardRenderListD3D[v8].pQuards[0].pos.x = (((double)(unsigned __int16)v18 * 0.000015259022
+    pBillboardRenderListD3D[v8].pQuads[0].pos.x = (((double)(unsigned __int16)v18 * 0.000015259022
                                                     + (double)(v18 >> 16))
                                                     * v16
                                                     - ((double)(unsigned __int16)v20 * 0.000015259022
@@ -8137,22 +6628,22 @@
          - 12.0)
         * v11
         + (double)a2->uScreenSpaceY;
-    pBillboardRenderListD3D[v8].pQuards[0].specular = 0;
-    pBillboardRenderListD3D[v8].pQuards[0].diffuse = uDiffuse;
-    pBillboardRenderListD3D[v8].pQuards[0].pos.y = v23;
+    pBillboardRenderListD3D[v8].pQuads[0].specular = 0;
+    pBillboardRenderListD3D[v8].pQuads[0].diffuse = uDiffuse;
+    pBillboardRenderListD3D[v8].pQuads[0].pos.y = v23;
     v24 = 1.0 - 1.0 / (v6 * 1000.0 / (double)pOutdoorCamera->shading_dist_mist);
-    pBillboardRenderListD3D[v8].pQuards[0].pos.z = v24;
+    pBillboardRenderListD3D[v8].pQuads[0].pos.z = v24;
     v25 = 1.0 / v6;
-    pBillboardRenderListD3D[v8].pQuards[0].rhw = v25;
-    pBillboardRenderListD3D[v8].pQuards[0].texcoord.x = 0.0;
-    pBillboardRenderListD3D[v8].pQuards[0].texcoord.y = 0.0;
+    pBillboardRenderListD3D[v8].pQuads[0].rhw = v25;
+    pBillboardRenderListD3D[v8].pQuads[0].texcoord.x = 0.0;
+    pBillboardRenderListD3D[v8].pQuads[0].texcoord.y = 0.0;
     v26 = (double)(a2->uScreenSpaceX - 12) - v13;
     v27 = (double)a2->uScreenSpaceY - v15;
     v28 = stru_5C6E00->Cos(angle);
     v29 = stru_5C6E00->Sin(v19 + stru_5C6E00->uIntegerHalfPi);
     v30 = stru_5C6E00->Sin(v19 + stru_5C6E00->uIntegerHalfPi);
     v31 = stru_5C6E00->Cos(angle);
-    pBillboardRenderListD3D[v8].pQuards[1].pos.x = (((double)(unsigned __int16)v28 * 0.000015259022
+    pBillboardRenderListD3D[v8].pQuads[1].pos.x = (((double)(unsigned __int16)v28 * 0.000015259022
                                                      + (double)(v28 >> 16))
                                                      * v26
                                                      - ((double)(unsigned __int16)v29 * 0.000015259022
@@ -8164,20 +6655,20 @@
          - 12.0)
         * v11
         + (double)a2->uScreenSpaceY;
-    pBillboardRenderListD3D[v8].pQuards[1].pos.z = v24;
-    pBillboardRenderListD3D[v8].pQuards[1].pos.y = v32;
-    pBillboardRenderListD3D[v8].pQuards[1].specular = 0;
-    pBillboardRenderListD3D[v8].pQuards[1].rhw = v25;
-    pBillboardRenderListD3D[v8].pQuards[1].diffuse = uDiffuse;
-    pBillboardRenderListD3D[v8].pQuards[1].texcoord.x = 0.0;
-    pBillboardRenderListD3D[v8].pQuards[1].texcoord.y = 1.0;
+    pBillboardRenderListD3D[v8].pQuads[1].pos.z = v24;
+    pBillboardRenderListD3D[v8].pQuads[1].pos.y = v32;
+    pBillboardRenderListD3D[v8].pQuads[1].specular = 0;
+    pBillboardRenderListD3D[v8].pQuads[1].rhw = v25;
+    pBillboardRenderListD3D[v8].pQuads[1].diffuse = uDiffuse;
+    pBillboardRenderListD3D[v8].pQuads[1].texcoord.x = 0.0;
+    pBillboardRenderListD3D[v8].pQuads[1].texcoord.y = 1.0;
     v33 = (double)(a2->uScreenSpaceX + 12) - v13;
     v34 = (double)a2->uScreenSpaceY - v15;
     v35 = stru_5C6E00->Cos(angle);
     v36 = stru_5C6E00->Sin(v19 + stru_5C6E00->uIntegerHalfPi);
     v37 = stru_5C6E00->Sin(v19 + stru_5C6E00->uIntegerHalfPi);
     v38 = stru_5C6E00->Cos(angle);
-    pBillboardRenderListD3D[v8].pQuards[2].pos.x = (((double)(unsigned __int16)v35 * 0.000015259022
+    pBillboardRenderListD3D[v8].pQuads[2].pos.x = (((double)(unsigned __int16)v35 * 0.000015259022
                                                      + (double)(v35 >> 16))
                                                      * v33
                                                      - ((double)(unsigned __int16)v36 * 0.000015259022
@@ -8189,20 +6680,20 @@
          - 12.0)
         * v11
         + (double)a2->uScreenSpaceY;
-    pBillboardRenderListD3D[v8].pQuards[2].specular = 0;
-    pBillboardRenderListD3D[v8].pQuards[2].pos.z = v24;
-    pBillboardRenderListD3D[v8].pQuards[2].rhw = v25;
-    pBillboardRenderListD3D[v8].pQuards[2].diffuse = uDiffuse;
-    pBillboardRenderListD3D[v8].pQuards[2].pos.y = v39;
-    pBillboardRenderListD3D[v8].pQuards[2].texcoord.x = 1.0;
-    pBillboardRenderListD3D[v8].pQuards[2].texcoord.y = 1.0;
+    pBillboardRenderListD3D[v8].pQuads[2].specular = 0;
+    pBillboardRenderListD3D[v8].pQuads[2].pos.z = v24;
+    pBillboardRenderListD3D[v8].pQuads[2].rhw = v25;
+    pBillboardRenderListD3D[v8].pQuads[2].diffuse = uDiffuse;
+    pBillboardRenderListD3D[v8].pQuads[2].pos.y = v39;
+    pBillboardRenderListD3D[v8].pQuads[2].texcoord.x = 1.0;
+    pBillboardRenderListD3D[v8].pQuads[2].texcoord.y = 1.0;
     v40 = (double)(a2->uScreenSpaceX + 12) - v13;
     v41 = (double)(a2->uScreenSpaceY - 25) - v15;
     v42 = stru_5C6E00->Cos(angle);
     v43 = stru_5C6E00->Sin(v19 + stru_5C6E00->uIntegerHalfPi);
     v44 = stru_5C6E00->Sin(v19 + stru_5C6E00->uIntegerHalfPi);
     v45 = stru_5C6E00->Cos(angle);
-    pBillboardRenderListD3D[v8].pQuards[3].pos.x = (((double)(unsigned __int16)v42 * 0.000015259022
+    pBillboardRenderListD3D[v8].pQuads[3].pos.x = (((double)(unsigned __int16)v42 * 0.000015259022
                                                      + (double)(v42 >> 16))
                                                      * v40
                                                      - ((double)(unsigned __int16)v43 * 0.000015259022
@@ -8214,16 +6705,16 @@
          - 12.0)
         * v11
         + (double)a2->uScreenSpaceY;
-    pBillboardRenderListD3D[v8].pQuards[3].specular = 0;
-    pBillboardRenderListD3D[v8].pQuards[3].pos.z = v24;
-    pBillboardRenderListD3D[v8].pQuards[3].rhw = v25;
-    pBillboardRenderListD3D[v8].pQuards[3].diffuse = uDiffuse;
+    pBillboardRenderListD3D[v8].pQuads[3].specular = 0;
+    pBillboardRenderListD3D[v8].pQuads[3].pos.z = v24;
+    pBillboardRenderListD3D[v8].pQuads[3].rhw = v25;
+    pBillboardRenderListD3D[v8].pQuads[3].diffuse = uDiffuse;
     pBillboardRenderListD3D[v8].pTexture = a3;
     pBillboardRenderListD3D[v8].z_order = v6;
     pBillboardRenderListD3D[v8].uNumVertices = 4;
-    pBillboardRenderListD3D[v8].pQuards[3].pos.y = v46;
-    pBillboardRenderListD3D[v8].pQuards[3].texcoord.x = 1.0;
-    pBillboardRenderListD3D[v8].pQuards[3].texcoord.y = 0.0;
+    pBillboardRenderListD3D[v8].pQuads[3].pos.y = v46;
+    pBillboardRenderListD3D[v8].pQuads[3].texcoord.x = 1.0;
+    pBillboardRenderListD3D[v8].pQuads[3].texcoord.y = 0.0;
   }
 }
 
@@ -8271,53 +6762,53 @@
   v15 = (double)((int)pSprite->uBufferHeight - pSprite->uAreaY);
   if (a2->uFlags & 4)
     v14 *= -1.0;
-  pBillboardRenderListD3D[v8].pQuards[0].diffuse = diffuse;
-  pBillboardRenderListD3D[v8].pQuards[0].pos.x = (double)a2->uScreenSpaceX - v14 * v30;
-  pBillboardRenderListD3D[v8].pQuards[0].pos.y = (double)a2->uScreenSpaceY - v15 * v29;
-  pBillboardRenderListD3D[v8].pQuards[0].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist);
-  pBillboardRenderListD3D[v8].pQuards[0].rhw = 1.0 / a2->zbuffer_depth;
-  pBillboardRenderListD3D[v8].pQuards[0].specular = specular;
-  pBillboardRenderListD3D[v8].pQuards[0].texcoord.x = 0.0;
-  pBillboardRenderListD3D[v8].pQuards[0].texcoord.y = 0.0;
+  pBillboardRenderListD3D[v8].pQuads[0].diffuse = diffuse;
+  pBillboardRenderListD3D[v8].pQuads[0].pos.x = (double)a2->uScreenSpaceX - v14 * v30;
+  pBillboardRenderListD3D[v8].pQuads[0].pos.y = (double)a2->uScreenSpaceY - v15 * v29;
+  pBillboardRenderListD3D[v8].pQuads[0].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist);
+  pBillboardRenderListD3D[v8].pQuads[0].rhw = 1.0 / a2->zbuffer_depth;
+  pBillboardRenderListD3D[v8].pQuads[0].specular = specular;
+  pBillboardRenderListD3D[v8].pQuads[0].texcoord.x = 0.0;
+  pBillboardRenderListD3D[v8].pQuads[0].texcoord.y = 0.0;
 
     v14 = (double)((int)pSprite->uBufferWidth / 2 - pSprite->uAreaX);
     v15 = (double)((int)pSprite->uBufferHeight - pSprite->uAreaHeight - pSprite->uAreaY);
     if ( a2->uFlags & 4 )
       v14 = v14 * -1.0;
-    pBillboardRenderListD3D[v8].pQuards[1].specular = specular;
-    pBillboardRenderListD3D[v8].pQuards[1].diffuse = diffuse;
-    pBillboardRenderListD3D[v8].pQuards[1].pos.x = (double)a2->uScreenSpaceX - v14 * v30;
-    pBillboardRenderListD3D[v8].pQuards[1].pos.y = (double)a2->uScreenSpaceY - v15 * v29;
-    pBillboardRenderListD3D[v8].pQuards[1].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist);
-    pBillboardRenderListD3D[v8].pQuards[1].rhw = 1.0 / a2->zbuffer_depth;
-    pBillboardRenderListD3D[v8].pQuards[1].texcoord.x = 0.0;
-    pBillboardRenderListD3D[v8].pQuards[1].texcoord.y = 1.0;
+    pBillboardRenderListD3D[v8].pQuads[1].specular = specular;
+    pBillboardRenderListD3D[v8].pQuads[1].diffuse = diffuse;
+    pBillboardRenderListD3D[v8].pQuads[1].pos.x = (double)a2->uScreenSpaceX - v14 * v30;
+    pBillboardRenderListD3D[v8].pQuads[1].pos.y = (double)a2->uScreenSpaceY - v15 * v29;
+    pBillboardRenderListD3D[v8].pQuads[1].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist);
+    pBillboardRenderListD3D[v8].pQuads[1].rhw = 1.0 / a2->zbuffer_depth;
+    pBillboardRenderListD3D[v8].pQuads[1].texcoord.x = 0.0;
+    pBillboardRenderListD3D[v8].pQuads[1].texcoord.y = 1.0;
 
     v14 = (double)((int)pSprite->uAreaWidth + pSprite->uAreaX + pSprite->uBufferWidth / 2 - pSprite->uBufferWidth);
     v15 = (double)((int)pSprite->uBufferHeight - pSprite->uAreaHeight - pSprite->uAreaY);
     if ( a2->uFlags & 4 )
       v14 *= -1.0;
-    pBillboardRenderListD3D[v8].pQuards[2].diffuse = diffuse;
-    pBillboardRenderListD3D[v8].pQuards[2].specular = specular;
-    pBillboardRenderListD3D[v8].pQuards[2].pos.x = (double)a2->uScreenSpaceX + v14 * v30;
-    pBillboardRenderListD3D[v8].pQuards[2].pos.y = (double)a2->uScreenSpaceY - v15 * v29;
-    pBillboardRenderListD3D[v8].pQuards[2].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist);
-    pBillboardRenderListD3D[v8].pQuards[2].rhw = 1.0 / a2->zbuffer_depth;
-    pBillboardRenderListD3D[v8].pQuards[2].texcoord.x = 1.0;
-    pBillboardRenderListD3D[v8].pQuards[2].texcoord.y = 1.0;
+    pBillboardRenderListD3D[v8].pQuads[2].diffuse = diffuse;
+    pBillboardRenderListD3D[v8].pQuads[2].specular = specular;
+    pBillboardRenderListD3D[v8].pQuads[2].pos.x = (double)a2->uScreenSpaceX + v14 * v30;
+    pBillboardRenderListD3D[v8].pQuads[2].pos.y = (double)a2->uScreenSpaceY - v15 * v29;
+    pBillboardRenderListD3D[v8].pQuads[2].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist);
+    pBillboardRenderListD3D[v8].pQuads[2].rhw = 1.0 / a2->zbuffer_depth;
+    pBillboardRenderListD3D[v8].pQuads[2].texcoord.x = 1.0;
+    pBillboardRenderListD3D[v8].pQuads[2].texcoord.y = 1.0;
 
     v14 = (double)((int)pSprite->uAreaWidth + pSprite->uAreaX + pSprite->uBufferWidth / 2 - pSprite->uBufferWidth);
     v15 = (double)((int)pSprite->uBufferHeight - pSprite->uAreaY);
     if ( a2->uFlags & 4 )
       v14 *= -1.0;
-    pBillboardRenderListD3D[v8].pQuards[3].diffuse = diffuse;
-    pBillboardRenderListD3D[v8].pQuards[3].specular = specular;
-    pBillboardRenderListD3D[v8].pQuards[3].pos.x = (double)a2->uScreenSpaceX + v14 * v30;
-    pBillboardRenderListD3D[v8].pQuards[3].pos.y = (double)a2->uScreenSpaceY - v15 * v29;
-    pBillboardRenderListD3D[v8].pQuards[3].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist);
-    pBillboardRenderListD3D[v8].pQuards[3].rhw = 1.0 / a2->zbuffer_depth;
-    pBillboardRenderListD3D[v8].pQuards[3].texcoord.x = 1.0;
-    pBillboardRenderListD3D[v8].pQuards[3].texcoord.y = 0.0;
+    pBillboardRenderListD3D[v8].pQuads[3].diffuse = diffuse;
+    pBillboardRenderListD3D[v8].pQuads[3].specular = specular;
+    pBillboardRenderListD3D[v8].pQuads[3].pos.x = (double)a2->uScreenSpaceX + v14 * v30;
+    pBillboardRenderListD3D[v8].pQuads[3].pos.y = (double)a2->uScreenSpaceY - v15 * v29;
+    pBillboardRenderListD3D[v8].pQuads[3].pos.z = 1.0 - 1.0 / (a2->zbuffer_depth * 1000.0 / (double)pOutdoorCamera->shading_dist_mist);
+    pBillboardRenderListD3D[v8].pQuads[3].rhw = 1.0 / a2->zbuffer_depth;
+    pBillboardRenderListD3D[v8].pQuads[3].texcoord.x = 1.0;
+    pBillboardRenderListD3D[v8].pQuads[3].texcoord.y = 0.0;
 
   pBillboardRenderListD3D[v8].uNumVertices = 4;
   pBillboardRenderListD3D[v8].pTexture = pSprite->pTexture;
@@ -8493,79 +6984,54 @@
 }
 
 //----- (004A4CC9) --------------------------------------------------------
-void Render::_4A4CC9(stru6_stru1_indoor_sw_billboard *a1, int a2)
-{
-  int v3; // eax@1
-  int v4; // edx@3
+void Render::_4A4CC9_AddSomeBillboard(stru6_stru1_indoor_sw_billboard *a1, int diffuse)
+{
   unsigned int v5; // eax@7
-  int v6; // edi@7
   char *v7; // edx@8
-  char *v8; // ecx@8
-  char v9; // zf@9
   double v10; // st6@9
   double v11; // st6@10
   int v12; // ebx@13
-  int v13; // ecx@16
-  unsigned int v14; // [sp+Ch] [bp-4h]@1
-
-  auto _this = this;
-
-  *(float *)&v14 = 1000000.0;
-  v3 = a1->field_10;
-  if ( v3 >= 3 )
-  {
-    if ( v3 > 0 )
-    {
-      _this = (Render *)&a1->field_14[62];
-      v4 = a1->field_10;
-      do
-      {
-        if ( *(float *)&this->bUserDirect3D < (double)*(float *)&v14 )
-          v14 = this->bUserDirect3D;
-        _this = (Render *)((char *)_this + 16);
-        --v4;
-      }
-      while ( v4 );
-    }
-    v5 = Billboard_ProbablyAddToListAndSortByZOrder(v14);
-    v6 = 0;
-    pBillboardRenderListD3D[v5].field_90 = 0;
-    pBillboardRenderListD3D[v5].uParentBillboardID = -1;
-    pBillboardRenderListD3D[v5].uOpacity = RenderBillboardD3D::Opaque_2;
-    if ( a1->field_10 > 0 )
-    {
-      v7 = (char *)&a1->field_14[62];
-      v8 = (char *)&pBillboardRenderListD3D[v5].pQuards[0].pos.z;
-      do
-      {
-        v9 = uCurrentlyLoadedLevelType == LEVEL_Indoor;
-        *((int *)v8 - 2) = *((int *)v7 - 2);
-        *((int *)v8 - 1) = *((int *)v7 - 1);
-        v10 = *(float *)v7;
-        if ( v9 )
-          v11 = v10 * 0.061758894;
-        else
-          v11 = v10 * 1000.0 / (double)pOutdoorCamera->shading_dist_mist;
-        *(float *)v8 = 1.0 - 1.0 / v11;
-        *((float *)v8 + 1) = 1.0 / *(float *)v7;
-        if ( a2 & 0xFF000000 )
-          v12 = *((int *)v7 + 1);
-        else
-          v12 = a2;
-        *((int *)v8 + 3) = 0;
-        *((int *)v8 + 2) = v12;
-        ++v6;
-        v7 += 16;
-        *((float *)v8 + 4) = 0.0;
-        *((float *)v8 + 5) = 0.0;
-        v8 += 32;
-      }
-      while ( v6 < a1->field_10 );
-    }
-    v13 = a1->field_10;
-    pBillboardRenderListD3D[v5].pTexture = 0;
-    pBillboardRenderListD3D[v5].uNumVertices = v13;
-    LODWORD(pBillboardRenderListD3D[v5].z_order) = v14;
+
+  if (a1->uNumVertices < 3)
+    return;
+
+  float depth = 1000000.0;
+  for (uint i = 0; i < a1->uNumVertices; ++i)
+  {
+    if (a1->field_104[i].z < depth)
+      depth = a1->field_104[i * 4].z;
+  }
+
+  v5 = Billboard_ProbablyAddToListAndSortByZOrder(depth);
+  pBillboardRenderListD3D[v5].field_90 = 0;
+  pBillboardRenderListD3D[v5].uParentBillboardID = -1;
+  pBillboardRenderListD3D[v5].uOpacity = RenderBillboardD3D::Opaque_2;
+  pBillboardRenderListD3D[v5].pTexture = 0;
+  pBillboardRenderListD3D[v5].uNumVertices = a1->uNumVertices;
+  pBillboardRenderListD3D[v5].z_order = depth;
+
+  for (uint i = 0; i < a1->uNumVertices; ++i)
+  {
+    pBillboardRenderListD3D[v5].pQuads[i].pos.x = a1->field_104[i].x;
+    pBillboardRenderListD3D[v5].pQuads[i].pos.y = a1->field_104[i].y;
+
+    v10 = a1->field_104[i].z;
+    if (uCurrentlyLoadedLevelType == LEVEL_Indoor)
+      v11 = v10 * 0.061758894;
+    else
+      v11 = v10 * 1000.0 / (double)pOutdoorCamera->shading_dist_mist;
+    pBillboardRenderListD3D[v5].pQuads[i].pos.z = 1.0 - 1.0 / v11;
+    pBillboardRenderListD3D[v5].pQuads[i].rhw = 1.0 / a1->field_104[i].z;
+
+    if (diffuse & 0xFF000000)
+      v12 = a1->field_104[i].diffuse;
+    else
+      v12 = diffuse;
+    pBillboardRenderListD3D[v5].pQuads[i].diffuse = v12;
+    pBillboardRenderListD3D[v5].pQuads[i].specular = 0;
+
+    pBillboardRenderListD3D[v5].pQuads[i].texcoord.x = 0.0;
+    pBillboardRenderListD3D[v5].pQuads[i].texcoord.y = 0.0;
   }
 }
 
@@ -8838,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 )
@@ -10633,12 +9101,6 @@
 // 6BE364: using guessed type int dword_6BE364_game_settings_1;
 // A74C88: using guessed type int dword_A74C88;
 
-//----- (0044EC20) --------------------------------------------------------
-bool RenderD3D::DoesRaiseExceptions()
-{
-  return true;
-}
-
 
 //----- (004524D8) --------------------------------------------------------
 HWLTexture *RenderHWLContainer::LoadTexture(const char *pName, int bMipMaps)
@@ -10865,20 +9327,20 @@
   auto p = &pRenderer->pBillboardRenderListD3D[0];
   for (int i = 0; i < p->uNumVertices; ++i)
   {
-    p->pQuards[i].pos.z -= p->pQuards[i].pos.z * 0.6;
-    //p->pQuards[i].rhw = + 0.8 * (1.0f - p->pQuards[i].rhw);
-  }
-  p->pQuards[0].pos.x = 10;
-  p->pQuards[0].pos.y = 10;
-
-  p->pQuards[1].pos.x = 10;
-  p->pQuards[1].pos.y = 200;
-
-  p->pQuards[2].pos.x = 100;
-  p->pQuards[2].pos.y = 200;
-
-  p->pQuards[3].pos.x = 100;
-  p->pQuards[3].pos.y = 10;
+    p->pQuads[i].pos.z -= p->pQuads[i].pos.z * 0.6;
+    //p->pQuads[i].rhw = + 0.8 * (1.0f - p->pQuads[i].rhw);
+  }
+  p->pQuads[0].pos.x = 10;
+  p->pQuads[0].pos.y = 10;
+
+  p->pQuads[1].pos.x = 10;
+  p->pQuads[1].pos.y = 200;
+
+  p->pQuads[2].pos.x = 100;
+  p->pQuads[2].pos.y = 200;
+
+  p->pQuads[3].pos.x = 100;
+  p->pQuads[3].pos.y = 10;
 
       if (p->uOpacity != RenderBillboardD3D::NoBlend)
       SetBillboardBlendOptions(p->uOpacity);
@@ -10886,7 +9348,7 @@
     pRenderer->pRenderD3D->pDevice->SetTexture(0, p->pTexture);
     ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(D3DPT_TRIANGLEFAN,
                                                          D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
-                                                         p->pQuards, p->uNumVertices,
+                                                         p->pQuads, p->uNumVertices,
                                                          D3DDP_DONOTLIGHT | D3DDP_DONOTUPDATEEXTENTS));
 
   }*/
@@ -10901,7 +9363,7 @@
     pRenderer->pRenderD3D->pDevice->SetTexture(0, p->pTexture);
     ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(D3DPT_TRIANGLEFAN,
                                                          D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
-                                                         p->pQuards, p->uNumVertices,
+                                                         p->pQuads, p->uNumVertices,
                                                          D3DDP_DONOTLIGHT | D3DDP_DONOTUPDATEEXTENTS));
   }
 
@@ -10971,3 +9433,11 @@
 {
   pRenderer->Present();
 }
+
+
+
+//----- (0044EC20) --------------------------------------------------------
+/*bool RenderD3D::DoesRaiseExceptions()
+{
+  return true;
+}*/
\ No newline at end of file