Mercurial > mm7
changeset 1344:65379a50e4eb
Portals in indoor (continue)
author | Ritor1 |
---|---|
date | Thu, 11 Jul 2013 17:47:12 +0600 |
parents | 8bfdc44cebfd |
children | b99aeb077d4f |
files | Indoor.cpp Outdoor_stuff.h Render.cpp mm7_1.cpp mm7_3.cpp mm7_4.cpp mm7_data.cpp mm7_data.h stru367.h |
diffstat | 9 files changed, 492 insertions(+), 583 deletions(-) [+] |
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
--- a/Outdoor_stuff.h Fri Jul 05 17:37:30 2013 +0600 +++ b/Outdoor_stuff.h Thu Jul 11 17:47:12 2013 +0600 @@ -68,7 +68,7 @@ { int _48616B(int a2, int a3, int a4, int a5, int a6, int a7); int _48653D(int a2, int a3, int a4, int a5, int a6, int a7); - int _48694B(); + int sky_48694B(); int field_0_party_dir_x; int field_4_party_dir_y;
--- a/Render.cpp Fri Jul 05 17:37:30 2013 +0600 +++ b/Render.cpp Thu Jul 11 17:47:12 2013 +0600 @@ -566,7 +566,7 @@ return; array_77EC08[1999]._48607B(&stru_8019C8); - array_77EC08[1999].ptr_38->_48694B(); + array_77EC08[1999].ptr_38->sky_48694B(); if (pOutdoor->uMainTile_BitmapID == -1) { @@ -589,7 +589,7 @@ cos((double)pIndoorCamera->sRotationX * 0.0030664064); sin((double)pIndoorCamera->sRotationX * 0.0030664064); array_77EC08[1999]._48607B(&stru_8019C8); - array_77EC08[1999].ptr_38->_48694B(); + array_77EC08[1999].ptr_38->sky_48694B(); if (pOutdoor->uSky_TextureID == -1) { @@ -1727,9 +1727,9 @@ //-------------------------------------------------------------------------------------------------------------------- // - for (unsigned int z = 0; z < 128; ++z) - { - for (unsigned int x = 0; x < 128; ++x) + for (unsigned int z = 0; z < 127; ++z) + { + for (unsigned int x = 0; x < 127; ++x) { pTile = &array_77EC08[pOutdoorCamera->numStru148s]; pTile->flags = 0;
--- a/mm7_1.cpp Fri Jul 05 17:37:30 2013 +0600 +++ b/mm7_1.cpp Thu Jul 11 17:47:12 2013 +0600 @@ -547,11 +547,11 @@ + v2->pFacePlane_old.vNormal.y * ((signed __int16)(*(int *)&v4->x >> 16) - pBLVRenderParams->vPartyPos.y) + v2->pFacePlane_old.vNormal.z * (v4->z - pBLVRenderParams->vPartyPos.z) < 0 ) { - stru_50B700.field_0 = 1; + PortalFace.field_0 = 1; } else { - stru_50B700.field_0 = 0; + PortalFace.field_0 = 0; if ( !(v2->uAttributes & 1) ) return 0; } @@ -786,7 +786,7 @@ return result;*/ } -// 50B700: using guessed type int stru_50B700.field_0; +// 50B700: using guessed type int PortalFace.field_0; //----- (00424CD7) -------------------------------------------------------- signed int __fastcall sr_424CD7(unsigned int uVertexID)
--- a/mm7_3.cpp Fri Jul 05 17:37:30 2013 +0600 +++ b/mm7_3.cpp Thu Jul 11 17:47:12 2013 +0600 @@ -5958,36 +5958,21 @@ { int v0; // esi@2 int v1; // eax@2 - //double v2; // st7@2 - //double v3; // st6@2 - //double v4; // st5@2 - //double v5; // st4@2 - //double v6; // st7@2 - //char *v7; // esi@3 int v8; // eax@4 int v9; // eax@4 int v10; // ebx@4 signed __int64 v11; // qax@6 - double v12; // st7@6 + //double v12; // st7@6 int v13; // edi@6 int v14; // ecx@6 - int v15; // eax@8 + //int v15; // eax@8 int v16; // eax@12 signed __int64 v17; // qtt@13 - signed int v18; // ecx@13 - //Texture *v19; // eax@15 - //double v20; // st6@15 - //double v21; // st7@15 - //double v22; // st6@15 - //unsigned __int8 v23; // sf@15 - //unsigned __int8 v24; // of@15 - stru148 _this; // [sp+14h] [bp-150h]@1 - //double v26; // [sp+120h] [bp-44h]@4 - //float v27; // [sp+128h] [bp-3Ch]@4 + signed int pShading; // ecx@13 + stru148 pSky; // [sp+14h] [bp-150h]@1 float v28; // [sp+12Ch] [bp-38h]@2 int v29; // [sp+130h] [bp-34h]@4 int v30; // [sp+134h] [bp-30h]@1 - //int v31; // [sp+138h] [bp-2Ch]@2 int v32; // [sp+13Ch] [bp-28h]@6 int v33; // [sp+140h] [bp-24h]@2 int v34; // [sp+144h] [bp-20h]@1 @@ -6007,26 +5992,32 @@ v30 = ((double)(pOutdoorCamera->int_fov_rad * pIndoorCamera->pos.z) / ((double)pOutdoorCamera->int_fov_rad + 8192.0) + pViewport->uScreenCenterY); - v38 = pViewport->uScreenCenterY - - pOutdoorCamera->int_fov_rad / (pOutdoorCamera->shading_dist_mist * cos(pIndoorCamera->sRotationX * 0.003066406352445483) + 0.0000001000000011686097) * - (pOutdoorCamera->shading_dist_mist * -sin(pIndoorCamera->sRotationX * 0.003066406352445483) - pIndoorCamera->pos.z); - _this._48607B(&stru_8019C8); - _this.ptr_38->_48694B(); - _this.uTileBitmapID = pOutdoor->uSky_TextureID; - _this.pTexture = (Texture *)(SLOWORD(pOutdoor->uSky_TextureID) != -1 ? &pBitmaps_LOD->pTextures[SLOWORD(pOutdoor->uSky_TextureID)] : 0); + v38 = pViewport->uScreenCenterY - pOutdoorCamera->int_fov_rad / + (pOutdoorCamera->shading_dist_mist * cos(pIndoorCamera->sRotationX * 0.003066406352445483) + 0.0000001000000011686097) * + (pOutdoorCamera->shading_dist_mist * -sin(pIndoorCamera->sRotationX * 0.003066406352445483) - pIndoorCamera->pos.z); + + pSky._48607B(&stru_8019C8); + pSky.ptr_38->sky_48694B(); + pSky.uTileBitmapID = pOutdoor->uSky_TextureID;//номер текстуры + pSky.pTexture = (Texture *)(pOutdoor->uSky_TextureID != -1 ? &pBitmaps_LOD->pTextures[pOutdoor->uSky_TextureID] : 0);//текстура неба if (pOutdoor->uSky_TextureID == -1) return; - _this.dimming_level = 0; - _this.uNumVertices = 4; - _this.v_18.x = -stru_5C6E00->Sin(pIndoorCamera->sRotationX + 16); - _this.v_18.y = 0; - _this.v_18.z = -stru_5C6E00->Cos(pIndoorCamera->sRotationX + 16); - _this.field_24 = 0x2000000; - - _this.sTextureDeltaU = 224 * pMiscTimer->uTotalGameTimeElapsed; - _this.sTextureDeltaV = 224 * pMiscTimer->uTotalGameTimeElapsed; - + pSky.dimming_level = 0;//затемнение + pSky.uNumVertices = 4;//количество вершин + + //centering(центруем)--------------------------------------------------------------- + pSky.v_18.x = -stru_5C6E00->Sin(pIndoorCamera->sRotationX + 16);//-3216 + pSky.v_18.y = 0; + pSky.v_18.z = -stru_5C6E00->Cos(pIndoorCamera->sRotationX + 16);//-65457 + //--------------------------------------------------------------------------- + + pSky.field_24 = 0x2000000; + + pSky.sTextureDeltaU = 224 * pMiscTimer->uTotalGameTimeElapsed; + pSky.sTextureDeltaV = 224 * pMiscTimer->uTotalGameTimeElapsed; + + //sky position(положение неба)---------------------------------------------- array_50AC10[0].vWorldViewProjX = pViewport->uViewportTL_X; array_50AC10[0].vWorldViewProjY = pViewport->uViewportTL_Y; @@ -6038,9 +6029,10 @@ array_50AC10[3].vWorldViewProjX = pViewport->uViewportBR_X; array_50AC10[3].vWorldViewProjY = pViewport->uViewportTL_Y; + //-------------------------------------------------------------------------- //pParty->sRotationY / 2048.0f - + // move sky(двидение неба)--------------include----------------------------- float t = (GetTickCount() % 96000) / 96000.0f; array_50AC10[0].u = t - pParty->sRotationY / 1024.0f; array_50AC10[0].v = t - pParty->sRotationX / 512.0f; @@ -6053,100 +6045,101 @@ array_50AC10[3].u = 1 + t - pParty->sRotationY / 1024.0f; array_50AC10[3].v = t - pParty->sRotationX / 512.0f; - - v36 = (double)(pViewport->uViewportBR_X - pViewport->uViewportTL_X) * 0.5; - v33 = 65536 / (signed int)(v36 / tan(0.6457717418670654) + 0.5); - - for (uint i = 0; i < _this.uNumVertices; ++i) - { - v29 = floorf(array_50AC10[i].vWorldViewProjY + 0.5f); - v39 = (unsigned __int64)(_this.ptr_38->field_14 * v33 * (v30 - v29)) / 65536; - v8 = v39 + _this.ptr_38->field_C; - - v39 = (unsigned __int64)(_this.ptr_38->field_20 * v33 * (v30 - v29)) / 65536; - v36 = v39 + _this.ptr_38->field_18; - - v9 = (unsigned __int64)(_this.v_18.z * v33 * (v30 - v29)) / 65536; - v10 = _this.v_18.x + v9; - v39 = _this.v_18.x + v9; - if ( _this.v_18.x + v9 > 0 ) + //-------------------------------------------------------------------------- + + //rotate skydome(вращение купола неба)-------------------------------------- + v36 = (pViewport->uViewportBR_X - pViewport->uViewportTL_X) * 0.5;//центр экрана 230 + v33 = 65536 / (signed int)(v36 / tan(0.6457717418670654) + 0.5);//214 + + for (uint i = 0; i < pSky.uNumVertices; ++i) + { + v29 = floorf(array_50AC10[i].vWorldViewProjY + 0.5f);//8 + v39 = (unsigned __int64)(pSky.ptr_38->field_14 * v33 * (v30 - v29)) / 65536;//0 + v8 = v39 + pSky.ptr_38->field_C;//0 + + v39 = (unsigned __int64)(pSky.ptr_38->field_20 * v33 * (v30 - v29)) / 65536;//0 + v36 = v39 + pSky.ptr_38->field_18;//65536 + + v9 = (unsigned __int64)(pSky.v_18.z * v33 * (v30 - v29)) / 65536;//27917 + v10 = pSky.v_18.x + v9;//24701 + v39 = pSky.v_18.x + v9;//24701 + if ( pSky.v_18.x + v9 > 0 ) { v10 = 0; v39 = 0; } //v11 = (signed __int64)array_50AC10[i].vWorldViewProjX; v38 = v10; - v12 = array_50AC10[i].vWorldViewProjY - 1.0; + //v12 = array_50AC10[i].vWorldViewProjY - 1.0; v13 = v33 * (pViewport->uScreenCenterX - (signed __int64)array_50AC10[i].vWorldViewProjX); - v34 = -_this.field_24; - v32 = (signed __int64)v12; + v34 = -pSky.field_24; + v32 = (signed __int64)array_50AC10[i].vWorldViewProjY - 1.0; v14 = v33 * (v30 - v32); + while ( 1 ) { - //v40 = v14; + v40 = v14; if ( !v10 ) { - v37 = _this.v_18.z; - v16 = (unsigned __int64)(_this.v_18.z * (signed __int64)v14) >> 16; + v37 = pSky.v_18.z; + v16 = (unsigned __int64)(pSky.v_18.z * (signed __int64)v14) >> 16; --v32; v14 += v33; - v10 = _this.v_18.x + v16; - v39 = _this.v_18.x + v16; - v38 = _this.v_18.x + v16; + v10 = pSky.v_18.x + v16; + v39 = pSky.v_18.x + v16; + v38 = pSky.v_18.x + v16; break; } v37 = abs(v34 >> 14); - v15 = abs(v10); - if ( v37 <= v15 || v32 <= pViewport->uViewportTL_Y ) + if ( abs(v34 >> 14) <= abs(v10) || v32 <= pViewport->uViewportTL_Y ) { if ( v39 <= 0 ) break; } - //v14 = v40; - v37 = _this.v_18.z; - v16 = (unsigned __int64)(_this.v_18.z * v14) >> 16; + v14 = v40; + v37 = pSky.v_18.z; + v16 = (unsigned __int64)(pSky.v_18.z * v14) >> 16; --v32; v14 += v33; - v10 = _this.v_18.x + v16; - v39 = _this.v_18.x + v16; - v38 = _this.v_18.x + v16; + v10 = pSky.v_18.x + v16; + v39 = pSky.v_18.x + v16; + v38 = pSky.v_18.x + v16; break; } + LODWORD(v17) = v34 << 16; HIDWORD(v17) = v34 >> 16; - v18 = v17 / v38; - if ( v18 < 0 ) - v18 = pOutdoorCamera->shading_dist_mist; - - v37 += ((unsigned __int64)(_this.ptr_38->field_10 * v13) >> 16); - v36 += ((unsigned __int64)(_this.ptr_38->field_1C * v13) >> 16); - v35 = 224 * pMiscTimer->uTotalGameTimeElapsed + fixpoint_sub0(v37, v18) / 8; - v36 = 224 * pMiscTimer->uTotalGameTimeElapsed + fixpoint_sub0(v36, v18) / 8; + pShading = v17 / v38; + if ( pShading < 0 ) + pShading = pOutdoorCamera->shading_dist_mist; + + v37 += ((unsigned __int64)(pSky.ptr_38->field_10 * v13) >> 16); + v36 += ((unsigned __int64)(pSky.ptr_38->field_1C * v13) >> 16); + v35 = 224 * pMiscTimer->uTotalGameTimeElapsed + fixpoint_sub0(v37, pShading) / 8; + v36 = 224 * pMiscTimer->uTotalGameTimeElapsed + fixpoint_sub0(v36, pShading) / 8; //array_50AC10[i].vWorldViewPosition.x = pOutdoorCamera->shading_dist_mist; - //array_50AC10[i].vWorldPosition.x = v36 / (_this.pTexture->uTextureHeight * 65536.0); + //array_50AC10[i].vWorldPosition.x = v36 / (pSky.pTexture->uTextureHeight * 65536.0); //array_50AC10[i].vWorldPosition.y = 1.0 / (pOutdoorCamera->shading_dist_mist >> 16); - //array_50AC10[i].vWorldPosition.z = v35 / (_this.pTexture->uTextureWidth * 65536.0); + //array_50AC10[i].vWorldPosition.z = v35 / (pSky.pTexture->uTextureWidth * 65536.0); //array_50AC10[i]._rhw = 1.0f / (v18 >> 16); - //array_50AC10[i].u = (double)v35 / (65536.0 * _this.pTexture->uTextureWidth); - //array_50AC10[i].v = (double)v36 / (65536.0 * _this.pTexture->uTextureHeight); - //float t = (GetTickCount() % 96000) / 96000.0f; + //array_50AC10[i].u = (double)v35 / (65536.0 * pSky.pTexture->uTextureWidth); + //array_50AC10[i].v = (double)v36 / (65536.0 * pSky.pTexture->uTextureHeight); + //----------------------------------------------------------------------------------------- + array_50AC10[i]._rhw = 1.0f; - //array_50AC10[i].u = t; - //array_50AC10[i].v = t; - } - //if ( i == _this.uNumVertices - 1 ) - //{ - pRenderer->DrawSkyPolygon(_this.uNumVertices, &_this, pBitmaps_LOD->pHardwareTextures[_this.uTileBitmapID]); - - array_50AC10[0].vWorldViewProjY = v38; - array_50AC10[1].vWorldViewProjY = array_50AC10[1].vWorldViewProjY + 30.0; - array_50AC10[2].vWorldViewProjY = array_50AC10[2].vWorldViewProjY + 30.0; - array_50AC10[3].vWorldViewProjY = v38; - - pRenderer->DrawSkyPolygon(_this.uNumVertices, &_this, pBitmaps_LOD->pHardwareTextures[_this.uTileBitmapID]); - //return; - //} + } + //if ( i == _this.uNumVertices - 1 ) + //{ + pRenderer->DrawSkyPolygon(pSky.uNumVertices, &pSky, pBitmaps_LOD->pHardwareTextures[pSky.uTileBitmapID]); + + array_50AC10[0].vWorldViewProjY = v38; + array_50AC10[1].vWorldViewProjY = array_50AC10[1].vWorldViewProjY + 30.0; + array_50AC10[2].vWorldViewProjY = array_50AC10[2].vWorldViewProjY + 30.0; + array_50AC10[3].vWorldViewProjY = v38; + + pRenderer->DrawSkyPolygon(pSky.uNumVertices, &pSky, pBitmaps_LOD->pHardwareTextures[pSky.uTileBitmapID]); + //} } //----- (00479A53) -------------------------------------------------------- @@ -10535,7 +10528,7 @@ } //----- (0048694B) -------------------------------------------------------- -int stru149::_48694B() +int stru149::sky_48694B() { int v1; // eax@1 int v2; // ST04_4@1
--- a/mm7_4.cpp Fri Jul 05 17:37:30 2013 +0600 +++ b/mm7_4.cpp Thu Jul 11 17:47:12 2013 +0600 @@ -3494,7 +3494,7 @@ v91 = &pIndoor->pFaces[sFaceID]; if ( !pRenderer->pRenderD3D ) { - result = sub_423B5D(sFaceID); + result = GetPortalScreenCoord(sFaceID); if ( result ) { result = sub_424829(result, &stru_F8A590, pBLVRenderParams->field_7C, v2); @@ -3959,7 +3959,7 @@ } else { - v59 = sub_423B5D(uFaceID); + v59 = GetPortalScreenCoord(uFaceID); v3 = v59; } if ( v3 && (pRenderer->pRenderD3D || sub_424829(v3, &stru_F8A590, pBLVRenderParams->field_7C, v1)) )
--- a/mm7_data.cpp Fri Jul 05 17:37:30 2013 +0600 +++ b/mm7_data.cpp Thu Jul 11 17:47:12 2013 +0600 @@ -967,25 +967,25 @@ int dword_507CD8; // weak std::array<int, 50> dword_50B570; // weak std::array<int, 50> dword_50B638; // weak -stru367 stru_50B700; -/*int stru_50B700.field_0; // weak -int stru_50B700.field_38[777]; // idb -int stru_50B700._view_transformed_ys[45]; -int stru_50B700.field_128[777]; -int stru_50B700._view_transformed_zs[45]; -int stru_50B700.field_218[777]; -int stru_50B700._view_transformed_xs[45]; -int stru_50B700._screen_space_y[777]; -int stru_50B700.field_3E4[777]; -int stru_50B700.field_2F0[2]; // idb -int stru_50B700._ys[3 + 45]; -int stru_50B700._ys2[48]; // idb -int stru_50B700._screen_space_x[777]; // idb -int stru_50B700.field_3D4[777]; // weak -int stru_50B700._xs[777]; // weak +stru367 PortalFace; +/*int PortalFace.field_0; // weak +int PortalFace.field_38[777]; // idb +int PortalFace._view_transformed_ys[45]; +int PortalFace.field_128[777]; +int PortalFace._view_transformed_zs[45]; +int PortalFace.field_218[777]; +int PortalFace._view_transformed_xs[45]; +int PortalFace._screen_space_y[777]; +int PortalFace.field_3E4[777]; +int PortalFace.field_2F0[2]; // idb +int PortalFace._ys[3 + 45]; +int PortalFace._ys2[48]; // idb +int PortalFace._screen_space_x[777]; // idb +int PortalFace.field_3D4[777]; // weak +int PortalFace._xs[777]; // weak int dword_50BAE8[777]; // weak -int stru_50B700._xs2[3 + 45]; // weak -int stru_50B700._xs3[48]; // weak*/ +int PortalFace._xs2[3 + 45]; // weak +int PortalFace._xs3[48]; // weak*/ std::array<int, 100> dword_50BC10; // weak std::array<int, 100> dword_50BDA0; // weak std::array<int, 100> dword_50BF30; // weak
--- a/mm7_data.h Fri Jul 05 17:37:30 2013 +0600 +++ b/mm7_data.h Thu Jul 11 17:47:12 2013 +0600 @@ -610,25 +610,25 @@ extern int dword_507CD8; // weak extern std::array<int, 50> dword_50B570; // weak extern std::array<int, 50> dword_50B638; // weak -extern struct stru367 stru_50B700; -/*extern int stru_50B700.field_0; // weak -extern int stru_50B700.field_38[]; // idb -extern int stru_50B700._view_transformed_ys[]; -extern int stru_50B700.field_128[]; -extern int stru_50B700._view_transformed_zs[]; -extern int stru_50B700.field_218[]; -extern int stru_50B700._view_transformed_xs[]; -extern int stru_50B700._screen_space_y[]; -extern int stru_50B700.field_3E4[]; -extern int stru_50B700.field_2F0[]; // idb -extern int stru_50B700._ys[]; -extern int stru_50B700._ys2[]; // idb -extern int stru_50B700._screen_space_x[]; // idb -extern int stru_50B700.field_3D4[]; // weak -extern int stru_50B700._xs[]; // weak +extern struct stru367 PortalFace; +/*extern int PortalFace.field_0; // weak +extern int PortalFace.field_38[]; // idb +extern int PortalFace._view_transformed_ys[]; +extern int PortalFace.field_128[]; +extern int PortalFace._view_transformed_zs[]; +extern int PortalFace.field_218[]; +extern int PortalFace._view_transformed_xs[]; +extern int PortalFace._screen_space_y[]; +extern int PortalFace.field_3E4[]; +extern int PortalFace.field_2F0[]; // idb +extern int PortalFace._ys[]; +extern int PortalFace._ys2[]; // idb +extern int PortalFace._screen_space_x[]; // idb +extern int PortalFace.field_3D4[]; // weak +extern int PortalFace._xs[]; // weak extern int dword_50BAE8[]; // weak -extern int stru_50B700._xs2[]; // weak -extern int stru_50B700._xs3[]; // weak*/ +extern int PortalFace._xs2[]; // weak +extern int PortalFace._xs3[]; // weak*/ extern std::array<int, 100> dword_50BC10; // weak extern std::array<int, 100> dword_50BDA0; // weak extern std::array<int, 100> dword_50BF30; // weak @@ -1149,7 +1149,7 @@ void __cdecl reset_some_strus_flt_2Cs(); void __cdecl j_sub_423B4A(); void __cdecl sub_423B4A(); -int __fastcall sub_423B5D(unsigned int uFaceID); +int __fastcall GetPortalScreenCoord(unsigned int uFaceID); signed int __fastcall sub_424579(int uFaceID, struct stru320 *a2); bool sub_424829(int pNumVertices, struct BspRenderer_stru2 *a2, struct BspRenderer_stru2 *a3, int uFaceID); signed int __fastcall sr_424CD7(unsigned int uVertexID); // idb
--- a/stru367.h Fri Jul 05 17:37:30 2013 +0600 +++ b/stru367.h Thu Jul 11 17:47:12 2013 +0600 @@ -6,11 +6,11 @@ #pragma pack(push, 1) struct stru367 { - int field_0; + bool direction; std::array<int, 13> field_4; - std::array<int, 60> _view_transformed_ys; - std::array<int, 60> _view_transformed_zs; - std::array<int, 48> _view_transformed_xs; + std::array<int, 60> _view_transformed_x; + std::array<int, 60> _view_transformed_y; + std::array<int, 48> _view_transformed_z; std::array<int, 60> _screen_space_y; std::array<int, 60> _screen_space_x; };