changeset 676:ecfb1b3c9a39

BLV: when standing right on the portal (orange wall) everything looks fine
author Nomad
date Fri, 15 Mar 2013 04:13:24 +0200
parents 92c1e1250e7c
children 551f74425b17
files Game.cpp Game.h Indoor.cpp Indoor.h IndoorCameraD3D.cpp Indoor_stuff.h Outdoor.h Vis.cpp mm7_1.cpp mm7_2.cpp mm7_3.cpp mm7_4.cpp mm7_5.cpp mm7_data.cpp mm7_data.h stru10.cpp
diffstat 16 files changed, 365 insertions(+), 311 deletions(-) [+]
line wrap: on
line diff
--- a/Game.cpp	Thu Mar 14 23:44:03 2013 +0200
+++ b/Game.cpp	Fri Mar 15 04:13:24 2013 +0200
@@ -631,7 +631,7 @@
   if (!_44F07B())
     return false;
 
-    if ( uFlags & 8 )
+    if ( uFlags & GAME_FLAGS_1_DRAW_BLV_DEBUGS)
       LOBYTE(pStru10Instance->field_4) = 0;
     if ( pRenderer->pRenderD3D && uCurrentlyLoadedLevelType == LEVEL_Outdoor)
     {
--- a/Game.h	Thu Mar 14 23:44:03 2013 +0200
+++ b/Game.h	Fri Mar 15 04:13:24 2013 +0200
@@ -16,6 +16,7 @@
 
 
 
+#define GAME_FLAGS_1_DRAW_BLV_DEBUGS    0x08
 #define GAME_FLAGS_2_SATURATE_LIGHTMAPS 0x02
 #define GAME_FLAGS_2_ALTER_GRAVITY      0x08
 #define GAME_FLAGS_2_TARGETING_MODE     0x10
--- a/Indoor.cpp	Thu Mar 14 23:44:03 2013 +0200
+++ b/Indoor.cpp	Fri Mar 15 04:13:24 2013 +0200
@@ -272,28 +272,28 @@
   if (bD3D)
   {
     pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z);
-    for (uint i = 0; i < pBspRenderer->uNumFaceIDs; ++i)
+    for (uint i = 0; i < pBspRenderer->num_faces; ++i)
     {
-      v2 = pBspRenderer->pFaceIDs[2 * i + 1];
-      if ( pBspRenderer->pSectors[v2].std__vector_0007A8 == -1 )
+      v2 = pBspRenderer->faces[i].uNodeID;
+      if ( pBspRenderer->nodes[v2].std__vector_0007A8 == -1 )
       {
         v6 = 0;
         v3 = 0;
       }
       else
       {
-        v3 = pBspRenderer->pSectors[v2].std__vector_0007AC;
-        v6 = pBspRenderer->pSectors[v2].pVertices;
+        v3 = pBspRenderer->nodes[v2].std__vector_0007AC;
+        v6 = pBspRenderer->nodes[v2].pVertices;
       }
-      IndoorLocation::ExecDraw_d3d(pBspRenderer->pFaceIDs[2 * i], v3, 4, v6);
+      IndoorLocation::ExecDraw_d3d(pBspRenderer->faces[i].uFaceID, v3, 4, v6);
     }
   }
   else
   {
-    for (uint j = 0; j < pBspRenderer->uNumFaceIDs; ++j )
+    for (uint j = 0; j < pBspRenderer->num_faces; ++j )
     {
-      v5 = pBspRenderer->pFaceIDs[2 * j];
-      pBLVRenderParams->field_7C = &pBspRenderer->pSectors[pBspRenderer->pFaceIDs[2 * j + 1]].field_C;
+      v5 = pBspRenderer->faces[j].uFaceID;
+      pBLVRenderParams->field_7C = &pBspRenderer->nodes[pBspRenderer->faces[j].uNodeID].field_C;
       IndoorLocation::ExecDraw_sw(v5);
     }
   }
@@ -314,6 +314,7 @@
   if (pBLVRenderParams->uPartySectorID)
     IndoorLocation::ExecDraw(pRenderer->pRenderD3D != 0);
   pRenderer->DrawBillboardList_BLV();
+
   if ( !pRenderer->pRenderD3D )
   {
     if (pBLVRenderParams->uFlags & INDOOR_CAMERA_DRAW_D3D_OUTLINES)
@@ -322,17 +323,17 @@
     {
       v1 = pBLVRenderParams->pRenderTarget;
       v6 = 0;
-      if ( (signed int)pBspRenderer->pNumSectors > 0 )
+      if ( (signed int)pBspRenderer->num_nodes > 0 )
       {
         v7 = 0;
-        v2 = (char *)&pBspRenderer->pSectors[0].field_C._viewport_space_w;
+        v2 = (char *)&pBspRenderer->nodes[0].field_C._viewport_space_w;
         do
         {
           v3 = *((int *)v2 - 1);
           v4 = pRenderer->uTargetSurfacePitch * *((int *)v2 - 1);
           if ( v3 <= *(int *)v2 )
           {
-            v5 = (char *)&pBspRenderer->pSectors[0].field_C.array_3D8[v3 + v7];
+            v5 = (char *)&pBspRenderer->nodes[0].field_C.array_3D8[v3 + v7];
             do
             {
               v1[v4 + *((short *)v5 - 480)] = 255;
@@ -347,7 +348,7 @@
           v7 += 1126;
           v2 += 2252;
         }
-        while ( v6 < (signed int)pBspRenderer->pNumSectors );
+        while ( v6 < (signed int)pBspRenderer->num_nodes );
       }
     }
   }
@@ -527,7 +528,7 @@
           stru_F7B60C.face_plane.dist = pFace->pFacePlane.dist;
         }
 
-        if (stru_F8AD28.uNumLightsApplied > 0 && !(pFace->uAttributes & 0x400000))
+        if (stru_F8AD28.uNumLightsApplied > 0 && !(pFace->uAttributes & FACE_DO_NOT_LIGHT))
           pGame->pLightmapBuilder->ApplyLights(&stru_F8AD28, &stru_F7B60C, uNumVerticesa, array_507D30, pVertices, 0);
 
         if (pDecalBuilder->uNumDecals > 0)
@@ -564,7 +565,7 @@
           if (pFace->uAttributes & FACE_DO_NOT_LIGHT)
             _479A53_draw_some_blv_poly(uNumVerticesa, uFaceID);
           else
-            pRenderer->DrawIndoorPolygon(uNumVerticesa, pFace, v27, v28, 8 * uFaceID | 6, v17, 0);
+            pRenderer->DrawIndoorPolygon(uNumVerticesa, pFace, v27, v28, 8 * uFaceID | OBJECT_BModel, v17, 0);
           return;
         }
         //v17 = 0xFFFFFFFF;
@@ -1233,7 +1234,7 @@
 }
 
 //----- (004B0EA8) --------------------------------------------------------
