# HG changeset patch # User Gloval # Date 1370808576 -14400 # Node ID 30df39a3aa9259e09971d648fd8dfcec09e11c23 # Parent ae812777b1d4965cf128610905645f82e3a53e7b# Parent 353cb3ad9725482918f9c56c43144a6ef0999f36 Merge diff -r ae812777b1d4 -r 30df39a3aa92 Indoor.cpp --- a/Indoor.cpp Mon Jun 10 00:09:21 2013 +0400 +++ b/Indoor.cpp Mon Jun 10 00:09:36 2013 +0400 @@ -1312,8 +1312,6 @@ return; } - - if (p->uFaceID == uFaceID) return; if (!node_id && @@ -1337,10 +1335,8 @@ nodes[num_nodes].uViewportZ = pBLVRenderParams->uViewportZ; nodes[num_nodes].uViewportY = pBLVRenderParams->uViewportY; nodes[num_nodes].uViewportW = pBLVRenderParams->uViewportW; - nodes[num_nodes].field_C._43F9E1(pBLVRenderParams->uViewportX, - pBLVRenderParams->uViewportY, - pBLVRenderParams->uViewportZ, - pBLVRenderParams->uViewportW); + nodes[num_nodes].field_C._43F9E1(pBLVRenderParams->uViewportX, pBLVRenderParams->uViewportY, + pBLVRenderParams->uViewportZ, pBLVRenderParams->uViewportW); AddBspNodeToRenderList(++num_nodes - 1); return; } @@ -1381,7 +1377,7 @@ //savegame: qw , 0Bh and 0x1D4h //problem here when standing near/on portal, condition is false because of face_min_screenspace_x > p->uViewportZ if (face_max_screenspace_x >= p->uViewportX && -// face_min_screenspace_x <= p->uViewportZ && + face_min_screenspace_x <= p->uViewportZ && face_max_screenspace_y >= p->uViewportY && face_min_screenspace_y <= p->uViewportW && sub_424829(num_vertices, &nodes[num_nodes].field_C, &p->field_C, uFaceID)) diff -r ae812777b1d4 -r 30df39a3aa92 Items.cpp diff -r ae812777b1d4 -r 30df39a3aa92 UIHouses.cpp diff -r ae812777b1d4 -r 30df39a3aa92 UITransition.cpp diff -r ae812777b1d4 -r 30df39a3aa92 Viewport.cpp --- a/Viewport.cpp Mon Jun 10 00:09:21 2013 +0400 +++ b/Viewport.cpp Mon Jun 10 00:09:36 2013 +0400 @@ -180,61 +180,59 @@ //----- (00443365) -------------------------------------------------------- void ViewingParams::_443365() - { - - Vec3_short_ *v3; // eax@4 - Vec3_short_ *v6; // eax@12 - int minimum_y; // [sp+10h] [bp-10h]@2 - int maximum_y; // [sp+14h] [bp-Ch]@2 - int minimum_x; // [sp+18h] [bp-8h]@2 - int maximum_x; // [sp+1Ch] [bp-4h]@2 +{ + Vec3_short_ *v3; // eax@4 + Vec3_short_ *v6; // eax@12 + int minimum_y; // [sp+10h] [bp-10h]@2 + int maximum_y; // [sp+14h] [bp-Ch]@2 + int minimum_x; // [sp+18h] [bp-8h]@2 + int maximum_x; // [sp+1Ch] [bp-4h]@2 - - InitGrayPalette(); - if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) - { - minimum_x = 0x40000000; - minimum_y = 0x40000000; + InitGrayPalette(); + if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) + { + minimum_x = 0x40000000; + minimum_y = 0x40000000; - maximum_x = -0x40000000; - maximum_y = -0x40000000; - for (int i=0; ipMapOutlines->uNumOutlines; ++i) - { - v3 = &pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uFace1ID]; + maximum_x = -0x40000000; + maximum_y = -0x40000000; + for (int i=0; ipMapOutlines->uNumOutlines; ++i) + { + v3 = &pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uFace1ID]; - if ( v3->x < minimum_x ) - minimum_x = v3->x; - if ( v3->x > maximum_x ) - maximum_x = v3->x; - if ( v3->y < minimum_y ) - minimum_y = v3->x; - if ( v3->y > maximum_y ) - maximum_y = v3->x; + if ( v3->x < minimum_x ) + minimum_x = v3->x; + if ( v3->x > maximum_x ) + maximum_x = v3->x; + if ( v3->y < minimum_y ) + minimum_y = v3->x; + if ( v3->y > maximum_y ) + maximum_y = v3->x; - v6 = &pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uFace2ID]; + v6 = &pIndoor->pVertices[pIndoor->pMapOutlines->pOutlines[i].uFace2ID]; + + if ( v6->x < minimum_x ) + minimum_x = v3->x; + if ( v6->x > maximum_x ) + maximum_x = v3->x; - if ( v6->x < minimum_x ) - minimum_x = v3->x; - if ( v6->x > maximum_x ) - maximum_x = v3->x; - - if ( v6->y < minimum_y ) - minimum_y = v3->y; - if ( v6->y > maximum_y ) - maximum_y = v3->y; - } + if ( v6->y < minimum_y ) + minimum_y = v3->y; + if ( v6->y > maximum_y ) + maximum_y = v3->y; + } - uMinimapZoom = 1024; - indoor_center_x = (signed int)(minimum_x + maximum_x) / 2; - field_28 = 10; - indoor_center_y = (signed int)(minimum_y + maximum_y) / 2; - } - else - { - indoor_center_x = 0; - indoor_center_y = 0; - uMinimapZoom = _576E2C_current_minimap_zoom; - field_28 = dword_576E28; - } - field_2C = 384; - } \ No newline at end of file + uMinimapZoom = 1024; + indoor_center_x = (signed int)(minimum_x + maximum_x) / 2; + field_28 = 10; + indoor_center_y = (signed int)(minimum_y + maximum_y) / 2; + } + else + { + indoor_center_x = 0; + indoor_center_y = 0; + uMinimapZoom = _576E2C_current_minimap_zoom; + field_28 = dword_576E28; + } + field_2C = 384; +} \ No newline at end of file diff -r ae812777b1d4 -r 30df39a3aa92 mm7_1.cpp --- a/mm7_1.cpp Mon Jun 10 00:09:21 2013 +0400 +++ b/mm7_1.cpp Mon Jun 10 00:09:36 2013 +0400 @@ -1487,7 +1487,7 @@ //----- (00423B5D) -------------------------------------------------------- int __fastcall sub_423B5D(unsigned int uFaceID) { - BLVFace *v1; // ebx@1 + BLVFace *pFace; // ebx@1 Vec3_short_ *v2; // esi@1 //int v3; // ST28_4@1 __int16 v4; // ST2C_2@1 @@ -1577,45 +1577,39 @@ signed int id; // [sp+24h] [bp-4h]@51 signed int ie; // [sp+24h] [bp-4h]@61 - v1 = &pIndoor->pFaces[uFaceID]; + pFace = &pIndoor->pFaces[uFaceID]; //this = pGame->pIndoorCameraD3D; - v2 = &pIndoor->pVertices[v1->pVertexIDs[0]]; + v2 = &pIndoor->pVertices[pFace->pVertexIDs[0]]; //v3 = *(_DWORD *)&v2->x; v4 = v2->z; //v5 = 0; - if ( v1->pFacePlane_old.vNormal.x * (v2->x - pBLVRenderParams->vPartyPos.x) - + v1->pFacePlane_old.vNormal.y * (v2->y - pBLVRenderParams->vPartyPos.y) - + v1->pFacePlane_old.vNormal.z * (v2->z - pBLVRenderParams->vPartyPos.z) < 0 ) + if ( pFace->pFacePlane_old.vNormal.x * (v2->x - pBLVRenderParams->vPartyPos.x) + + pFace->pFacePlane_old.vNormal.y * (v2->y - pBLVRenderParams->vPartyPos.y) + + pFace->pFacePlane_old.vNormal.z * (v2->z - pBLVRenderParams->vPartyPos.z) < 0 ) { stru_50B700.field_0 = 1; } else { stru_50B700.field_0 = 0; - if ( !v1->Portal() ) + if ( !pFace->Portal() ) return 0; } //v66 = v1->uNumVertices; - for (uint i = 0; i < v1->uNumVertices; ++i) + for (uint i = 0; i < pFace->uNumVertices; ++i) { - auto v6 = &pIndoor->pVertices[v1->pVertexIDs[i]]; - pGame->pIndoorCameraD3D->ApplyViewTransform_TrueIfStillVisible( - v6->x, - v6->y, - v6->z, - &stru_50B700._view_transformed_xs[i], - &stru_50B700._view_transformed_zs[i], - &stru_50B700._view_transformed_ys[i], - 0); + auto v6 = &pIndoor->pVertices[pFace->pVertexIDs[i]]; + pGame->pIndoorCameraD3D->ApplyViewTransform_TrueIfStillVisible(v6->x, v6->y, v6->z, + &stru_50B700._view_transformed_xs[i], &stru_50B700._view_transformed_zs[i], &stru_50B700._view_transformed_ys[i], 0); } //v7 = v1->uNumVertices; //v8 = 0; - if (v1->uNumVertices <= 0) + if (pFace->uNumVertices <= 0) return 0; bool bFound = false; - for (uint i = 0; i < v1->uNumVertices; ++i) + for (uint i = 0; i < pFace->uNumVertices; ++i) if (stru_50B700._view_transformed_xs[i] >= 0x80000u) { bFound = true; @@ -1625,12 +1619,12 @@ return 0; v79 = 0; - stru_50B700._view_transformed_xs[v1->uNumVertices] = stru_50B700._view_transformed_xs[0]; - stru_50B700._view_transformed_zs[v1->uNumVertices] = stru_50B700._view_transformed_zs[0]; - stru_50B700._view_transformed_ys[v1->uNumVertices] = stru_50B700._view_transformed_ys[0]; + stru_50B700._view_transformed_xs[pFace->uNumVertices] = stru_50B700._view_transformed_xs[0]; + stru_50B700._view_transformed_zs[pFace->uNumVertices] = stru_50B700._view_transformed_zs[0]; + stru_50B700._view_transformed_ys[pFace->uNumVertices] = stru_50B700._view_transformed_ys[0]; thisa = stru_50B700._view_transformed_xs[0] >= (signed int)0x80000u; //int i = 1; - for (uint i = 1; i <= v1->uNumVertices; ++i) + for (uint i = 1; i <= pFace->uNumVertices; ++i) { v10 = stru_50B700._view_transformed_xs[i]; v81 = v10 >= (signed int)0x80000u; diff -r ae812777b1d4 -r 30df39a3aa92 mm7_3.cpp --- a/mm7_3.cpp Mon Jun 10 00:09:21 2013 +0400 +++ b/mm7_3.cpp Mon Jun 10 00:09:36 2013 +0400 @@ -11018,10 +11018,8 @@ pBspRenderer->nodes[0].uViewportZ = pBLVRenderParams->uViewportZ; pBspRenderer->nodes[0].uViewportY = pBLVRenderParams->uViewportY; pBspRenderer->nodes[0].uViewportX = pBLVRenderParams->uViewportX; - pBspRenderer->nodes[0].field_C._43F9E1(pBLVRenderParams->uViewportX, - pBLVRenderParams->uViewportY, - pBLVRenderParams->uViewportZ, - pBLVRenderParams->uViewportW); + pBspRenderer->nodes[0].field_C._43F9E1(pBLVRenderParams->uViewportX, pBLVRenderParams->uViewportY, + pBLVRenderParams->uViewportZ, pBLVRenderParams->uViewportW); pBspRenderer->nodes[0].uFaceID = -1; pBspRenderer->nodes[0].viewing_portal_id = -1; pBspRenderer->num_nodes = 1; @@ -11386,85 +11384,75 @@ //----- (00440639) -------------------------------------------------------- void AddBspNodeToRenderList(unsigned int node_id) { - //int v1; // ebx@1 - signed int v2; // edi@1 - BLVSector *v3; // esi@1 - - //v1 = sector_id; - v2 = 0; - v3 = &pIndoor->pSectors[pBspRenderer->nodes[node_id].uSectorID]; + BLVSector *pSector; // esi@1 + + pSector = &pIndoor->pSectors[pBspRenderer->nodes[node_id].uSectorID]; if ( pRenderer->pRenderD3D ) { - for (uint i = 0; i < v3->uNumNonBSPFaces; ++i) + for (uint i = 0; i < pSector->uNumNonBSPFaces; ++i) //Log::Warning(L"Non-BSP face: %X", v3->pFaceIDs[v2]); - pBspRenderer->AddFaceToRenderList_d3d(node_id, v3->pFaceIDs[i]); - } - else - { - if ( v3->uNumNonBSPFaces > 0 ) - { - do - pBspRenderer->AddFaceToRenderList_sw(node_id, v3->pFaceIDs[v2++]); - while ( v2 < v3->uNumNonBSPFaces ); - } - } - if ( v3->field_0 & 0x10 ) - sub_4406BC(node_id, v3->uFirstBSPNode); + pBspRenderer->AddFaceToRenderList_d3d(node_id, pSector->pFaceIDs[i]); + } + else + { + for (uint i = 0; i < pSector->uNumNonBSPFaces; ++i) + pBspRenderer->AddFaceToRenderList_sw(node_id, pSector->pFaceIDs[i]); + } + if ( pSector->field_0 & 0x10 ) + sub_4406BC(node_id, pSector->uFirstBSPNode); } //----- (004406BC) -------------------------------------------------------- void __fastcall sub_4406BC(unsigned int node_id, unsigned int uFirstNode) { - BLVSector *v2; // esi@2 - BSPNode *v3; // edi@2 - BLVFace *v4; // eax@2 + BLVSector *pSector; // esi@2 + BSPNode *pNode; // edi@2 + BLVFace *pFace; // eax@2 int v5; // ecx@2 __int16 v6; // ax@6 int v7; // ebp@10 int v8; // ebx@10 __int16 v9; // di@18 //int v10; // [sp+10h] [bp-Ch]@1 - bool v11; // [sp+14h] [bp-8h]@5 - BspRenderer_stru0 *v12; // [sp+18h] [bp-4h]@1 + //bool v11; // [sp+14h] [bp-8h]@5 + BspRenderer_stru0 *node; // [sp+18h] [bp-4h]@1 //Log::Warning(L"sub_4406BC(%u, %u)", a1, uFirstNode); //v10 = a1; - v12 = &pBspRenderer->nodes[node_id]; + node = &pBspRenderer->nodes[node_id]; while ( 1 ) { - v2 = &pIndoor->pSectors[v12->uSectorID]; - v3 = &pIndoor->pNodes[uFirstNode]; - v4 = &pIndoor->pFaces[v2->pFaceIDs[v3->uCoplanarOffset]]; - v5 = v4->pFacePlane_old.dist - + pBLVRenderParams->vPartyPos.x * v4->pFacePlane_old.vNormal.x - + pBLVRenderParams->vPartyPos.y * v4->pFacePlane_old.vNormal.y - + pBLVRenderParams->vPartyPos.z * v4->pFacePlane_old.vNormal.z; - if (v4->Portal() && v4->uSectorID != v12->uSectorID ) + pSector = &pIndoor->pSectors[node->uSectorID]; + pNode = &pIndoor->pNodes[uFirstNode]; + pFace = &pIndoor->pFaces[pSector->pFaceIDs[pNode->uCoplanarOffset]]; + v5 = pFace->pFacePlane_old.dist + pBLVRenderParams->vPartyPos.x * pFace->pFacePlane_old.vNormal.x + + pBLVRenderParams->vPartyPos.y * pFace->pFacePlane_old.vNormal.y + pBLVRenderParams->vPartyPos.z * pFace->pFacePlane_old.vNormal.z; + if (pFace->Portal() && pFace->uSectorID != node->uSectorID ) v5 = -v5; - v11 = v5 > 0; + //v11 = v5 > 0; if ( v5 <= 0 ) - v6 = v3->uFront; + v6 = pNode->uFront; else - v6 = v3->uBack; + v6 = pNode->uBack; if ( v6 != -1 ) sub_4406BC(node_id, v6); - v7 = v3->uCoplanarOffset; - v8 = v7 + v3->uCoplanarSize; + v7 = pNode->uCoplanarOffset; + v8 = v7 + pNode->uCoplanarSize; //Log::Warning(L"Node %u: %X to %X (%hX)", uFirstNode, v7, v8, v2->pFaceIDs[v7]); if ( pRenderer->pRenderD3D ) { while ( v7 < v8 ) - pBspRenderer->AddFaceToRenderList_d3d(node_id, v2->pFaceIDs[v7++]); + pBspRenderer->AddFaceToRenderList_d3d(node_id, pSector->pFaceIDs[v7++]); } else { while ( v7 < v8 ) - pBspRenderer->AddFaceToRenderList_sw(node_id, v2->pFaceIDs[v7++]); - } - v9 = v11 ? v3->uFront : v3->uBack; + pBspRenderer->AddFaceToRenderList_sw(node_id, pSector->pFaceIDs[v7++]); + } + v9 = v5 > 0 ? pNode->uFront : pNode->uBack; if ( v9 == -1 ) break; uFirstNode = v9; diff -r ae812777b1d4 -r 30df39a3aa92 mm7_4.cpp diff -r ae812777b1d4 -r 30df39a3aa92 mm7_data.h