Mercurial > mm7
changeset 1389:4dc34f7acb0b
Merge
author | Grumpy7 |
---|---|
date | Wed, 17 Jul 2013 00:40:15 +0200 |
parents | 60d4885eb107 (current diff) 729635c2bb40 (diff) |
children | 613c77e51e38 |
files | |
diffstat | 4 files changed, 88 insertions(+), 115 deletions(-) [+] |
line wrap: on
line diff
--- a/Indoor.cpp Wed Jul 17 00:39:37 2013 +0200 +++ b/Indoor.cpp Wed Jul 17 00:40:15 2013 +0200 @@ -63,7 +63,7 @@ stru320 stru_F8AD28; // idb stru337 stru_F81018; stru167_wrap array_5118E8; -BspRenderer_stru2 stru_F8A590; +BspRenderer_PortalViewportData stru_F8A590; BspRenderer *pBspRenderer = new BspRenderer; // idb stru141 stru_721530; std::array<stru352, 480> stru_F83B80; @@ -314,7 +314,7 @@ } else for (uint j = 0; j < pBspRenderer->num_faces; ++j ) { - pBLVRenderParams->field_7C = &pBspRenderer->nodes[pBspRenderer->faces[j].uNodeID].field_C; + pBLVRenderParams->field_7C = &pBspRenderer->nodes[pBspRenderer->faces[j].uNodeID].PortalScreenData; IndoorLocation::ExecDraw_sw(pBspRenderer->faces[j].uFaceID); } } @@ -347,22 +347,22 @@ for(int i=0; i < pBspRenderer->num_nodes; i++) { BspRenderer_stru0 *pNode = &pBspRenderer->nodes[i]; - v4 = pRenderer->uTargetSurfacePitch * pNode->field_C._viewport_space_y; - if ( pNode->field_C._viewport_space_y <= pNode->field_C._viewport_space_w ) + v4 = pRenderer->uTargetSurfacePitch * pNode->PortalScreenData._viewport_space_y; + if ( pNode->PortalScreenData._viewport_space_y <= pNode->PortalScreenData._viewport_space_w ) { //v5 = (char *)&pBspRenderer->nodes[0].field_C.array_3D8[pNode->field_C._viewport_space_y + v7]; - v5 = &pNode->field_C.viewport_right_side[pNode->field_C._viewport_space_y]; - v8 = &pNode->field_C.viewport_left_side[pNode->field_C._viewport_space_y]; + v5 = &pNode->PortalScreenData.viewport_right_side[pNode->PortalScreenData._viewport_space_y]; + v8 = &pNode->PortalScreenData.viewport_left_side[pNode->PortalScreenData._viewport_space_y]; do { v1[v4 + *v8] = 255; - ++pNode->field_C._viewport_space_y; + ++pNode->PortalScreenData._viewport_space_y; v1[v4 + *v5] = 255; v4 += pRenderer->uTargetSurfacePitch; ++v5; ++v8; } - while ( pNode->field_C._viewport_space_y <= pNode->field_C._viewport_space_w ); + while ( pNode->PortalScreenData._viewport_space_y <= pNode->PortalScreenData._viewport_space_w ); } } } @@ -1337,7 +1337,7 @@ nodes[num_nodes].uViewportZ = pBLVRenderParams->uViewportZ; nodes[num_nodes].uViewportY = pBLVRenderParams->uViewportY; nodes[num_nodes].uViewportW = pBLVRenderParams->uViewportW; - nodes[num_nodes].field_C.GetViewportData(pBLVRenderParams->uViewportX, pBLVRenderParams->uViewportY, + nodes[num_nodes].PortalScreenData.GetViewportData(pBLVRenderParams->uViewportX, pBLVRenderParams->uViewportY, pBLVRenderParams->uViewportZ, pBLVRenderParams->uViewportW); AddBspNodeToRenderList(++num_nodes - 1); return; @@ -1379,7 +1379,7 @@ face_min_screenspace_x <= nodes[node_id].uViewportZ && face_max_screenspace_y >= nodes[node_id].uViewportY && face_min_screenspace_y <= nodes[node_id].uViewportW && - PortalFrustrum(num_vertices, &nodes[num_nodes].field_C, &nodes[node_id].field_C, uFaceID)) + PortalFrustrum(num_vertices, &nodes[num_nodes].PortalScreenData, &nodes[node_id].PortalScreenData, uFaceID)) { pTransitionSector = pFace->uSectorID; if (nodes[node_id].uSectorID == pTransitionSector ) @@ -1481,7 +1481,7 @@ v3->nodes[v3->num_nodes].uViewportZ = LOWORD(pBLVRenderParams->uViewportZ); v3->nodes[v3->num_nodes].uViewportY = LOWORD(pBLVRenderParams->uViewportY); v3->nodes[v3->num_nodes].uViewportW = LOWORD(pBLVRenderParams->uViewportW); - v3->nodes[v3->num_nodes++].field_C.GetViewportData( + v3->nodes[v3->num_nodes++].PortalScreenData.GetViewportData( SLOWORD(pBLVRenderParams->uViewportX), pBLVRenderParams->uViewportY, SLOWORD(pBLVRenderParams->uViewportZ), @@ -1532,7 +1532,7 @@ && v23 <= *((short *)v20 + 2007) && v12 >= *((short *)v20 + 2006) && v22 <= *((short *)v20 + 2008) - && PortalFrustrum(v10, &v3->nodes[v3->num_nodes].field_C, (BspRenderer_stru2 *)(v20 + 4020), uFaceID) ) + && PortalFrustrum(v10, &v3->nodes[v3->num_nodes].PortalScreenData, (BspRenderer_PortalViewportData *)(v20 + 4020), uFaceID) ) { v16 = v21->uSectorID; if ( *((short *)v20 + 2004) == v16 ) @@ -1587,7 +1587,7 @@ if ( v1 < (signed int)pIndoor->uNumFaces ) { v2 = pBspRenderer->faces[i].uFaceID; - pBLVRenderParams->field_7C = &pBspRenderer->nodes[pBspRenderer->faces[i].uNodeID].field_C; + pBLVRenderParams->field_7C = &pBspRenderer->nodes[pBspRenderer->faces[i].uNodeID].PortalScreenData; v3 = GetPortalScreenCoord(v2); if ( v3 ) { @@ -5734,7 +5734,7 @@ pBspRenderer->nodes[0].uViewportZ = pBLVRenderParams->uViewportZ; pBspRenderer->nodes[0].uViewportY = pBLVRenderParams->uViewportY; pBspRenderer->nodes[0].uViewportX = pBLVRenderParams->uViewportX; - pBspRenderer->nodes[0].field_C.GetViewportData(pBLVRenderParams->uViewportX, pBLVRenderParams->uViewportY, + pBspRenderer->nodes[0].PortalScreenData.GetViewportData(pBLVRenderParams->uViewportX, pBLVRenderParams->uViewportY, pBLVRenderParams->uViewportZ, pBLVRenderParams->uViewportW); pBspRenderer->nodes[0].uFaceID = -1; pBspRenderer->nodes[0].viewing_portal_id = -1; @@ -5746,7 +5746,7 @@ } //----- (0043F9E1) -------------------------------------------------------- -void BspRenderer_stru2::GetViewportData(__int16 x, int y, __int16 z, int w) +void BspRenderer_PortalViewportData::GetViewportData(__int16 x, int y, __int16 z, int w) { _viewport_space_y = y; _viewport_space_w = w; @@ -6831,9 +6831,9 @@ check_event_triggers(); } //----- (00424829) -------------------------------------------------------- -bool PortalFrustrum(int pNumVertices, BspRenderer_stru2 *a2, BspRenderer_stru2 *a3, int uFaceID) +// Finds out if current portal can be seen through the previous portal +bool PortalFrustrum(int pNumVertices, BspRenderer_PortalViewportData *far_portal, BspRenderer_PortalViewportData *near_portal, int uFaceID) { - //int v6; // eax@3 int min_y; // esi@5 int max_y; // edx@5 int current_ID; // eax@12 @@ -6852,7 +6852,7 @@ int v34; // eax@66 int v35; // dx@66 __int16 v36; // dx@67 - __int16 v37; // di@67 + //__int16 v37; // di@67 __int16 v38; // dx@67 int v46; // edx@87 int v49; // esi@93 @@ -6865,11 +6865,8 @@ signed int direction1; // [sp+24h] [bp-1Ch]@3 signed int direction2; // [sp+28h] [bp-18h]@3 int min_y_ID; // [sp+2Ch] [bp-14h]@5 - //int v68; // [sp+34h] [bp-Ch]@12 int v69; // [sp+34h] [bp-Ch]@29 int v70; // [sp+34h] [bp-Ch]@46 - int v71; // [sp+34h] [bp-Ch]@75 - int v72; // [sp+34h] [bp-Ch]@80 if ( pNumVertices <= 1 ) return false; @@ -6891,23 +6888,22 @@ //get min and max y for portal(дать минимальное и максимальное значение y для портала) for ( uint i = 1; i < pNumVertices; ++i ) { - if ( PortalFace._screen_space_y[i] >= min_y ) - { - if ( PortalFace._screen_space_y[i] > max_y ) - max_y = PortalFace._screen_space_y[i]; - } - else + if (PortalFace._screen_space_y[i] < min_y) { min_y_ID = i; min_y = PortalFace._screen_space_y[i]; } + else if (PortalFace._screen_space_y[i] > max_y) + { + max_y = PortalFace._screen_space_y[i]; + } } if ( max_y == min_y ) return false; //***************************************************************************************************************************** - a2->_viewport_space_y = min_y; - a2->_viewport_space_w = max_y; + far_portal->_viewport_space_y = min_y; + far_portal->_viewport_space_w = max_y; current_ID = min_y_ID; min_y_ID2 = min_y_ID; @@ -6941,8 +6937,9 @@ if ( PortalFace._screen_space_y[v13] != PortalFace._screen_space_y[min_y_ID2] ) { v62 = PortalFace._screen_space_x[min_y_ID2] << 16; - 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]); - a2->viewport_left_side[min_y] = PortalFace._screen_space_x[min_y_ID2]; + 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]); + far_portal->viewport_left_side[min_y] = (short)PortalFace._screen_space_x[min_y_ID2]; } //**************************************************************************************************************************************** // @@ -6979,15 +6976,14 @@ 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] = PortalFace._screen_space_x[v20]; + v53 = ((PortalFace._screen_space_x[v19] - PortalFace._screen_space_x[v20]) << 16) / + (PortalFace._screen_space_y[v19] - PortalFace._screen_space_y[v20]); + far_portal->viewport_right_side[max_y] = (short)PortalFace._screen_space_x[v20]; } //**************************************************************************************************************************************** v22 = min_y; if ( min_y <= max_y ) { - //v56 = &a2->array_3D8[v7]; - //v23 = &a2->array_18[v7]; for ( v70 = min_y; v70 <= max_y; ++v70 ) { v24 = v13; @@ -7002,10 +6998,9 @@ else v13 -= pNumVertices; v26 = v13; - //v27 = PortalFace._screen_space_y[v26] - PortalFace._screen_space_y[v24]; if ( PortalFace._screen_space_y[v26] - PortalFace._screen_space_y[v24] > 0 ) { - v54 = ((PortalFace._screen_space_x[v26] - PortalFace._screen_space_x[v24]) << 16) / PortalFace._screen_space_y[v26] - PortalFace._screen_space_y[v24]; + 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; } } @@ -7021,113 +7016,88 @@ else v18 -= pNumVertices; v31 = v18; - //v32 = PortalFace._screen_space_y[v31] - PortalFace._screen_space_y[v29]; if ( PortalFace._screen_space_y[v31] - PortalFace._screen_space_y[v29] > 0 ) { - v53 = ((PortalFace._screen_space_x[v31] - PortalFace._screen_space_x[v29]) << 16) / PortalFace._screen_space_y[v31] - PortalFace._screen_space_y[v29]; + 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; - //v35 = *(__int16 *)((char *)&a2->array_3D8[v70] + v34); - //v35 = HIWORD(v62); - a2->viewport_left_side[v70] = HIWORD(v62); - a2->viewport_right_side[v70] = HIWORD(v61); - //v34 = &a2->array_3D8[v70]; - //v35 = a2->array_3D8[v70]; - if ( a2->viewport_left_side[v70] > a2->viewport_right_side[v70] ) + far_portal->viewport_left_side[v70] = HIWORD(v62); + far_portal->viewport_right_side[v70] = HIWORD(v61); + if ( far_portal->viewport_left_side[v70] > far_portal->viewport_right_side[v70] ) { - v36 = a2->viewport_left_side[v70] ^ a2->viewport_right_side[v70]; - v37 = a2->viewport_right_side[v70]; - a2->viewport_left_side[v70] = v36; - v38 = v37 ^ v36; - a2->viewport_left_side[v70] ^= v38; - a2->viewport_right_side[v70] = v38; + v36 = far_portal->viewport_left_side[v70] ^ far_portal->viewport_right_side[v70]; + //v37 = far_portal->viewport_right_side[v70]; + far_portal->viewport_left_side[v70] = v36; + v38 = far_portal->viewport_right_side[v70] ^ v36; + far_portal->viewport_left_side[v70] ^= v38; + far_portal->viewport_right_side[v70] = v38; } - //++v56; v62 += v54; v22 = v70 + 1; v61 += v53; - //++v23; } } - if ( max_y < a3->_viewport_space_y ) + //***************************************************************************************************************************** + // check portals coordinates and determine max, min(проверка координат порталов и определение макс, мин-ой у) + if ( max_y < near_portal->_viewport_space_y ) return false; - if ( min_y > a3->_viewport_space_w ) + if ( min_y > near_portal->_viewport_space_w ) return false; - if ( min_y < a3->_viewport_space_y ) - min_y = a3->_viewport_space_y; - if ( max_y > a3->_viewport_space_w ) - max_y = a3->_viewport_space_w; + if ( min_y < near_portal->_viewport_space_y ) + min_y = near_portal->_viewport_space_y; + if ( max_y > near_portal->_viewport_space_w ) + max_y = near_portal->_viewport_space_w; if ( min_y <= max_y ) { - //a3a = (char *)a2 - (char *)a3; - //v42 = &a3->array_3D8[v7]; - //v57 = *(__int16 *)((char *)v42 + a3a); - for ( v71 = min_y; v71 <= max_y; ++v71 ) + for ( min_y; min_y <= max_y; ++min_y ) { - if ( a2->viewport_left_side[v71] >= a3->viewport_left_side[v71] && a2->viewport_left_side[v71] <= a3->viewport_right_side[v71] ) + if ( far_portal->viewport_right_side[min_y] >= near_portal->viewport_left_side[min_y] + && far_portal->viewport_left_side[min_y] <= near_portal->viewport_right_side[min_y] ) break; - //++v57; - ++min_y; - //++v42; } } if ( max_y < min_y ) return false; - //a3a = (char *)a2 - (char *)a3; - //v43 = &a3->array_3D8[v8]; - //v58 = *(__int16 *)((char *)v43 + a3a); - for ( v72 = max_y; v72 >= min_y; --v72 ) - { - if ( a2->viewport_right_side[v72] >= a3->viewport_left_side[v72] && a2->viewport_left_side[v72] <= a3->viewport_right_side[v72] ) + for ( max_y; max_y >= min_y; --max_y ) + { + if ( far_portal->viewport_right_side[max_y] >= near_portal->viewport_left_side[max_y] + && far_portal->viewport_left_side[max_y] <= near_portal->viewport_right_side[max_y] ) break; - //--v58; - --max_y; - //--v43; - //v8 = v8; } if ( min_y >= max_y ) - return false; - //a3b = (char *)a3 - (char *)a2; + return false;// incorect working portal faceID 1105(не до конца корректно работает портал фейс 1105 под определённым углом) + //************************************************************************************************************************************* v59 = min_y; - //v45 = &a2->array_18[v7]; - for ( v46 = max_y - min_y + 1; v46; --v46 ) { - //v47 = *(__int16 *)((char *)v45 + a3b); - if ( a2->viewport_left_side[v59] < a3->viewport_left_side[v59] ) - a2->viewport_left_side[v59] = a3->viewport_left_side[v59]; - if ( a2->viewport_right_side[v59] > a3->viewport_right_side[v59] ) - a2->viewport_right_side[v59] = a3->viewport_right_side[v59]; + if ( far_portal->viewport_left_side[v59] < near_portal->viewport_left_side[v59] ) + far_portal->viewport_left_side[v59] = near_portal->viewport_left_side[v59]; + if ( far_portal->viewport_right_side[v59] > near_portal->viewport_right_side[v59] ) + far_portal->viewport_right_side[v59] = near_portal->viewport_right_side[v59]; ++v59; - //++v45; - } - a2->_viewport_space_y = min_y; - a2->_viewport_space_w = max_y; - a2->field_8 = a2->viewport_left_side[min_y]; - //v48 = a2->viewport_right_side[v7]; - a2->field_10 = min_y; - a2->field_14 = min_y; - a2->field_C = a2->viewport_right_side[min_y]; + } + far_portal->_viewport_space_y = min_y; + far_portal->_viewport_space_w = max_y; + far_portal->_viewport_space_x = far_portal->viewport_left_side[min_y]; + far_portal->_viewport_space_z = far_portal->viewport_right_side[min_y]; + far_portal->_viewport_x_minID = min_y; + far_portal->_viewport_z_maxID = min_y; v49 = min_y + 1; if ( v49 <= max_y ) { - //v50 = &a2->array_3D8[v49]; for ( v49; v49 <= max_y; ++v49 ) { - //v51 = a2->array_18[v49]; - if ( a2->viewport_left_side[v49] < a2->field_8 ) + if ( far_portal->viewport_left_side[v49] < far_portal->_viewport_space_x ) { - a2->field_8 = a2->viewport_left_side[v49]; - a2->field_10 = v49; + far_portal->_viewport_space_x = far_portal->viewport_left_side[v49]; + far_portal->_viewport_x_minID = v49; } - if ( a2->viewport_right_side[v49] > a2->field_C ) + if ( far_portal->viewport_right_side[v49] > far_portal->_viewport_space_z ) { - a2->field_C = a2->viewport_right_side[v49]; - a2->field_14 = v49; + far_portal->_viewport_space_z = far_portal->viewport_right_side[v49]; + far_portal->_viewport_z_maxID = v49; } - //++v50; } } return true; @@ -7332,6 +7302,9 @@ } // результат: при повороте камеры, когда граница портала сдвигается к краю экрана, портал остается прозрачным(видимым) //****************************************************************************************************************************************** + //координаты как в Ида-базе игры так и в данном проекте перевёрнутые,т.е. портал который в правой части экрана имеет экранные координаты + //которые для левой части экрана. Например, x(оригинал) = 8, у нас х = 468(противоположный край экрана), точно также и с у. + // //check for left_clip plane(порверка по левой границе) left_num_vertices = 0; PortalFace._screen_space_x[depth_num_vertices + 12] = PortalFace._screen_space_x[12];
--- a/Indoor.h Wed Jul 17 00:39:37 2013 +0200 +++ b/Indoor.h Wed Jul 17 00:40:15 2013 +0200 @@ -561,7 +561,7 @@ int field_70; int uViewportCenterX; int uViewportCenterY; - struct BspRenderer_stru2 *field_7C; + struct BspRenderer_PortalViewportData *field_7C; unsigned int uNumFacesRenderedThisFrame; int field_84; int field_88;
--- a/Indoor_stuff.h Wed Jul 17 00:39:37 2013 +0200 +++ b/Indoor_stuff.h Wed Jul 17 00:40:15 2013 +0200 @@ -6,21 +6,21 @@ /* 165 */ #pragma pack(push, 1) -struct BspRenderer_stru2 +struct BspRenderer_PortalViewportData { void GetViewportData(__int16 x, int y, __int16 z, int w); int _viewport_space_y; int _viewport_space_w; - int field_8; - int field_C; - int field_10; - int field_14; + int _viewport_space_x; + int _viewport_space_z; + int _viewport_x_minID; + int _viewport_z_maxID; __int16 viewport_left_side[480]; __int16 viewport_right_side[480]; }; #pragma pack(pop) -extern BspRenderer_stru2 stru_F8A590; +extern BspRenderer_PortalViewportData stru_F8A590; @@ -51,7 +51,7 @@ unsigned __int16 uViewportZ; unsigned __int16 uViewportW; __int16 field_A; - BspRenderer_stru2 field_C; + BspRenderer_PortalViewportData PortalScreenData; unsigned __int16 uFaceID; __int16 field_7A6; unsigned int viewing_portal_id; // portal through which we're seeing this node
--- a/mm7_data.h Wed Jul 17 00:39:37 2013 +0200 +++ b/mm7_data.h Wed Jul 17 00:40:15 2013 +0200 @@ -1151,7 +1151,7 @@ void __cdecl sub_423B4A(); int __fastcall GetPortalScreenCoord(unsigned int uFaceID); signed int __fastcall sub_424579(int uFaceID, struct stru320 *a2); -bool PortalFrustrum(int pNumVertices, struct BspRenderer_stru2 *a2, struct BspRenderer_stru2 *a3, int uFaceID); +bool PortalFrustrum(int pNumVertices, struct BspRenderer_PortalViewportData *a2, struct BspRenderer_PortalViewportData *near_portal, int uFaceID); signed int __fastcall sr_424CD7(unsigned int uVertexID); // idb signed int __fastcall sr_424EE0_MakeFanFromTriangle(unsigned int uVertexID); // idb signed int __fastcall sr_4250FE(unsigned int uVertexID); // idb