-void BspRenderer::AddFaceToRenderList_d3d(int a2, unsigned int uFaceID)
+void BspRenderer::AddFaceToRenderList_d3d(unsigned int node_id, unsigned int uFaceID)
 {
   //unsigned int v3; // edx@1
   //stru170 *v4; // ebx@1
@@ -1242,10 +1243,10 @@
   unsigned __int16 v7; // ax@11
   Vec3_short_ *v8; // esi@15
   int v9; // edx@15
-  signed int v10; // eax@18
-  signed int v11; // edi@19
-  signed int v12; // ecx@19
-  signed int v13; // esi@19
+  //signed int v10; // eax@18
+  //signed int v11; // edi@19
+  //signed int v12; // ecx@19
+  //signed int v13; // esi@19
   signed int v14; // edx@20
   int v15; // edx@24
   //int v16; // esi@29
@@ -1263,33 +1264,41 @@
   //signed int v28; // ST28_4@47
   char v29; // al@48
   signed int v30; // eax@51
-  int v31; // eax@52
+  //int v31; // eax@52
   //unsigned int v32; // eax@55
   //__int16 v33; // cx@56
-  signed int v34; // [sp+Ch] [bp-14h]@18
+  //signed int v34; // [sp+Ch] [bp-14h]@18
   //int a0; // [sp+14h] [bp-Ch]@2
   //IndoorCameraD3D *a0a; // [sp+14h] [bp-Ch]@36
-  signed int v37; // [sp+18h] [bp-8h]@19
+  //signed int v37; // [sp+18h] [bp-8h]@19
   //stru10 *v38; // [sp+18h] [bp-8h]@36
   //BLVFace *v39; // [sp+1Ch] [bp-4h]@1
 
   //v3 = uFaceID;
   //v4 = this;
   //v5 = &pIndoor->pFaces[uFaceID];
-  pSectors[pNumSectors].std__vector_0007A8 = -1;
+  nodes[num_nodes].std__vector_0007A8 = -1;
   //v39 = &pIndoor->pFaces[uFaceID];
 
   auto pFace = &pIndoor->pFaces[uFaceID];
 
-  if (pFace->TwoSided())
+  if (!pFace->Portal())
   {
-    auto p = &pSectors[a2];
+    if (num_faces < 1000)
+    {
+      faces[num_faces].uFaceID = uFaceID;
+      faces[num_faces++].uNodeID = node_id;
+    }
+    return;
+  }
+
+    auto p = &nodes[node_id];
     //v6 = (int)((char *)this + 2252 * a2);
     //a0 = v6;
     if (p->uFaceID == uFaceID)
       return;
-    if (!a2 &&
-        pBLVRenderParams->vPartyPos.x >= pFace->pBounding.x1 - 16 &&
+    if (!node_id &&
+        pBLVRenderParams->vPartyPos.x >= pFace->pBounding.x1 - 16 &&  // we are probably standing at the portal plane
         pBLVRenderParams->vPartyPos.x <= pFace->pBounding.x2 + 16 &&
         pBLVRenderParams->vPartyPos.y >= pFace->pBounding.y1 - 16 &&
         pBLVRenderParams->vPartyPos.y <= pFace->pBounding.y2 + 16 &&
@@ -1298,59 +1307,80 @@
     {
       if ( abs(pFace->pFacePlane_old.dist + pBLVRenderParams->vPartyPos.x * pFace->pFacePlane_old.vNormal.x
                                        + pBLVRenderParams->vPartyPos.y * pFace->pFacePlane_old.vNormal.y
-                                       + pBLVRenderParams->vPartyPos.z * pFace->pFacePlane_old.vNormal.z) <= 589824 )
+                                       + pBLVRenderParams->vPartyPos.z * pFace->pFacePlane_old.vNormal.z) <= 589824 ) // we sure are standing at the portal plane
       {
         v7 = pFace->uSectorID;
-        if ( pSectors[0].uSectorID == v7 )
+        if ( nodes[0].uSectorID == v7 )  // draw back sector
           v7 = pFace->uBackSectorID;
-        pSectors[pNumSectors].uSectorID = v7;
-        pSectors[pNumSectors].uFaceID = uFaceID;
-        pSectors[pNumSectors].uViewportX = pBLVRenderParams->uViewportX;
-        pSectors[pNumSectors].uViewportZ = pBLVRenderParams->uViewportZ;
-        pSectors[pNumSectors].uViewportY = pBLVRenderParams->uViewportY;
-        pSectors[pNumSectors].uViewportW = pBLVRenderParams->uViewportW;
-        pSectors[pNumSectors++].field_C._43F9E1(
-          pBLVRenderParams->uViewportX,
-          pBLVRenderParams->uViewportY,
-          pBLVRenderParams->uViewportZ,
-          pBLVRenderParams->uViewportW);
-        sub_440639(pNumSectors - 1);
+        nodes[num_nodes].uSectorID = v7;
+        nodes[num_nodes].uFaceID = uFaceID;
+        nodes[num_nodes].uViewportX = pBLVRenderParams->uViewportX;
+        nodes[num_nodes].uViewportZ = pBLVRenderParams->uViewportZ;
+        nodes[num_nodes].uViewportY = pBLVRenderParams->uViewportY;
+        nodes[num_nodes].uViewportW = pBLVRenderParams->uViewportW;
+        nodes[num_nodes++].field_C._43F9E1(pBLVRenderParams->uViewportX,
+                                             pBLVRenderParams->uViewportY,
+                                             pBLVRenderParams->uViewportZ,
+                                             pBLVRenderParams->uViewportW);
+        AddBspNodeToRenderList(num_nodes - 1);
         return;
       }
       //v5 = v39;
       //v6 = a0;
     }
+
     v8 = &pIndoor->pVertices[pFace->pVertexIDs[0]];
     v9 = pFace->pFacePlane_old.vNormal.x * (v8->x - pBLVRenderParams->vPartyPos.x)
        + pFace->pFacePlane_old.vNormal.y * (v8->y - pBLVRenderParams->vPartyPos.y)
        + pFace->pFacePlane_old.vNormal.z * (v8->z - pBLVRenderParams->vPartyPos.z);
     if (p->uSectorID != pFace->uSectorID)
       v9 = -v9;
-    if ( v9 < 0 )
+    if (v9 >= 0)
+      return;
+
+    auto num_vertices = sub_423B5D(uFaceID);
+    if (num_vertices < 2)
+      return;
+
+    auto face_min_screenspace_x = _50BAC8_screen_space_x[0],
+         face_max_screenspace_x = _50BAC8_screen_space_x[0];
+    auto face_min_screenspace_y = _50B9D8_screen_space_y[0],
+         face_max_screenspace_y = _50B9D8_screen_space_y[0];
+    for (uint i = 1; i < num_vertices; ++i)
     {
-      v10 = sub_423B5D(uFaceID);
-      v34 = v10;
-      if ( v10 )
-      {
-        v11 = dword_50BAC8[0];
-        v12 = dword_50B9D8_ys[0];
-        a2 = dword_50BAC8[0];
+      if (face_min_screenspace_x > _50BAC8_screen_space_x[i])
+        face_min_screenspace_x = _50BAC8_screen_space_x[i];
+      if (face_max_screenspace_x < _50BAC8_screen_space_x[i])
+        face_max_screenspace_x = _50BAC8_screen_space_x[i];
+
+      if (face_min_screenspace_y > _50B9D8_screen_space_y[i])
+        face_min_screenspace_y = _50B9D8_screen_space_y[i];
+      if (face_max_screenspace_y < _50B9D8_screen_space_y[i])
+        face_max_screenspace_y = _50B9D8_screen_space_y[i];
+    }
+      //v10 = sub_423B5D(uFaceID);
+      //v34 = v10;
+      //if ( v10 )
+      //{
+       /* v11 = _50BAC8_screen_space_x[0];
+        v12 = _50B9D8_screen_space_y[0];
+        a2 = _50BAC8_screen_space_x[0];
         v13 = 1;
-        v37 = dword_50B9D8_ys[0];
+        v37 = _50B9D8_screen_space_y[0];
         if ( v10 > 1 )
         {
           do
           {
-            v14 = dword_50BAC8[v13];
+            v14 = _50BAC8_screen_space_x[v13];
             if ( v14 < a2 )
-              a2 = dword_50BAC8[v13];
+              a2 = _50BAC8_screen_space_x[v13];
             if ( v14 > v11 )
               v11 = v14;
-            v15 = dword_50B9D8_ys[v13];
+            v15 = _50B9D8_screen_space_y[v13];
             if ( v15 < v37 )
-              v37 = dword_50B9D8_ys[v13];
+              v37 = _50B9D8_screen_space_y[v13];
             if ( v15 > v12 )
-              v12 = dword_50B9D8_ys[v13];
+              v12 = _50B9D8_screen_space_y[v13];
             v10 = v34;
             ++v13;
           }
@@ -1361,24 +1391,28 @@
             a2 <= p->uViewportZ &&
             v12 >= p->uViewportY &&
             v37 <= p->uViewportW &&
-            sub_424829(v10, &pSectors[pNumSectors].field_C, &p->field_C, uFaceID))
+            sub_424829(v10, &nodes[num_nodes].field_C, &p->field_C, uFaceID))*/
+      if (face_max_screenspace_x >= p->uViewportX &&
+          face_min_screenspace_x <= p->uViewportZ &&
+          face_max_screenspace_y >= p->uViewportY &&
+          face_min_screenspace_y <= p->uViewportW &&
+          sub_424829(num_vertices, &nodes[num_nodes].field_C, &p->field_C, uFaceID))
         {
           //v17 = v39;
           v18 = pFace->uSectorID;
           if (p->uSectorID == v18 )
             v18 = pFace->uBackSectorID;
-          pSectors[pNumSectors].uSectorID = v18;
-          pSectors[pNumSectors].uFaceID = uFaceID;
-          pSectors[pNumSectors].uViewportX = pBLVRenderParams->uViewportX;
-          pSectors[pNumSectors].uViewportZ = pBLVRenderParams->uViewportZ;
-          pSectors[pNumSectors].uViewportY = pBLVRenderParams->uViewportY;
-          pSectors[pNumSectors].uViewportW = pBLVRenderParams->uViewportW;
+          nodes[num_nodes].uSectorID = v18;
+          nodes[num_nodes].uFaceID = uFaceID;
+          nodes[num_nodes].uViewportX = pBLVRenderParams->uViewportX;
+          nodes[num_nodes].uViewportZ = pBLVRenderParams->uViewportZ;
+          nodes[num_nodes].uViewportY = pBLVRenderParams->uViewportY;
+          nodes[num_nodes].uViewportW = pBLVRenderParams->uViewportW;
           //v38 = pGame->pStru10Instance;
           //a0a = pGame->pIndoorCameraD3D;
           if (p->std__vector_0007A8 == -1 )
           {
-            v29 = pGame->pStru10Instance->_49C681_DrawDebugStuff(pFace, pSectors[pNumSectors].std__vector_0007AC,
-                    pSectors[pNumSectors].pVertices);
+            v29 = pGame->pStru10Instance->_49C681_DrawDebugStuff(pFace, nodes[num_nodes].std__vector_0007AC, nodes[num_nodes].pVertices);
           }
           else
           {
@@ -1386,7 +1420,7 @@
             static RenderVertexSoft static_subAddFaceToRenderList_d3d_stru_F79E08[64];
 
             //v23 = 0;
-            a2 = pFace->uNumVertices;
+            unsigned int a2 = pFace->uNumVertices;
             for (uint k = 0; k < pFace->uNumVertices; ++k)
             {
               //v24 = (char *)&static_subAddFaceToRenderList_d3d_stru_F7AA08[0].vWorldPosition.z;
@@ -1407,46 +1441,35 @@
             }
             pGame->pIndoorCameraD3D->_437285_prolly_colide_vertices_against_frustrum(
               static_subAddFaceToRenderList_d3d_stru_F7AA08,
-              (unsigned int *)&a2,
+              &a2,
               static_subAddFaceToRenderList_d3d_stru_F79E08,
               p->std__vector_0007AC,
               4,
               0,
               0);
-            v29 = pGame->pStru10Instance->_49C5DA(pFace, static_subAddFaceToRenderList_d3d_stru_F79E08, &a2,
-                    pSectors[pNumSectors].std__vector_0007AC,
-                    pSectors[pNumSectors].pVertices);
+            v29 = pGame->pStru10Instance->_49C5DA(pFace, static_subAddFaceToRenderList_d3d_stru_F79E08, (int *)&a2,
+                    nodes[num_nodes].std__vector_0007AC,
+                    nodes[num_nodes].pVertices);
           }
           if ( v29 )
           {
-            pSectors[pNumSectors].std__vector_0007A8 = uFaceID;
-            v30 = pNumSectors;
+            nodes[num_nodes].std__vector_0007A8 = uFaceID;
+            v30 = num_nodes;
             if ( v30 < 150 )
             {
-              v31 = v30 + 1;
-              pNumSectors = v31;
-              sub_440639(v31 - 1);
+              //v31 = v30 + 1;
+              num_nodes = v30 + 1;
+              AddBspNodeToRenderList(v30);
             }
           }
           if (pBLVRenderParams->uFlags & INDOOR_CAMERA_DRAW_SW_OUTLINES)
             pGame->pIndoorCameraD3D->PrepareAndDrawDebugOutline(pFace, 0x1E1EFF);
         }
-      }
-    }
-  }
-  else
-  {
-    if (uNumFaceIDs < 1000 )
-    {
-      pFaceIDs[2 * uNumFaceIDs] = uFaceID;
-      pFaceIDs[2 * uNumFaceIDs++ + 1] = a2;
-    }
-  }
 }
 
 
 //----- (004AFB86) --------------------------------------------------------
