comparison Indoor.cpp @ 1376:78671379d8da

PortalFrustrum
author Ritor1
date Tue, 16 Jul 2013 11:55:36 +0600
parents 5572e7b02f45
children 1fb9f4b9b6a7 db3769ae574c
comparison
equal deleted inserted replaced
1373:87155494292c 1376:78671379d8da
61 LEVEL_TYPE uCurrentlyLoadedLevelType = LEVEL_null; 61 LEVEL_TYPE uCurrentlyLoadedLevelType = LEVEL_null;
62 62
63 stru320 stru_F8AD28; // idb 63 stru320 stru_F8AD28; // idb
64 stru337 stru_F81018; 64 stru337 stru_F81018;
65 stru167_wrap array_5118E8; 65 stru167_wrap array_5118E8;
66 BspRenderer_stru2 stru_F8A590; 66 BspRenderer_PortalViewportData stru_F8A590;
67 BspRenderer *pBspRenderer = new BspRenderer; // idb 67 BspRenderer *pBspRenderer = new BspRenderer; // idb
68 stru141 stru_721530; 68 stru141 stru_721530;
69 std::array<stru352, 480> stru_F83B80; 69 std::array<stru352, 480> stru_F83B80;
70 70
71 71
312 IndoorLocation::ExecDraw_d3d(pBspRenderer->faces[i].uFaceID, pBspRenderer->nodes[pBspRenderer->faces[i].uNodeID].std__vector_0007AC, 4, pBspRenderer->nodes[pBspRenderer->faces[i].uNodeID].pPortalBounding); 312 IndoorLocation::ExecDraw_d3d(pBspRenderer->faces[i].uFaceID, pBspRenderer->nodes[pBspRenderer->faces[i].uNodeID].std__vector_0007AC, 4, pBspRenderer->nodes[pBspRenderer->faces[i].uNodeID].pPortalBounding);
313 } 313 }
314 } 314 }
315 else for (uint j = 0; j < pBspRenderer->num_faces; ++j ) 315 else for (uint j = 0; j < pBspRenderer->num_faces; ++j )
316 { 316 {
317 pBLVRenderParams->field_7C = &pBspRenderer->nodes[pBspRenderer->faces[j].uNodeID].field_C; 317 pBLVRenderParams->field_7C = &pBspRenderer->nodes[pBspRenderer->faces[j].uNodeID].PortalScreenData;
318 IndoorLocation::ExecDraw_sw(pBspRenderer->faces[j].uFaceID); 318 IndoorLocation::ExecDraw_sw(pBspRenderer->faces[j].uFaceID);
319 } 319 }
320 } 320 }
321 321
322 //----- (00440BED) -------------------------------------------------------- 322 //----- (00440BED) --------------------------------------------------------
345 v1 = pBLVRenderParams->pRenderTarget; 345 v1 = pBLVRenderParams->pRenderTarget;
346 v7 = 0; 346 v7 = 0;
347 for(int i=0; i < pBspRenderer->num_nodes; i++) 347 for(int i=0; i < pBspRenderer->num_nodes; i++)
348 { 348 {
349 BspRenderer_stru0 *pNode = &pBspRenderer->nodes[i]; 349 BspRenderer_stru0 *pNode = &pBspRenderer->nodes[i];
350 v4 = pRenderer->uTargetSurfacePitch * pNode->field_C._viewport_space_y; 350 v4 = pRenderer->uTargetSurfacePitch * pNode->PortalScreenData._viewport_space_y;
351 if ( pNode->field_C._viewport_space_y <= pNode->field_C._viewport_space_w ) 351 if ( pNode->PortalScreenData._viewport_space_y <= pNode->PortalScreenData._viewport_space_w )
352 { 352 {
353 //v5 = (char *)&pBspRenderer->nodes[0].field_C.array_3D8[pNode->field_C._viewport_space_y + v7]; 353 //v5 = (char *)&pBspRenderer->nodes[0].field_C.array_3D8[pNode->field_C._viewport_space_y + v7];
354 v5 = &pNode->field_C.viewport_right_side[pNode->field_C._viewport_space_y]; 354 v5 = &pNode->PortalScreenData.viewport_right_side[pNode->PortalScreenData._viewport_space_y];
355 v8 = &pNode->field_C.viewport_left_side[pNode->field_C._viewport_space_y]; 355 v8 = &pNode->PortalScreenData.viewport_left_side[pNode->PortalScreenData._viewport_space_y];
356 do 356 do
357 { 357 {
358 v1[v4 + *v8] = 255; 358 v1[v4 + *v8] = 255;
359 ++pNode->field_C._viewport_space_y; 359 ++pNode->PortalScreenData._viewport_space_y;
360 v1[v4 + *v5] = 255; 360 v1[v4 + *v5] = 255;
361 v4 += pRenderer->uTargetSurfacePitch; 361 v4 += pRenderer->uTargetSurfacePitch;
362 ++v5; 362 ++v5;
363 ++v8; 363 ++v8;
364 } 364 }
365 while ( pNode->field_C._viewport_space_y <= pNode->field_C._viewport_space_w ); 365 while ( pNode->PortalScreenData._viewport_space_y <= pNode->PortalScreenData._viewport_space_w );
366 } 366 }
367 } 367 }
368 } 368 }
369 } 369 }
370 } 370 }
1335 nodes[num_nodes].uFaceID = uFaceID; 1335 nodes[num_nodes].uFaceID = uFaceID;
1336 nodes[num_nodes].uViewportX = pBLVRenderParams->uViewportX; 1336 nodes[num_nodes].uViewportX = pBLVRenderParams->uViewportX;
1337 nodes[num_nodes].uViewportZ = pBLVRenderParams->uViewportZ; 1337 nodes[num_nodes].uViewportZ = pBLVRenderParams->uViewportZ;
1338 nodes[num_nodes].uViewportY = pBLVRenderParams->uViewportY; 1338 nodes[num_nodes].uViewportY = pBLVRenderParams->uViewportY;
1339 nodes[num_nodes].uViewportW = pBLVRenderParams->uViewportW; 1339 nodes[num_nodes].uViewportW = pBLVRenderParams->uViewportW;
1340 nodes[num_nodes].field_C.GetViewportData(pBLVRenderParams->uViewportX, pBLVRenderParams->uViewportY, 1340 nodes[num_nodes].PortalScreenData.GetViewportData(pBLVRenderParams->uViewportX, pBLVRenderParams->uViewportY,
1341 pBLVRenderParams->uViewportZ, pBLVRenderParams->uViewportW); 1341 pBLVRenderParams->uViewportZ, pBLVRenderParams->uViewportW);
1342 AddBspNodeToRenderList(++num_nodes - 1); 1342 AddBspNodeToRenderList(++num_nodes - 1);
1343 return; 1343 return;
1344 } 1344 }
1345 } 1345 }
1377 //problem here when standing near/on portal, condition is false because of face_min_screenspace_x > p->uViewportZ 1377 //problem here when standing near/on portal, condition is false because of face_min_screenspace_x > p->uViewportZ
1378 if (face_max_screenspace_x >= nodes[node_id].uViewportX && 1378 if (face_max_screenspace_x >= nodes[node_id].uViewportX &&
1379 face_min_screenspace_x <= nodes[node_id].uViewportZ && 1379 face_min_screenspace_x <= nodes[node_id].uViewportZ &&
1380 face_max_screenspace_y >= nodes[node_id].uViewportY && 1380 face_max_screenspace_y >= nodes[node_id].uViewportY &&
1381 face_min_screenspace_y <= nodes[node_id].uViewportW && 1381 face_min_screenspace_y <= nodes[node_id].uViewportW &&
1382 PortalFrustrum(num_vertices, &nodes[num_nodes].field_C, &nodes[node_id].field_C, uFaceID)) 1382 PortalFrustrum(num_vertices, &nodes[num_nodes].PortalScreenData, &nodes[node_id].PortalScreenData, uFaceID))
1383 { 1383 {
1384 pTransitionSector = pFace->uSectorID; 1384 pTransitionSector = pFace->uSectorID;
1385 if (nodes[node_id].uSectorID == pTransitionSector ) 1385 if (nodes[node_id].uSectorID == pTransitionSector )
1386 pTransitionSector = pFace->uBackSectorID; 1386 pTransitionSector = pFace->uBackSectorID;
1387 nodes[num_nodes].uSectorID = pTransitionSector; 1387 nodes[num_nodes].uSectorID = pTransitionSector;
1479 v3->nodes[v3->num_nodes].uFaceID = uFaceID; 1479 v3->nodes[v3->num_nodes].uFaceID = uFaceID;
1480 v3->nodes[v3->num_nodes].uViewportX = LOWORD(pBLVRenderParams->uViewportX); 1480 v3->nodes[v3->num_nodes].uViewportX = LOWORD(pBLVRenderParams->uViewportX);
1481 v3->nodes[v3->num_nodes].uViewportZ = LOWORD(pBLVRenderParams->uViewportZ); 1481 v3->nodes[v3->num_nodes].uViewportZ = LOWORD(pBLVRenderParams->uViewportZ);
1482 v3->nodes[v3->num_nodes].uViewportY = LOWORD(pBLVRenderParams->uViewportY); 1482 v3->nodes[v3->num_nodes].uViewportY = LOWORD(pBLVRenderParams->uViewportY);
1483 v3->nodes[v3->num_nodes].uViewportW = LOWORD(pBLVRenderParams->uViewportW); 1483 v3->nodes[v3->num_nodes].uViewportW = LOWORD(pBLVRenderParams->uViewportW);
1484 v3->nodes[v3->num_nodes++].field_C.GetViewportData( 1484 v3->nodes[v3->num_nodes++].PortalScreenData.GetViewportData(
1485 SLOWORD(pBLVRenderParams->uViewportX), 1485 SLOWORD(pBLVRenderParams->uViewportX),
1486 pBLVRenderParams->uViewportY, 1486 pBLVRenderParams->uViewportY,
1487 SLOWORD(pBLVRenderParams->uViewportZ), 1487 SLOWORD(pBLVRenderParams->uViewportZ),
1488 pBLVRenderParams->uViewportW); 1488 pBLVRenderParams->uViewportW);
1489 v7 = v3->num_nodes - 1; 1489 v7 = v3->num_nodes - 1;
1530 } 1530 }
1531 if ( v11 >= *((short *)v20 + 2005) 1531 if ( v11 >= *((short *)v20 + 2005)
1532 && v23 <= *((short *)v20 + 2007) 1532 && v23 <= *((short *)v20 + 2007)
1533 && v12 >= *((short *)v20 + 2006) 1533 && v12 >= *((short *)v20 + 2006)
1534 && v22 <= *((short *)v20 + 2008) 1534 && v22 <= *((short *)v20 + 2008)
1535 && PortalFrustrum(v10, &v3->nodes[v3->num_nodes].field_C, (BspRenderer_stru2 *)(v20 + 4020), uFaceID) ) 1535 && PortalFrustrum(v10, &v3->nodes[v3->num_nodes].PortalScreenData, (BspRenderer_PortalViewportData *)(v20 + 4020), uFaceID) )
1536 { 1536 {
1537 v16 = v21->uSectorID; 1537 v16 = v21->uSectorID;
1538 if ( *((short *)v20 + 2004) == v16 ) 1538 if ( *((short *)v20 + 2004) == v16 )
1539 v16 = v21->uBackSectorID; 1539 v16 = v21->uBackSectorID;
1540 v3->nodes[v3->num_nodes].uSectorID = v16; 1540 v3->nodes[v3->num_nodes].uSectorID = v16;
1585 if ( v1 >= 0 ) 1585 if ( v1 >= 0 )
1586 { 1586 {
1587 if ( v1 < (signed int)pIndoor->uNumFaces ) 1587 if ( v1 < (signed int)pIndoor->uNumFaces )
1588 { 1588 {
1589 v2 = pBspRenderer->faces[i].uFaceID; 1589 v2 = pBspRenderer->faces[i].uFaceID;
1590 pBLVRenderParams->field_7C = &pBspRenderer->nodes[pBspRenderer->faces[i].uNodeID].field_C; 1590 pBLVRenderParams->field_7C = &pBspRenderer->nodes[pBspRenderer->faces[i].uNodeID].PortalScreenData;
1591 v3 = GetPortalScreenCoord(v2); 1591 v3 = GetPortalScreenCoord(v2);
1592 if ( v3 ) 1592 if ( v3 )
1593 { 1593 {
1594 if ( PortalFrustrum(v3, &stru_F8A590, pBLVRenderParams->field_7C, v1) ) 1594 if ( PortalFrustrum(v3, &stru_F8A590, pBLVRenderParams->field_7C, v1) )
1595 { 1595 {
5732 pBspRenderer->nodes[0].uSectorID = pBLVRenderParams->uPartySectorID; 5732 pBspRenderer->nodes[0].uSectorID = pBLVRenderParams->uPartySectorID;
5733 pBspRenderer->nodes[0].uViewportW = pBLVRenderParams->uViewportW; 5733 pBspRenderer->nodes[0].uViewportW = pBLVRenderParams->uViewportW;
5734 pBspRenderer->nodes[0].uViewportZ = pBLVRenderParams->uViewportZ; 5734 pBspRenderer->nodes[0].uViewportZ = pBLVRenderParams->uViewportZ;
5735 pBspRenderer->nodes[0].uViewportY = pBLVRenderParams->uViewportY; 5735 pBspRenderer->nodes[0].uViewportY = pBLVRenderParams->uViewportY;
5736 pBspRenderer->nodes[0].uViewportX = pBLVRenderParams->uViewportX; 5736 pBspRenderer->nodes[0].uViewportX = pBLVRenderParams->uViewportX;
5737 pBspRenderer->nodes[0].field_C.GetViewportData(pBLVRenderParams->uViewportX, pBLVRenderParams->uViewportY, 5737 pBspRenderer->nodes[0].PortalScreenData.GetViewportData(pBLVRenderParams->uViewportX, pBLVRenderParams->uViewportY,
5738 pBLVRenderParams->uViewportZ, pBLVRenderParams->uViewportW); 5738 pBLVRenderParams->uViewportZ, pBLVRenderParams->uViewportW);
5739 pBspRenderer->nodes[0].uFaceID = -1; 5739 pBspRenderer->nodes[0].uFaceID = -1;
5740 pBspRenderer->nodes[0].viewing_portal_id = -1; 5740 pBspRenderer->nodes[0].viewing_portal_id = -1;
5741 pBspRenderer->num_nodes = 1; 5741 pBspRenderer->num_nodes = 1;
5742 AddBspNodeToRenderList(0); 5742 AddBspNodeToRenderList(0);
5744 5744
5745 pBspRenderer->MakeVisibleSectorList(); 5745 pBspRenderer->MakeVisibleSectorList();
5746 } 5746 }
5747 5747
5748 //----- (0043F9E1) -------------------------------------------------------- 5748 //----- (0043F9E1) --------------------------------------------------------
5749 void BspRenderer_stru2::GetViewportData(__int16 x, int y, __int16 z, int w) 5749 void BspRenderer_PortalViewportData::GetViewportData(__int16 x, int y, __int16 z, int w)
5750 { 5750 {
5751 _viewport_space_y = y; 5751 _viewport_space_y = y;
5752 _viewport_space_w = w; 5752 _viewport_space_w = w;
5753 5753
5754 for (uint i = 0; i < 480; ++i) 5754 for (uint i = 0; i < 480; ++i)
6829 UpdateActors_BLV(); 6829 UpdateActors_BLV();
6830 BLV_UpdateDoors(); 6830 BLV_UpdateDoors();
6831 check_event_triggers(); 6831 check_event_triggers();
6832 } 6832 }
6833 //----- (00424829) -------------------------------------------------------- 6833 //----- (00424829) --------------------------------------------------------
6834 bool PortalFrustrum(int pNumVertices, BspRenderer_stru2 *a2, BspRenderer_stru2 *a3, int uFaceID) 6834 bool PortalFrustrum(int pNumVertices, BspRenderer_PortalViewportData *far_portal, BspRenderer_PortalViewportData *near_portal, int uFaceID)
6835 { 6835 {
6836 //int v6; // eax@3
6837 int min_y; // esi@5 6836 int min_y; // esi@5
6838 int max_y; // edx@5 6837 int max_y; // edx@5
6839 int current_ID; // eax@12 6838 int current_ID; // eax@12
6840 int v13; // eax@22 6839 int v13; // eax@22
6841 int v15; // ecx@29 6840 int v15; // ecx@29
6863 int v61; // [sp+1Ch] [bp-24h]@29 6862 int v61; // [sp+1Ch] [bp-24h]@29
6864 int v62; // [sp+20h] [bp-20h]@0 6863 int v62; // [sp+20h] [bp-20h]@0
6865 signed int direction1; // [sp+24h] [bp-1Ch]@3 6864 signed int direction1; // [sp+24h] [bp-1Ch]@3
6866 signed int direction2; // [sp+28h] [bp-18h]@3 6865 signed int direction2; // [sp+28h] [bp-18h]@3
6867 int min_y_ID; // [sp+2Ch] [bp-14h]@5 6866 int min_y_ID; // [sp+2Ch] [bp-14h]@5
6868 //int v68; // [sp+34h] [bp-Ch]@12
6869 int v69; // [sp+34h] [bp-Ch]@29 6867 int v69; // [sp+34h] [bp-Ch]@29
6870 int v70; // [sp+34h] [bp-Ch]@46 6868 int v70; // [sp+34h] [bp-Ch]@46
6871 int v71; // [sp+34h] [bp-Ch]@75
6872 int v72; // [sp+34h] [bp-Ch]@80
6873 6869
6874 if ( pNumVertices <= 1 ) 6870 if ( pNumVertices <= 1 )
6875 return false; 6871 return false;
6876 min_y = PortalFace._screen_space_y[0]; 6872 min_y = PortalFace._screen_space_y[0];
6877 min_y_ID = 0; 6873 min_y_ID = 0;
6904 } 6900 }
6905 if ( max_y == min_y ) 6901 if ( max_y == min_y )
6906 return false; 6902 return false;
6907 6903
6908 //***************************************************************************************************************************** 6904 //*****************************************************************************************************************************
6909 a2->_viewport_space_y = min_y; 6905 far_portal->_viewport_space_y = min_y;
6910 a2->_viewport_space_w = max_y; 6906 far_portal->_viewport_space_w = max_y;
6911 current_ID = min_y_ID; 6907 current_ID = min_y_ID;
6912 min_y_ID2 = min_y_ID; 6908 min_y_ID2 = min_y_ID;
6913 6909
6914 for ( uint i = 0; i < pNumVertices; ++i ) 6910 for ( uint i = 0; i < pNumVertices; ++i )
6915 { 6911 {
6940 v13 -= pNumVertices; 6936 v13 -= pNumVertices;
6941 if ( PortalFace._screen_space_y[v13] != PortalFace._screen_space_y[min_y_ID2] ) 6937 if ( PortalFace._screen_space_y[v13] != PortalFace._screen_space_y[min_y_ID2] )
6942 { 6938 {
6943 v62 = PortalFace._screen_space_x[min_y_ID2] << 16; 6939 v62 = PortalFace._screen_space_x[min_y_ID2] << 16;
6944 v54 = ((PortalFace._screen_space_x[v13] - PortalFace._screen_space_x[min_y_ID2]) << 16) / (PortalFace._screen_space_y[v13] - PortalFace._screen_space_y[min_y_ID2]); 6940 v54 = ((PortalFace._screen_space_x[v13] - PortalFace._screen_space_x[min_y_ID2]) << 16) / (PortalFace._screen_space_y[v13] - PortalFace._screen_space_y[min_y_ID2]);
6945 a2->viewport_left_side[min_y] = PortalFace._screen_space_x[min_y_ID2]; 6941 far_portal->viewport_left_side[min_y] = PortalFace._screen_space_x[min_y_ID2];
6946 } 6942 }
6947 //**************************************************************************************************************************************** 6943 //****************************************************************************************************************************************
6948 // 6944 //
6949 v15 = min_y_ID; 6945 v15 = min_y_ID;
6950 v61 = min_y_ID; 6946 v61 = min_y_ID;
6978 v20 = v61; 6974 v20 = v61;
6979 if ( PortalFace._screen_space_y[v19] != PortalFace._screen_space_y[v61] ) 6975 if ( PortalFace._screen_space_y[v19] != PortalFace._screen_space_y[v61] )
6980 { 6976 {
6981 v61 = PortalFace._screen_space_x[v20] << 16; 6977 v61 = PortalFace._screen_space_x[v20] << 16;
6982 v53 = ((PortalFace._screen_space_x[v19] - PortalFace._screen_space_x[v20]) << 16) / PortalFace._screen_space_y[v19] - PortalFace._screen_space_y[v20]; 6978 v53 = ((PortalFace._screen_space_x[v19] - PortalFace._screen_space_x[v20]) << 16) / PortalFace._screen_space_y[v19] - PortalFace._screen_space_y[v20];
6983 a2->viewport_right_side[max_y] = PortalFace._screen_space_x[v20]; 6979 far_portal->viewport_right_side[max_y] = PortalFace._screen_space_x[v20];
6984 } 6980 }
6985 //**************************************************************************************************************************************** 6981 //****************************************************************************************************************************************
6986 v22 = min_y; 6982 v22 = min_y;
6987 if ( min_y <= max_y ) 6983 if ( min_y <= max_y )
6988 { 6984 {
6989 //v56 = &a2->array_3D8[v7];
6990 //v23 = &a2->array_18[v7];
6991 for ( v70 = min_y; v70 <= max_y; ++v70 ) 6985 for ( v70 = min_y; v70 <= max_y; ++v70 )
6992 { 6986 {
6993 v24 = v13; 6987 v24 = v13;
6994 if ( v22 >= PortalFace._screen_space_y[v13] && v22 != max_y ) 6988 if ( v22 >= PortalFace._screen_space_y[v13] && v22 != max_y )
6995 { 6989 {
7000 v13 += pNumVertices; 6994 v13 += pNumVertices;
7001 } 6995 }
7002 else 6996 else
7003 v13 -= pNumVertices; 6997 v13 -= pNumVertices;
7004 v26 = v13; 6998 v26 = v13;
7005 //v27 = PortalFace._screen_space_y[v26] - PortalFace._screen_space_y[v24];
7006 if ( PortalFace._screen_space_y[v26] - PortalFace._screen_space_y[v24] > 0 ) 6999 if ( PortalFace._screen_space_y[v26] - PortalFace._screen_space_y[v24] > 0 )
7007 { 7000 {
7008 v54 = ((PortalFace._screen_space_x[v26] - PortalFace._screen_space_x[v24]) << 16) / PortalFace._screen_space_y[v26] - PortalFace._screen_space_y[v24]; 7001 v54 = ((PortalFace._screen_space_x[v26] - PortalFace._screen_space_x[v24]) << 16) / PortalFace._screen_space_y[v26] - PortalFace._screen_space_y[v24];
7009 v62 = PortalFace._screen_space_x[v24] << 16; 7002 v62 = PortalFace._screen_space_x[v24] << 16;
7010 } 7003 }
7019 v18 += pNumVertices; 7012 v18 += pNumVertices;
7020 } 7013 }
7021 else 7014 else
7022 v18 -= pNumVertices; 7015 v18 -= pNumVertices;
7023 v31 = v18; 7016 v31 = v18;
7024 //v32 = PortalFace._screen_space_y[v31] - PortalFace._screen_space_y[v29];
7025 if ( PortalFace._screen_space_y[v31] - PortalFace._screen_space_y[v29] > 0 ) 7017 if ( PortalFace._screen_space_y[v31] - PortalFace._screen_space_y[v29] > 0 )
7026 { 7018 {
7027 v53 = ((PortalFace._screen_space_x[v31] - PortalFace._screen_space_x[v29]) << 16) / PortalFace._screen_space_y[v31] - PortalFace._screen_space_y[v29]; 7019 v53 = ((PortalFace._screen_space_x[v31] - PortalFace._screen_space_x[v29]) << 16) / PortalFace._screen_space_y[v31] - PortalFace._screen_space_y[v29];
7028 v61 = PortalFace._screen_space_x[v29] << 16; 7020 v61 = PortalFace._screen_space_x[v29] << 16;
7029 } 7021 }
7030 } 7022 }
7031 //v34 = (char *)a2->array_18 - (char *)a2->array_3D8; 7023 far_portal->viewport_left_side[v70] = HIWORD(v62);
7032 //v35 = *(__int16 *)((char *)&a2->array_3D8[v70] + v34); 7024 far_portal->viewport_right_side[v70] = HIWORD(v61);
7033 //v35 = HIWORD(v62); 7025 if ( far_portal->viewport_left_side[v70] > far_portal->viewport_right_side[v70] )
7034 a2->viewport_left_side[v70] = HIWORD(v62); 7026 {
7035 a2->viewport_right_side[v70] = HIWORD(v61); 7027 v36 = far_portal->viewport_left_side[v70] ^ far_portal->viewport_right_side[v70];
7036 //v34 = &a2->array_3D8[v70]; 7028 v37 = far_portal->viewport_right_side[v70];
7037 //v35 = a2->array_3D8[v70]; 7029 far_portal->viewport_left_side[v70] = v36;
7038 if ( a2->viewport_left_side[v70] > a2->viewport_right_side[v70] )
7039 {
7040 v36 = a2->viewport_left_side[v70] ^ a2->viewport_right_side[v70];
7041 v37 = a2->viewport_right_side[v70];
7042 a2->viewport_left_side[v70] = v36;
7043 v38 = v37 ^ v36; 7030 v38 = v37 ^ v36;
7044 a2->viewport_left_side[v70] ^= v38; 7031 far_portal->viewport_left_side[v70] ^= v38;
7045 a2->viewport_right_side[v70] = v38; 7032 far_portal->viewport_right_side[v70] = v38;
7046 } 7033 }
7047 //++v56;
7048 v62 += v54; 7034 v62 += v54;
7049 v22 = v70 + 1; 7035 v22 = v70 + 1;
7050 v61 += v53; 7036 v61 += v53;
7051 //++v23; 7037 }
7052 } 7038 }
7053 } 7039 //*****************************************************************************************************************************
7054 if ( max_y < a3->_viewport_space_y ) 7040 // check portals coordinates and determine max, min(проверка координат порталов и определение макс, мин-ой у)
7041 if ( max_y < near_portal->_viewport_space_y )
7055 return false; 7042 return false;
7056 if ( min_y > a3->_viewport_space_w ) 7043 if ( min_y > near_portal->_viewport_space_w )
7057 return false; 7044 return false;
7058 if ( min_y < a3->_viewport_space_y ) 7045 if ( min_y < near_portal->_viewport_space_y )
7059 min_y = a3->_viewport_space_y; 7046 min_y = near_portal->_viewport_space_y;
7060 if ( max_y > a3->_viewport_space_w ) 7047 if ( max_y > near_portal->_viewport_space_w )
7061 max_y = a3->_viewport_space_w; 7048 max_y = near_portal->_viewport_space_w;
7062 if ( min_y <= max_y ) 7049 if ( min_y <= max_y )
7063 { 7050 {
7064 //a3a = (char *)a2 - (char *)a3; 7051 for ( min_y; min_y <= max_y; ++min_y )
7065 //v42 = &a3->array_3D8[v7]; 7052 {
7066 //v57 = *(__int16 *)((char *)v42 + a3a); 7053 if ( far_portal->viewport_right_side[min_y] >= near_portal->viewport_left_side[min_y]
7067 for ( v71 = min_y; v71 <= max_y; ++v71 ) 7054 && far_portal->viewport_left_side[min_y] <= near_portal->viewport_right_side[min_y] )
7068 {
7069 if ( a2->viewport_left_side[v71] >= a3->viewport_left_side[v71] && a2->viewport_left_side[v71] <= a3->viewport_right_side[v71] )
7070 break; 7055 break;
7071 //++v57;
7072 ++min_y;
7073 //++v42;
7074 } 7056 }
7075 } 7057 }
7076 if ( max_y < min_y ) 7058 if ( max_y < min_y )
7077 return false; 7059 return false;
7078 //a3a = (char *)a2 - (char *)a3; 7060 for ( max_y; max_y >= min_y; --max_y )
7079 //v43 = &a3->array_3D8[v8]; 7061 {
7080 //v58 = *(__int16 *)((char *)v43 + a3a); 7062 if ( far_portal->viewport_right_side[max_y] >= near_portal->viewport_left_side[max_y]
7081 for ( v72 = max_y; v72 >= min_y; --v72 ) 7063 && far_portal->viewport_left_side[max_y] <= near_portal->viewport_right_side[max_y] )
7082 {
7083 if ( a2->viewport_right_side[v72] >= a3->viewport_left_side[v72] && a2->viewport_left_side[v72] <= a3->viewport_right_side[v72] )
7084 break; 7064 break;
7085 //--v58;
7086 --max_y;
7087 //--v43;
7088 //v8 = v8;
7089 } 7065 }
7090 if ( min_y >= max_y ) 7066 if ( min_y >= max_y )
7091 return false; 7067 return false;// incorect working portal faceID 1105(не доконца корректно работает портал фейс 1105 под определённым углом)
7092 //a3b = (char *)a3 - (char *)a2; 7068 //*************************************************************************************************************************************
7093 v59 = min_y; 7069 v59 = min_y;
7094 //v45 = &a2->array_18[v7];
7095
7096 for ( v46 = max_y - min_y + 1; v46; --v46 ) 7070 for ( v46 = max_y - min_y + 1; v46; --v46 )
7097 { 7071 {
7098 //v47 = *(__int16 *)((char *)v45 + a3b); 7072 if ( far_portal->viewport_left_side[v59] < near_portal->viewport_left_side[v59] )
7099 if ( a2->viewport_left_side[v59] < a3->viewport_left_side[v59] ) 7073 far_portal->viewport_left_side[v59] = near_portal->viewport_left_side[v59];
7100 a2->viewport_left_side[v59] = a3->viewport_left_side[v59]; 7074 if ( far_portal->viewport_right_side[v59] > near_portal->viewport_right_side[v59] )
7101 if ( a2->viewport_right_side[v59] > a3->viewport_right_side[v59] ) 7075 far_portal->viewport_right_side[v59] = near_portal->viewport_right_side[v59];
7102 a2->viewport_right_side[v59] = a3->viewport_right_side[v59];
7103 ++v59; 7076 ++v59;
7104 //++v45; 7077 }
7105 } 7078 far_portal->_viewport_space_y = min_y;
7106 a2->_viewport_space_y = min_y; 7079 far_portal->_viewport_space_w = max_y;
7107 a2->_viewport_space_w = max_y; 7080 far_portal->_viewport_space_x = far_portal->viewport_left_side[min_y];
7108 a2->field_8 = a2->viewport_left_side[min_y]; 7081 far_portal->_viewport_x_minID = min_y;
7109 //v48 = a2->viewport_right_side[v7]; 7082 far_portal->_viewport_z_maxID = min_y;
7110 a2->field_10 = min_y; 7083 far_portal->_viewport_space_z = far_portal->viewport_right_side[min_y];
7111 a2->field_14 = min_y;
7112 a2->field_C = a2->viewport_right_side[min_y];
7113 v49 = min_y + 1; 7084 v49 = min_y + 1;
7114 if ( v49 <= max_y ) 7085 if ( v49 <= max_y )
7115 { 7086 {
7116 //v50 = &a2->array_3D8[v49];
7117 for ( v49; v49 <= max_y; ++v49 ) 7087 for ( v49; v49 <= max_y; ++v49 )
7118 { 7088 {
7119 //v51 = a2->array_18[v49]; 7089 if ( far_portal->viewport_left_side[v49] < far_portal->_viewport_space_x )
7120 if ( a2->viewport_left_side[v49] < a2->field_8 ) 7090 {
7121 { 7091 far_portal->_viewport_space_x = far_portal->viewport_left_side[v49];
7122 a2->field_8 = a2->viewport_left_side[v49]; 7092 far_portal->_viewport_x_minID = v49;
7123 a2->field_10 = v49; 7093 }
7124 } 7094 if ( far_portal->viewport_right_side[v49] > far_portal->_viewport_space_z )
7125 if ( a2->viewport_right_side[v49] > a2->field_C ) 7095 {
7126 { 7096 far_portal->_viewport_space_z = far_portal->viewport_right_side[v49];
7127 a2->field_C = a2->viewport_right_side[v49]; 7097 far_portal->_viewport_z_maxID = v49;
7128 a2->field_14 = v49; 7098 }
7129 }
7130 //++v50;
7131 } 7099 }
7132 } 7100 }
7133 return true; 7101 return true;
7134 } 7102 }
7135 //----- (00423B5D) -------------------------------------------------------- 7103 //----- (00423B5D) --------------------------------------------------------