changeset 68:fdacbc653945

BLV render: first image
author Nomad
date Sat, 27 Oct 2012 19:23:06 +0200
parents 427b6c3b4e0f
children efefae49c990
files DecalBuilder.cpp Game.cpp Game.h Indoor.cpp Indoor.h IndoorCameraD3D.cpp LightmapBuilder.cpp LightmapBuilder.h Render.cpp Render.h mm7_2.cpp mm7_3.cpp mm7_4.cpp mm7_data.cpp mm7_data.h stru6.cpp stru9.cpp stru9.h
diffstat 18 files changed, 346 insertions(+), 641 deletions(-) [+]
line wrap: on
line diff
--- a/DecalBuilder.cpp	Fri Oct 26 03:43:05 2012 +0200
+++ b/DecalBuilder.cpp	Sat Oct 27 19:23:06 2012 +0200
@@ -146,6 +146,8 @@
   DecalBuilder *thisa; // [sp+40h] [bp-8h]@1
   RenderVertexSoft *a11; // [sp+44h] [bp-4h]@8
 
+  __debugbreak();
+
   auto a9 = uSectorID;
 
   thisa = this;
--- a/Game.cpp	Fri Oct 26 03:43:05 2012 +0200
+++ b/Game.cpp	Sat Oct 27 19:23:06 2012 +0200
@@ -667,22 +667,15 @@
 
 
 //----- (0044EDE4) --------------------------------------------------------
-bool Game::_44EDE4(BLVFace *pFace, int *a3)
+bool Game::AlterGamma(BLVFace *pFace, unsigned int *pColor)
 {
-  bool result; // eax@1
-
-  result = (bool)pGame;
-  if ( pGame->uFlags2 & 2 && (result = (bool)pFace, pFace->uAttributes & 2) )
+  if (pGame->uFlags2 & 2 && pFace->uAttributes & 2)
   {
-    result = sub_48A959(*a3, 1.0, this->_E28_timed_gamma_strength, -1.0);
-    *a3 = result;
-    LOBYTE(result) = 1;
+    *pColor = ReplaceHSV(*pColor, 1.0, fSaturation, -1.0);
+    return true;
   }
   else
-  {
-    LOBYTE(result) = 0;
-  }
-  return result;
+    return false;
 }
 
 //----- (0044EE30) --------------------------------------------------------