-void BspRenderer::AddFaceToRenderList_sw(int a2, unsigned int uFaceID)
+void BspRenderer::AddFaceToRenderList_sw(unsigned int node_id, unsigned int uFaceID)
 {
   BspRenderer *v3; // ebx@1
   BLVFace *v4; // eax@1
@@ -1473,13 +1496,13 @@
   v3 = this;
   v4 = &pIndoor->pFaces[uFaceID];
   v21 = v4;
-  if (v4->TwoSided())
+  if (v4->Portal())
   {
-    v5 = (char *)this + 2252 * a2;
+    v5 = (char *)this + 2252 * node_id;
     v20 = v5;
     if ( uFaceID == *((short *)v5 + 2982) )
       return;
-    if ( !a2
+    if (!node_id
       && pBLVRenderParams->vPartyPos.x >= v4->pBounding.x1 - 16
       && pBLVRenderParams->vPartyPos.x <= v4->pBounding.x2 + 16
       && pBLVRenderParams->vPartyPos.y >= v4->pBounding.y1 - 16
@@ -1492,20 +1515,20 @@
                                        + pBLVRenderParams->vPartyPos.z * v4->pFacePlane_old.vNormal.z) <= 589824 )
       {
         v6 = v21->uSectorID;
-        if ( v3->pSectors[0].uSectorID == v6 )
+        if ( v3->nodes[0].uSectorID == v6 )
           v6 = v21->uBackSectorID;
-        v3->pSectors[v3->pNumSectors].uSectorID = v6;
-        v3->pSectors[v3->pNumSectors].uFaceID = uFaceID;
-        v3->pSectors[v3->pNumSectors].uViewportX = LOWORD(pBLVRenderParams->uViewportX);
-        v3->pSectors[v3->pNumSectors].uViewportZ = LOWORD(pBLVRenderParams->uViewportZ);
-        v3->pSectors[v3->pNumSectors].uViewportY = LOWORD(pBLVRenderParams->uViewportY);
-        v3->pSectors[v3->pNumSectors].uViewportW = LOWORD(pBLVRenderParams->uViewportW);
-        v3->pSectors[v3->pNumSectors++].field_C._43F9E1(
+        v3->nodes[v3->num_nodes].uSectorID = v6;
+        v3->nodes[v3->num_nodes].uFaceID = uFaceID;
+        v3->nodes[v3->num_nodes].uViewportX = LOWORD(pBLVRenderParams->uViewportX);
+        v3->nodes[v3->num_nodes].uViewportZ = LOWORD(pBLVRenderParams->uViewportZ);
+        v3->nodes[v3->num_nodes].uViewportY = LOWORD(pBLVRenderParams->uViewportY);
+        v3->nodes[v3->num_nodes].uViewportW = LOWORD(pBLVRenderParams->uViewportW);
+        v3->nodes[v3->num_nodes++].field_C._43F9E1(
           SLOWORD(pBLVRenderParams->uViewportX),
           pBLVRenderParams->uViewportY,
           SLOWORD(pBLVRenderParams->uViewportZ),
           pBLVRenderParams->uViewportW);
-        v7 = v3->pNumSectors - 1;
+        v7 = v3->num_nodes - 1;
         goto LABEL_14;
       }
       v4 = v21;
@@ -1523,25 +1546,25 @@
       v19 = v10;
       if ( v10 )
       {
-        v11 = dword_50BAC8[0];
-        v12 = dword_50B9D8_ys[0];
-        v23 = dword_50BAC8[0];
+        v11 = _50BAC8_screen_space_x[0];
+        v12 = _50B9D8_screen_space_y[0];
+        v23 = _50BAC8_screen_space_x[0];
         v13 = 1;
-        v22 = dword_50B9D8_ys[0];
+        v22 = _50B9D8_screen_space_y[0];
         if ( v10 > 1 )
         {
           do
           {
-            v14 = dword_50BAC8[v13];
+            v14 = _50BAC8_screen_space_x[v13];
             if ( v14 < v23 )
-              v23 = dword_50BAC8[v13];
+              v23 = _50BAC8_screen_space_x[v13];
             if ( v14 > v11 )
-              v11 = dword_50BAC8[v13];
-            v15 = dword_50B9D8_ys[v13];
+              v11 = _50BAC8_screen_space_x[v13];
+            v15 = _50B9D8_screen_space_y[v13];
             if ( v15 < v22 )
-              v22 = dword_50B9D8_ys[v13];
+              v22 = _50B9D8_screen_space_y[v13];
             if ( v15 > v12 )
-              v12 = dword_50B9D8_ys[v13];
+              v12 = _50B9D8_screen_space_y[v13];
             v10 = v19;
             ++v13;
           }
@@ -1551,25 +1574,25 @@
           && v23 <= *((short *)v20 + 2007)
           && v12 >= *((short *)v20 + 2006)
           && v22 <= *((short *)v20 + 2008)
-          && sub_424829(v10, &v3->pSectors[v3->pNumSectors].field_C, (BspRenderer_stru2 *)(v20 + 4020), uFaceID) )
+          && sub_424829(v10, &v3->nodes[v3->num_nodes].field_C, (BspRenderer_stru2 *)(v20 + 4020), uFaceID) )
         {
           v16 = v21->uSectorID;
           if ( *((short *)v20 + 2004) == v16 )
             v16 = v21->uBackSectorID;
-          v3->pSectors[v3->pNumSectors].uSectorID = v16;
-          v3->pSectors[v3->pNumSectors].uFaceID = uFaceID;
-          v3->pSectors[v3->pNumSectors].uViewportX = LOWORD(pBLVRenderParams->uViewportX);
-          v3->pSectors[v3->pNumSectors].uViewportZ = LOWORD(pBLVRenderParams->uViewportZ);
-          v3->pSectors[v3->pNumSectors].uViewportY = LOWORD(pBLVRenderParams->uViewportY);
-          v3->pSectors[v3->pNumSectors].uViewportW = LOWORD(pBLVRenderParams->uViewportW);
-          v17 = v3->pNumSectors;
+          v3->nodes[v3->num_nodes].uSectorID = v16;
+          v3->nodes[v3->num_nodes].uFaceID = uFaceID;
+          v3->nodes[v3->num_nodes].uViewportX = LOWORD(pBLVRenderParams->uViewportX);
+          v3->nodes[v3->num_nodes].uViewportZ = LOWORD(pBLVRenderParams->uViewportZ);
+          v3->nodes[v3->num_nodes].uViewportY = LOWORD(pBLVRenderParams->uViewportY);
+          v3->nodes[v3->num_nodes].uViewportW = LOWORD(pBLVRenderParams->uViewportW);
+          v17 = v3->num_nodes;
           if ( v17 < 150 )
           {
             v18 = v17 + 1;
-            v3->pNumSectors = v18;
+            v3->num_nodes = v18;
             v7 = v18 - 1;
 LABEL_14:
-            sub_440639(v7);
+            AddBspNodeToRenderList(v7);
             return;
           }
         }
@@ -1578,10 +1601,10 @@
   }
   else
   {
-    if ( (signed int)this->uNumFaceIDs < 1000 )
+    if (num_faces < 1000)
     {
-      this->pFaceIDs[2 * this->uNumFaceIDs] = uFaceID;
-      this->pFaceIDs[2 * this->uNumFaceIDs++ + 1] = a2;
+      faces[num_faces].uFaceID = uFaceID;
+      faces[num_faces++].uNodeID = node_id;
     }
   }
 }
@@ -1598,15 +1621,15 @@
   int v6; // ecx@7
   int v7; // esi@8
 
-  for ( i = 0; i < (signed int)pBspRenderer->uNumFaceIDs; ++i )
+  for ( i = 0; i < (signed int)pBspRenderer->num_faces; ++i )
   {
-    v1 = pBspRenderer->pFaceIDs[2 * i];
+    v1 = pBspRenderer->faces[i].uFaceID;
     if ( v1 >= 0 )
     {
       if ( v1 < (signed int)pIndoor->uNumFaces )
       {
-        v2 = pBspRenderer->pFaceIDs[2 * i];
-        pBLVRenderParams->field_7C = &pBspRenderer->pSectors[pBspRenderer->pFaceIDs[2 * i + 1]].field_C;
+        v2 = pBspRenderer->faces[i].uFaceID;
+        pBLVRenderParams->field_7C = &pBspRenderer->nodes[pBspRenderer->faces[i].uNodeID].field_C;
         v3 = sub_423B5D(v2);
         if ( v3 )
         {
@@ -2479,21 +2502,6 @@
     MessageBoxW(nullptr, L"Can't load file!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Polydata.cpp:803", 0);
     return 0;
   }
-
-  assert(sizeof(Vec3_short_) == 6);
-  assert(sizeof(BLVFace) == 96);
-  assert(sizeof(BLVFaceExtra) == 36);
-  assert(sizeof(BLVSector) == 116);
-  assert(sizeof(LevelDecoration) == 32);
-  assert(sizeof(BLVLightMM7) == 16);
-  assert(sizeof(BSPNode) == 8);
-  assert(sizeof(SpawnPointMM7) == 24);
-  assert(sizeof(DDM_DLV_Header) == 40);
-  assert(sizeof(Actor) == 836);
-  assert(sizeof(SpriteObject) == 112);
-  assert(sizeof(Chest) == 5324);
-  assert(sizeof(stru123) == 0xC8);
-  assert(sizeof(BLVMapOutline) == 12);
   
   bLoaded = true;
 
@@ -2523,13 +2531,13 @@
     pFace->pVertexIDs = ptr_2AC + j;
     
     j += pFace->uNumVertices + 1;
-    pFace->pXInterceptDisplacements = ptr_2AC + j;
+    pFace->pXInterceptDisplacements = (short *)(ptr_2AC + j);
 
     j += pFace->uNumVertices + 1;
-    pFace->pYInterceptDisplacements = ptr_2AC + j;
+    pFace->pYInterceptDisplacements = (short *)(ptr_2AC + j);
 
     j += pFace->uNumVertices + 1;
-    pFace->pZInterceptDisplacements = ptr_2AC + j;
+    pFace->pZInterceptDisplacements = (short *)(ptr_2AC + j);
 
     j += pFace->uNumVertices + 1;
     pFace->pVertexUIDs = (__int16 *)(ptr_2AC + j);
--- a/Indoor.h	Thu Mar 14 23:44:03 2013 +0200
+++ b/Indoor.h	Fri Mar 15 04:13:24 2013 +0200
@@ -250,7 +250,7 @@
 #pragma pack(pop)
 
 
-#define FACE_TWO_SIDED          0x00000001 // portal/two-sided
+#define FACE_PORTAL             0x00000001 // portal/two-sided
 #define FACE_CAN_SATURATE_COLOR 0x00000002
 #define FACE_TEXTURE_ANIMATED   0x00000010 // like wavy water
 #define FACE_INVISIBLE          0x00002000
@@ -284,7 +284,7 @@
 
   inline bool Invisible() const {return uAttributes & FACE_INVISIBLE;}
   inline bool Visible() const   {return !Invisible();}
-  inline bool TwoSided() const  {return uAttributes & FACE_TWO_SIDED;}
+  inline bool Portal() const    {return uAttributes & FACE_PORTAL;}
   inline bool Animated() const  {return uAttributes & FACE_TEXTURE_ANIMATED;}
   inline bool Clickable() const {return uAttributes & FACE_CLICKABLE;}
 
@@ -296,9 +296,9 @@
   int zCalc3;
   unsigned int uAttributes;
   unsigned __int16 *pVertexIDs;
-  unsigned __int16 *pXInterceptDisplacements;
-  unsigned __int16 *pYInterceptDisplacements;
-  unsigned __int16 *pZInterceptDisplacements;
+  signed __int16 *pXInterceptDisplacements;
+  signed __int16 *pYInterceptDisplacements;
+  signed __int16 *pZInterceptDisplacements;
   signed __int16   *pVertexUIDs;
   signed __int16   *pVertexVIDs;
   unsigned __int16  uFaceExtraID;
--- a/IndoorCameraD3D.cpp	Thu Mar 14 23:44:03 2013 +0200
+++ b/IndoorCameraD3D.cpp	Fri Mar 15 04:13:24 2013 +0200
@@ -396,7 +396,7 @@
 //----- (00438258) --------------------------------------------------------
 bool IndoorCameraD3D::is_face_faced_to_camera(BLVFace *pFace, RenderVertexSoft *a2)
 {
-  if (pFace->TwoSided())
+  if (pFace->Portal())
     return false;
 
   //really strange cull; dot(to_cam, normal) < 0 means we see the BACK face, not font %_%
--- a/Indoor_stuff.h	Thu Mar 14 23:44:03 2013 +0200
+++ b/Indoor_stuff.h	Fri Mar 15 04:13:24 2013 +0200
@@ -63,6 +63,14 @@
 
 
 
+#pragma pack(push, 1)
+struct BspFace
+{
+  unsigned __int16 uFaceID;
+  unsigned __int16 uNodeID;
+};
+#pragma pack(pop)
+
 
 /*  163 */
 #pragma pack(push, 1)
@@ -74,21 +82,22 @@
    // _eh_vector_constructor_iterator_(field_FA8, 2252, 150,
    //    (void (__thiscall *)(void *))stru170_stru0::stru170_stru0,
    //    (void (__thiscall *)(void *))stru170_stru0::dtor);
-    uNumFaceIDs = 0;
-    pNumSectors = 0;
+    num_faces = 0;
+    num_nodes = 0;
     uNumVisibleNotEmptySectors = 0;
   }
 
-  void AddFaceToRenderList_sw(int a2, unsigned int uFaceID);
-  void AddFaceToRenderList_d3d(signed int a2, unsigned int uFaceID);
+  void AddFaceToRenderList_sw(unsigned int node_id, unsigned int uFaceID);
+  void AddFaceToRenderList_d3d(unsigned int node_id, unsigned int uFaceID);
   void MakeVisibleSectorList();
   void DrawFaceOutlines();
 
-  unsigned int uNumFaceIDs;
-  __int16 pFaceIDs[2000];
+  unsigned int num_faces;
+  //__int16 pFaceIDs[2000];
+  BspFace faces[1000];
   //char field_130[3700];
-  unsigned int pNumSectors;
-  BspRenderer_stru0 pSectors[150];
+  unsigned int num_nodes;
+  BspRenderer_stru0 nodes[150];
   unsigned int uNumVisibleNotEmptySectors;
   unsigned __int16 pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[6];
 };
--- a/Outdoor.h	Thu Mar 14 23:44:03 2013 +0200
+++ b/Outdoor.h	Fri Mar 15 04:13:24 2013 +0200
@@ -80,7 +80,7 @@
   
   inline bool Invisible() const {return uAttributes & FACE_INVISIBLE;}
   inline bool Visible() const   {return !Invisible();}
-  inline bool TwoSided() const  {return uAttributes & FACE_TWO_SIDED;}
+  inline bool TwoSided() const  {return uAttributes & FACE_PORTAL;}
 
   struct Plane_int_ pFacePlane;
   int zCalc1;
@@ -90,9 +90,9 @@
   unsigned __int16 pVertexIDs[20];
   unsigned __int16 pTextureUIDs[20];
   unsigned __int16 pTextureVIDs[20];
-  unsigned __int16 pXInterceptDisplacements[20];
-  unsigned __int16 pYInterceptDisplacements[20];
-  unsigned __int16 pZInterceptDisplacements[20];
+  signed __int16 pXInterceptDisplacements[20];
+  signed __int16 pYInterceptDisplacements[20];
+  signed __int16 pZInterceptDisplacements[20];
   unsigned __int16 uTextureID;
   __int16 sTextureDeltaU;
   __int16 sTextureDeltaV;
--- a/Vis.cpp	Thu Mar 14 23:44:03 2013 +0200
+++ b/Vis.cpp	Fri Mar 15 04:13:24 2013 +0200
@@ -349,9 +349,9 @@
   v5 = 0;
   thisa = this;
   v17 = 0;
-  for ( a1.flt_2C = 0.0; v17 < (signed int)pBspRenderer->uNumFaceIDs; ++v17 )
+  for ( a1.flt_2C = 0.0; v17 < (signed int)pBspRenderer->num_faces; ++v17 )
   {
-    v6 = pBspRenderer->pFaceIDs[2 * v5];
+    v6 = pBspRenderer->faces[v5].uFaceID;
     if ( v6 >= 0 )
     {
       if ( v6 < (signed int)pIndoor->uNumFaces )
@@ -611,7 +611,7 @@
   //float a5a; // [sp+30h] [bp+18h]@10
   //float a5b; // [sp+30h] [bp+18h]@13
 
-  if (a5->TwoSided() || a5->Invisible())
+  if (a5->Portal() || a5->Invisible())
     return false;
 
   
@@ -1849,9 +1849,9 @@
 
   result = 0;
   thisa = this;
-  for ( i = 0; i < (signed int)pBspRenderer->uNumFaceIDs; ++i )
+  for ( i = 0; i < (signed int)pBspRenderer->num_faces; ++i )
   {
-    v5 = pBspRenderer->pFaceIDs[2 * result];
+    v5 = pBspRenderer->faces[result].uFaceID;
     if ( v5 >= 0 )
     {
       if ( v5 < (signed int)pIndoor->uNumFaces )
--- a/mm7_1.cpp	Thu Mar 14 23:44:03 2013 +0200
+++ b/mm7_1.cpp	Fri Mar 15 04:13:24 2013 +0200
@@ -5826,7 +5826,7 @@
   else
   {
     dword_50B700 = 0;
-    if ( !v1->TwoSided() )
+    if ( !v1->Portal() )
       return 0;
   }
   //v66 = v1->uNumVertices;
@@ -6122,15 +6122,15 @@
         v70 = (signed int)(v56 - v58) * (signed __int64)(dword_50BAD4[v57 - 1] - dword_50BAD4[v57]) / (dword_50B9E4[v57 - 1] - v58);
         v59 = dword_50BAD4[v57];
       }
-      dword_50BAC8[v55] = v70 + v59;
+      _50BAC8_screen_space_x[v55] = v70 + v59;
       v56 = pBLVRenderParams->uViewportW;
-      dword_50B9D8_ys[v55] = pBLVRenderParams->uViewportW;
+      _50B9D8_screen_space_y[v55] = pBLVRenderParams->uViewportW;
       ++v55;
     }
     if ( v85 )
     {
-      dword_50BAC8[v55] = dword_50BAD4[v57];
-      dword_50B9D8_ys[v55++] = dword_50B9E4[v57];
+      _50BAC8_screen_space_x[v55] = dword_50BAD4[v57];
+      _50B9D8_screen_space_y[v55++] = dword_50B9E4[v57];
     }
     ++ie;
     thise = v85;
@@ -6140,12 +6140,12 @@
   if ( !v55 )
     return 0;
   v61 = pRenderer->pRenderD3D == 0;
-  dword_50BAC8[v55] = dword_50BAC8[0];
-  dword_50B9D8_ys[v55] = dword_50B9D8_ys[0];
+  _50BAC8_screen_space_x[v55] = _50BAC8_screen_space_x[0];
+  _50B9D8_screen_space_y[v55] = _50B9D8_screen_space_y[0];
   if ( v61 && v55 > 3 )
   {
-    dword_50BAC8[v55 + 1] = dword_50BAC8[1];
-    dword_50B9D8_ys[v55 + 1] = dword_50B9D8_ys[1];
+    _50BAC8_screen_space_x[v55 + 1] = _50BAC8_screen_space_x[1];
+    _50B9D8_screen_space_y[v55 + 1] = _50B9D8_screen_space_y[1];
     thisf = 2 * (dword_50B700 != 0) - 1;
     if ( v55 > 0 )
     {
@@ -6163,8 +6163,8 @@
         if ( v64 >= v55 )
           v64 -= v55;
         if ( thisf
-           * ((dword_50B9D8_ys[v64] - dword_50B9D8_ys[v63]) * (dword_50BAC8[v62] - dword_50BAC8[v63])
-            - (dword_50B9D8_ys[v62] - dword_50B9D8_ys[v63]) * (dword_50BAC8[v64] - dword_50BAC8[v63])) < 0 )
+           * ((_50B9D8_screen_space_y[v64] - _50B9D8_screen_space_y[v63]) * (_50BAC8_screen_space_x[v62] - _50BAC8_screen_space_x[v63])
+            - (_50B9D8_screen_space_y[v62] - _50B9D8_screen_space_y[v63]) * (_50BAC8_screen_space_x[v64] - _50BAC8_screen_space_x[v63])) < 0 )
         {
           v62 = v80;
           v71 = v80;
@@ -6175,16 +6175,16 @@
           v65 = v71;
           if ( v71 < v55 || (v65 = v71 - v55, v71 - v55 < v55) )
           {
-            memcpy(&dword_50B9D8_ys[v65], &dword_50B9D8_ys[v65 + 1], 4 * ((unsigned int)(4 * (v55 - v65)) >> 2));
-            memcpy(&dword_50BAC8[v65], &dword_50BAC8[v65 + 1], 4 * ((unsigned int)(4 * (v55 - v65)) >> 2));
+            memcpy(&_50B9D8_screen_space_y[v65], &_50B9D8_screen_space_y[v65 + 1], 4 * ((unsigned int)(4 * (v55 - v65)) >> 2));
+            memcpy(&_50BAC8_screen_space_x[v65], &_50BAC8_screen_space_x[v65 + 1], 4 * ((unsigned int)(4 * (v55 - v65)) >> 2));
           }
           --v55;
         }
       }
       while ( v62 - 1 < v55 );
     }
-    dword_50BAC8[v55] = dword_50BAC8[0];
-    dword_50B9D8_ys[v55] = dword_50B9D8_ys[0];
+    _50BAC8_screen_space_x[v55] = _50BAC8_screen_space_x[0];
+    _50B9D8_screen_space_y[v55] = _50B9D8_screen_space_y[0];
   }
   return v55;
 }
@@ -6544,23 +6544,23 @@
   v60 = a2;
   if ( !a1
     || (!dword_50B700 ? (v64 = -1, v6 = 1, v63 = 1) : (v6 = 1, v63 = -1, v64 = 1),
-        v7 = dword_50B9D8_ys[0],
+        v7 = _50B9D8_screen_space_y[0],
         v65 = 0,
-        v8 = dword_50B9D8_ys[0],
+        v8 = _50B9D8_screen_space_y[0],
         a1 <= v6) )
     return 0;
   do
   {
-    v9 = dword_50B9D8_ys[v6];
+    v9 = _50B9D8_screen_space_y[v6];
     if ( v9 >= v7 )
     {
       if ( v9 > v8 )
-        v8 = dword_50B9D8_ys[v6];
+        v8 = _50B9D8_screen_space_y[v6];
     }
     else
     {
       v65 = v6;
-      v7 = dword_50B9D8_ys[v6];
+      v7 = _50B9D8_screen_space_y[v6];
     }
     ++v6;
   }
@@ -6588,8 +6588,8 @@
       {
         v10 -= v74;
       }
-      v12 = dword_50B9D8_ys[v10];
-      if ( v12 <= dword_50B9D8_ys[v11] )
+      v12 = _50B9D8_screen_space_y[v10];
+      if ( v12 <= _50B9D8_screen_space_y[v11] )
       {
         v55 = v10;
         v11 = v10;
@@ -6614,12 +6614,12 @@
   }
   v67 = v13;
 LABEL_27:
-  if ( dword_50B9D8_ys[v13] != dword_50B9D8_ys[v55] )
+  if ( _50B9D8_screen_space_y[v13] != _50B9D8_screen_space_y[v55] )
   {
-    v14 = dword_50BAC8[v55];
+    v14 = _50BAC8_screen_space_x[v55];
     v62 = v14 << 16;
-    v54 = ((dword_50BAC8[v13] - v14) << 16) / (dword_50B9D8_ys[v13] - dword_50B9D8_ys[v55]);
-    v5->array_18[v7] = LOWORD(dword_50BAC8[v55]);
+    v54 = ((_50BAC8_screen_space_x[v13] - v14) << 16) / (_50B9D8_screen_space_y[v13] - _50B9D8_screen_space_y[v55]);
+    v5->array_18[v7] = LOWORD(_50BAC8_screen_space_x[v55]);
   }
   v15 = v65;
   v69 = 0;
@@ -6639,8 +6639,8 @@
       {
         v15 -= v74;
       }
-      v17 = dword_50B9D8_ys[v15];
-      if ( v17 <= dword_50B9D8_ys[v16] )
+      v17 = _50B9D8_screen_space_y[v15];
+      if ( v17 <= _50B9D8_screen_space_y[v16] )
       {
         v61 = v15;
         v16 = v15;
@@ -6667,14 +6667,14 @@
 LABEL_44:
   v19 = v18;
   v20 = v61;
-  v53 = dword_50B9D8_ys[v19] - dword_50B9D8_ys[v61];
-  if ( dword_50B9D8_ys[v19] != dword_50B9D8_ys[v61] )
+  v53 = _50B9D8_screen_space_y[v19] - _50B9D8_screen_space_y[v61];
+  if ( _50B9D8_screen_space_y[v19] != _50B9D8_screen_space_y[v61] )
   {
-    v21 = dword_50BAC8[v20];
+    v21 = _50BAC8_screen_space_x[v20];
     v5 = v60;
     v61 = v21 << 16;
-    v53 = ((dword_50BAC8[v19] - v21) << 16) / v53;
-    v60->array_3D8[v73] = LOWORD(dword_50BAC8[v20]);
+    v53 = ((_50BAC8_screen_space_x[v19] - v21) << 16) / v53;
+    v60->array_3D8[v73] = LOWORD(_50BAC8_screen_space_x[v20]);
   }
   v22 = v7;
   v70 = v7;
@@ -6685,7 +6685,7 @@
     do
     {
       v24 = v67;
-      if ( v22 < dword_50B9D8_ys[v67] || v22 == v73 )
+      if ( v22 < _50B9D8_screen_space_y[v67] || v22 == v73 )
         goto LABEL_57;
       v25 = v64 + v67;
       v67 = v25;
@@ -6702,16 +6702,16 @@
       v67 = v25;
 LABEL_55:
       v26 = v25;
-      v27 = dword_50B9D8_ys[v26] - dword_50B9D8_ys[v24];
-      if ( dword_50B9D8_ys[v26] - dword_50B9D8_ys[v24] > 0 )
+      v27 = _50B9D8_screen_space_y[v26] - _50B9D8_screen_space_y[v24];
+      if ( _50B9D8_screen_space_y[v26] - _50B9D8_screen_space_y[v24] > 0 )
       {
-        v28 = dword_50BAC8[v24];
-        v54 = ((dword_50BAC8[v26] - v28) << 16) / v27;
+        v28 = _50BAC8_screen_space_x[v24];
+        v54 = ((_50BAC8_screen_space_x[v26] - v28) << 16) / v27;
         v62 = v28 << 16;
       }
 LABEL_57:
       v29 = v66;
-      if ( v70 >= dword_50B9D8_ys[v66] && v70 != v73 )
+      if ( v70 >= _50B9D8_screen_space_y[v66] && v70 != v73 )
       {
         v30 = v63 + v66;
         v66 += v63;
@@ -6727,11 +6727,11 @@
           v66 = v30;
         }
         v31 = v30;
-        v32 = dword_50B9D8_ys[v31] - dword_50B9D8_ys[v29];
-        if ( dword_50B9D8_ys[v31] - dword_50B9D8_ys[v29] > 0 )
+        v32 = _50B9D8_screen_space_y[v31] - _50B9D8_screen_space_y[v29];
+        if ( _50B9D8_screen_space_y[v31] - _50B9D8_screen_space_y[v29] > 0 )
         {
-          v33 = dword_50BAC8[v29];
-          v53 = ((dword_50BAC8[v31] - v33) << 16) / v32;
+          v33 = _50BAC8_screen_space_x[v29];
+          v53 = ((_50BAC8_screen_space_x[v31] - v33) << 16) / v32;
           v61 = v33 << 16;
         }
       }
--- a/mm7_2.cpp	Thu Mar 14 23:44:03 2013 +0200
+++ b/mm7_2.cpp	Fri Mar 15 04:13:24 2013 +0200
@@ -10443,6 +10443,20 @@
   assert(sizeof(stru320) == 0x3FC);
   assert(sizeof(TravelInfo) == 0x20);
   assert(sizeof(stru336) == 0x798);
+  assert(sizeof(Vec3_short_) == 6);
+  assert(sizeof(BLVFace) == 96);
+  assert(sizeof(BLVFaceExtra) == 36);
+  assert(sizeof(BLVSector) == 116);
+  assert(sizeof(LevelDecoration) == 32);
+  assert(sizeof(BLVLightMM7) == 16);
+  assert(sizeof(BSPNode) == 8);
+  assert(sizeof(SpawnPointMM7) == 24);
+  assert(sizeof(DDM_DLV_Header) == 40);
+  assert(sizeof(Actor) == 836);
+  assert(sizeof(SpriteObject) == 112);
+  assert(sizeof(Chest) == 5324);
+  assert(sizeof(stru123) == 0xC8);
+  assert(sizeof(BLVMapOutline) == 12);
 }
 
 bool new_sky = false;
--- a/mm7_3.cpp	Thu Mar 14 23:44:03 2013 +0200
+++ b/mm7_3.cpp	Fri Mar 15 04:13:24 2013 +0200
@@ -138,7 +138,7 @@
     {
       v11 = v9->pFloors[v10];
       v12 = &pIndoor->pFaces[v11];
-      if ( v12->TwoSided()
+      if ( v12->Portal()
         || stru_721530.sMaxX > v12->pBounding.x2
         || stru_721530.sMinX < v12->pBounding.x1
         || stru_721530.sMaxY > v12->pBounding.y2
@@ -3795,7 +3795,7 @@
         v6 = (unsigned __int64)(a2->z * (signed __int64)v4->pFacePlane_old.vNormal.z) >> 16,
         v7 = v5 + v6 + a4b,
         (v16 = v5 + v6 + a4b) == 0)
-    || v7 > 0 && !v4->TwoSided())
+    || v7 > 0 && !v4->Portal())
     return 0;
   v8 = v4->pFacePlane_old.vNormal.z * a1->z;
   v9 = -(v4->pFacePlane_old.dist + v8 + a1->y * v4->pFacePlane_old.vNormal.y + a1->x * v4->pFacePlane_old.vNormal.x);
@@ -3855,7 +3855,7 @@
         v14 = v10 + v12 + v11,
         v22 = v10 + v12 + v11,
         v13)
-    || v14 > 0 && !a2->TwoSided())
+    || v14 > 0 && !a2->Portal())
     return 0;
   v15 = a4 * a2->pFacePlane_old.vNormal.y;
   v16 = -(a2->pFacePlane_old.dist + v15 + a3 * a2->pFacePlane_old.vNormal.x + a5 * a2->pFacePlane_old.vNormal.z);
