diff Indoor.cpp @ 1344:65379a50e4eb

Portals in indoor (continue)
author Ritor1
date Thu, 11 Jul 2013 17:47:12 +0600
parents 2ddb0af0f437
children b99aeb077d4f
line wrap: on
line diff
--- a/Indoor.cpp	Fri Jul 05 17:37:30 2013 +0600
+++ b/Indoor.cpp	Thu Jul 11 17:47:12 2013 +0600
@@ -768,7 +768,7 @@
             v126 = stru_F8AD28.pDeltaUV[0];
             v128 = stru_F8AD28.pDeltaUV[1];
             v107 = bUseLoResSprites;
-            v7 = sub_423B5D(v1);
+            v7 = GetPortalScreenCoord(v1);
             if ( v7 )
             {
               if ( sub_424829(v7, &stru_F8A590, pBLVRenderParams->field_7C, v1) )
@@ -1352,25 +1352,25 @@
   if (v9 >= 0)
     return;
 
-  auto num_vertices = sub_423B5D(uFaceID);
+  auto num_vertices = GetPortalScreenCoord(uFaceID);
   if (num_vertices < 2)
     return;
 
-  auto face_min_screenspace_x = stru_50B700._screen_space_x[0],
-       face_max_screenspace_x = stru_50B700._screen_space_x[0];
-  auto face_min_screenspace_y = stru_50B700._screen_space_y[0],
-       face_max_screenspace_y = stru_50B700._screen_space_y[0];
+  auto face_min_screenspace_x = PortalFace._screen_space_x[0],
+       face_max_screenspace_x = PortalFace._screen_space_x[0];
+  auto face_min_screenspace_y = PortalFace._screen_space_y[0],
+       face_max_screenspace_y = PortalFace._screen_space_y[0];
   for (uint i = 1; i < num_vertices; ++i)
   {
-    if (face_min_screenspace_x > stru_50B700._screen_space_x[i])
-      face_min_screenspace_x = stru_50B700._screen_space_x[i];
-    if (face_max_screenspace_x < stru_50B700._screen_space_x[i])
-      face_max_screenspace_x = stru_50B700._screen_space_x[i];
-
-    if (face_min_screenspace_y > stru_50B700._screen_space_y[i])
-      face_min_screenspace_y = stru_50B700._screen_space_y[i];
-    if (face_max_screenspace_y < stru_50B700._screen_space_y[i])
-      face_max_screenspace_y = stru_50B700._screen_space_y[i];
+    if (face_min_screenspace_x > PortalFace._screen_space_x[i])
+      face_min_screenspace_x = PortalFace._screen_space_x[i];
+    if (face_max_screenspace_x < PortalFace._screen_space_x[i])
+      face_max_screenspace_x = PortalFace._screen_space_x[i];
+
+    if (face_min_screenspace_y > PortalFace._screen_space_y[i])
+      face_min_screenspace_y = PortalFace._screen_space_y[i];
+    if (face_max_screenspace_y < PortalFace._screen_space_y[i])
+      face_max_screenspace_y = PortalFace._screen_space_y[i];
   }
 	  //_screen_space_x = 719, 568, 493
 	  //savegame: qw , 0Bh and 0x1D4h
@@ -1500,29 +1500,29 @@
       v9 = -v9;
     if ( v9 < 0 )
     {
-      v10 = sub_423B5D(uFaceID);
+      v10 = GetPortalScreenCoord(uFaceID);
       v19 = v10;
       if ( v10 )
       {
-        v11 = stru_50B700._screen_space_x[0];
-        v12 = stru_50B700._screen_space_y[0];
-        v23 = stru_50B700._screen_space_x[0];
+        v11 = PortalFace._screen_space_x[0];
+        v12 = PortalFace._screen_space_y[0];
+        v23 = PortalFace._screen_space_x[0];
         v13 = 1;
-        v22 = stru_50B700._screen_space_y[0];
+        v22 = PortalFace._screen_space_y[0];
         if ( v10 > 1 )
         {
           do
           {
-            v14 = stru_50B700._screen_space_x[v13];
+            v14 = PortalFace._screen_space_x[v13];
             if ( v14 < v23 )
-              v23 = stru_50B700._screen_space_x[v13];
+              v23 = PortalFace._screen_space_x[v13];
             if ( v14 > v11 )
-              v11 = stru_50B700._screen_space_x[v13];
-            v15 = stru_50B700._screen_space_y[v13];
+              v11 = PortalFace._screen_space_x[v13];
+            v15 = PortalFace._screen_space_y[v13];
             if ( v15 < v22 )
-              v22 = stru_50B700._screen_space_y[v13];
+              v22 = PortalFace._screen_space_y[v13];
             if ( v15 > v12 )
-              v12 = stru_50B700._screen_space_y[v13];
+              v12 = PortalFace._screen_space_y[v13];
             v10 = v19;
             ++v13;
           }
@@ -1588,7 +1588,7 @@
       {
         v2 = pBspRenderer->faces[i].uFaceID;
         pBLVRenderParams->field_7C = &pBspRenderer->nodes[pBspRenderer->faces[i].uNodeID].field_C;
-        v3 = sub_423B5D(v2);
+        v3 = GetPortalScreenCoord(v2);
         if ( v3 )
         {
           if ( sub_424829(v3, &stru_F8A590, pBLVRenderParams->field_7C, v1) )
@@ -6910,10 +6910,10 @@
   //return true;
   if ( pNumVertices <= 1 )
     return false;
-  min_y = stru_50B700._screen_space_y[0];
+  min_y = PortalFace._screen_space_y[0];
   v65 = 0;
-  max_y = stru_50B700._screen_space_y[0];
-  if ( !stru_50B700.field_0 )
+  max_y = PortalFace._screen_space_y[0];
+  if ( !PortalFace.direction )
   {
     v63 = 1;
     v64 = -1;
@@ -6926,15 +6926,15 @@
 
   for ( v6 = 1; v6 < pNumVertices; ++v6 )
   {
-    if ( stru_50B700._screen_space_y[v6] >= min_y )
+    if ( PortalFace._screen_space_y[v6] >= min_y )
     {
-      if ( stru_50B700._screen_space_y[v6] > max_y )
-        max_y = stru_50B700._screen_space_y[v6];
+      if ( PortalFace._screen_space_y[v6] > max_y )
+        max_y = PortalFace._screen_space_y[v6];
     }
-    if ( stru_50B700._screen_space_y[v6] < min_y )
+    if ( PortalFace._screen_space_y[v6] < min_y )
     {
       v65 = v6;
-      min_y = stru_50B700._screen_space_y[v6];
+      min_y = PortalFace._screen_space_y[v6];
     }
   }
   if ( max_y == min_y )
@@ -6955,12 +6955,12 @@
     }
     else
       v10 -= pNumVertices;
-    if ( stru_50B700._screen_space_y[v10] <= stru_50B700._screen_space_y[v65] )
+    if ( PortalFace._screen_space_y[v10] <= PortalFace._screen_space_y[v65] )
     {
       v55 = v10;
       v65 = v10;
     }
-    if ( stru_50B700._screen_space_y[v10] == max_y )
+    if ( PortalFace._screen_space_y[v10] == max_y )
       break;
   }
   v13 = v55 + v64;
@@ -6971,11 +6971,11 @@
   }
   else
     v13 -= pNumVertices;
-  if ( stru_50B700._screen_space_y[v13] != stru_50B700._screen_space_y[v55] )
-  {
-    v62 = stru_50B700._screen_space_x[v55] << 16;
-    v54 = ((stru_50B700._screen_space_x[v13] - stru_50B700._screen_space_x[v55]) << 16) / (stru_50B700._screen_space_y[v13] - stru_50B700._screen_space_y[v55]);
-    a2->viewport_left_side[min_y] = LOWORD(stru_50B700._screen_space_x[v55]);
+  if ( PortalFace._screen_space_y[v13] != PortalFace._screen_space_y[v55] )
+  {
+    v62 = PortalFace._screen_space_x[v55] << 16;
+    v54 = ((PortalFace._screen_space_x[v13] - PortalFace._screen_space_x[v55]) << 16) / (PortalFace._screen_space_y[v13] - PortalFace._screen_space_y[v55]);
+    a2->viewport_left_side[min_y] = LOWORD(PortalFace._screen_space_x[v55]);
   }
   v15 = v65;
   v61 = v65;
@@ -6990,12 +6990,12 @@
     }
     else
       v15 -= pNumVertices;
-    if ( stru_50B700._screen_space_y[v15] <= stru_50B700._screen_space_y[v65] )
+    if ( PortalFace._screen_space_y[v15] <= PortalFace._screen_space_y[v65] )
     {
       v61 = v15;
       v65 = v15;
     }
-    if ( stru_50B700._screen_space_y[v15] == max_y )
+    if ( PortalFace._screen_space_y[v15] == max_y )
       break;
   }
   v18 = v63 + v61;
@@ -7008,11 +7008,11 @@
     v18 -= pNumVertices;
   v19 = v18;
   v20 = v61;
-  if ( stru_50B700._screen_space_y[v19] != stru_50B700._screen_space_y[v61] )
-  {
-    v61 = stru_50B700._screen_space_x[v20] << 16;
-    v53 = ((stru_50B700._screen_space_x[v19] - stru_50B700._screen_space_x[v20]) << 16) / stru_50B700._screen_space_y[v19] - stru_50B700._screen_space_y[v20];
-    a2->viewport_right_side[max_y] = LOWORD(stru_50B700._screen_space_x[v20]);
+  if ( PortalFace._screen_space_y[v19] != PortalFace._screen_space_y[v61] )
+  {
+    v61 = PortalFace._screen_space_x[v20] << 16;
+    v53 = ((PortalFace._screen_space_x[v19] - PortalFace._screen_space_x[v20]) << 16) / PortalFace._screen_space_y[v19] - PortalFace._screen_space_y[v20];
+    a2->viewport_right_side[max_y] = LOWORD(PortalFace._screen_space_x[v20]);
   }
   v22 = min_y;
   if ( min_y <= max_y )
@@ -7022,7 +7022,7 @@
     for ( v70 = min_y; v70 <= max_y; ++v70 )
     {
       v24 = v13;
-      if ( v22 >= stru_50B700._screen_space_y[v13] && v22 != max_y )
+      if ( v22 >= PortalFace._screen_space_y[v13] && v22 != max_y )
       {
         v13 = v64 + v13;
         if ( v13 < pNumVertices )
@@ -7033,15 +7033,15 @@
         else
           v13 -= pNumVertices;
         v26 = v13;
-        //v27 = stru_50B700._screen_space_y[v26] - stru_50B700._screen_space_y[v24];
-        if ( stru_50B700._screen_space_y[v26] - stru_50B700._screen_space_y[v24] > 0 )
+        //v27 = PortalFace._screen_space_y[v26] - PortalFace._screen_space_y[v24];
+        if ( PortalFace._screen_space_y[v26] - PortalFace._screen_space_y[v24] > 0 )
         {
-          v54 = ((stru_50B700._screen_space_x[v26] - stru_50B700._screen_space_x[v24]) << 16) / stru_50B700._screen_space_y[v26] - stru_50B700._screen_space_y[v24];
-          v62 = stru_50B700._screen_space_x[v24] << 16;
+          v54 = ((PortalFace._screen_space_x[v26] - PortalFace._screen_space_x[v24]) << 16) / PortalFace._screen_space_y[v26] - PortalFace._screen_space_y[v24];
+          v62 = PortalFace._screen_space_x[v24] << 16;
         }
       }
       v29 = v18;
-      if ( v70 >= stru_50B700._screen_space_y[v18] && v70 != max_y )
+      if ( v70 >= PortalFace._screen_space_y[v18] && v70 != max_y )
       {
         v18 += v63;
         if ( v18 < pNumVertices )
@@ -7052,11 +7052,11 @@
         else
           v18 -= pNumVertices;
         v31 = v18;
-        //v32 = stru_50B700._screen_space_y[v31] - stru_50B700._screen_space_y[v29];
-        if ( stru_50B700._screen_space_y[v31] - stru_50B700._screen_space_y[v29] > 0 )
+        //v32 = PortalFace._screen_space_y[v31] - PortalFace._screen_space_y[v29];
+        if ( PortalFace._screen_space_y[v31] - PortalFace._screen_space_y[v29] > 0 )
         {
-          v53 = ((stru_50B700._screen_space_x[v31] - stru_50B700._screen_space_x[v29]) << 16) / stru_50B700._screen_space_y[v31] - stru_50B700._screen_space_y[v29];
-          v61 = stru_50B700._screen_space_x[v29] << 16;
+          v53 = ((PortalFace._screen_space_x[v31] - PortalFace._screen_space_x[v29]) << 16) / PortalFace._screen_space_y[v31] - PortalFace._screen_space_y[v29];
+          v61 = PortalFace._screen_space_x[v29] << 16;
         }
       }
 	  //v34 = (char *)a2->array_18 - (char *)a2->array_3D8;
@@ -7164,141 +7164,93 @@
   return true;
 }
 //----- (00423B5D) --------------------------------------------------------
-int __fastcall sub_423B5D(unsigned int uFaceID)
+int __fastcall GetPortalScreenCoord(unsigned int uFaceID)
 {
   BLVFace *pFace; // ebx@1
-  //Vec3_short_ *v2; // esi@1
-  //int v3; // ST28_4@1
-  //__int16 v4; // ST2C_2@1
-  //signed int v5; // esi@1
-  //Vec3_short_ *v6; // eax@4
-  //signed int v7; // edi@5
-  //signed int bFound; // eax@5
-  //signed int v9; // ecx@10
-  //int v10; // eax@10
-  //int v11; // edx@11
-  int v12; // ST28_4@12
+  int pNextVertices; // edx@11
+  int t; // ST28_4@12
   signed int v13; // edx@12
   signed __int64 v14; // qtt@12
-  char *v15; // ebx@12
-  int v16; // ST28_4@14
   signed int v17; // eax@14
   signed __int64 v18; // qtt@14
-  signed int v19; // edx@15
   signed int v20; // edx@17
-  signed int v21; // ebx@19
-  signed int v22; // esi@20
-  int v23; // edi@21
-  int v24; // eax@21
   int v25; // eax@22
-  int v26; // eax@22
-  signed int v27; // ST30_4@24
-  signed __int64 v28; // qtt@24
-  int v29; // ST18_4@25
-  int v30; // eax@26
+  int pScreenX; // eax@22
   int v31; // eax@27
-  int v32; // eax@27
-  signed int v33; // ST30_4@29
-  signed __int64 v34; // qtt@29
+  int pScreenY; // eax@27
   int v35; // ST30_4@30
-  signed int v36; // edi@31
-  unsigned int v37; // eax@31
-  bool v38; // edx@31
-  int v39; // ecx@31
-  int v40; // ecx@32
-  int v41; // esi@32
-  int v42; // eax@34
-  signed int v43; // ebx@41
-  unsigned int v44; // eax@41
-  signed int v45; // ecx@42
-  int v46; // esi@42
-  int v47; // eax@44
-  signed int v48; // edi@51
-  unsigned int v49; // eax@51
-  bool v50; // edx@51
-  int v51; // ecx@51
-  int v52; // ecx@52
-  int v53; // esi@52
-  int v54; // eax@54
-  int v55; // ebx@61
-  unsigned int v56; // eax@61
-  signed int v57; // ecx@62
-  int v58; // esi@62
-  int v59; // eax@64
-  char v61; // zf@72
+  signed int left_num_vertices; // edi@31
+  signed int right_num_vertices; // ebx@41
+  signed int top_num_vertices; // edi@51
+  int bottom_num_vertices; // ebx@61
   signed int v62; // edx@75
   int v63; // ecx@76
   int v64; // esi@76
   int v65; // ecx@83
-  //signed int v66; // [sp+14h] [bp-14h]@3
-  int v67; // [sp+14h] [bp-14h]@34
-  int v68; // [sp+14h] [bp-14h]@44
-  int v69; // [sp+14h] [bp-14h]@54
-  int v70; // [sp+14h] [bp-14h]@64
   signed int v71; // [sp+14h] [bp-14h]@75
-  //IndoorCameraD3D *_this; // [sp+18h] [bp-10h]@1
   bool current_vertices_flag; // [sp+18h] [bp-10h]@9
   int thisb; // [sp+18h] [bp-10h]@12
-  int thisc; // [sp+18h] [bp-10h]@20
-  bool thisd; // [sp+18h] [bp-10h]@41
-  bool thise; // [sp+18h] [bp-10h]@61
   int thisf; // [sp+18h] [bp-10h]@74
   signed int depth_num_vertices; // [sp+1Ch] [bp-Ch]@9
   int v80; // [sp+1Ch] [bp-Ch]@76
   bool next_vertices_flag; // [sp+20h] [bp-8h]@10
-  bool v82; // [sp+20h] [bp-8h]@32
-  bool v83; // [sp+20h] [bp-8h]@42
-  bool v84; // [sp+20h] [bp-8h]@52
-  bool v85; // [sp+20h] [bp-8h]@62
-  //signed int v86; // [sp+24h] [bp-4h]@9
-  signed int v87; // [sp+24h] [bp-4h]@19
-  signed int v88; // [sp+24h] [bp-4h]@31
-  signed int v89; // [sp+24h] [bp-4h]@41
   signed int v90; // [sp+24h] [bp-4h]@51
-  signed int v91; // [sp+24h] [bp-4h]@61
 
   pFace = &pIndoor->pFaces[uFaceID];
-  memset(&stru_50B700, 0, sizeof(stru367));
-  //_this = pGame->pIndoorCameraD3D;
-  //v2 = &pIndoor->pVertices[pIndoor->pFaces[uFaceID].pVertexIDs[0]];
-  //v3 = *(_DWORD *)pIndoor->pVertices[pIndoor->pFaces[uFaceID].pVertexIDs[0]].x;
-  //v4 = pIndoor->pVertices[pIndoor->pFaces[uFaceID].pVertexIDs[0]].z;
-  //v5 = 0;
+  memset(&PortalFace, 0, sizeof(stru367));
+
+  //get direction the face(определение направленности фейса)*********************************************************************************
   if ( pFace->pFacePlane_old.vNormal.x * (pIndoor->pVertices[pIndoor->pFaces[uFaceID].pVertexIDs[0]].x - pBLVRenderParams->vPartyPos.x)
      + pFace->pFacePlane_old.vNormal.y * (pIndoor->pVertices[pIndoor->pFaces[uFaceID].pVertexIDs[0]].y - pBLVRenderParams->vPartyPos.y)
      + pFace->pFacePlane_old.vNormal.z * (pIndoor->pVertices[pIndoor->pFaces[uFaceID].pVertexIDs[0]].z - pBLVRenderParams->vPartyPos.z) < 0 )
   {
-    stru_50B700.field_0 = 1;
+    PortalFace.direction = true;
   }
   else
   {
-    stru_50B700.field_0 = 0;
+    PortalFace.direction = false;
     if ( !(pFace->Portal()) )
       return 0;
   }
-  //v66 = pFace->uNumVertices;
+  //*****************************************************************************************************************************************
+  //generate/cinvertetion in camera location coordinates(генерация/конвертирование в координаты пространства камеры)
+
+  //for new coordinates:
+  //int x = 0x AAAA BBBB;
+  //AAAA - integer(целая часть), BBBB - fractional(дробная)
+  //float v = HIWORD(x) + LOWORD(x) / 65535.0f;
+  //0x0351A281 это 849(351 в шестнадцатиричной) в целой части и A281 в дробной(хотя как точно BBBB считалась не помню)
+  //if in HIWORD: FFFF = -1
+  //FFFE = -2
+  //FFFD = -3
+  //....
+  //8000 = -32767
+  //7FFF = 32767
+  //7FFE = 32766
+  //если в LOWORD например лежит FFFF то не совсем понятно, что это
+  //потому что если и hiword и loword равны FFFF FFFF то двойное отрицание как бы, нужно тестировать что конкретно получается чтобы понять что это значит
+  //всё что больше 7FFF для верхнего слова это идёт уже с минусом/Nomad/
+
   if ( (signed int)pFace->uNumVertices > 0 )
   {
     for (uint i = 0; i < pFace->uNumVertices; ++i)
     {
-      //v6 = &pIndoor->pVertices[pFace->pVertexIDs[v5]];
-      pGame->pIndoorCameraD3D->ApplyViewTransform_TrueIfStillVisible(
-        pIndoor->pVertices[pFace->pVertexIDs[i]].x,
-        pIndoor->pVertices[pFace->pVertexIDs[i]].y,
-        pIndoor->pVertices[pFace->pVertexIDs[i]].z,
-        &stru_50B700._view_transformed_xs[i + 3],
-        &stru_50B700._view_transformed_zs[i + 3],
-        &stru_50B700._view_transformed_ys[i + 3],
-        0);
+      pGame->pIndoorCameraD3D->ApplyViewTransform_TrueIfStillVisible(pIndoor->pVertices[pFace->pVertexIDs[i]].x,
+                                                                     pIndoor->pVertices[pFace->pVertexIDs[i]].y,
+                                                                     pIndoor->pVertices[pFace->pVertexIDs[i]].z,
+        &PortalFace._view_transformed_z[i + 3], &PortalFace._view_transformed_x[i + 3], &PortalFace._view_transformed_y[i + 3], 0);
     }
   }
-  //v7 = pFace->uNumVertices;
+  //х: 55681665, 55681665, 53050369, 47787777, 45156481, 45156481
+  //x: 0x0351 a281,0x0351 a281,0x0329 7c01,0x02d9 2f01,0x02b1 0881,0x02b1 0881
+  //*****************************************************************************************************************************************
+  //check vertices for the nearest plane(проверка вершин есть ли в области за ближайшей плоскостью)
   if ( pFace->uNumVertices <= 0 )
     return 0;
   bool bFound = false;
   for (uint i = 0; i < pFace->uNumVertices; ++i)
   {
-    if ( stru_50B700._view_transformed_xs[i + 3] >= 524288 )
+    if ( PortalFace._view_transformed_z[i + 3] >= 524288 )// 8.0(0x80000)
     {
       bFound = true;
       break;
@@ -7306,345 +7258,314 @@
   }
   if ( !bFound )
     return 0;
-
+  //*****************************************************************************************************************************************
+  //check for near clip plane(проверка по ближней границе)
+  //   
+  //     v0                 v1
+  //      ._________________.
+  //     /                   \
+  //    /                     \
+  // v5.                       . v2
+  //   |                       |
+  //   |                       |
+  //   |                       |
+  //  ---------------------------- 8.0(near_clip)
+  //   |                       |
+  //   ._______________________.
+  //  v4                        v3
   depth_num_vertices = 0;
-  stru_50B700._view_transformed_xs[pFace->uNumVertices + 3] = stru_50B700._view_transformed_xs[3];
-  stru_50B700._view_transformed_zs[pFace->uNumVertices + 3] = stru_50B700._view_transformed_zs[3];
-  stru_50B700._view_transformed_ys[pFace->uNumVertices + 3] = stru_50B700._view_transformed_ys[3];
-  current_vertices_flag = stru_50B700._view_transformed_xs[3] >= 524288;
-  //v86 = 1;
+  PortalFace._view_transformed_z[pFace->uNumVertices + 3] = PortalFace._view_transformed_z[3];
+  PortalFace._view_transformed_x[pFace->uNumVertices + 3] = PortalFace._view_transformed_x[3];
+  PortalFace._view_transformed_y[pFace->uNumVertices + 3] = PortalFace._view_transformed_y[3];
+  current_vertices_flag = PortalFace._view_transformed_z[3] >= 524288;// 8.0(0x80000)
   if ( pFace->uNumVertices >= 1 )
   {
     for ( uint i = 1; i <= pFace->uNumVertices; ++i)
     {
-      //v9 = v86;
-      //v10 = stru_50B700._view_transformed_xs[v86 + 3];
-      next_vertices_flag = stru_50B700._view_transformed_xs[i + 3] >= 524288;
-      if ( current_vertices_flag ^ next_vertices_flag )
+      next_vertices_flag = PortalFace._view_transformed_z[i + 3] >= 524288;// 8.0(0x80000)
+      if ( current_vertices_flag ^ next_vertices_flag )//или текущая или следующая вершина за ближней границей
       {
-        //v11 = stru_50B700._view_transformed_xs[i + 2];
-        if ( stru_50B700._view_transformed_xs[i + 3] >= 524288 )
+        if ( next_vertices_flag )//следующая вершина за ближней границей
         {
-          v12 = stru_50B700._view_transformed_xs[i + 3] - stru_50B700._view_transformed_xs[i + 2];
-          v13 = 524288 - stru_50B700._view_transformed_xs[i + 2];
+          v13 = 524288 - PortalFace._view_transformed_z[i + 2];
           LODWORD(v14) = v13 << 16;
           HIDWORD(v14) = v13 >> 16;
-          v15 = (char *)&stru_50B700._view_transformed_ys[i + 2];
-          stru_50B700._view_transformed_zs[depth_num_vertices] = ((unsigned __int64)((stru_50B700._view_transformed_zs[i + 3]
-                                                                     - stru_50B700._view_transformed_zs[i + 2])
-                                                                    * v14
-                                                                    / v12) >> 16)
-                                                + stru_50B700._view_transformed_zs[i + 2];
-          thisb = (unsigned __int64)((stru_50B700._view_transformed_ys[i + 3] - stru_50B700._view_transformed_ys[i + 2])
-                                   * v14
-                                   / v12) >> 16;
+          //t = near_clip - v0.z / v1.z - v0.z
+          t = v14 / PortalFace._view_transformed_z[i + 3] - PortalFace._view_transformed_z[i + 2];
+          //New_x = (v1.x - v0.x)*t + v0.x
+          PortalFace._view_transformed_x[depth_num_vertices] = ((unsigned __int64)((PortalFace._view_transformed_x[i + 3]
+                                                           - PortalFace._view_transformed_x[i + 2]) * t) >> 16) + PortalFace._view_transformed_x[i + 2];
+          //New_y = (v1.y - v0.y)*t + v0.y
+          PortalFace._view_transformed_y[depth_num_vertices] = ((unsigned __int64)((PortalFace._view_transformed_y[i + 3] - PortalFace._view_transformed_y[i + 2])
+                                   * t) >> 16) + PortalFace._view_transformed_y[i + 2];
+          //New_z = 8.0(0x80000)
+          PortalFace._view_transformed_z[depth_num_vertices] = 524288;
         }
-        else
+        else// текущая вершина за ближней границей
         {
-          v16 = stru_50B700._view_transformed_xs[i + 2] - stru_50B700._view_transformed_xs[i + 3];
-          v17 = 524288 - stru_50B700._view_transformed_xs[i + 3];
+          v17 = 524288 - PortalFace._view_transformed_z[i + 3];
           LODWORD(v18) = v17 << 16;
           HIDWORD(v18) = v17 >> 16;
-          v15 = (char *)&stru_50B700._view_transformed_ys[i + 3];
-          stru_50B700._view_transformed_zs[depth_num_vertices] = ((unsigned __int64)((stru_50B700._view_transformed_zs[i + 2]
-                                                                     - stru_50B700._view_transformed_zs[i + 3])
-                                                                    * v18
-                                                                    / v16) >> 16)
-                                                + stru_50B700._view_transformed_zs[i + 3];
-          thisb = (unsigned __int64)((stru_50B700._view_transformed_ys[i + 2] - stru_50B700._view_transformed_ys[i + 3])
-                                   * v18
-                                   / v16) >> 16;
+          //t = near_clip - v1.z / v0.z - v1.z
+          t = v18 / PortalFace._view_transformed_z[i + 2] - PortalFace._view_transformed_z[i + 3];
+          //New_x = (v0.x - v1.x)*t + v1.x
+          PortalFace._view_transformed_x[depth_num_vertices] = ((unsigned __int64)((PortalFace._view_transformed_x[i + 2]
+                                                   - PortalFace._view_transformed_x[i + 3]) * t) >> 16) + PortalFace._view_transformed_x[i + 3];
+          //New_y = (v0.x - v1.y)*t + v1.y
+          PortalFace._view_transformed_y[depth_num_vertices] = ((unsigned __int64)((PortalFace._view_transformed_y[i + 2] - PortalFace._view_transformed_y[i + 3])
+                                   * t) >> 16) + PortalFace._view_transformed_y[i + 3];
+          //New_z = 8.0(0x80000)
+          PortalFace._view_transformed_z[depth_num_vertices] = 524288;
         }
-        v19 = depth_num_vertices++;
-        //v7 = pFace->uNumVertices;
-        stru_50B700._view_transformed_ys[v19] = thisb + *(_DWORD *)v15;
-        stru_50B700._view_transformed_xs[v19] = 524288;
+        depth_num_vertices++;
       }
-      if ( next_vertices_flag )
+      if ( next_vertices_flag )//если следующая вершина за ближней границей 
       {
-        v20 = depth_num_vertices++;
-        stru_50B700._view_transformed_xs[v20] = stru_50B700._view_transformed_xs[i + 3];
-        stru_50B700._view_transformed_zs[v20] = stru_50B700._view_transformed_zs[i + 3];
-        stru_50B700._view_transformed_ys[v20] = stru_50B700._view_transformed_ys[i + 3];
+        pNextVertices = depth_num_vertices++;
+        PortalFace._view_transformed_z[pNextVertices] = PortalFace._view_transformed_z[i + 3];
+        PortalFace._view_transformed_x[pNextVertices] = PortalFace._view_transformed_x[i + 3];
+        PortalFace._view_transformed_y[pNextVertices] = PortalFace._view_transformed_y[i + 3];
       }
       current_vertices_flag = next_vertices_flag;
     }
   }
-
-  v87 = 0;
-  v21 = depth_num_vertices;
-  stru_50B700._view_transformed_xs[depth_num_vertices] = stru_50B700._view_transformed_xs[0];
-  stru_50B700._view_transformed_zs[depth_num_vertices] = stru_50B700._view_transformed_zs[0];
-  for ( stru_50B700._view_transformed_ys[depth_num_vertices] = stru_50B700._view_transformed_ys[0];
-        v87 < depth_num_vertices;
-        stru_50B700._screen_space_y[v22 + 12] = pBLVRenderParams->uViewportCenterY - v35 )
-  {
-    v22 = v87;
-    thisc = abs(stru_50B700._view_transformed_xs[v87]);
-    if ( abs(stru_50B700._view_transformed_zs[v87]) >> 13 <= thisc )
-    {
-      v27 = stru_50B700._view_transformed_zs[v22];
-      LODWORD(v28) = v27 << 16;
-      HIDWORD(v28) = v27 >> 16;
-      v26 = v28 / stru_50B700._view_transformed_xs[v22];
-      v23 = 0;
-    }
+  //результат: нет моргания на границе портала(когда проходим сквозь портал)
+  //************************************************************************************************************************************
+  //convertion in screen coordinates(конвертирование в координаты экрана)
+  PortalFace._view_transformed_z[depth_num_vertices] = PortalFace._view_transformed_z[0];
+  PortalFace._view_transformed_x[depth_num_vertices] = PortalFace._view_transformed_x[0];
+  PortalFace._view_transformed_y[depth_num_vertices] = PortalFace._view_transformed_y[0];
+  for ( uint i = 0; i < depth_num_vertices; ++i )
+  {
+    if ( (abs(PortalFace._view_transformed_x[i]) >> 13) <= abs(PortalFace._view_transformed_z[i]) )
+      pScreenX = fixpoint_div(PortalFace._view_transformed_x[i],  PortalFace._view_transformed_z[i]);
     else
     {
-      v23 = 0;
-      v24 = 0;
-      if ( stru_50B700._view_transformed_zs[v22] >= 0 )
+      if ( PortalFace._view_transformed_x[i] >= 0 )
       {
-        //LOBYTE(v24) = stru_50B700._view_transformed_xs[v22] >= 0;
-        //v26 = ((v24 - 1) & 0xFF800000) + 4194304;
-        if (stru_50B700._view_transformed_xs[v22] >= 0)
-          v26 = 0x400000;   // 64.0
+        if (PortalFace._view_transformed_z[i] >= 0)
+          pScreenX = 0x400000;   // 64.0
         else
-          v26 = 0xFFC00000;
+          pScreenX = 0xFFC00000;  // -63.0
       }
       else
       {
-        //LOBYTE(v24) = stru_50B700._view_transformed_xs[v22] >= 0;
-        //v25 = v24 - 1;
-        //v26 = (v25 & 0x800000) - 4194304;
-        if (stru_50B700._view_transformed_xs[v22] >= 0)
-          v26 = 0xFFC00000;  // -63.0
+        if (PortalFace._view_transformed_z[i] >= 0)
+          pScreenX = 0xFFC00000;  // -63.0
         else
-          v26 = 0x400000;
+          pScreenX = 0x400000; // 64.0
       }
     }
 
-    v29 = stru_50B700._view_transformed_ys[v22];
-    stru_50B700._screen_space_x[v22 + 12] = v26;
-    if ( abs(v29) >> 13 <= thisc )
-    {
-      v33 = stru_50B700._view_transformed_ys[v22];
-      LODWORD(v34) = v33 << 16;
-      HIDWORD(v34) = v33 >> 16;
-      v32 = v34 / stru_50B700._view_transformed_xs[v22];
-    }
+    if ( (abs(PortalFace._view_transformed_y[i]) >> 13) <= abs(PortalFace._view_transformed_z[i]) )
+      pScreenY = fixpoint_div(PortalFace._view_transformed_y[i],  PortalFace._view_transformed_z[i]);
     else
     {
-      v30 = 0;
-      if ( stru_50B700._view_transformed_ys[v22] >= v23 )
+      if ( PortalFace._view_transformed_y[i] >= 0 )
       {
-        //LOBYTE(v30) = stru_50B700._view_transformed_xs[v22] >= v23;
-        //v32 = ((v30 - 1) & 0xFF800000) + 4194304;
-        if (stru_50B700._view_transformed_xs[v22] >= v23)
-          v32 = 0x400000;   // 64.0
+        if (PortalFace._view_transformed_z[i] >= 0)
+          pScreenY = 0x400000;   // 64.0
         else
-          v32 = 0xFFC00000;
+          pScreenY = 0xFFC00000;  // -63.0
       }
       else
       {
-        //LOBYTE(v30) = stru_50B700._view_transformed_xs[v22] >= v23;
-        //v31 = v30 - 1;
-        //v32 = (v31 & 0x800000) - 4194304;
-        if (stru_50B700._view_transformed_xs[v22] >= v23)
-          v32 = 0xFFC00000;  // -63.0
+        if (PortalFace._view_transformed_z[i] >= 0)
+          pScreenY = 0xFFC00000;  // -63.0
         else
-          v32 = 0x400000;
+          pScreenY = 0x400000;  // 64.0
       }
     }
-    stru_50B700._screen_space_y[v22 + 12] = v32;
-    stru_50B700._screen_space_x[v22 + 12] = (unsigned __int64)(SHIWORD(pBLVRenderParams->field_40)
-                                                             * (signed __int64)stru_50B700._screen_space_x[v22 + 12]) >> 16;
-    v35 = (unsigned __int64)(SHIWORD(pBLVRenderParams->field_40) * (signed __int64)stru_50B700._screen_space_y[v22 + 12]) >> 16;
-    stru_50B700._screen_space_x[v22 + 12] = pBLVRenderParams->uViewportCenterX - stru_50B700._screen_space_x[v22 + 12];
-    ++v87;
-  }
-  v36 = 0;
-  stru_50B700._screen_space_x[v21 + 12] = stru_50B700._screen_space_x[12];
-  stru_50B700._screen_space_y[v21 + 12] = stru_50B700._screen_space_y[12];
-  v37 = pBLVRenderParams->uViewportX;
-  v38 = stru_50B700._screen_space_x[12] < (signed int)pBLVRenderParams->uViewportX;
-  LOBYTE(v38) = stru_50B700._screen_space_x[12] >= (signed int)pBLVRenderParams->uViewportX;
-  v39 = 1;
-  v88 = 1;
+    PortalFace._screen_space_x[i + 12] = pBLVRenderParams->uViewportCenterX - ((unsigned __int64)(SHIWORD(pBLVRenderParams->field_40) * (signed __int64)pScreenX) >> 16);
+    PortalFace._screen_space_y[i + 12] = pBLVRenderParams->uViewportCenterY - ((unsigned __int64)(SHIWORD(pBLVRenderParams->field_40) * (signed __int64)pScreenY) >> 16);
+  }
+  //х -34, 4, 61, 83, 83, -34
+  //y 211, 152, 172, 216, 273, 293
+  // результат: при повороте камеры, когда граница портала сдвигается к краю экрана, портал остается прозрачным(видимым)
+  //******************************************************************************************************************************************
+  //check for left_clip plane(порверка по левой границе)
+  left_num_vertices = 0;
+  PortalFace._screen_space_x[depth_num_vertices + 12] = PortalFace._screen_space_x[12];
+  PortalFace._screen_space_y[depth_num_vertices + 12] = PortalFace._screen_space_y[12];
+  current_vertices_flag = PortalFace._screen_space_x[12] >= (signed int)pBLVRenderParams->uViewportX;
   if ( depth_num_vertices < 1 )
     return 0;
-  do
-  {
-    v40 = v39;
-    v41 = stru_50B700._screen_space_x[v40 + 12];
-    v82 = v41 >= (signed int)v37;
-    if ( v38 ^ v82 )
+  for ( uint i = 1; i <= depth_num_vertices; ++i )
+  {
+    next_vertices_flag = PortalFace._screen_space_x[i + 12] >= (signed int)pBLVRenderParams->uViewportX;
+    if ( current_vertices_flag ^ next_vertices_flag )
     {
-      if ( v41 >= (signed int)v37 )
+      if ( next_vertices_flag )
       {
-        v67 = (signed int)(v37 - stru_50B700._screen_space_x[v40 + 11])
-            * (signed __int64)(stru_50B700._screen_space_y[v40 + 12] - stru_50B700._screen_space_y[v40 + 11])
-            / (v41 - stru_50B700._screen_space_x[v40 + 11]);
-        v42 = stru_50B700._screen_space_y[v40 + 11];
+        //t = left_clip - v0.x / v1.x - v0.x
+        t = (signed __int64)(pBLVRenderParams->uViewportX - PortalFace._screen_space_x[i + 11])
+                          / (PortalFace._screen_space_x[i + 12] - PortalFace._screen_space_x[i + 11]);
+        //New_y = (v1.y - v0.y)*t + v0.y
+        PortalFace._screen_space_y[left_num_vertices + 9] = (signed int)(PortalFace._screen_space_y[i + 12]- PortalFace._screen_space_y[i + 11])
+                                                            * t + PortalFace._screen_space_y[i + 11];
+        //New_x = left_clip
+        PortalFace._screen_space_x[left_num_vertices + 9] = pBLVRenderParams->uViewportX;
       }
       else
       {
-        v67 = (signed int)(v37 - v41)
-            * (signed __int64)(stru_50B700._screen_space_y[v40 + 11] - stru_50B700._screen_space_y[v40 + 12])
-            / (stru_50B700._screen_space_x[v40 + 11] - v41);
-        v42 = stru_50B700._screen_space_y[v40 + 12];
+        //t = left_clip - v1.x / v0.x - v1.x
+        t = (signed __int64)(pBLVRenderParams->uViewportX - PortalFace._screen_space_x[i + 12])
+                          / (PortalFace._screen_space_x[i + 11] - PortalFace._screen_space_x[i + 12]);
+        //New_y = (v0.y - v1.y)*t + v1.y
+        PortalFace._screen_space_y[left_num_vertices + 9] = (signed int)( PortalFace._screen_space_y[i + 11] - PortalFace._screen_space_y[i + 12])
+                                                            * t + PortalFace._screen_space_y[i + 12];
+        //New_x = left_clip
+        PortalFace._screen_space_x[left_num_vertices + 9] = pBLVRenderParams->uViewportX;
       }
-      ++v36;
-      stru_50B700._screen_space_y[v36 + 8] = v67 + v42;
-      v37 = pBLVRenderParams->uViewportX;
-      stru_50B700._screen_space_x[v36 + 8] = pBLVRenderParams->uViewportX;
+      left_num_vertices++;
     }
-    v38 = v82;
-    if ( v82 )
+    if ( next_vertices_flag )
     {
-      stru_50B700._screen_space_x[v36 + 9] = stru_50B700._screen_space_x[v40 + 12];
-      stru_50B700._screen_space_y[v36++ + 9] = stru_50B700._screen_space_y[v40 + 12];
+      pNextVertices = left_num_vertices++;
+      PortalFace._screen_space_x[pNextVertices + 9] = PortalFace._screen_space_x[i + 12];
+      PortalFace._screen_space_y[pNextVertices + 9] = PortalFace._screen_space_y[i + 12];
     }
-    v39 = v88++ + 1;
-  }
-  while ( v88 <= depth_num_vertices );
-  if ( !v36
-    || (v43 = 0,
-        stru_50B700._screen_space_x[v36 + 9] = stru_50B700._screen_space_x[9],
-        stru_50B700._screen_space_y[v36 + 9] = stru_50B700._screen_space_y[9],
-        v44 = pBLVRenderParams->uViewportZ,
-        thisd = stru_50B700._screen_space_x[9] <= (signed int)pBLVRenderParams->uViewportZ,
-        v89 = 1,
-        v36 < 1) )
+    current_vertices_flag = next_vertices_flag;
+  }
+//*********************************************************************************************************************************
+//for right_clip plane(проверка по правой плоскости)
+  right_num_vertices = 0;
+  PortalFace._screen_space_x[left_num_vertices + 9] = PortalFace._screen_space_x[9];
+  PortalFace._screen_space_y[left_num_vertices + 9] = PortalFace._screen_space_y[9];
+  current_vertices_flag = PortalFace._screen_space_x[9] <= (signed int)pBLVRenderParams->uViewportZ;
+  if (left_num_vertices < 1)
     return 0;
-  do
-  {
-    v45 = v89;
-    v46 = stru_50B700._screen_space_x[v89 + 9];
-    v83 = v46 <= (signed int)v44;
-    if ( thisd ^ v83 )
+  for ( uint i = 1; i <= left_num_vertices; ++i )
+  {
+    next_vertices_flag = PortalFace._screen_space_x[i + 9] <= (signed int)pBLVRenderParams->uViewportZ;
+    if ( current_vertices_flag ^ next_vertices_flag )
     {
-      if ( v46 <= (signed int)v44 )
+      if ( next_vertices_flag )
       {
-        v68 = (signed int)(v44 - stru_50B700._screen_space_x[v45 + 8])
-            * (signed __int64)(stru_50B700._screen_space_y[v45 + 9] - stru_50B700._screen_space_y[v45 + 8])
-            / (v46 - stru_50B700._screen_space_x[v45 + 8]);
-        v47 = stru_50B700._screen_space_y[v45 + 8];
+        //t = right_clip - v1.x / v0.x - v1.x
+        t = (signed __int64)(pBLVRenderParams->uViewportZ - PortalFace._screen_space_x[i + 9])
+                          / (PortalFace._screen_space_x[i + 8] - PortalFace._screen_space_x[i + 9]);
+        //New_y = (v0.y - v1.y)*t + v1.y
+        PortalFace._screen_space_y[right_num_vertices + 6] = (signed int)(PortalFace._screen_space_y[i + 8] - PortalFace._screen_space_y[i + 9])
+                                                           * t + PortalFace._screen_space_y[i + 9];
+        //New_x = right_clip
+        PortalFace._screen_space_x[right_num_vertices + 6] = pBLVRenderParams->uViewportZ;
       }
       else
       {
-        v68 = (signed int)(v44 - v46)
-            * (signed __int64)(stru_50B700._screen_space_y[v45 + 8] - stru_50B700._screen_space_y[v45 + 9])
-            / (stru_50B700._screen_space_x[v45 + 8] - v46);
-        v47 = stru_50B700._screen_space_y[v45 + 9];
+        //t = right_clip - v0.x / v1.x - v0.x
+        t = (signed __int64)(pBLVRenderParams->uViewportZ - PortalFace._screen_space_x[i + 8])
+                          / (PortalFace._screen_space_x[i + 9] - PortalFace._screen_space_x[i + 8]);
+        //New_y = (v1.y - v0.y)*t + v0.y
+        PortalFace._screen_space_y[right_num_vertices + 6] = (signed int)(PortalFace._screen_space_y[i + 9] - PortalFace._screen_space_y[i + 8])
+                                                           * t + PortalFace._screen_space_y[i + 8];
+        //New_x = right_clip
+        PortalFace._screen_space_x[right_num_vertices + 6] = pBLVRenderParams->uViewportZ;
       }
-      ++v43;
-      stru_50B700._screen_space_y[v43 + 5] = v68 + v47;
-      v44 = pBLVRenderParams->uViewportZ;
-      stru_50B700._screen_space_x[v43 + 5] = pBLVRenderParams->uViewportZ;
+      right_num_vertices++;
     }
-    if ( v83 )
+    if ( next_vertices_flag )
     {
-      stru_50B700._screen_space_x[v43 + 6] = stru_50B700._screen_space_x[v45 + 9];
-      stru_50B700._screen_space_y[v43++ + 6] = stru_50B700._screen_space_y[v45 + 9];
+      pNextVertices = right_num_vertices++;
+      PortalFace._screen_space_x[pNextVertices + 6] = PortalFace._screen_space_x[i + 9];
+      PortalFace._screen_space_y[pNextVertices + 6] = PortalFace._screen_space_y[i + 9];
     }
-    ++v89;
-    thisd = v83;
-  }
-  while ( v89 <= v36 );
-  if ( !v43
-    || (v48 = 0,
-        stru_50B700._screen_space_x[v43 + 6] = stru_50B700._screen_space_x[6],
-        stru_50B700._screen_space_y[v43 + 6] = stru_50B700._screen_space_y[6],
-        v49 = pBLVRenderParams->uViewportY,
-        v50 = stru_50B700._screen_space_y[6] < (signed int)pBLVRenderParams->uViewportY,
-        LOBYTE(v50) = stru_50B700._screen_space_y[6] >= (signed int)pBLVRenderParams->uViewportY,
-        v51 = 1,
-        v90 = 1,
-        v43 < 1) )
+    current_vertices_flag = next_vertices_flag;
+  }
+  //************************************************************************************************************************************
+  // for top clip plane
+  top_num_vertices = 0;
+  PortalFace._screen_space_x[right_num_vertices + 6] = PortalFace._screen_space_x[6];
+  PortalFace._screen_space_y[right_num_vertices + 6] = PortalFace._screen_space_y[6];
+
+  current_vertices_flag = PortalFace._screen_space_y[6] >= (signed int)pBLVRenderParams->uViewportY;
+  if ( right_num_vertices < 1 )
     return 0;
-  do
-  {
-    v52 = v51;
-    v53 = stru_50B700._screen_space_y[v52 + 6];
-    v84 = v53 >= (signed int)v49;
-    if ( v50 ^ v84 )
+  for ( uint i = 1; i <= right_num_vertices; ++i )
+  {
+    next_vertices_flag = PortalFace._screen_space_y[i + 6] >= (signed int)pBLVRenderParams->uViewportY;
+    if ( current_vertices_flag ^ next_vertices_flag )
     {
-      if ( v53 >= (signed int)v49 )
+      if ( next_vertices_flag )
       {
-        v69 = (signed int)(v49 - stru_50B700._screen_space_y[v52 + 5])
-            * (signed __int64)(stru_50B700._screen_space_x[v52 + 6] - stru_50B700._screen_space_x[v52 + 5])
-            / (v53 - stru_50B700._screen_space_y[v52 + 5]);
-        v54 = stru_50B700._screen_space_x[v52 + 5];
+        t = (signed __int64)(pBLVRenderParams->uViewportY  - PortalFace._screen_space_y[i + 5])
+                          / (PortalFace._screen_space_y[i + 6] - PortalFace._screen_space_y[i + 5]);
+        PortalFace._screen_space_x[top_num_vertices + 3] = (signed int)(PortalFace._screen_space_x[i + 6] - PortalFace._screen_space_x[i + 5])
+            * t + PortalFace._screen_space_x[i + 5];
+        PortalFace._screen_space_y[top_num_vertices + 3] = pBLVRenderParams->uViewportY;
       }
       else
       {
-        v69 = (signed int)(v49 - v53)
-            * (signed __int64)(stru_50B700._screen_space_x[v52 + 5] - stru_50B700._screen_space_x[v52 + 6])
-            / (stru_50B700._screen_space_y[v52 + 5] - v53);
-        v54 = stru_50B700._screen_space_x[v52 + 6];
+        t = (signed __int64)(pBLVRenderParams->uViewportY - PortalFace._screen_space_y[i + 6])
+                          / (PortalFace._screen_space_y[i + 5] - PortalFace._screen_space_y[i + 6]);
+        PortalFace._screen_space_x[top_num_vertices + 3] = (signed int)(PortalFace._screen_space_x[i + 5]- PortalFace._screen_space_x[i + 6])
+            * t + PortalFace._screen_space_x[i + 6];
+        PortalFace._screen_space_y[top_num_vertices + 3] = pBLVRenderParams->uViewportY;
       }
-      ++v48;
-      stru_50B700._screen_space_x[v48 + 2] = v69 + v54;
-      v49 = pBLVRenderParams->uViewportY;
-      stru_50B700._screen_space_y[v48 + 2] = pBLVRenderParams->uViewportY;
+      top_num_vertices++;
     }
-    v50 = v84;
-    if ( v84 )
+    current_vertices_flag = next_vertices_flag;
+    if ( next_vertices_flag )
     {
-      stru_50B700._screen_space_x[v48 + 3] = stru_50B700._screen_space_x[v52 + 6];
-      stru_50B700._screen_space_y[v48++ + 3] = stru_50B700._screen_space_y[v52 + 6];
+      pNextVertices = top_num_vertices++;
+      PortalFace._screen_space_x[pNextVertices + 3] = PortalFace._screen_space_x[i + 6];
+      PortalFace._screen_space_y[pNextVertices + 3] = PortalFace._screen_space_y[i + 6];
     }
-    v51 = v90++ + 1;
-  }
-  while ( v90 <= v43 );
-  if ( !v48
-    || (v55 = 0,
-        stru_50B700._screen_space_x[v48 + 3] = stru_50B700._screen_space_x[3],
-        stru_50B700._screen_space_y[v48 + 3] = stru_50B700._screen_space_y[3],
-        v56 = pBLVRenderParams->uViewportW,
-        thise = stru_50B700._screen_space_y[3] <= (signed int)pBLVRenderParams->uViewportW,
-        v91 = 1,
-        v48 < 1) )
+  }
+//**********************************************************************************************************************************
+//for bottom_clip plane(проверка по нижней плоскости)
+  bottom_num_vertices = 0;
+  PortalFace._screen_space_x[top_num_vertices + 3] = PortalFace._screen_space_x[3];
+  PortalFace._screen_space_y[top_num_vertices + 3] = PortalFace._screen_space_y[3];
+  current_vertices_flag = PortalFace._screen_space_y[3] <= (signed int)pBLVRenderParams->uViewportW;
+  if ( top_num_vertices < 1 )
     return 0;
-  do
-  {
-    v57 = v91;
-    v58 = stru_50B700._screen_space_y[v91 + 3];
-    v85 = v58 <= (signed int)v56;
-    if ( thise ^ v85 )
+  for ( uint i =1; i <= top_num_vertices; ++i )
+  {
+    next_vertices_flag = PortalFace._screen_space_y[i + 3] <= (signed int)pBLVRenderParams->uViewportW;
+    if ( current_vertices_flag ^ next_vertices_flag )
     {
-      if ( v58 <= (signed int)v56 )
+      if ( next_vertices_flag )
       {
-        v70 = (signed int)(v56 - stru_50B700._screen_space_y[v57 + 2])
-            * (signed __int64)(stru_50B700._screen_space_x[v57 + 3] - stru_50B700._screen_space_x[v57 + 2])
-            / (v58 - stru_50B700._screen_space_y[v57 + 2]);
-        v59 = stru_50B700._screen_space_x[v57 + 2];
+        t = (signed __int64)(pBLVRenderParams->uViewportW - PortalFace._screen_space_y[i + 3])
+                          / (PortalFace._screen_space_y[i + 2] - PortalFace._screen_space_y[i + 3]);
+        PortalFace._screen_space_x[bottom_num_vertices] = (signed int)(PortalFace._screen_space_x[i + 2] - PortalFace._screen_space_x[i + 3])
+            * t + PortalFace._screen_space_x[i + 3];
+        PortalFace._screen_space_y[bottom_num_vertices] = pBLVRenderParams->uViewportW;
       }
       else
       {
-        v70 = (signed int)(v56 - v58)
-            * (signed __int64)(stru_50B700._screen_space_x[v57 + 2] - stru_50B700._screen_space_x[v57 + 3])
-            / (stru_50B700._screen_space_y[v57 + 2] - v58);
-        v59 = stru_50B700._screen_space_x[v57 + 3];
+        t = (signed __int64)(pBLVRenderParams->uViewportW - PortalFace._screen_space_y[i + 2])
+                          / (PortalFace._screen_space_y[i + 3] - PortalFace._screen_space_y[i + 2]);
+        PortalFace._screen_space_x[bottom_num_vertices] = (signed int)(PortalFace._screen_space_x[i + 3] - PortalFace._screen_space_x[i + 2])
+            * t + PortalFace._screen_space_x[i + 2];
+        PortalFace._screen_space_y[bottom_num_vertices] = pBLVRenderParams->uViewportW;
       }
-      ++v55;
-      //stru_50B700._screen_space_y[v55 + 59] = v70 + v59;
-	  stru_50B700._screen_space_x[v55 - 1] = v70 + v59;
-      v56 = pBLVRenderParams->uViewportW;
-      //stru_50B700._view_transformed_xs[v55 + 47] = pBLVRenderParams->uViewportW;
-	  stru_50B700._screen_space_y[v55 - 1] = pBLVRenderParams->uViewportW;
+      bottom_num_vertices++;
     }
-    if ( v85 )
+    if ( next_vertices_flag )
     {
-      stru_50B700._screen_space_x[v55] = stru_50B700._screen_space_x[v57 + 3];
-      stru_50B700._screen_space_y[v55++] = stru_50B700._screen_space_y[v57 + 3];
+      pNextVertices = bottom_num_vertices++;
+      PortalFace._screen_space_x[pNextVertices] = PortalFace._screen_space_x[i + 3];
+      PortalFace._screen_space_y[pNextVertices] = PortalFace._screen_space_y[i + 3];
     }
-    ++v91;
-    thise = v85;
-  }
-  while ( v91 <= v48 );
-  if ( !v55 )
+    current_vertices_flag = next_vertices_flag;
+  }
+  //out_x: 83,8,8,61,83
+  //out_y: 273,293,152,172,216
+//***************************************************************************************************************************************
+
+  if ( !bottom_num_vertices )
     return 0;
-  v61 = pRenderer->pRenderD3D == 0;
-  stru_50B700._screen_space_x[v55] = stru_50B700._screen_space_x[0];
-  stru_50B700._screen_space_y[v55] = stru_50B700._screen_space_y[0];
-  if ( v61 && v55 > 3 )
-  {
-    stru_50B700._screen_space_x[v55 + 1] = stru_50B700._screen_space_x[1];
-    stru_50B700._screen_space_y[v55 + 1] = stru_50B700._screen_space_y[1];
-    thisf = 2 * (stru_50B700.field_0 != 0) - 1;
-    if ( v55 > 0 )
+  PortalFace._screen_space_x[bottom_num_vertices] = PortalFace._screen_space_x[0];
+  PortalFace._screen_space_y[bottom_num_vertices] = PortalFace._screen_space_y[0];
+//check for software(проверка для софтвар)
+  if ( !pRenderer->pRenderD3D && bottom_num_vertices > 3 )
+  {
+    PortalFace._screen_space_x[bottom_num_vertices + 1] = PortalFace._screen_space_x[1];
+    PortalFace._screen_space_y[bottom_num_vertices + 1] = PortalFace._screen_space_y[1];
+    thisf = PortalFace.direction == true ? 1 : - 1;
+    if ( bottom_num_vertices > 0 )
     {
       v62 = 1;
       v71 = 1;
@@ -7653,17 +7574,16 @@
         v63 = v62 - 1;
         v64 = v62 + 1;
         v80 = v62 + 1;
-        if ( v62 - 1 >= v55 )
-          v63 -= v55;
-        if ( v62 >= v55 )
-          v62 -= v55;
-        if ( v64 >= v55 )
-          v64 -= v55;
-        if ( thisf
-           * ((stru_50B700._screen_space_y[v64] - stru_50B700._screen_space_y[v63])
-            * (stru_50B700._screen_space_x[v62] - stru_50B700._screen_space_x[v63])
-            - (stru_50B700._screen_space_y[v62] - stru_50B700._screen_space_y[v63])
-            * (stru_50B700._screen_space_x[v64] - stru_50B700._screen_space_x[v63])) < 0 )
+        if ( v62 - 1 >= bottom_num_vertices )
+          v63 -= bottom_num_vertices;
+        if ( v62 >= bottom_num_vertices )
+          v62 -= bottom_num_vertices;
+        if ( v64 >= bottom_num_vertices )
+          v64 -= bottom_num_vertices;
+        if ( thisf * ((PortalFace._screen_space_y[v64] - PortalFace._screen_space_y[v63])
+                   * (PortalFace._screen_space_x[v62] - PortalFace._screen_space_x[v63])
+                   - (PortalFace._screen_space_y[v62] - PortalFace._screen_space_y[v63])
+                   * (PortalFace._screen_space_x[v64] - PortalFace._screen_space_x[v63])) < 0 )
         {
           v62 = v80;
           v71 = v80;
@@ -7672,24 +7592,20 @@
         {
           v62 = v71;
           v65 = v71;
-          if ( v71 < v55 || (v65 = v71 - v55, v71 - v55 < v55) )
+          if ( v71 < bottom_num_vertices || (v65 = v71 - bottom_num_vertices, v71 - bottom_num_vertices < bottom_num_vertices) )
           {
-            memcpy(
-              &stru_50B700._screen_space_y[v65],
-              &stru_50B700._screen_space_y[v65 + 1],
-              4 * ((unsigned int)(4 * (v55 - v65)) >> 2));
-            memcpy(
-              &stru_50B700._screen_space_x[v65],
-              &stru_50B700._screen_space_x[v65 + 1],
-              4 * ((unsigned int)(4 * (v55 - v65)) >> 2));
+            memcpy(&PortalFace._screen_space_y[v65], &PortalFace._screen_space_y[v65 + 1],
+              4 * ((unsigned int)(4 * (bottom_num_vertices - v65)) >> 2));
+            memcpy(&PortalFace._screen_space_x[v65], &PortalFace._screen_space_x[v65 + 1],
+              4 * ((unsigned int)(4 * (bottom_num_vertices - v65)) >> 2));
           }
-          --v55;
+          --bottom_num_vertices;
         }
       }
-      while ( v62 - 1 < v55 );
+      while ( v62 - 1 < bottom_num_vertices );
     }
-    stru_50B700._screen_space_x[v55] = stru_50B700._screen_space_x[0];
-    stru_50B700._screen_space_y[v55] = stru_50B700._screen_space_y[0];
-  }
-  return v55;
+    PortalFace._screen_space_x[bottom_num_vertices] = PortalFace._screen_space_x[0];
+    PortalFace._screen_space_y[bottom_num_vertices] = PortalFace._screen_space_y[0];
+  }
+  return bottom_num_vertices;
 }
\ No newline at end of file