@@ -690,7 +683,7 @@
 {
   if (uFlags2 & 0x2 && a2->uAttributes & 0x02)
   {
-    *(int *)a3 = sub_48A959(*(int *)a3, 1.0, _E28_timed_gamma_strength, -1.0);
+    *(int *)a3 = ReplaceHSV(*(int *)a3, 1.0, fSaturation, -1.0);
     return true;
   }
   else
@@ -763,12 +756,12 @@
     v4 = (double)a4;
     a2a = v4;
     *a3 |= 2u;
-    a3a = (1.0 - this->_E28_timed_gamma_strength) * v4;
+    a3a = (1.0 - this->fSaturation) * v4;
     //v5 = a3a + 6.7553994e15;
     //if ( SLODWORD(v5) >= 0 )
     if (floorf(a3a + 0.5f) >= 0 )
     {
-      a3b = (1.0 - this->_E28_timed_gamma_strength) * a2a;
+      a3b = (1.0 - this->fSaturation) * a2a;
       //v7 = a3b + 6.7553994e15;
       //v6 = LODWORD(v7);
       v6 = floorf(a3b + 0.5f);
@@ -779,12 +772,12 @@
     }
     if ( a4 >= v6 )
     {
-      a4a = (1.0 - _E28_timed_gamma_strength) * a2a;
+      a4a = (1.0 - fSaturation) * a2a;
       //v9 = a4a + 6.7553994e15;
       //if ( SLODWORD(v9) >= 0 )
       if (floorf(a4a + 0.5f) >= 0)
       {
-        a4b = (1.0 - _E28_timed_gamma_strength) * a2a;
+        a4b = (1.0 - fSaturation) * a2a;
         //v10 = a4b + 6.7553994e15;
         //result = LODWORD(v10);
         result = floorf(a4b + 0.5f);
@@ -843,11 +836,11 @@
     v4 = (double)a4;
     v11 = v4;
     *a3 |= 2u;
-    v12 = (1.0 - this->_E28_timed_gamma_strength) * v4;
+    v12 = (1.0 - this->fSaturation) * v4;
     //v5 = v12 + 6.7553994e15;
     if (floorf(v12 + 0.5f)/* SLODWORD(v5)*/ >= 0 )
     {
-      v13 = (1.0 - this->_E28_timed_gamma_strength) * v11;
+      v13 = (1.0 - this->fSaturation) * v11;
       //v7 = v13 + 6.7553994e15;
       //v6 = LODWORD(v7);
       v6 = floorf(v13 + 0.5f);
@@ -858,11 +851,11 @@
     }
     if ( a4 >= v6 )
     {
-      v14 = (1.0 - _E28_timed_gamma_strength) * v11;
+      v14 = (1.0 - fSaturation) * v11;
       //v9 = v14 + 6.7553994e15;
       if (floorf(v14 + 0.5f)/* SLODWORD(v9)*/ >= 0 )
       {
-        v15 = (1.0 - _E28_timed_gamma_strength) * v11;
+        v15 = (1.0 - fSaturation) * v11;
         //v10 = v15 + 6.7553994e15;
         //result = LODWORD(v10);
         result = floorf(v15 + 0.5f);
@@ -1018,9 +1011,9 @@
     v7 = 1.0;
   }
   if ( pRenderer->pRenderD3D )
-    _E28_timed_gamma_strength = v7;
+    fSaturation = v7;
   else
-    _E28_timed_gamma_strength = (1.0 - 0.5) * v7 + 0.5;
+    fSaturation = (1.0 - 0.5) * v7 + 0.5;
 }
 
 //----- (0044EA17) --------------------------------------------------------
--- a/Game.h	Fri Oct 26 03:43:05 2012 +0200
+++ b/Game.h	Sat Oct 27 19:23:06 2012 +0200
@@ -92,7 +92,7 @@
   void OutlineSelection();
   signed int _44EC23(struct stru148 *a2, int *a3, signed int a4);
   signed int _44ED0A(struct BLVFace *a2, int *a3, signed int a4);
-  bool _44EDE4(struct BLVFace *pFace, int *a3);
+  bool AlterGamma(struct BLVFace *pFace, unsigned int *pColor);
   bool _44EE30(struct ODMFace *a2, int a3);
   bool draw_debug_outlines();
   bool _44EEA7();
@@ -144,7 +144,7 @@
   unsigned int bGammaControlInitialized;
   unsigned int uFlags;
   unsigned int uFlags2;
-  float _E28_timed_gamma_strength;
+  float fSaturation;
   unsigned __int64 uSomeGammaStartTime;
   __int64 uSomeGammaDeltaTime;
   ThreadWard *pThreadWardInstance;
--- a/Indoor.cpp	Fri Oct 26 03:43:05 2012 +0200
+++ b/Indoor.cpp	Sat Oct 27 19:23:06 2012 +0200
@@ -451,21 +451,21 @@
   //double v19; // st6@27
   //double v20; // st5@27
   //char v21; // dl@27
-  unsigned int v22; // eax@44
+  //unsigned int v22; // eax@44
   unsigned int v23; // eax@35
   DWORD v24; // eax@37
   int v25; // eax@38
-  char *v26; // edi@38
+  //char *v26; // edi@38
   IDirect3DTexture2 *v27; // eax@42
   Texture *v28; // [sp+Ch] [bp-1Ch]@15
-  int i; // [sp+10h] [bp-18h]@38
+  //int i; // [sp+10h] [bp-18h]@38
   //LightmapBuilder *pStru4; // [sp+14h] [bp-14h]@16
   //IndoorCameraD3D *v31; // [sp+18h] [bp-10h]@16
   //IndoorCameraD3D_Vec4 *a7; // [sp+1Ch] [bp-Ch]@1
   //unsigned int uFaceID_; // [sp+20h] [bp-8h]@1
   unsigned int uNumVerticesa; // [sp+24h] [bp-4h]@17
   int a4a; // [sp+34h] [bp+Ch]@25
-  unsigned int a4b; // [sp+34h] [bp+Ch]@38
+  //unsigned int a4b; // [sp+34h] [bp+Ch]@38
 
   //v4 = uFaceID;
   //a7 = pVertices;
@@ -505,10 +505,11 @@
       static_vertices_F7C228[i].u = (signed)pFace->pVertexUIDs[i];
       static_vertices_F7C228[i].v = (signed)pFace->pVertexUIDs[i];
     }
-            if ( !pVertices
-              || (pGame->pStru9Instance->_498377(a4, 4u, pVertices, static_vertices_F7C228, &uNumVerticesa), uNumVerticesa) )
-            {
-              if ( pGame->pIndoorCameraD3D->_437285_prolly_colide_vertices_against_frustrum(
+
+    if (!pVertices ||
+        (pGame->pStru9Instance->_498377(a4, 4u, pVertices, static_vertices_F7C228, &uNumVerticesa), uNumVerticesa) )
+    {
+      if (pGame->pIndoorCameraD3D->_437285_prolly_colide_vertices_against_frustrum(
                      static_vertices_F7C228,
                      &uNumVerticesa,
                      static_vertices_F7B628,
@@ -517,27 +518,28 @@
                      false,
                      0) != 1
                 || uNumVerticesa )
-              {
-                a4a = SHIWORD(stru_F8AD28.uCurrentAmbientLightLevel);
-                v17 = (248 - 8 * SHIWORD(stru_F8AD28.uCurrentAmbientLightLevel)) | (((248 - 8 * SHIWORD(stru_F8AD28.uCurrentAmbientLightLevel)) | ((248 - 8 * SHIWORD(stru_F8AD28.uCurrentAmbientLightLevel)) << 8)) << 8);
-                sub_4B0E07(uFaceID);
-                pGame->pLightmapBuilder->ApplyLights_IndoorFace(uFaceID);
-                pDecalBuilder->ApplyBloodsplatDecals_IndoorFace(uFaceID);
-                pGame->pIndoorCameraD3D->ViewTransfrom_OffsetUV(static_vertices_F7B628, uNumVerticesa, array_507D30, &stru_F8AD28);
-                pGame->pIndoorCameraD3D->Project(array_507D30, uNumVerticesa, 0);
-                pGame->pLightmapBuilder->std__vector_000004_size = 0;
-                if (stru_F8AD28.uNumLightsApplied > 0 ||
-                    pDecalBuilder->uNumDecals > 0)
-                {
-                  stru_F7B60C.face_plane.vNormal.x = pFace->pFacePlane.vNormal.x;
-                  stru_F7B60C.polygonType = pFace->uPolygonType;
-                  stru_F7B60C.face_plane.vNormal.y = pFace->pFacePlane.vNormal.y;
-                  stru_F7B60C.face_plane.vNormal.z = pFace->pFacePlane.vNormal.z;
-                  stru_F7B60C.face_plane.dist = pFace->pFacePlane.dist;
-                }
-                if (stru_F8AD28.uNumLightsApplied > 0 &&
-                    !(pFace->uAttributes & 0x400000))
-                  pGame->pLightmapBuilder->ApplyLights(
+      {
+        a4a = SHIWORD(stru_F8AD28.uCurrentAmbientLightLevel);
+        v17 = (248 - 8 * SHIWORD(stru_F8AD28.uCurrentAmbientLightLevel)) | (((248 - 8 * SHIWORD(stru_F8AD28.uCurrentAmbientLightLevel)) | ((248 - 8 * SHIWORD(stru_F8AD28.uCurrentAmbientLightLevel)) << 8)) << 8);
+        sub_4B0E07(uFaceID);
+        pGame->pLightmapBuilder->ApplyLights_IndoorFace(uFaceID);
+        pDecalBuilder->ApplyBloodsplatDecals_IndoorFace(uFaceID);
+        pGame->pIndoorCameraD3D->ViewTransfrom_OffsetUV(static_vertices_F7B628, uNumVerticesa, array_507D30, &stru_F8AD28);
+        pGame->pIndoorCameraD3D->Project(array_507D30, uNumVerticesa, 0);
+        pGame->pLightmapBuilder->std__vector_000004_size = 0;
+        if (stru_F8AD28.uNumLightsApplied > 0 ||
+            pDecalBuilder->uNumDecals > 0)
+        {
+          stru_F7B60C.face_plane.vNormal.x = pFace->pFacePlane.vNormal.x;
+          stru_F7B60C.polygonType = pFace->uPolygonType;
+          stru_F7B60C.face_plane.vNormal.y = pFace->pFacePlane.vNormal.y;
+          stru_F7B60C.face_plane.vNormal.z = pFace->pFacePlane.vNormal.z;
+          stru_F7B60C.face_plane.dist = pFace->pFacePlane.dist;
+        }
+
+        if (stru_F8AD28.uNumLightsApplied > 0 &&
+            !(pFace->uAttributes & 0x400000))
+          pGame->pLightmapBuilder->ApplyLights(
                     &stru_F8AD28,
                     &stru_F7B60C,
                     uNumVerticesa,
@@ -545,8 +547,8 @@
                     pVertices,
                     0);
 
-                if (pDecalBuilder->uNumDecals > 0)
-                  pDecalBuilder->ApplyDecals(
+        if (pDecalBuilder->uNumDecals > 0)
+          pDecalBuilder->ApplyDecals(
                     a4a,
                     1,
                     &stru_F7B60C,
@@ -555,52 +557,44 @@
                     pVertices,
                     0,
                     pFace->uSectorID);
-                if (pFace->uAttributes & 0x10 &&
-                    pFace->uBitmapID == pRenderer->field_1036AC_bitmapid )
-                {
-                  v23 = pRenderer->pHDWaterBitmapIDs[pRenderer->field_1036A8_bitmapid];
-                  goto LABEL_42;
-                }
-                if ( pFace->uAttributes & 0x10 )
-                {
-                  v24 = GetTickCount() >> 2;
-                  if ( (signed int)uNumVerticesa > 0 )
-                  {
-                    v25 = v24 - stru_5C6E00->uIntegerHalfPi;
-                    v26 = (char *)&array_507D30[0].v;
-                    a4b = uNumVerticesa;
-                    for ( i = v25; ; v25 = i )
-                    {
-                      *(float *)v26 = (double)(pBitmaps_LOD->pTextures[pFace->uBitmapID].uHeightMinus1 & (unsigned int)(stru_5C6E00->SinCos(v25) >> 8))
-                                    + *(float *)v26;
-                      v26 += 48;
-                      --a4b;
-                      if ( !a4b )
-                        break;
-                    }
-                  }
-                }
-                else
-                {
-                  v22 = pFace->uAttributes;
-                  if ( BYTE1(v22) & 0x40 )
-                  {
-                    v23 = pTextureFrameTable->GetFrameTexture(
+
+        if (pFace->Animated() &&
+            pFace->uBitmapID == pRenderer->field_1036AC_bitmapid )
+        {
+          __debugbreak();
+          v23 = pRenderer->pHDWaterBitmapIDs[pRenderer->field_1036A8_bitmapid];
+          goto LABEL_42;
+        }
+
+        if (pFace->Animated())
+        {
+          v24 = GetTickCount() / 4;
+          v25 = v24 - stru_5C6E00->uIntegerHalfPi;
+
+          for (uint i = 0; i < uNumVerticesa; ++i)
+            array_507D30[i].v += (double)(pBitmaps_LOD->pTextures[pFace->uBitmapID].uHeightMinus1 & (unsigned int)(stru_5C6E00->SinCos(v25) >> 8));
+
+          v23 = pFace->uBitmapID;
+          goto LABEL_42;
+        }
+        else
+        {
+          if (pFace->uAttributes & 0x4000)
+          {
+            v23 = pTextureFrameTable->GetFrameTexture(
                             pFace->uBitmapID,
                             pBLVRenderParams->field_0_timer_);
 LABEL_42:
                     v27 = pBitmaps_LOD->pHardwareTextures[v23];
-                    if ( BYTE2(pFace->uAttributes) & 0x40 )
-                      sub_479A53(uNumVerticesa, uFaceID);
+                    if (pFace->uAttributes & 0x400000)
+                      _479A53_draw_some_blv_poly(uNumVerticesa, uFaceID);
                     else
                       pRenderer->DrawIndoorPolygon(uNumVerticesa, pFace, v27, v28, 8 * uFaceID | 6, v17, 0);
                     return;
-                  }
-                }
-                v23 = pFace->uBitmapID;
-                goto LABEL_42;
-              }
-            }
+          }
+        }
+      }
+    }
   }
 }
 
--- a/Indoor.h	Fri Oct 26 03:43:05 2012 +0200
+++ b/Indoor.h	Sat Oct 27 19:23:06 2012 +0200
@@ -251,6 +251,7 @@
 
 
 #define FACE_TWO_SIDED        0x00000001 // portal/two-sided
+// 0x02  color is saturated against lights
 #define FACE_TEXTURE_ANIMATED 0x00000010 // like wavy water
 #define FACE_INVISIBLE        0x00002000
 #define FACE_TEXTURE_FRAME    0x00004000 // Texture ID is a frameset from TextureFrameTable, otherwise BitmapID
--- a/IndoorCameraD3D.cpp	Fri Oct 26 03:43:05 2012 +0200
+++ b/IndoorCameraD3D.cpp	Sat Oct 27 19:23:06 2012 +0200
@@ -667,7 +667,7 @@
       //v19 = pRenderer->pRenderD3D->pDevice;
       ErrD3D(pRenderer->pRenderD3D->pDevice->SetTexture(0, nullptr));
       ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(D3DPT_POINTLIST,
-              452,
+              D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
               pD3DVertices,
               uNumD3DVertices,
               16));
@@ -820,7 +820,7 @@
       ErrD3D(pRenderer->pRenderD3D->pDevice->SetTexture(0, nullptr));
       ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(
               D3DPT_LINELIST,
-              452,
+              D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
               v24,
               2,
               16));
--- a/LightmapBuilder.cpp	Fri Oct 26 03:43:05 2012 +0200
+++ b/LightmapBuilder.cpp	Sat Oct 27 19:23:06 2012 +0200
@@ -117,29 +117,11 @@
 }
 
 //----- (0045BE86) --------------------------------------------------------
-bool LightmapBuilder::_45BE86_build_light_polygon(Vec3_int_ *pos, float radius, unsigned int uColorMask, float dot_dist, int uLightType, stru314 *a7, signed int a2, RenderVertexSoft *a9, char uClipFlag)
+bool LightmapBuilder::_45BE86_build_light_polygon(Vec3_int_ *pos, float radius, unsigned int uColorMask, float dot_dist, int uLightType, stru314 *a7, unsigned int uNumVertices, RenderVertexSoft *a9, char uClipFlag)
 {
-  //LightmapBuilder *v10; // esi@1
   Lightmap *v11; // edi@3
-  //double v12; // st7@5
-  //double v13; // st7@5
-  //stru314 *v14; // ebx@5
-  //double v15; // st7@5
-  //RenderVertexSoft *pLightmapVertices; // edx@5
   double v17; // st7@5
-  //double v18; // st7@5
-  //char *v19; // eax@5
-  //double v20; // st6@5
-  //double v21; // st5@5
-  //signed int v22; // ecx@5
-  //double v23; // st5@5
   double v24; // st7@6
-  //int v25; // ebx@8
-  //double v26; // st7@8
-  //int v27; // eax@8
-  //double v28; // st6@8
-  //double v29; // st6@8
-  //double v30; // st5@8
   int v31; // eax@8
   int v32; // ebx@8
   unsigned int v33; // ecx@8
@@ -150,61 +132,22 @@
   double v38; // st7@14
   double v39; // st7@16
   double v40; // st7@16
-  //double v41; // st7@22
-  //stru9 *v42; // ecx@22
-  //char result; // al@22
-  //unsigned int *v44; // ebx@23
   int v45; // eax@24
-  //RenderVertexSoft *v46; // edi@27
-  //std::string *v47; // ecx@34
-  //char *v48; // esi@39
-  //int v49; // eax@39
-  //unsigned __int8 v50; // sf@39
-  //unsigned __int8 v51; // of@39
-  //const char *v52; // [sp-Ch] [bp-58h]@34
   int v53; // [sp-8h] [bp-54h]@34
-  //std::string v54; // [sp-4h] [bp-50h]@19
-  //float v55; // [sp+0h] [bp-4Ch]@22
-  //float v56; // [sp+4h] [bp-48h]@22
-  //int v57; // [sp+8h] [bp-44h]@22
-  //unsigned int v58; // [sp+Ch] [bp-40h]@16
-  //void *v59; // [sp+10h] [bp-3Ch]@16
-  //float v60; // [sp+20h] [bp-2Ch]@8
-  //float v61; // [sp+24h] [bp-28h]@8
-  //float v62; // [sp+28h] [bp-24h]@8
-  //Vec3_float_ a1; // [sp+2Ch] [bp-20h]@8
-  //double v64; // [sp+38h] [bp-14h]@8
-  //int pLightmapVertices_; // [sp+40h] [bp-Ch]@5
-  //float v66; // [sp+44h] [bp-8h]@5
-  //char v67; // [sp+4Bh] [bp-1h]@2
-  //float arg0b; // [sp+54h] [bp+8h]@8
-  //int arg0c; // [sp+54h] [bp+8h]@8
-  //int arg0a; // [sp+54h] [bp+8h]@8
 
-  //auto a4 = radius;
-  //auto a5 = dot_dist;
-
-  //v10 = this;
   if (fabsf(radius) < 1e-6f)
     return true;
 
-  //v67 = uLightType & 1;
   v11 = uLightType & 1 ? &std__vector_000004[std__vector_000004_size] :
                          &std__vector_183808[std__vector_183808_size];
-  //v12 = radius - dot_dist;
   flt_3C8C24 = radius - dot_dist;
-  //v13 = sqrt((radius + dot_dist) * (radius - dot_dist));
   flt_3C8C28 = sqrt((radius + dot_dist) * (radius - dot_dist));
-  //v14 = a7;
-  //v66 = 1.0 / radius;
   flt_3C8C2C_lightmaps_brightness = 1.0 - (radius - flt_3C8C28) / radius;
   v11->field_C08 = (double)pos->x - dot_dist * a7->field_4.x;
   v11->field_C0A = (double)pos->y - dot_dist * a7->field_4.y;
   v11->field_C0C = (double)pos->z - dot_dist * a7->field_4.z;
-  //v15 = a4;
-  //pLightmapVertices = v11->pVertices;
+
   v17 = radius * flt_3C8C2C_lightmaps_brightness;
-  //pLightmapVertices_ = (int)v11->pVertices;
   flt_3C8C30 = v17;
   flt_3C8C0C = v17 * a7->field_10.x;
   flt_3C8C10 = v17 * a7->field_10.y;
@@ -212,17 +155,6 @@
   flt_3C8C18 = v17 * a7->field_1C.x;
   flt_3C8C1C = v17 * a7->field_1C.y;
   flt_3C8C20 = v17 * a7->field_1C.z;
-  //LODWORD(a5) = v11->field_C08;
-  //v18 = (double)SLODWORD(a5);
-  //LODWORD(a5) = v11->field_C0A;
-  //v19 = (char *)&v11->pVertices[0].vWorldPosition.y;
-  //v20 = (double)SLODWORD(a5);
-  //v21 = v11->field_C0A - flt_3C8C1C;
-  //LODWORD(a5) = v11->field_C0C;
-  //v22 = 4;
-  //v23 = (double)SLODWORD(a5);
-  //a5 = v23;
-
 
   /*
   v11->pVertices[0].vWorldPosition.x = v11->field_C08 - flt_3C8C18 + flt_3C8C0C;
@@ -249,7 +181,7 @@
   v11->pVertices[3].u = 1.0;
   v11->pVertices[3].v = 0.0;
   */
-  //v19 = (char *)&v11->pVertices[0].vWorldPosition.y;
+
   for (uint i = 0; i < 4; ++i)
   {
     v11->pVertices[i].vWorldPosition.x = v11->field_C08 - flt_3C8C18 + flt_3C8C0C;
@@ -266,10 +198,7 @@
     v11->pVertices[i].vWorldPosition.x -= v24 * a7->field_4.x;
     v11->pVertices[i].vWorldPosition.y -= v24 * a7->field_4.y;
     v11->pVertices[i].vWorldPosition.z -= v24 * a7->field_4.z;
-    //v19 += 48;
-    //--v22;
   }
-  //while ( v22 );
 
   v11->uColorMask = uColorMask;
   v11->uNumVertices = 4;
@@ -278,42 +207,12 @@
     v11->fBrightness = flt_3C8C2C_lightmaps_brightness;
   else
   {
-    //LODWORD(a5) = v11->field_C0C;
-    //v25 = pos;
-    //v26 = v11->field_C0C;
-    //LODWORD(a5) = v11->field_C0A;
-    //v27 = v11->field_C08;
-    //a5 = v11->field_C0A;
-    //uColorMask = v27;
-    //v28 = (double)v27;
-    //v61 = a5;
-    //v60 = v27;
-    //v62 = v26;
-    //*(float *)&uColorMask = (double)pos->z;
-    //arg0b = (double)pos->y;
-    //v29 = (double)pos->x - v11->field_C08;
-    //v30 = (double)pos->y - v11->field_C0A;
-    //a5 = (double)pos->z - v11->field_C0C;
     Vec3_float_ a1; // [sp+2Ch] [bp-20h]@8
     a1.x = (double)pos->x - v11->field_C08;
     a1.y = (double)pos->y - v11->field_C0A;
     a1.z = (double)pos->z - v11->field_C0C;
     a1.Normalize();
-    //v64 = v62 + 6.7553994e15;
-    //LODWORD(a5) = LODWORD(v64);
-    //LODWORD(a5) = floorf(v11->field_C0C + 0.5f);
-    //v64 = v61 + 6.7553994e15;
-    //arg0c = LODWORD(v64);
-    //arg0c = floorf(v11->field_C0A + 0.5f);
-    //v64 = v60 + 6.7553994e15;
-    //arg8 = LODWORD(v64);
-    //uColorMask = floorf(v11->field_C08 + 0.5f);
-    //auto _v64 /*HIDWORD(v64)*/ = abs(pos->z - v11->field_C0C);
-    //arg0a = abs(pos->y - v11->field_C0A);
-    //v31 = abs(pos->x - v11->field_C08);
-    //LODWORD(a5) = v31;
-    //v32 = arg0a;
-    //v33 = _v64;//HIDWORD(v64);
+
     auto dist_x = abs(pos->x - v11->field_C08), //v31
          dist_y = abs(pos->y - v11->field_C0A), //v32  arg0a
          dist_z = abs(pos->z - v11->field_C0C); //v33  _v64
@@ -363,31 +262,20 @@
     {
         MessageBoxW(nullptr, L"Invalid light type!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Light.cpp:277", 0);
     }
-    //v14 = a7;
-    //pLightmapVertices = (RenderVertexSoft *)pLightmapVertices_;
   }
 
-
-  //v41 = a7->field_4.z;
-  //v42 = pGame->pStru9Instance;
-  //v59 = &v11->uNumVertices;
-  //v58 = (unsigned int)pLightmapVertices;
-  //*(float *)&v57 = v41;
-  //v56 = a7->field_4.y;
-  //v55 = a7->field_4.x;
-  //result = v42->_4980B9(a9, a2, v55, v56, *(float *)&v57, pLightmapVertices, &v11->uNumVertices);
-  if (pGame->pStru9Instance->_4980B9(a9, a2,
-                                     a7->field_4.x, a7->field_4.y, a7->field_4.z,
-                                     v11->pVertices, &v11->uNumVertices))
+  if (!pGame->pStru9Instance->_4980B9(a9, uNumVertices,
+                                      a7->field_4.x, a7->field_4.y, a7->field_4.z,
+                                      v11->pVertices, &v11->uNumVertices))
     return false;
 
   //v44 = &v11->uNumVertices;
   if (!v11->uNumVertices)
     return true;
 
-  v45 = _45C6D6(a2, a9, v11);
-  if ( v45 != a2 && v45 > 0 )
-    _45C4B9(a2, a9, v11);
+  v45 = _45C6D6(uNumVertices, a9, v11);
+  if ( v45 != uNumVertices && v45 > 0 )
+    _45C4B9(uNumVertices, a9, v11);
   //v59 = v11->uNumVertices;
   //v46 = (RenderVertexSoft *)pLightmapVertices_;
   pGame->pIndoorCameraD3D->ViewTransform(v11->pVertices, v11->uNumVertices);
--- a/LightmapBuilder.h	Fri Oct 26 03:43:05 2012 +0200
+++ b/LightmapBuilder.h	Sat Oct 27 19:23:06 2012 +0200
@@ -53,7 +53,7 @@
   bool ApplyLights_IndoorFace(unsigned int uFaceID);
   int _45C6D6(int a2, struct RenderVertexSoft *a3, Lightmap *pLightmap);
   int _45C4B9(int a2, struct RenderVertexSoft *a3, Lightmap *pLightmap);
-  bool _45BE86_build_light_polygon(Vec3_int_ *pos, float radius, unsigned int uColorMask, float dot_dist, int uLightType, struct stru314 *a7, signed int a2, RenderVertexSoft *a9, char uClipFlag);
+  bool _45BE86_build_light_polygon(Vec3_int_ *pos, float radius, unsigned int uColorMask, float dot_dist, int uLightType, struct stru314 *a7, unsigned int uNumVertices, RenderVertexSoft *a9, char uClipFlag);
   bool ApplyLights(struct stru320 *a2, struct stru154 *a3, unsigned int uNumVertices, struct RenderVertexSoft *a5, struct IndoorCameraD3D_Vec4 *, char uClipFlag);
 
 
--- a/Render.cpp	Fri Oct 26 03:43:05 2012 +0200
+++ b/Render.cpp	Sat Oct 27 19:23:06 2012 +0200
@@ -4129,61 +4129,42 @@
 //----- (0049E4FC) --------------------------------------------------------
 void RenderD3D::ClearTarget(unsigned int bClearColor, unsigned int uClearColor, unsigned int bClearDepth, float z_clear)
 {
-  unsigned int flags; // esi@1
-  IDirect3DViewport3 *v6; // eax@6
-  D3DRECT v7; // [sp+Ch] [bp-10h]@6
-
-  flags = 0;
-  if ( bClearColor )
-    flags = 1;                                  // D3DRMCLEAR_TARGET
-  if ( bClearDepth )
-    flags |= 2u;                                // D3DRMCLEAR_ZBUFFER
-  if ( flags )
-  {
-    v6 = this->pViewport;
-    v7.x1 = 0;
-    v7.y1 = 0;
-    v7.x2 = 640;
-    v7.y2 = 480;                                // BUG
-    v6->Clear2(
-      1,
-      &v7,
-      flags,
-      uClearColor,
-      LODWORD(z_clear),
-      0);
-  }
+  uint uClearFlags = 0;
+
+  if (bClearColor)
+    uClearFlags |= D3DCLEAR_TARGET;
+  if (bClearDepth)
+    uClearFlags |= D3DCLEAR_ZBUFFER;
+  
+  D3DRECT rects[] = {{0, 0, 640, 480}};
+  if (uClearFlags)
+    pViewport->Clear2(1, rects, uClearFlags, uClearColor, z_clear, 0);
 }
 
 
 //----- (0049E54D) --------------------------------------------------------
 void RenderD3D::Present(bool bForceBlit)
 {
-  RenderD3D *v2; // esi@1
-  char bFullscreen; // zf@1
-  struct tagRECT Rect; // [sp+8h] [bp-28h]@4
   RECT v5; // [sp+18h] [bp-18h]@1
   struct tagPOINT Point; // [sp+28h] [bp-8h]@4
 
-  v2 = this;
   v5.left = 0;
   v5.top = 0;
-  bFullscreen = this->bWindowed == 0;
   v5.bottom = 480;
   v5.right = 640;
-  if ( !bFullscreen || bForceBlit )
-  {
-    GetClientRect(this->hWindow, &Rect);
+
+  if (bWindowed || bForceBlit)
+  {
+    RECT rc;
+    GetClientRect(hWindow, &rc);
     Point.y = 0;
     Point.x = 0;
-    ClientToScreen(v2->hWindow, &Point);
-    OffsetRect(&Rect, Point.x, Point.y);
-    v2->pFrontBuffer->Blt(&Rect, v2->pBackBuffer, &v5, DDBLT_WAIT, 0);
+    ClientToScreen(hWindow, &Point);
+    OffsetRect(&rc, Point.x, Point.y);
+    pFrontBuffer->Blt(&rc, pBackBuffer, &v5, DDBLT_WAIT, 0);
   }
   else
-  {
-    this->pFrontBuffer->Flip(0, 1u);
-  }
+    pFrontBuffer->Flip(0, 1);
 }
 
 
@@ -4692,20 +4673,13 @@
 //----- (0049ECC4) --------------------------------------------------------
 void Render::ClearBlack()
 {
-  Render *v1; // eax@1
-  RenderD3D *v2; // ecx@1
-
-  v1 = this;
-  v2 = this->pRenderD3D;
-  if ( v2 )
-  {
-    if ( v1->field_40110 )
-      pRenderD3D->ClearTarget(1u, 0, 0, 0.0);
+  if (pRenderD3D)
+  {
+    if (field_40110)
+      pRenderD3D->ClearTarget(true, 0, false, 0.0);
   }
   else
-  {
-    memset(pRenderer->pTargetSurface, 0, 4 * (v1->field_10 * v1->field_14 >> 1));
-  }
+    memset(pRenderer->pTargetSurface, 0, 4 * (field_10 * field_14 / 2));
 }
 
 
@@ -4718,7 +4692,8 @@
   RECT x; // [sp+68h] [bp-10h]@3
 
   memset(&v3, 0, sizeof(DDBLTFX));
-  if ( pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || pVersion->pVersionInfo.dwMajorVersion != 4 )
+  if (pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT ||
+      pVersion->pVersionInfo.dwMajorVersion >= 5)
   {
     x.left = uWindowX;
     x.right = uWindowX + uWindowHeight;
@@ -5435,20 +5410,13 @@
 //----- (0049FBCD) --------------------------------------------------------
 void Render::ClearTarget(unsigned int uColor)
 {
-  Render *v2; // eax@1
-  RenderD3D *v3; // ecx@1
-
-  v2 = this;
-  v3 = this->pRenderD3D;
-  if ( v3 )
-  {
-    if ( v2->field_40110 )
-      pRenderD3D->ClearTarget(1u, uColor, 0, 0.0);
+  if (pRenderD3D)
+  {
+    if (field_40110)
+      pRenderD3D->ClearTarget(true, uColor, false, 0.0);
   }
   else
-  {
-    memset32(v2->pTargetSurface, uColor, v2->field_10 * v2->field_14 >> 1);
-  }
+    memset32(pTargetSurface, uColor, field_10 * field_14 / 2);
 }
 
 
@@ -5479,7 +5447,7 @@
       {
         if (pAsyncMouse)
           pAsyncMouse->_46BAEC();
-        pRenderD3D->Present(0);
+        pRenderD3D->Present(false);
         if (pAsyncMouse)
           pAsyncMouse->_46BB0A();
       }
@@ -7113,12 +7081,12 @@
   {
     if (pRenderD3D)
     {
-      pRenderD3D->ClearTarget(1u, 0, 1u, 1.0);
+      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 (!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();
@@ -7323,7 +7291,7 @@
         ErrD3D(pRenderD3D->pDevice->SetTexture(0, a5));
         ErrD3D(pRenderD3D->pDevice->DrawPrimitive(
           D3DPT_TRIANGLEFAN,
-          452,
+          D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
           arary_77E5C8,
           uNumVertices,
           16));
@@ -7383,7 +7351,7 @@
         ErrD3D(pRenderD3D->pDevice->SetTexture(0, 0));
         ErrD3D(pRenderD3D->pDevice->DrawPrimitive(
                 D3DPT_TRIANGLEFAN,
-                452,
+                D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
                 arary_77E5C8,
                 uNumVertices,
                 16));
@@ -7414,7 +7382,7 @@
         ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, 3u));
         ErrD3D(pRenderD3D->pDevice->DrawPrimitive(
                 D3DPT_TRIANGLEFAN,
-                452,
+                D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
                 arary_77E5C8,
                 uNumVertices,
                 16));
@@ -7441,7 +7409,7 @@
           ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, 5u));
           ErrD3D(pRenderD3D->pDevice->DrawPrimitive(
                   D3DPT_TRIANGLEFAN,
-                  452,
+                  D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
                   arary_77E5C8,
                   uNumVertices,
                   16));
@@ -7525,7 +7493,7 @@
     ErrD3D(pRenderD3D->pDevice->SetTexture(0, a4));
     ErrD3D(pRenderD3D->pDevice->DrawPrimitive(
       D3DPT_TRIANGLEFAN,
-      452,
+      D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
       arary_77E5C8,
       uNumVertices,
       24));
@@ -7581,7 +7549,7 @@
       ErrD3D(pRenderD3D->pDevice->SetTexture(0, pHwTex));
       ErrD3D(pRenderD3D->pDevice->DrawPrimitive(
         D3DPT_TRIANGLEFAN,
-        452,
+        D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
         arary_77E5C8,
         a2,
         28));
@@ -7592,81 +7560,66 @@
 
 
 //----- (004A2FC0) --------------------------------------------------------
-void Render::DrawIndoorPolygon(unsigned int uNumVertices, BLVFace *a3, IDirect3DTexture2 *pHwTex, Texture *pTex, int a6, int a7, int a8)
-{
-  Render *v8; // edi@1
-  unsigned int v9; // esi@3
-  HRESULT v10; // eax@8
-  HRESULT v11; // eax@8
+void Render::DrawIndoorPolygon(unsigned int uNumVertices, BLVFace *pFace, IDirect3DTexture2 *pHwTex, Texture *pTex, int uPackedID, unsigned int uColor, int a8)
+{
+  //Render *v8; // edi@1
+  //unsigned int v9; // esi@3
   char *v12; // ecx@9
   char *v13; // eax@9
   double v14; // st6@10
   int v15; // edx@10
   Texture *v16; // edx@10
   double v17; // st6@10
-  char v18; // zf@10
+  //char v18; // zf@10
   Texture *v19; // edx@10
-  HRESULT v20; // eax@11
-  HRESULT v21; // eax@11
-  HRESULT v22; // eax@11
   Texture *v23; // edx@16
   char *v24; // ecx@16
   char *v25; // eax@16
   double v26; // st6@17
   int v27; // esi@17
   double v28; // st6@17
-  HRESULT v29; // eax@18
-  HRESULT v30; // eax@18
-  HRESULT v31; // eax@18
-  HRESULT v32; // eax@18
   unsigned int v33; // ecx@18
   char *v34; // eax@19
-  HRESULT v35; // eax@21
-  HRESULT v36; // eax@21
-  HRESULT v37; // eax@21
-  HRESULT v38; // eax@21
-  HRESULT v39; // eax@21
-  HRESULT v40; // eax@21
-  HRESULT v41; // eax@21
-  HRESULT v42; // eax@21
-  HRESULT v43; // eax@21
-  HRESULT v44; // eax@21
-  Texture *v45; // edx@23
-  char *v46; // ecx@23
-  char *v47; // eax@23
-  double v48; // st6@24
-  int v49; // esi@24
-  double v50; // st6@24
-  HRESULT v51; // eax@25
-  HRESULT v52; // eax@25
+  //Texture *v45; // edx@23
+  //char *v46; // ecx@23
+  //char *v47; // eax@23
+  //double v48; // st6@24
+  //int v49; // esi@24
+  //double v50; // st6@24
   const char *v53; // [sp-Ch] [bp-20h]@21
-  int v54; // [sp-8h] [bp-1Ch]@21
-  unsigned int v55; // [sp-4h] [bp-18h]@21
+  //int v54; // [sp-8h] [bp-1Ch]@21
+  //unsigned int v55; // [sp-4h] [bp-18h]@21
   const char *v56; // [sp+0h] [bp-14h]@0
   int v57; // [sp+4h] [bp-10h]@0
   unsigned int v58; // [sp+8h] [bp-Ch]@0
-  LightmapBuilder *v59; // [sp+Ch] [bp-8h]@3
-  int a3a; // [sp+10h] [bp-4h]@4
-
-  v8 = this;
-  if ( this->uNumD3DSceneBegins && (signed int)uNumVertices >= 3 )
-  {
-    v59 = pGame->pLightmapBuilder;
-    v9 = v59->std__vector_000004_size;
-    if ( v9 )
-      a3a = -1;
-    else
-      a3a = a7;
-    pGame->_44EDE4(a3, &a3a);
-    if ( byte_4D864C && pGame->uFlags & 1 )
-    {
+  //LightmapBuilder *v59; // [sp+Ch] [bp-8h]@3
+  //int a3a; // [sp+10h] [bp-4h]@4
+
+  //v8 = this;
+  if (!uNumD3DSceneBegins || uNumVertices < 3)
+    return;
+
+  //auto a3 = pFace;
+  //auto a6 = uPackedID;
+    //v59 = pGame->pLightmapBuilder;
+    //v9 = v59->std__vector_000004_size;
+
+  auto uCorrectedColor = uColor;
+  if (pGame->pLightmapBuilder->std__vector_000004_size)
+    uCorrectedColor = 0xFFFFFFFF;
+  pGame->AlterGamma(pFace, &uCorrectedColor);
+
+  if (byte_4D864C && pGame->uFlags & 1)
+  {
+      __debugbreak();
       ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, false));
       ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_ADDRESS, 1));
       if ( (signed int)uNumVertices > 0 )
       {
         v12 = (char *)&array_507D30[0].vWorldViewPosition;
         v13 = (char *)&arary_77E5C8[0].pos.y;
-        a7 = uNumVertices;
+        auto a7 = uNumVertices;
+        uint v18;
         do
         {
           v14 = *(float *)v12 * 0.061758894;
@@ -7674,7 +7627,7 @@
           *((int *)v13 + 4) = 0;
           *((int *)v13 - 1) = v15;
           *(int *)v13 = *((int *)v12 + 4);
-          *((int *)v13 + 3) = a3a;
+          *((int *)v13 + 3) = uCorrectedColor;
           v16 = pTex;
           v13 += 32;
           *((float *)v13 - 7) = 1.0 - 1.0 / v14;
@@ -7694,63 +7647,47 @@
       ErrD3D(pRenderD3D->pDevice->SetTexture(0, nullptr));
       ErrD3D(pRenderD3D->pDevice->DrawPrimitive(
               D3DPT_TRIANGLEFAN,
-              452,
+              D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
               arary_77E5C8,
               uNumVertices,
               28));
-      v59->_45D74F_MessWithLight(-1, 0);
-    }
-    else
-    {
-      if ( !v9 || byte_4D864C && pGame->uFlags & 2 )
-      {
-        if ( (signed int)uNumVertices > 0 )
-        {
-          v45 = pTex;
-          v46 = (char *)&array_507D30[0].vWorldViewPosition;
-          v47 = (char *)&arary_77E5C8[0].pos.y;
-          pTex = (Texture *)uNumVertices;
-          do
-          {
-            v48 = *(float *)v46 * 0.061758894;
-            v49 = *((int *)v46 + 3);
-            *((int *)v47 + 4) = 0;
-            *((int *)v47 - 1) = v49;
-            *(int *)v47 = *((int *)v46 + 4);
-            *((int *)v47 + 3) = a3a;
-            v47 += 32;
-            *((float *)v47 - 7) = 1.0 - 1.0 / v48;
-            v50 = 1.0 / *(float *)v46;
-            v46 += 48;
-            v18 = pTex == (Texture *)1;
-            pTex = (Texture *)((char *)pTex - 1);
-            *((float *)v47 - 6) = v50;
-            a7 = v45->uTextureWidth;
-            *((float *)v47 - 3) = *((float *)v46 - 6) / (double)a7;
-            a7 = v45->uTextureHeight;
-            *((float *)v47 - 2) = *((float *)v46 - 5) / (double)a7;
-          }
-          while ( !v18 );
-        }
-        ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_ADDRESS, 1));
-        ErrD3D(pRenderD3D->pDevice->SetTexture(0, pHwTex));
-        v55 = 0;
-        v54 = 1490;
-        ErrD3D(pRenderD3D->pDevice->DrawPrimitive(
-                D3DPT_TRIANGLEFAN,
-                452,
+      pGame->pLightmapBuilder->_45D74F_MessWithLight(-1, 0);
+  }
+  else
+  {
+    if (!pGame->pLightmapBuilder->std__vector_000004_size ||
+        byte_4D864C && pGame->uFlags & 2)
+    {
+      for (uint i = 0; i < uNumVertices; ++i)
+      {
+        arary_77E5C8[i].pos.x = array_507D30[i].vWorldViewProjX;
+        arary_77E5C8[i].pos.y = array_507D30[i].vWorldViewProjY;
+        arary_77E5C8[i].pos.z = 1.0 - 1.0 / (array_507D30[i].vWorldViewPosition.x * 0.061758894);
+        arary_77E5C8[i].rhw = 1.0 / array_507D30[i].vWorldViewPosition.x;
+        arary_77E5C8[i].diffuse = uCorrectedColor;
+        arary_77E5C8[i].specular = 0;
+        arary_77E5C8[i].texcoord.x = array_507D30[i].u / (double)pTex->uTextureWidth;
+        arary_77E5C8[i].texcoord.y = array_507D30[i].v / (double)pTex->uTextureHeight;
+      }
+
+      ErrD3D(pRenderD3D->pDevice->SetTextureStageState(0, D3DTSS_ADDRESS, 1));
+      ErrD3D(pRenderD3D->pDevice->SetTexture(0, pHwTex));
+      ErrD3D(pRenderD3D->pDevice->DrawPrimitive(D3DPT_TRIANGLEFAN,
+                D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
                 arary_77E5C8,
                 uNumVertices,
                 28));
-      }
-      else
-      {
+    }
+    else
+    {
+      __debugbreak();
         if ( (signed int)uNumVertices > 0 )
         {
           v23 = pTex;
           v24 = (char *)&array_507D30[0].vWorldViewPosition;
           v25 = (char *)&arary_77E5C8[0].pos.y;
           pTex = (Texture *)uNumVertices;
+          uint v18;
           do
           {
             v26 = *(float *)v24 * 0.061758894;
@@ -7758,7 +7695,7 @@
             *((int *)v25 + 4) = 0;
             *((int *)v25 - 1) = v27;
             *(int *)v25 = *((int *)v24 + 4);
-            *((int *)v25 + 3) = a7;
+            *((int *)v25 + 3) = uColor;
             v25 += 32;
             *((float *)v25 - 7) = 1.0 - 1.0 / v26;
             v28 = 1.0 / *(float *)v24;
@@ -7766,10 +7703,10 @@
             v18 = pTex == (Texture *)1;
             pTex = (Texture *)((char *)pTex - 1);
             *((float *)v25 - 6) = v28;
-            a3 = (BLVFace *)v23->uTextureWidth;
-            *((float *)v25 - 3) = *((float *)v24 - 6) / (double)(signed int)a3;
-            a3 = (BLVFace *)v23->uTextureHeight;
-            *((float *)v25 - 2) = *((float *)v24 - 5) / (double)(signed int)a3;
+            //a3 = (BLVFace *)v23->uTextureWidth;
+            *((float *)v25 - 3) = *((float *)v24 - 6) / (double)(signed int)v23->uTextureWidth;
+            //a3 = (BLVFace *)v23->uTextureHeight;
+            *((float *)v25 - 2) = *((float *)v24 - 5) / (double)(signed int)v23->uTextureHeight;
           }
           while ( !v18 );
         }
@@ -7778,19 +7715,19 @@
         ErrD3D(pRenderD3D->pDevice->SetTexture(0, nullptr));
         ErrD3D(pRenderD3D->pDevice->DrawPrimitive(
                 D3DPT_TRIANGLEFAN,
-                452,
+                D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
                 arary_77E5C8,
                 uNumVertices,
                 28));
         ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, 1));
-        v59->_45D74F_MessWithLight(-1, 0);
+        pGame->pLightmapBuilder->_45D74F_MessWithLight(-1, 0);
         v33 = uNumVertices;
         if ( (signed int)uNumVertices > 0 )
         {
           v34 = (char *)&arary_77E5C8[0].diffuse;
           do
           {
-            *(int *)v34 = a3a;
+            *(int *)v34 = uCorrectedColor;
             v34 += 32;
             --v33;
           }
@@ -7804,14 +7741,13 @@
         ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, 3));
         ErrD3D(pRenderD3D->pDevice->DrawPrimitive(
                 D3DPT_TRIANGLEFAN,
-                452,
+                D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
                 arary_77E5C8,
                 uNumVertices,
                 28));
         ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, 2));
         ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, 1));
         ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, false));
-      }
     }
   }
 }