@@ -11144,24 +11144,23 @@
 //----- (0043F953) --------------------------------------------------------
 void PrepareBspRenderList_BLV()
 {
-  pBspRenderer->uNumFaceIDs = 0;
+  pBspRenderer->num_faces = 0;
 
   if (pBLVRenderParams->uPartySectorID)
   {
-    pBspRenderer->pSectors[0].uSectorID = pBLVRenderParams->uPartySectorID;
-    pBspRenderer->pSectors[0].uViewportW = pBLVRenderParams->uViewportW;
-    pBspRenderer->pSectors[0].uViewportZ = pBLVRenderParams->uViewportZ;
-    pBspRenderer->pSectors[0].uViewportY = pBLVRenderParams->uViewportY;
-    pBspRenderer->pSectors[0].uViewportX = pBLVRenderParams->uViewportX;
-    pBspRenderer->pSectors[0].field_C._43F9E1(
-      pBLVRenderParams->uViewportX,
-      pBLVRenderParams->uViewportY,
-      pBLVRenderParams->uViewportZ,
-      pBLVRenderParams->uViewportW);
-    pBspRenderer->pSectors[0].uFaceID = -1;
-    pBspRenderer->pSectors[0].std__vector_0007A8 = -1;
-    pBspRenderer->pNumSectors = 1;
-    sub_440639(0);
+    pBspRenderer->nodes[0].uSectorID = pBLVRenderParams->uPartySectorID;
+    pBspRenderer->nodes[0].uViewportW = pBLVRenderParams->uViewportW;
+    pBspRenderer->nodes[0].uViewportZ = pBLVRenderParams->uViewportZ;
+    pBspRenderer->nodes[0].uViewportY = pBLVRenderParams->uViewportY;
+    pBspRenderer->nodes[0].uViewportX = pBLVRenderParams->uViewportX;
+    pBspRenderer->nodes[0].field_C._43F9E1(pBLVRenderParams->uViewportX,
+                                           pBLVRenderParams->uViewportY,
+                                           pBLVRenderParams->uViewportZ,
+                                           pBLVRenderParams->uViewportW);
+    pBspRenderer->nodes[0].uFaceID = -1;
+    pBspRenderer->nodes[0].std__vector_0007A8 = -1;
+    pBspRenderer->num_nodes = 1;
+    AddBspNodeToRenderList(0);
   }
 
   pBspRenderer->MakeVisibleSectorList();
@@ -11177,8 +11176,8 @@
   {
     if ( i < y || i > w )
     {
+      array_18[i] = 640;
       array_3D8[i] = -1;
-      array_18[i] = 640;
     }
     else
     {
@@ -11516,36 +11515,36 @@
 
 
 //----- (00440639) --------------------------------------------------------
-void __fastcall sub_440639(int a1)
-{
-  int v1; // ebx@1
+void AddBspNodeToRenderList(unsigned int node_id)
+{
+  //int v1; // ebx@1
   signed int v2; // edi@1
   BLVSector *v3; // esi@1
 
-  v1 = a1;
+  //v1 = sector_id;
   v2 = 0;
-  v3 = &pIndoor->pSectors[pBspRenderer->pSectors[a1].uSectorID];
+  v3 = &pIndoor->pSectors[pBspRenderer->nodes[node_id].uSectorID];
   if ( pRenderer->pRenderD3D )
   {
     for (uint i = 0; i < v3->uNumNonBSPFaces; ++i)
       //Log::Warning(L"Non-BSP face: %X", v3->pFaceIDs[v2]);
-      pBspRenderer->AddFaceToRenderList_d3d(v1, v3->pFaceIDs[i]);
+      pBspRenderer->AddFaceToRenderList_d3d(node_id, v3->pFaceIDs[i]);
   }
   else
   {
     if ( v3->uNumNonBSPFaces > 0 )
     {
       do
-        pBspRenderer->AddFaceToRenderList_sw(v1, v3->pFaceIDs[v2++]);
+        pBspRenderer->AddFaceToRenderList_sw(node_id, v3->pFaceIDs[v2++]);
       while ( v2 < v3->uNumNonBSPFaces );
     }
   }
   if ( v3->field_0 & 0x10 )
-    sub_4406BC(v1, v3->uFirstBSPNode);
+    sub_4406BC(node_id, v3->uFirstBSPNode);
 }
 
 //----- (004406BC) --------------------------------------------------------
-void __fastcall sub_4406BC(int a1, unsigned int uFirstNode)
+void __fastcall sub_4406BC(unsigned int node_id, unsigned int uFirstNode)
 {
   BLVSector *v2; // esi@2
   BSPNode *v3; // edi@2
@@ -11555,14 +11554,14 @@
   int v7; // ebp@10
   int v8; // ebx@10
   __int16 v9; // di@18
-  int v10; // [sp+10h] [bp-Ch]@1
+  //int v10; // [sp+10h] [bp-Ch]@1
   bool v11; // [sp+14h] [bp-8h]@5
   BspRenderer_stru0 *v12; // [sp+18h] [bp-4h]@1
 
   //Log::Warning(L"sub_4406BC(%u, %u)", a1, uFirstNode);
 
-  v10 = a1;
-  v12 = &pBspRenderer->pSectors[a1];
+  //v10 = a1;
+  v12 = &pBspRenderer->nodes[node_id];
   while ( 1 )
   {
     v2 = &pIndoor->pSectors[v12->uSectorID];
@@ -11572,7 +11571,7 @@
        + pBLVRenderParams->vPartyPos.x * v4->pFacePlane_old.vNormal.x
        + pBLVRenderParams->vPartyPos.y * v4->pFacePlane_old.vNormal.y
        + pBLVRenderParams->vPartyPos.z * v4->pFacePlane_old.vNormal.z;
-    if (v4->TwoSided() && v4->uSectorID != v12->uSectorID )
+    if (v4->Portal() && v4->uSectorID != v12->uSectorID )
       v5 = -v5;
     v11 = v5 > 0;
     if ( v5 <= 0 )
@@ -11580,7 +11579,7 @@
     else
       v6 = v3->uBack;
     if ( v6 != -1 )
-      sub_4406BC(v10, v6);
+      sub_4406BC(node_id, v6);
     v7 = v3->uCoplanarOffset;
     v8 = v7 + v3->uCoplanarSize;
 
@@ -11589,12 +11588,12 @@
     if ( pRenderer->pRenderD3D )
     {
       while ( v7 < v8 )
-        pBspRenderer->AddFaceToRenderList_d3d(v10, v2->pFaceIDs[v7++]);
+        pBspRenderer->AddFaceToRenderList_d3d(node_id, v2->pFaceIDs[v7++]);
     }
     else
     {
       while ( v7 < v8 )
-        pBspRenderer->AddFaceToRenderList_sw(v10, v2->pFaceIDs[v7++]);
+        pBspRenderer->AddFaceToRenderList_sw(node_id, v2->pFaceIDs[v7++]);
     }
     v9 = v11 ? v3->uFront : v3->uBack;
     if ( v9 == -1 )
--- a/mm7_4.cpp	Thu Mar 14 23:44:03 2013 +0200
+++ b/mm7_4.cpp	Fri Mar 15 04:13:24 2013 +0200
@@ -778,7 +778,7 @@
   BSPModel *v6; // edi@3
   ODMFace *v7; // esi@10
   unsigned __int8 v8; // al@10
-  unsigned __int16 *v9; // eax@18
+  signed __int16 *v9; // eax@18
   int v10; // edx@19
   int v11; // ecx@21
   int v12; // ecx@23
--- a/mm7_5.cpp	Thu Mar 14 23:44:03 2013 +0200
+++ b/mm7_5.cpp	Fri Mar 15 04:13:24 2013 +0200
@@ -9251,25 +9251,24 @@
   int v6; // ebx@3
 
   uNumVisibleNotEmptySectors = 0;
-  for (uint i = 0; i < pNumSectors; ++i)
-  {
-      v6 = 0;
+  for (uint i = 0; i < num_nodes; ++i)
+  {
       if (!uNumVisibleNotEmptySectors)
       {
-        pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[uNumVisibleNotEmptySectors++] = pSectors[i].uSectorID;
-      }
-      else
-      {
-        while (pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[v6] != pSectors[i].uSectorID )
+        pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[uNumVisibleNotEmptySectors++] = nodes[i].uSectorID;
+        continue;
+      }
+      
+      v6 = 0;
+        while (pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[v6] != nodes[i].uSectorID )
         {
           ++v6;
           if ( v6 >= uNumVisibleNotEmptySectors)
           {
-            pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[uNumVisibleNotEmptySectors++] = pSectors[i].uSectorID;
-            continue;
-          }
-        }
-      }
+            pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[uNumVisibleNotEmptySectors++] = nodes[i].uSectorID;
+          }
+        }
+
   }
 }
 
@@ -11566,7 +11565,7 @@
             ++sDepthb )
       {
         v62 = &pIndoor->pFaces[(*(unsigned __int16 **)((char *)&v60->pWalls + v61))[sDepthb]];
-        if ( v62->TwoSided()
+        if ( v62->Portal()
           || v119 > v62->pBounding.x2
           || v123 < v62->pBounding.x1
           || v127 > v62->pBounding.y2
@@ -11732,7 +11731,7 @@
     while ( 1 )
     {
       v90 = &pIndoor->pFaces[(*(unsigned __int16 **)((char *)&v88->pWalls + v89))[v162]];
-      if ( v90->TwoSided()
+      if ( v90->Portal()
         || v120 > v90->pBounding.x2
         || v124 < v90->pBounding.x1
         || v128 > v90->pBounding.y2
--- a/mm7_data.cpp	Thu Mar 14 23:44:03 2013 +0200
+++ b/mm7_data.cpp	Fri Mar 15 04:13:24 2013 +0200
@@ -1718,7 +1718,7 @@
 int dword_50B918[777];
 int _50B924_view_transformed_xs[45];
 //int unk_50B9D4[777]; // idb
-int dword_50B9D8_ys[777];
+int _50B9D8_screen_space_y[777];
 int dword_50B9E4[777];
 //int dword_50B9E0_ys[777]; // idb
 //int dword_50B9EC[777]; // idb
@@ -1729,7 +1729,7 @@
 int dword_50B9FC_ys[3 + 45];
 int dword_50BA08_ys[48]; // idb
 //int dword_50BAC4[777]; // weak
-int dword_50BAC8[777]; // idb
+int _50BAC8_screen_space_x[777]; // idb
 //int dword_50BAD0[777]; // weak
 int dword_50BAD4[777]; // weak
 //int dword_50BADC_xs[777]; // weak
--- a/mm7_data.h	Thu Mar 14 23:44:03 2013 +0200
+++ b/mm7_data.h	Fri Mar 15 04:13:24 2013 +0200
@@ -1232,7 +1232,7 @@
 extern int dword_50B918[];
 extern int _50B924_view_transformed_xs[];
 //extern int unk_50B9D4[]; // idb
-extern int dword_50B9D8_ys[];
+extern int _50B9D8_screen_space_y[];
 extern int dword_50B9E4[];
 //extern int dword_50B9E0_ys[]; // idb
 //extern int dword_50B9EC[]; // idb
@@ -1243,7 +1243,7 @@
 extern int dword_50B9FC_ys[];
 extern int dword_50BA08_ys[]; // idb
 //extern int dword_50BAC4[]; // weak
-extern int dword_50BAC8[]; // idb
+extern int _50BAC8_screen_space_x[]; // idb
 //extern int dword_50BAD0[]; // weak
 extern int dword_50BAD4[]; // weak
 //extern int dword_50BADC_xs[]; // weak
@@ -1988,8 +1988,8 @@
 void __fastcall PrepareDecorationsRenderList_BLV(unsigned int uDecorationID, unsigned int uSectorID);
 void PrepareActorRenderList_BLV();
 void PrepareItemsRenderList_BLV();
-void __fastcall sub_440639(int a1);
-void __fastcall sub_4406BC(int a1, unsigned int uFirstNode); // idb
+void AddBspNodeToRenderList(unsigned int node_id);
+void __fastcall sub_4406BC(unsigned int node_id, unsigned int uFirstNode); // idb
 void __fastcall sub_440BED(struct IndoorLocation_drawstru *_this);
 bool sub_44100D();
 void GameUI_DrawTorchlightAndWizardEye();
--- a/stru10.cpp	Thu Mar 14 23:44:03 2013 +0200
+++ b/stru10.cpp	Fri Mar 15 04:13:24 2013 +0200
@@ -1,3 +1,5 @@
+#include <assert.h>
+
 #include "stru10.h"
 #include "Render.h"
 #include "Indoor.h"
@@ -440,7 +442,7 @@
     for (uint i = 0; i < pFace->uNumVertices; ++i)
     {
       v46[i].x = pIndoor->pVertices[pFace->pVertexIDs[i]].x + pFace->pXInterceptDisplacements[i];
-      v46[i].y = pIndoor->pVertices[pFace->pVertexIDs[i]].y + pFace->pZInterceptDisplacements[i];
+      v46[i].y = pIndoor->pVertices[pFace->pVertexIDs[i]].z + pFace->pZInterceptDisplacements[i];
       v46[i].c = i;
     }
   }
@@ -448,8 +450,8 @@
   {
     for (uint i = 0; i < pFace->uNumVertices; ++i)
     {
-      v46[i].x = pIndoor->pVertices[pFace->pVertexIDs[i]].x + pFace->pYInterceptDisplacements[i];
-      v46[i].y = pIndoor->pVertices[pFace->pVertexIDs[i]].y + pFace->pZInterceptDisplacements[i];
+      v46[i].x = pIndoor->pVertices[pFace->pVertexIDs[i]].y + pFace->pYInterceptDisplacements[i];
+      v46[i].y = pIndoor->pVertices[pFace->pVertexIDs[i]].z + pFace->pZInterceptDisplacements[i];
       v46[i].c = i;
     }
   }
@@ -583,6 +585,7 @@
     var_28 = 1;
     var_24 = 0;
   }
+  else assert(false);
 
 
   float arg_4;
@@ -595,6 +598,25 @@
   //__asm { fld     0.5 }
   if (pFace->uAttributes & 0x0100)
   {
+    /*arg_4 = ([2].x + [0].x) * flt_4D84F0
+    var_18 = ([3].y + [1].y) * flt_4D84F0
+
+      fld     dword ptr [ecx+94h]
+      fadd    dword ptr [ecx+34h]
+      fmul    st, st(1)
+      fstp    [ebp+var_18]
+      fld     dword ptr [ecx+68h]
+      fadd    dword ptr [ecx+8]
+      fmul    st, st(1)
+      fstp    [ebp+var_4]
+      fld     [ebp+arg4]
+      fsub    dword ptr [ecx]
+      fstp    [ebp+a3]
+      fld     [ebp+var_18]
+      fsub    dword ptr [ecx+34h]
+      fstp    [ebp+var_8]*/
+
+
     arg_4 = (pFaceBounding[0].vWorldPosition.x + pFaceBounding[2].vWorldPosition.x) / 2;
     var_18 = (pFaceBounding[3].vWorldPosition.y + pFaceBounding[1].vWorldPosition.y) / 2;
     var_4 = (pFaceBounding[0].vWorldPosition.z + pFaceBounding[2].vWorldPosition.z) / 2;
@@ -631,7 +653,7 @@
   }
 
 
-  if ( byte_4D864C && pGame->uFlags & 8 )
+  if ( byte_4D864C && pGame->uFlags & GAME_FLAGS_1_DRAW_BLV_DEBUGS)
   {
     RenderVertexSoft v26; // [sp+40h] [bp-60h]@20
     v26.vWorldPosition.x = arg_4;
@@ -674,7 +696,7 @@
 
   if ( byte_4D864C )
   {
-      if ( pGame->uFlags & 8 )
+      if ( pGame->uFlags & GAME_FLAGS_1_DRAW_BLV_DEBUGS)
       {
         RenderVertexSoft v25; // [sp+10h] [bp-90h]@20
         RenderVertexSoft v26; // [sp+40h] [bp-60h]@20
@@ -705,7 +727,7 @@
     memcpy(arg0 + 3, &v25, sizeof(RenderVertexSoft));
   }
 
-    if ( byte_4D864C && pGame->uFlags & 8 )
+    if ( byte_4D864C && pGame->uFlags & GAME_FLAGS_1_DRAW_BLV_DEBUGS)
     {
       RenderVertexSoft v26; // [sp+40h] [bp-60h]@20
       if ( !LOBYTE(field_4) )
@@ -741,14 +763,14 @@
 //----- (0049C5DA) --------------------------------------------------------
 char stru10::_49C5DA(BLVFace *a2, RenderVertexSoft *a3, int *a4, IndoorCameraD3D_Vec4 *a5, RenderVertexSoft *a6)
 {
-  stru10 *v6; // edi@1
-  char *v7; // eax@1
-  signed int v8; // ecx@1
-  IndoorCameraD3D *v9; // esi@3
+  //stru10 *v6; // edi@1
+  //char *v7; // eax@1
+  //signed int v8; // ecx@1
+  //IndoorCameraD3D *v9; // esi@3
   char result; // al@6
   RenderVertexSoft a4a[4]; // [sp+Ch] [bp-C0h]@1
 
-  v6 = this;
+  /*v6 = this;
   v7 = (char *)&a4a[0].flt_2C;
   v8 = 4;
   do
@@ -758,9 +780,9 @@
     --v8;
   }
   while ( v8 );
-  v9 = pGame->pIndoorCameraD3D;
+  v9 = pGame->pIndoorCameraD3D;*/
   _49CE9E(a2, a3, *a4, a4a);
-  if ( byte_4D864C && pGame->uFlags & 8 )
+  if ( byte_4D864C && pGame->uFlags & GAME_FLAGS_1_DRAW_BLV_DEBUGS)
     pGame->pIndoorCameraD3D->debug_outline_sw(a4a, 4u, 0xFF1E1Eu, 0.000099999997);
   result = _49C9E3(a2, a4a, 4u, a6);
   if ( result )
@@ -775,7 +797,7 @@
   RenderVertexSoft pBounding[4]; // [sp+Ch] [bp-C0h]@1
 
   CalcPolygonBoundingBox(pFace, pBounding);
-  if ( byte_4D864C && pGame->uFlags & 8 )
+  if ( byte_4D864C && pGame->uFlags & GAME_FLAGS_1_DRAW_BLV_DEBUGS)
     pGame->pIndoorCameraD3D->debug_outline_sw(pBounding, 4, 0xFF1E1E, 0.000099999997);
   if (_49C9E3(pFace, pBounding, 4, pArrayOf4))
     return _49C720(pArrayOf4, a3);
@@ -877,9 +899,9 @@
 //----- (0049C8DC) --------------------------------------------------------
 bool stru10::_49C8DC(RenderVertexSoft *arg0, Vec3_float_ *a2, float *a3)
 {
-  double v4; // st7@1
-  double v5; // st6@1
-  double v6; // st5@1
+  //double v4; // st7@1
+  //double v5; // st6@1
+  //double v6; // st5@1
   Vec3_float_ *result; // eax@1
   __int16 v8; // fps@3
   char v9; // c0@3
@@ -890,31 +912,33 @@
   double v14; // st6@5
   Vec3_float_ v1; // [sp+8h] [bp-3Ch]@1
   Vec3_float_ v2; // [sp+14h] [bp-30h]@1
-  float v17; // [sp+24h] [bp-20h]@1
-  float v18; // [sp+28h] [bp-1Ch]@1
-  float v19; // [sp+2Ch] [bp-18h]@1
-  float v20; // [sp+30h] [bp-14h]@1
-  float v21; // [sp+34h] [bp-10h]@1
+  //float v17; // [sp+24h] [bp-20h]@1
+  //float v18; // [sp+28h] [bp-1Ch]@1
+  //float v19; // [sp+2Ch] [bp-18h]@1
+  //float v20; // [sp+30h] [bp-14h]@1
+  //float v21; // [sp+34h] [bp-10h]@1
   Vec3_float_ a1; // [sp+38h] [bp-Ch]@1
 
-  v19 = arg0->vWorldPosition.x;
-  v20 = arg0->vWorldPosition.y;
-  v21 = arg0->vWorldPosition.z;
-  v4 = arg0[1].vWorldPosition.x;
-  v5 = arg0[1].vWorldPosition.y;
-  v2.z = arg0[1].vWorldPosition.z;
-  v6 = arg0[2].vWorldPosition.x;
-  v17 = arg0[2].vWorldPosition.y;
-  v18 = arg0[2].vWorldPosition.z;
-  a1.x = v4 - v19;
-  a1.y = v5 - v20;
-  a1.z = v2.z - v21;
-  LODWORD(v1.x) = (int)a1.x;
-  v1.y = a1.y;
-  v1.z = a1.z;
-  a1.x = v6 - v4;
-  a1.y = v17 - v5;
-  a1.z = v18 - v2.z;
+  //v19 = arg0->vWorldPosition.x;
+  //v20 = arg0->vWorldPosition.y;
+  //v21 = arg0->vWorldPosition.z;
+  //v4 = arg0[1].vWorldPosition.x;
+  //v5 = arg0[1].vWorldPosition.y;
+  //v2.z = arg0[1].vWorldPosition.z;
+  //v6 = arg0[2].vWorldPosition.x;
+  //v17 = arg0[2].vWorldPosition.y;
+  //v18 = arg0[2].vWorldPosition.z;
+  //a1.x = v4 - v19;
+  //a1.y = v5 - v20;
+  //a1.z = v2.z - v21;
+  v1.x = arg0[1].vWorldPosition.x - arg0[0].vWorldPosition.x;
+  v1.y = arg0[1].vWorldPosition.y - arg0[0].vWorldPosition.y;
+  v1.z = arg0[1].vWorldPosition.z - arg0[0].vWorldPosition.z;
+
+  a1.x = arg0[2].vWorldPosition.x - arg0[1].vWorldPosition.x;
+  a1.y = arg0[2].vWorldPosition.y - arg0[1].vWorldPosition.y;
+  a1.z = arg0[2].vWorldPosition.z - arg0[1].vWorldPosition.z;
+
   result = Vec3_float_::Cross(&v1, &v2, a1.x, a1.y, a1.z);
   a1.x = result->x;
   a1.y = result->y;
@@ -926,12 +950,12 @@
     a1.Normalize();
     v12 = a1.y;
     a2->x = a1.x;
-    v13 = v21 * a1.z;
-    v14 = v20 * a1.y;
+    v13 = arg0[0].vWorldPosition.z * a1.z;
+    v14 = arg0[0].vWorldPosition.y * a1.y;
     a2->y = v12;
     a2->z = a1.z;
     result = (Vec3_float_ *)a3;
-    *a3 = -(v13 + v14 + v19 * a1.x);
+    *a3 = -(v13 + v14 + arg0[0].vWorldPosition.x * a1.x);
     return true;
   }
   return false;