Mercurial > mm7
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) -------------------------------------------------------- |