@@ -8614,7 +8550,7 @@
   ErrD3D(pRenderer->pRenderD3D->pDevice->SetTexture(0, a9));
   ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(
     D3DPT_TRIANGLEFAN,
-    452,
+    D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
     v29,
     4,
     24));
@@ -9092,7 +9028,7 @@
     ErrD3D(pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZFUNC, 8u));
     ErrD3D(pRenderD3D->pDevice->DrawPrimitive(
       D3DPT_TRIANGLEFAN,
-      452,
+      D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
       v36,
       4,
       28));
--- a/Render.h	Fri Oct 26 03:43:05 2012 +0200
+++ b/Render.h	Sat Oct 27 19:23:06 2012 +0200
@@ -311,7 +311,7 @@
   void DrawTerrainPolygon(unsigned int uNumVertices, stru148 *a4, IDirect3DTexture2 *a5, int a6, int a7);
   void DrawFan(unsigned int uNumVertices, stru148 *a3, IDirect3DTexture2 *a4);
   void _4A2ED5(signed int a2, stru148 *a3, IDirect3DTexture2 *pHwTex);
-  void DrawIndoorPolygon(unsigned int uNumVertices, struct BLVFace *a3, IDirect3DTexture2 *pHwTex, Texture *pTex, int a6, int a7, int a8);
+  void DrawIndoorPolygon(unsigned int uNumVertices, struct BLVFace *a3, IDirect3DTexture2 *pHwTex, Texture *pTex, int uPackedID, unsigned int uColor, int a8);
   void MakeParticleBillboardAndPush_BLV(RenderBillboardTransform_local0 *a2, IDirect3DTexture2 *a3, unsigned int uDiffuse, int angle);
   void MakeParticleBillboardAndPush_ODM(RenderBillboardTransform_local0 *a2, IDirect3DTexture2 *a3, unsigned int uDiffuse, int angle);
   void TransformBillboard(RenderBillboardTransform_local0 *a2, Sprite *pSprite, int a1a, RenderBillboard *pBillboard);
--- a/mm7_2.cpp	Fri Oct 26 03:43:05 2012 +0200
+++ b/mm7_2.cpp	Sat Oct 27 19:23:06 2012 +0200
@@ -13850,7 +13850,6 @@
     ClipCursor(nullptr);
     pRenderer->SwitchToWindow(hWnd);
   }
-  pRenderer->Present();
 
   uSoundVolumeMultiplier = ReadWindowsRegistryInt("soundflag", 9);
   if (uSoundVolumeMultiplier > 9)
--- a/mm7_3.cpp	Fri Oct 26 03:43:05 2012 +0200
+++ b/mm7_3.cpp	Sat Oct 27 19:23:06 2012 +0200
@@ -7909,7 +7909,7 @@
 
 
 //----- (00479A53) --------------------------------------------------------
-void __fastcall sub_479A53(unsigned int uNumVertices, unsigned int uFaceID)
+void __fastcall _479A53_draw_some_blv_poly(unsigned int uNumVertices, unsigned int uFaceID)
 {
   BLVFace *pFace; // esi@1
   unsigned int v3; // edi@1
@@ -7992,6 +7992,8 @@
   float v80; // [sp+16Ch] [bp-8h]@3
   const void *v81; // [sp+170h] [bp-4h]@7
 
+  __debugbreak();
+
   pFace = &pIndoor->pFaces[uFaceID];
   v65 = uFaceID;
   v3 = uNumVertices;
--- a/mm7_4.cpp	Fri Oct 26 03:43:05 2012 +0200
+++ b/mm7_4.cpp	Sat Oct 27 19:23:06 2012 +0200
@@ -2813,47 +2813,26 @@
 
 
 //----- (0048A959) --------------------------------------------------------
-unsigned int sub_48A959(int _this, float a2, float a3, float a4)
-{
-  int v4; // esi@1
-  double v5; // st6@1
-  double v6; // st6@1
-  __int64 v8; // [sp+14h] [bp-20h]@1
-  double v9; // [sp+1Ch] [bp-18h]@1
-  int a6; // [sp+24h] [bp-10h]@1
-  float v11; // [sp+28h] [bp-Ch]@1
-  float v12; // [sp+2Ch] [bp-8h]@1
-  float a1; // [sp+30h] [bp-4h]@1
-  float a2a; // [sp+3Ch] [bp+8h]@7
-  float a2b; // [sp+3Ch] [bp+8h]@7
-  float a2c; // [sp+3Ch] [bp+8h]@7
-  int a3a; // [sp+40h] [bp+Ch]@7
-
-  v4 = _this;
-  v8 = ((unsigned int)_this >> 16) & 0xFFi64;
-  v5 = (double)v8 * 0.0039215689;
-  v8 = (unsigned __int16)_this >> 8;
-  a1 = v5;
-  v6 = (double)v8;
-  v8 = _this & 0xFFi64;
-  v12 = v6 * 0.0039215689;
-  v11 = (double)v8 * 0.0039215689;
-  RGB2HSV((float *)&v8 + 1, (float *)&v9 + 1, a1, v12, v11, (float *)&a6);
-  if ( a2 != -1.0 )
-    HIDWORD(v8) = LODWORD(a2);
-  if ( a3 != -1.0 )
-    HIDWORD(v9) = LODWORD(a3);
-  if ( a4 != -1.0 )
-    a6 = LODWORD(a4);
-  HSV2RGB(&a1, &v12, &v11, *((float *)&v8 + 1), *((float *)&v9 + 1), *(float *)&a6);
-  a2a = a1 * 255.0;
-  *(double *)&v8 = a2a + 6.7553994e15;
-  a3a = v8;
-  a2b = v12 * 255.0;
-  *(double *)&v8 = a2b + 6.7553994e15;
-  a2c = v11 * 255.0;
-  v9 = a2c + 6.7553994e15;
-  return LODWORD(v9) | v4 & 0xFF000000 | (((unsigned int)v8 | (a3a << 8)) << 8);
+unsigned int ReplaceHSV(unsigned int uColor, float h_replace, float s_replace, float v_replace)
+{
+  float r = ((uColor & 0x00FF0000) >> 16) / 255.0f,
+        g = ((uColor & 0x0000FF00) >> 8) / 255.0f,
+        b = (uColor & 0x000000FF) / 255.0f;
+
+  float h, s, v;
+  RGB2HSV(&h, &s, r, g, b, &v);
+
+  if ( h_replace != -1.0 )
+    h = h_replace;
+  if ( s_replace != -1.0 )
+    s = s_replace;
+  if ( v_replace != -1.0 )
+    v = v_replace;
+  HSV2RGB(&r, &g, &b, h, s, v);
+
+  return (((uint)floorf(r * 255.0f + 0.5f) & 0xFF) << 16) |
+         (((uint)floorf(g * 255.0f + 0.5f) & 0xFF) << 8) |
+         ((uint)floorf(b * 255.0f + 0.5f) & 0xFF);
 }
 
 
@@ -5454,8 +5433,8 @@
   //if (uPlayerCreationUI_ArrowAnim < 0)
   //  uPlayerCreationUI_ArrowAnim = 18;
 
-  v6 = LOBYTE(pFontCreate->uFontHeight) - 2;
-  v128 = LOBYTE(pFontCreate->uFontHeight) - 2;
+  v6 = pFontCreate->uFontHeight - 2;
+  v128 = pFontCreate->uFontHeight - 2;
   strcpy(Str1, pGlobalTXT_LocalizationStrings[205]);// "Skills"
   uNumLet = strlen(Str1) - 1;
   v134 = uNumLet;
@@ -7300,12 +7279,12 @@
         v2 = Dst.lpSurface;
 
 
-        for (uint y = 0; y < 480; ++y)
+        /*for (uint y = 0; y < 480; ++y)
         {
           auto pDst = (unsigned short *)((char *)Dst.lpSurface + y * Dst.lPitch);
           for (uint x = 0; x < 640; ++x)
             pDst[x] = pRenderer->uTargetRMask | pRenderer->uTargetBMask;
-        }
+        }*/
         
         auto pSrc = pRenderer->pTargetSurface;
         auto pDst = (__int16 *)Dst.lpSurface;
@@ -7344,9 +7323,16 @@
         v13 = v24;
 
         for (uint y = pViewport->uViewportY; y < pViewport->uViewportW; ++y)
-          memcpy(pDst + pViewport->uViewportX + y * Dst.lPitch / 2,
-                 pSrc + pViewport->uViewportX + y * 640, (pViewport->uViewportZ - pViewport->uViewportX) * sizeof(__int16));
-        
+        {
+          //memcpy(pDst + pViewport->uViewportX + y * Dst.lPitch / 2,
+          //       pSrc + pViewport->uViewportX + y * 640, (pViewport->uViewportZ - pViewport->uViewportX) * sizeof(__int16));
+          for (uint x = pViewport->uViewportX; x < pViewport->uViewportZ; ++x)
+          {
+            if (pSrc[y * 640 + x] != (pRenderer->uTargetGMask | pRenderer->uTargetBMask))
+              pDst[y * Dst.lPitch / 2 + x] = pSrc[y * 640 + x];
+          }
+        }
+
               ErrD3D(pRenderer->pBackBuffer4->Unlock(0));
 
        /* while ( 1 )
--- a/mm7_data.cpp	Fri Oct 26 03:43:05 2012 +0200
+++ b/mm7_data.cpp	Sat Oct 27 19:23:06 2012 +0200
@@ -561,7 +561,7 @@
 char aButtexi1[777]; // idb
 char aCanTJumpToThat[777]; // idb
 char aNoMapFoundForS[777]; // idb
-char a2[777]; // idb
+char global_a2[777]; // idb
 char aSSS[777]; // idb
 char aNotInMapStats[17]; // weak
 char aD47_blv[777]; // idb
@@ -2548,5 +2548,4 @@
 
 //int crt_F94004; // weak
 //int crtdword_F9400C; // weak
-FARPROC lpfn; // idb
-float flt_F942B0; // weak
\ No newline at end of file
+FARPROC lpfn; // idb
\ No newline at end of file
--- a/mm7_data.h	Fri Oct 26 03:43:05 2012 +0200
+++ b/mm7_data.h	Sat Oct 27 19:23:06 2012 +0200
@@ -547,7 +547,7 @@
 extern char aButtexi1[]; // idb
 extern char aCanTJumpToThat[]; // idb
 extern char aNoMapFoundForS[]; // idb
-extern char a2[]; // idb
+extern char global_a2[]; // idb
 extern char aSSS[]; // idb
 extern char aNotInMapStats[17]; // weak
 extern char aD47_blv[]; // idb
@@ -2505,7 +2505,6 @@
 //extern int crt_F94004; // weak
 //extern int crtdword_F9400C; // weak
 extern FARPROC lpfn; // idb
-extern float flt_F942B0; // weak
 //extern int crt_F944EC; // weak
 //extern int crtdword_F944F0; // weak
 //extern void *crt_F944F4; // idb
@@ -2982,7 +2981,7 @@
 void __cdecl loc_4789D4(); // idb
 void __cdecl loc_47907F(); // idb
 bool __fastcall IsBModelVisible(unsigned int uModelID, int *unused);
-void __fastcall sub_479A53(unsigned int uNumVertices, unsigned int uFaceID); // idb
+void __fastcall _479A53_draw_some_blv_poly(unsigned int uNumVertices, unsigned int uFaceID); // idb
 void __thiscall ODM_LoadAndInitialize(const char *pLevelFilename, struct OutdoorCamera *thisa);
 unsigned __int16 *__fastcall GetBillboardPalette(struct RenderBillboard *a1, int a2, signed int a3, int a4);
 int __fastcall sr_sub_47BEB1(signed int a1, stru148 *a2, int terrain_gamma, int a4, int *a5, int *a6, int a7, int a8);
@@ -3033,7 +3032,7 @@
 int __stdcall loc_489BB3(struct stru320 *a2, int thisa, unsigned int uNumVertices, RenderVertexSoft *a5, float a6, char uClipFlag); // weak
 bool __fastcall HSV2RGB(float *a1, float *a2, float *a3, float a4, float a5, float a6);
 void __fastcall RGB2HSV(float *a1, float *a2, float a3, float a4, float a5, float *a6);
-unsigned int __thiscall sub_48A959(int _this, float a2, float a3, float a4);
+unsigned int ReplaceHSV(unsigned int uColor, float a2, float gamma, float a4);
 int _48B561_mess_with_scaling_along_z(/*int a1, */float a2);
 signed int __cdecl sub_4908DE();
 signed int __cdecl PlayerCreation_ComputeAttributeBonus();
--- a/stru6.cpp	Fri Oct 26 03:43:05 2012 +0200
+++ b/stru6.cpp	Sat Oct 27 19:23:06 2012 +0200
@@ -1565,7 +1565,7 @@
       pRenderer->pRenderD3D->pDevice->SetRenderState(D3DRENDERSTATE_ZFUNC, 8u);
       pRenderer->pRenderD3D->pDevice->DrawPrimitive(
         D3DPT_TRIANGLEFAN,
-        452,
+        D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
         vd3d,
         4,
         28);
--- a/stru9.cpp	Fri Oct 26 03:43:05 2012 +0200
+++ b/stru9.cpp	Sat Oct 27 19:23:06 2012 +0200
@@ -29,6 +29,8 @@
   signed int a3a; // [sp+38h] [bp+10h]@12
   int a3b; // [sp+38h] [bp+10h]@25
 
+  __debugbreak();
+
   thisa = this;
 
   static RenderVertexSoft static_AE3FB4;
@@ -78,11 +80,11 @@
       v11 = *(float *)v8;
       ++v21;
       result = 0;
-      static_AE3FA4.flt_0 = *((float *)v8 - 1);
+      static_AE3FA4.x = *((float *)v8 - 1);
       static_AE33A0.uNumVertices = 0;
       a3a = 0;
-      static_AE3FA4.flt_4 = v11;
-      static_AE3FA4.flt_8 = v10;
+      static_AE3FA4.y = v11;
+      static_AE3FA4.z = v10;
       if ( (signed int)*v7 <= 0 )
         goto LABEL_32;
       do
@@ -99,7 +101,7 @@
           v19 = &pVertices[result];
         }
         v20 = v12;
-        if ( _49895A(v12, a2, &static_AE3FA4) )
+        if ( AreVectorsCollinear(v12, a2, &static_AE3FA4) )
           AddVertex(&static_AE33A0, v12);
         v7 = pOutNumVertices;
         result = a3a++ + 1;
@@ -225,6 +227,7 @@
 //----- (00498737) --------------------------------------------------------
 void stru9::AddVertex(struct VertexBuffer *pVertexBuffer, struct RenderVertexSoft *pVertex)
 {
+  __debugbreak();
   RenderVertexSoft *v3; // eax@1
 
   v3 = &pVertexBuffer->pVertices[pVertexBuffer->uNumVertices];
@@ -250,31 +253,22 @@
   char v14; // c2@24
   char v15; // c3@24
   float a1a; // [sp+10h] [bp+8h]@5
+
+  __debugbreak();
   
   static stru312 static_AE3388;
-  /*if ( !(static_init_flag__AE3388_bit1__AE3378_bit2 & 1) )
-  {
-    static_init_flag__AE3388_bit1__AE3378_bit2 |= 1u;
-    stru312::stru312(&static_AE3388);
-    atexit(nullsub_16);
-  }*/
   static stru312 static_AE3378;
-  /*if ( !(static_init_flag__AE3388_bit1__AE3378_bit2 & 2) )
-  {
-    static_init_flag__AE3388_bit1__AE3378_bit2 |= 2u;
-    stru312::stru312(&static_AE3378);
-    atexit(nullsub_15);
-  }*/
+
   v6 = a1;
-  static_AE3378.flt_0 = a1->vWorldPosition.x - a3->vWorldPosition.x;
-  static_AE3378.flt_4 = a1->vWorldPosition.y - a3->vWorldPosition.y;
+  static_AE3378.x = a1->vWorldPosition.x - a3->vWorldPosition.x;
+  static_AE3378.y = a1->vWorldPosition.y - a3->vWorldPosition.y;
   HIWORD(result) = HIWORD(a4);
-  static_AE3378.flt_8 = a1->vWorldPosition.z - a3->vWorldPosition.z;
-  static_AE3388.flt_0 = a2->vWorldPosition.x - a1->vWorldPosition.x;
-  static_AE3388.flt_4 = a2->vWorldPosition.y - a1->vWorldPosition.y;
-  static_AE3388.flt_8 = a2->vWorldPosition.z - a1->vWorldPosition.z;
-  a1a = static_AE3388.flt_0 * a4->flt_0 + static_AE3388.flt_8 * a4->flt_8 + static_AE3388.flt_4 * a4->flt_4;
-  v8 = static_AE3378.flt_0 * a4->flt_0 + static_AE3378.flt_8 * a4->flt_8 + static_AE3378.flt_4 * a4->flt_4;
+  static_AE3378.z = a1->vWorldPosition.z - a3->vWorldPosition.z;
+  static_AE3388.x = a2->vWorldPosition.x - a1->vWorldPosition.x;
+  static_AE3388.y = a2->vWorldPosition.y - a1->vWorldPosition.y;
+  static_AE3388.z = a2->vWorldPosition.z - a1->vWorldPosition.z;
+  a1a = static_AE3388.x * a4->x + static_AE3388.z * a4->z + static_AE3388.y * a4->y;
+  v8 = static_AE3378.x * a4->x + static_AE3378.z * a4->z + static_AE3378.y * a4->y;
   //UNDEF(v9);
   if ( a1a != 0.0 )
   {
@@ -335,39 +329,18 @@
 // AE3398: using guessed type char static_init_flag__AE3388_bit1__AE3378_bit2;
 
 //----- (0049895A) --------------------------------------------------------
-bool stru9::_49895A(struct RenderVertexSoft *a1, struct RenderVertexSoft *a2, struct stru312 *a3)
+bool stru9::AreVectorsCollinear(struct RenderVertexSoft *a1, struct RenderVertexSoft *a2, struct stru312 *a3)
 {
-  double v4; // st7@3
-  double v5; // st7@3
-  __int16 v6; // fps@3
-  char v7; // c0@3
-  char v8; // c2@3
-  char v9; // c3@3
-  bool result; // eax@3
-  
   static stru312 static_F942A0;
-  /*static bool __init_flag1 = false;
-  if (!__init_flag1)
-  {
-    __init_flag1 = true;
 
-    stru312::stru312(&static_F942A0);
-  }*/
+  static_F942A0.x = a1->vWorldPosition.x - a2->vWorldPosition.x;
+  static_F942A0.y = a1->vWorldPosition.y - a2->vWorldPosition.y;
+  static_F942A0.z = a1->vWorldPosition.z - a2->vWorldPosition.z;
 
-  static_F942A0.flt_0 = a1->vWorldPosition.x - a2->vWorldPosition.x;
-  static_F942A0.flt_4 = a1->vWorldPosition.y - a2->vWorldPosition.y;
-  v4 = a1->vWorldPosition.z - a2->vWorldPosition.z;
-  HIWORD(result) = HIWORD(a3);
-  static_F942A0.flt_8 = v4;
-  v5 = v4 * a3->flt_8 + static_F942A0.flt_4 * a3->flt_4 + static_F942A0.flt_0 * a3->flt_0;
-  //UNDEF(v6);
-  flt_F942B0 = v5;
-  v7 = v5 < 0.0;
-  v8 = 0;
-  v9 = v5 == 0.0;
-  BYTE1(result) = HIBYTE(v6);
-  LOBYTE(result) = v5 >= 0.0;
-  return result;
+  static float flt_F942B4 = static_F942A0.z * a3->z + static_F942A0.y * a3->y + static_F942A0.x * a3->x;
+  if (flt_F942B4 >= 0)
+    return true;
+  return false;
 }
 
 
@@ -377,156 +350,88 @@
   bool r1;
   bool r2;
 
-  r1 = _49895A(a1, a3, a4);
-  r2 = _49895A(a2, a3, a4);
+  r1 = AreVectorsCollinear(a1, a3, a4);
+  r2 = AreVectorsCollinear(a2, a3, a4);
   return !r1 && r2 == 1 ||
          r1 == 1 && !r2;
 }
 
 //----- (004980B9) --------------------------------------------------------
-bool stru9::_4980B9(RenderVertexSoft *a1, signed int a2, float a3, float a4, float a5, RenderVertexSoft *a6, unsigned int *pOutNumVertices)
+bool stru9::_4980B9(RenderVertexSoft *a1, unsigned int uNumVertices, float a3, float a4, float a5, RenderVertexSoft *pOutVertices, unsigned int *pOutNumVertices)
 {
-  bool result; // eax@7
-  unsigned int *v9; // ebx@7
-  char *v10; // edi@8
-  RenderVertexSoft *v11; // esi@9
   RenderVertexSoft *v12; // ecx@9
   double v13; // st7@12
   double v14; // st6@12
   double v15; // st5@12
-  RenderVertexSoft *v16; // edi@13
-  int v17; // ecx@25
-  VertexBuffer *v18; // edx@26
-  char *v19; // eax@26
-  unsigned int i; // ecx@26
-  bool v21; // [sp+0h] [bp-24h]@9
-  char *v22; // [sp+Ch] [bp-18h]@8
-  RenderVertexSoft *a2a; // [sp+10h] [bp-14h]@0
-  RenderVertexSoft *a1a; // [sp+14h] [bp-10h]@0
   signed int v25; // [sp+18h] [bp-Ch]@7
-  signed int v26; // [sp+1Ch] [bp-8h]@12
-  int v27; // [sp+1Ch] [bp-8h]@25
-  stru9 *thisa; // [sp+20h] [bp-4h]@1
-
-  __debugbreak();
-  thisa = this;
 
   static RenderVertexSoft stru_AE4BFC;
-  static bool __init_flag1 = false;
-  if (!__init_flag1)
-  {
-    __init_flag1 = true;
+  static stru312 static_sub_4980B9_stru_AE4BEC; // idb
+  static VertexBuffer static_sub_4980B9_stru_AE3FE8; // idb
 
-    stru_AE4BFC.flt_2C = 0.0;
-  }
-
-  static stru312 static_sub_4980B9_stru_AE4BEC; // idb
-  static bool __init_flag2 = false;
-  if (!__init_flag2)
+  v25 = 0;
+  if (uNumVertices <= 0)
   {
-    __init_flag2 = true;
-
-    //stru312::stru312(&static_sub_4980B9_stru_AE4BEC);
-  }
-  
-  static VertexBuffer static_sub_4980B9_stru_AE3FE8; // idb
-  static bool __init_flag3 = false;
-  if (!__init_flag3)
-  {
-    __init_flag3 = true;
-
-    //VertexBuffer::VertexBuffer(&static_sub_4980B9_stru_AE3FE8);
+    *pOutNumVertices = 0;
+    return true;
   }
 
-  result = 0;
-  v9 = pOutNumVertices;
-  v25 = 0;
-  if ( a2 <= 0 )
-    goto LABEL_32;
-  v10 = (char *)&a1->vWorldPosition.z;
-  v22 = (char *)&a1->vWorldPosition.z;
-  do
+  for (uint i = 0; i < uNumVertices; ++i)
   {
-    v11 = (RenderVertexSoft *)(v10 - 8);
-    v21 = result + 1;
-    v12 = &a1[(result + 1) % a2];
-    if ( *((float *)v10 - 2) != v12->vWorldPosition.x
-      || *((float *)v10 - 1) != v12->vWorldPosition.y
-      || *(float *)v10 != v12->vWorldPosition.z )
+    v12 = &a1[(i + 1) % uNumVertices];
+    if (a1[i].vWorldPosition.x != v12->vWorldPosition.x ||
+        a1[i].vWorldPosition.y != v12->vWorldPosition.y ||
+        a1[i].vWorldPosition.z!= v12->vWorldPosition.z)
     {
-      v13 = v12->vWorldPosition.x - v11->vWorldPosition.x;
-      v14 = v12->vWorldPosition.y - *((float *)v10 - 1);
-      v15 = v12->vWorldPosition.z - *(float *)v10;
+      v13 = v12->vWorldPosition.x - a1[i].vWorldPosition.x;
+      v14 = v12->vWorldPosition.y - a1[i].vWorldPosition.y;
+      v15 = v12->vWorldPosition.z - a1[i].vWorldPosition.z;
       ++v25;
-      result = 0;
+
       static_sub_4980B9_stru_AE3FE8.uNumVertices = 0;
-      v26 = 0;
-      static_sub_4980B9_stru_AE4BEC.flt_0 = a4 * v15 - v14 * a5;
-      static_sub_4980B9_stru_AE4BEC.flt_4 = v13 * a5 - v15 * a3;
-      static_sub_4980B9_stru_AE4BEC.flt_8 = v14 * a3 - v13 * a4;
-      if ( (signed int)*v9 <= 0 )
-        goto LABEL_32;
-      do
+      static_sub_4980B9_stru_AE4BEC.x = a4 * v15 - v14 * a5;
+      static_sub_4980B9_stru_AE4BEC.y = v13 * a5 - v15 * a3;
+      static_sub_4980B9_stru_AE4BEC.z = v14 * a3 - v13 * a4;
+      if (*pOutNumVertices == 0)
+        return true;
+
+      for (uint j = 0; j < *pOutNumVertices; ++j)
       {
-        v16 = &a6[result];
-        if ( result )
+        if (j)
         {
-          if ( _4989E1(a1a, &a6[result], v11, &static_sub_4980B9_stru_AE4BEC)
-            && _498774(a1a, v16, v11, &static_sub_4980B9_stru_AE4BEC, &stru_AE4BFC) )
-            AddVertex(&static_sub_4980B9_stru_AE3FE8, &stru_AE4BFC);
-        }
-        else
-        {
-          a2a = &a6[result];
+          if (_4989E1(&pOutVertices[j - 1], &pOutVertices[j], &a1[i], &static_sub_4980B9_stru_AE4BEC) &&
+              _498774(&pOutVertices[j - 1], &pOutVertices[j], &a1[i], &static_sub_4980B9_stru_AE4BEC, &stru_AE4BFC))
+              AddVertex(&static_sub_4980B9_stru_AE3FE8, &stru_AE4BFC);
         }
-        a1a = v16;
-        if ( _49895A(v16, v11, &static_sub_4980B9_stru_AE4BEC) )
-          AddVertex(&static_sub_4980B9_stru_AE3FE8, v16);
-        v9 = pOutNumVertices;
-        result = v26++ + 1;
+
+        if (AreVectorsCollinear(&pOutVertices[j], &a1[i], &static_sub_4980B9_stru_AE4BEC))
+          AddVertex(&static_sub_4980B9_stru_AE3FE8, &pOutVertices[j]);
       }
-      while ( v26 < (signed int)*pOutNumVertices );
-      if ( !static_sub_4980B9_stru_AE3FE8.uNumVertices )
-        goto LABEL_32;
-      if ( _4989E1(v16, a2a, v11, &static_sub_4980B9_stru_AE4BEC)
-        && _498774(v16, a2a, v11, &static_sub_4980B9_stru_AE4BEC, &stru_AE4BFC) )
-        AddVertex(&static_sub_4980B9_stru_AE3FE8, &stru_AE4BFC);
-      v17 = static_sub_4980B9_stru_AE3FE8.uNumVertices;
-      v27 = 0;
-      if ( static_sub_4980B9_stru_AE3FE8.uNumVertices > 0 )
+
+      if (!static_sub_4980B9_stru_AE3FE8.uNumVertices)
       {
-        v18 = &static_sub_4980B9_stru_AE3FE8;
-        v19 = (char *)&a6->vWorldPosition.y;
-        for ( i = (char *)&static_sub_4980B9_stru_AE3FE8.pVertices[0].flt_20 - (char *)a6;
-              ;
-              i = (char *)&static_sub_4980B9_stru_AE3FE8.pVertices[0].flt_20 - (char *)a6 )
-        {
-          ++v27;
-          *((int *)v19 - 1) = LODWORD(v18->pVertices[0].vWorldPosition.x);
-          v18 = (VertexBuffer *)((char *)v18 + 48);
-          *(float *)v19 = *(float *)&v19[(char *)&static_sub_4980B9_stru_AE3FE8 - (char *)a6];
-          *((float *)v19 + 1) = *(float *)&v19[(char *)&static_sub_4980B9_stru_AE3FE8.pVertices[0].vWorldPosition.y
-                                             - (char *)a6];
-          *((float *)v19 + 8) = *(float *)&v19[i];
-          *((float *)v19 + 9) = *(float *)&v19[(char *)&static_sub_4980B9_stru_AE3FE8.pVertices[0].u - (char *)a6];
-          v17 = static_sub_4980B9_stru_AE3FE8.uNumVertices;
-          v19 += 48;
-          if ( v27 >= static_sub_4980B9_stru_AE3FE8.uNumVertices )
-            break;
-        }
+        *pOutNumVertices = 0;
+        return true;
       }
-      v9 = pOutNumVertices;
-      v10 = v22;
-      *pOutNumVertices = v17;
+      if (_4989E1(&pOutVertices[*pOutNumVertices - 1], &pOutVertices[0], &a1[i], &static_sub_4980B9_stru_AE4BEC) &&
+          _498774(&pOutVertices[*pOutNumVertices - 1], &pOutVertices[0], &a1[i], &static_sub_4980B9_stru_AE4BEC, &stru_AE4BFC) )
+        AddVertex(&static_sub_4980B9_stru_AE3FE8, &stru_AE4BFC);
+
+      for (uint j = 0; j < static_sub_4980B9_stru_AE3FE8.uNumVertices; ++j)
+      {
+          pOutVertices[j].vWorldPosition.y = static_sub_4980B9_stru_AE3FE8.pVertices[j].vWorldPosition.x;
+          pOutVertices[j].vWorldPosition.y = static_sub_4980B9_stru_AE3FE8.pVertices[j].vWorldPosition.y;
+          pOutVertices[j].vWorldPosition.z = static_sub_4980B9_stru_AE3FE8.pVertices[j].vWorldPosition.z;
+          pOutVertices[j].u = static_sub_4980B9_stru_AE3FE8.pVertices[j].u;
+          pOutVertices[j].v = static_sub_4980B9_stru_AE3FE8.pVertices[j].v;
+      }
+      *pOutNumVertices = static_sub_4980B9_stru_AE3FE8.uNumVertices;
     }
-    result = v21;
-    v10 += 48;
-    v22 = v10;
   }
-  while ( v21 < a2 );
-  if ( v25 < 3 )
-LABEL_32:
-    *v9 = 0;
-  return 1;
+
+  if (v25 < 3)
+    *pOutNumVertices = 0;
+
+  return true;
 }
 // AE4C2C: using guessed type char static_sub_4980B9_byte_AE4C2C_init_flag;
\ No newline at end of file
--- a/stru9.h	Fri Oct 26 03:43:05 2012 +0200
+++ b/stru9.h	Sat Oct 27 19:23:06 2012 +0200
@@ -32,10 +32,11 @@
   {
   }
 
-  float flt_0;
-  float flt_4;
-  float flt_8;
+  float x;
+  float y;
+  float z;
   char field_C;
+  char pad[3];
 };
 #pragma pack(pop)
 
@@ -49,12 +50,12 @@
   inline stru9()
   {}
 
-  bool _4980B9(struct RenderVertexSoft *a1, signed int a2, float a3, float a4, float a5, struct RenderVertexSoft *a6, unsigned int *pOutNumVertices);
+  bool _4980B9(struct RenderVertexSoft *a1, unsigned int uNumVertices, float a3, float a4, float a5, struct RenderVertexSoft *pOutVertices, unsigned int *pOutNumVertices);
   bool _498377(struct RenderVertexSoft *a1, unsigned int uNumVertices, struct IndoorCameraD3D_Vec4 *a3, struct RenderVertexSoft *pVertices, unsigned int *pOutNumVertices);
   bool _4985FB(struct RenderVertexSoft *a1, signed int a2, struct RenderVertexSoft *a3, unsigned int *pOutNumVertices, struct Vec3_float_ *a5, float a6, char *a7, int unused);
   void AddVertex(struct VertexBuffer *pVertexBuffer, struct RenderVertexSoft *pVertex);
   bool _498774(struct RenderVertexSoft *a1, struct RenderVertexSoft *a2, struct RenderVertexSoft *a3, struct stru312 *a4, struct RenderVertexSoft *a5);
-  bool _49895A(struct RenderVertexSoft *a1, struct RenderVertexSoft *a2, struct stru312 *a3);
+  bool AreVectorsCollinear(struct RenderVertexSoft *a1, struct RenderVertexSoft *a2, struct stru312 *a3);
   bool _4989E1(struct RenderVertexSoft *a1, struct RenderVertexSoft *a2, struct RenderVertexSoft *a3, struct stru312 *a4);
 
   void (__thiscall ***vdestructor_ptr)(stru9 *, bool);