# HG changeset patch # User Nomad # Date 1363313604 -7200 # Node ID ecfb1b3c9a39731a48eb6240650d3a638aa40058 # Parent 92c1e1250e7cb30d372bcb4bf8235fd8e908a9c2 BLV: when standing right on the portal (orange wall) everything looks fine diff -r 92c1e1250e7c -r ecfb1b3c9a39 Game.cpp --- a/Game.cpp Thu Mar 14 23:44:03 2013 +0200 +++ b/Game.cpp Fri Mar 15 04:13:24 2013 +0200 @@ -631,7 +631,7 @@ if (!_44F07B()) return false; - if ( uFlags & 8 ) + if ( uFlags & GAME_FLAGS_1_DRAW_BLV_DEBUGS) LOBYTE(pStru10Instance->field_4) = 0; if ( pRenderer->pRenderD3D && uCurrentlyLoadedLevelType == LEVEL_Outdoor) { diff -r 92c1e1250e7c -r ecfb1b3c9a39 Game.h --- a/Game.h Thu Mar 14 23:44:03 2013 +0200 +++ b/Game.h Fri Mar 15 04:13:24 2013 +0200 @@ -16,6 +16,7 @@ +#define GAME_FLAGS_1_DRAW_BLV_DEBUGS 0x08 #define GAME_FLAGS_2_SATURATE_LIGHTMAPS 0x02 #define GAME_FLAGS_2_ALTER_GRAVITY 0x08 #define GAME_FLAGS_2_TARGETING_MODE 0x10 diff -r 92c1e1250e7c -r ecfb1b3c9a39 Indoor.cpp --- a/Indoor.cpp Thu Mar 14 23:44:03 2013 +0200 +++ b/Indoor.cpp Fri Mar 15 04:13:24 2013 +0200 @@ -272,28 +272,28 @@ if (bD3D) { pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z); - for (uint i = 0; i < pBspRenderer->uNumFaceIDs; ++i) + for (uint i = 0; i < pBspRenderer->num_faces; ++i) { - v2 = pBspRenderer->pFaceIDs[2 * i + 1]; - if ( pBspRenderer->pSectors[v2].std__vector_0007A8 == -1 ) + v2 = pBspRenderer->faces[i].uNodeID; + if ( pBspRenderer->nodes[v2].std__vector_0007A8 == -1 ) { v6 = 0; v3 = 0; } else { - v3 = pBspRenderer->pSectors[v2].std__vector_0007AC; - v6 = pBspRenderer->pSectors[v2].pVertices; + v3 = pBspRenderer->nodes[v2].std__vector_0007AC; + v6 = pBspRenderer->nodes[v2].pVertices; } - IndoorLocation::ExecDraw_d3d(pBspRenderer->pFaceIDs[2 * i], v3, 4, v6); + IndoorLocation::ExecDraw_d3d(pBspRenderer->faces[i].uFaceID, v3, 4, v6); } } else { - for (uint j = 0; j < pBspRenderer->uNumFaceIDs; ++j ) + for (uint j = 0; j < pBspRenderer->num_faces; ++j ) { - v5 = pBspRenderer->pFaceIDs[2 * j]; - pBLVRenderParams->field_7C = &pBspRenderer->pSectors[pBspRenderer->pFaceIDs[2 * j + 1]].field_C; + v5 = pBspRenderer->faces[j].uFaceID; + pBLVRenderParams->field_7C = &pBspRenderer->nodes[pBspRenderer->faces[j].uNodeID].field_C; IndoorLocation::ExecDraw_sw(v5); } } @@ -314,6 +314,7 @@ if (pBLVRenderParams->uPartySectorID) IndoorLocation::ExecDraw(pRenderer->pRenderD3D != 0); pRenderer->DrawBillboardList_BLV(); + if ( !pRenderer->pRenderD3D ) { if (pBLVRenderParams->uFlags & INDOOR_CAMERA_DRAW_D3D_OUTLINES) @@ -322,17 +323,17 @@ { v1 = pBLVRenderParams->pRenderTarget; v6 = 0; - if ( (signed int)pBspRenderer->pNumSectors > 0 ) + if ( (signed int)pBspRenderer->num_nodes > 0 ) { v7 = 0; - v2 = (char *)&pBspRenderer->pSectors[0].field_C._viewport_space_w; + v2 = (char *)&pBspRenderer->nodes[0].field_C._viewport_space_w; do { v3 = *((int *)v2 - 1); v4 = pRenderer->uTargetSurfacePitch * *((int *)v2 - 1); if ( v3 <= *(int *)v2 ) { - v5 = (char *)&pBspRenderer->pSectors[0].field_C.array_3D8[v3 + v7]; + v5 = (char *)&pBspRenderer->nodes[0].field_C.array_3D8[v3 + v7]; do { v1[v4 + *((short *)v5 - 480)] = 255; @@ -347,7 +348,7 @@ v7 += 1126; v2 += 2252; } - while ( v6 < (signed int)pBspRenderer->pNumSectors ); + while ( v6 < (signed int)pBspRenderer->num_nodes ); } } } @@ -527,7 +528,7 @@ stru_F7B60C.face_plane.dist = pFace->pFacePlane.dist; } - if (stru_F8AD28.uNumLightsApplied > 0 && !(pFace->uAttributes & 0x400000)) + if (stru_F8AD28.uNumLightsApplied > 0 && !(pFace->uAttributes & FACE_DO_NOT_LIGHT)) pGame->pLightmapBuilder->ApplyLights(&stru_F8AD28, &stru_F7B60C, uNumVerticesa, array_507D30, pVertices, 0); if (pDecalBuilder->uNumDecals > 0) @@ -564,7 +565,7 @@ if (pFace->uAttributes & FACE_DO_NOT_LIGHT) _479A53_draw_some_blv_poly(uNumVerticesa, uFaceID); else - pRenderer->DrawIndoorPolygon(uNumVerticesa, pFace, v27, v28, 8 * uFaceID | 6, v17, 0); + pRenderer->DrawIndoorPolygon(uNumVerticesa, pFace, v27, v28, 8 * uFaceID | OBJECT_BModel, v17, 0); return; } //v17 = 0xFFFFFFFF; @@ -1233,7 +1234,7 @@ } //----- (004B0EA8) -------------------------------------------------------- -void BspRenderer::AddFaceToRenderList_d3d(int a2, unsigned int uFaceID) +void BspRenderer::AddFaceToRenderList_d3d(unsigned int node_id, unsigned int uFaceID) { //unsigned int v3; // edx@1 //stru170 *v4; // ebx@1 @@ -1242,10 +1243,10 @@ unsigned __int16 v7; // ax@11 Vec3_short_ *v8; // esi@15 int v9; // edx@15 - signed int v10; // eax@18 - signed int v11; // edi@19 - signed int v12; // ecx@19 - signed int v13; // esi@19 + //signed int v10; // eax@18 + //signed int v11; // edi@19 + //signed int v12; // ecx@19 + //signed int v13; // esi@19 signed int v14; // edx@20 int v15; // edx@24 //int v16; // esi@29 @@ -1263,33 +1264,41 @@ //signed int v28; // ST28_4@47 char v29; // al@48 signed int v30; // eax@51 - int v31; // eax@52 + //int v31; // eax@52 //unsigned int v32; // eax@55 //__int16 v33; // cx@56 - signed int v34; // [sp+Ch] [bp-14h]@18 + //signed int v34; // [sp+Ch] [bp-14h]@18 //int a0; // [sp+14h] [bp-Ch]@2 //IndoorCameraD3D *a0a; // [sp+14h] [bp-Ch]@36 - signed int v37; // [sp+18h] [bp-8h]@19 + //signed int v37; // [sp+18h] [bp-8h]@19 //stru10 *v38; // [sp+18h] [bp-8h]@36 //BLVFace *v39; // [sp+1Ch] [bp-4h]@1 //v3 = uFaceID; //v4 = this; //v5 = &pIndoor->pFaces[uFaceID]; - pSectors[pNumSectors].std__vector_0007A8 = -1; + nodes[num_nodes].std__vector_0007A8 = -1; //v39 = &pIndoor->pFaces[uFaceID]; auto pFace = &pIndoor->pFaces[uFaceID]; - if (pFace->TwoSided()) + if (!pFace->Portal()) { - auto p = &pSectors[a2]; + if (num_faces < 1000) + { + faces[num_faces].uFaceID = uFaceID; + faces[num_faces++].uNodeID = node_id; + } + return; + } + + auto p = &nodes[node_id]; //v6 = (int)((char *)this + 2252 * a2); //a0 = v6; if (p->uFaceID == uFaceID) return; - if (!a2 && - pBLVRenderParams->vPartyPos.x >= pFace->pBounding.x1 - 16 && + if (!node_id && + pBLVRenderParams->vPartyPos.x >= pFace->pBounding.x1 - 16 && // we are probably standing at the portal plane pBLVRenderParams->vPartyPos.x <= pFace->pBounding.x2 + 16 && pBLVRenderParams->vPartyPos.y >= pFace->pBounding.y1 - 16 && pBLVRenderParams->vPartyPos.y <= pFace->pBounding.y2 + 16 && @@ -1298,59 +1307,80 @@ { if ( abs(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) <= 589824 ) + + pBLVRenderParams->vPartyPos.z * pFace->pFacePlane_old.vNormal.z) <= 589824 ) // we sure are standing at the portal plane { v7 = pFace->uSectorID; - if ( pSectors[0].uSectorID == v7 ) + if ( nodes[0].uSectorID == v7 ) // draw back sector v7 = pFace->uBackSectorID; - pSectors[pNumSectors].uSectorID = v7; - pSectors[pNumSectors].uFaceID = uFaceID; - pSectors[pNumSectors].uViewportX = pBLVRenderParams->uViewportX; - pSectors[pNumSectors].uViewportZ = pBLVRenderParams->uViewportZ; - pSectors[pNumSectors].uViewportY = pBLVRenderParams->uViewportY; - pSectors[pNumSectors].uViewportW = pBLVRenderParams->uViewportW; - pSectors[pNumSectors++].field_C._43F9E1( - pBLVRenderParams->uViewportX, - pBLVRenderParams->uViewportY, - pBLVRenderParams->uViewportZ, - pBLVRenderParams->uViewportW); - sub_440639(pNumSectors - 1); + nodes[num_nodes].uSectorID = v7; + nodes[num_nodes].uFaceID = uFaceID; + nodes[num_nodes].uViewportX = pBLVRenderParams->uViewportX; + 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); + AddBspNodeToRenderList(num_nodes - 1); return; } //v5 = v39; //v6 = a0; } + v8 = &pIndoor->pVertices[pFace->pVertexIDs[0]]; v9 = pFace->pFacePlane_old.vNormal.x * (v8->x - pBLVRenderParams->vPartyPos.x) + pFace->pFacePlane_old.vNormal.y * (v8->y - pBLVRenderParams->vPartyPos.y) + pFace->pFacePlane_old.vNormal.z * (v8->z - pBLVRenderParams->vPartyPos.z); if (p->uSectorID != pFace->uSectorID) v9 = -v9; - if ( v9 < 0 ) + if (v9 >= 0) + return; + + auto num_vertices = sub_423B5D(uFaceID); + if (num_vertices < 2) + return; + + auto face_min_screenspace_x = _50BAC8_screen_space_x[0], + face_max_screenspace_x = _50BAC8_screen_space_x[0]; + auto face_min_screenspace_y = _50B9D8_screen_space_y[0], + face_max_screenspace_y = _50B9D8_screen_space_y[0]; + for (uint i = 1; i < num_vertices; ++i) { - v10 = sub_423B5D(uFaceID); - v34 = v10; - if ( v10 ) - { - v11 = dword_50BAC8[0]; - v12 = dword_50B9D8_ys[0]; - a2 = dword_50BAC8[0]; + if (face_min_screenspace_x > _50BAC8_screen_space_x[i]) + face_min_screenspace_x = _50BAC8_screen_space_x[i]; + if (face_max_screenspace_x < _50BAC8_screen_space_x[i]) + face_max_screenspace_x = _50BAC8_screen_space_x[i]; + + if (face_min_screenspace_y > _50B9D8_screen_space_y[i]) + face_min_screenspace_y = _50B9D8_screen_space_y[i]; + if (face_max_screenspace_y < _50B9D8_screen_space_y[i]) + face_max_screenspace_y = _50B9D8_screen_space_y[i]; + } + //v10 = sub_423B5D(uFaceID); + //v34 = v10; + //if ( v10 ) + //{ + /* v11 = _50BAC8_screen_space_x[0]; + v12 = _50B9D8_screen_space_y[0]; + a2 = _50BAC8_screen_space_x[0]; v13 = 1; - v37 = dword_50B9D8_ys[0]; + v37 = _50B9D8_screen_space_y[0]; if ( v10 > 1 ) { do { - v14 = dword_50BAC8[v13]; + v14 = _50BAC8_screen_space_x[v13]; if ( v14 < a2 ) - a2 = dword_50BAC8[v13]; + a2 = _50BAC8_screen_space_x[v13]; if ( v14 > v11 ) v11 = v14; - v15 = dword_50B9D8_ys[v13]; + v15 = _50B9D8_screen_space_y[v13]; if ( v15 < v37 ) - v37 = dword_50B9D8_ys[v13]; + v37 = _50B9D8_screen_space_y[v13]; if ( v15 > v12 ) - v12 = dword_50B9D8_ys[v13]; + v12 = _50B9D8_screen_space_y[v13]; v10 = v34; ++v13; } @@ -1361,24 +1391,28 @@ a2 <= p->uViewportZ && v12 >= p->uViewportY && v37 <= p->uViewportW && - sub_424829(v10, &pSectors[pNumSectors].field_C, &p->field_C, uFaceID)) + sub_424829(v10, &nodes[num_nodes].field_C, &p->field_C, uFaceID))*/ + if (face_max_screenspace_x >= p->uViewportX && + 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)) { //v17 = v39; v18 = pFace->uSectorID; if (p->uSectorID == v18 ) v18 = pFace->uBackSectorID; - pSectors[pNumSectors].uSectorID = v18; - pSectors[pNumSectors].uFaceID = uFaceID; - pSectors[pNumSectors].uViewportX = pBLVRenderParams->uViewportX; - pSectors[pNumSectors].uViewportZ = pBLVRenderParams->uViewportZ; - pSectors[pNumSectors].uViewportY = pBLVRenderParams->uViewportY; - pSectors[pNumSectors].uViewportW = pBLVRenderParams->uViewportW; + nodes[num_nodes].uSectorID = v18; + nodes[num_nodes].uFaceID = uFaceID; + nodes[num_nodes].uViewportX = pBLVRenderParams->uViewportX; + nodes[num_nodes].uViewportZ = pBLVRenderParams->uViewportZ; + nodes[num_nodes].uViewportY = pBLVRenderParams->uViewportY; + nodes[num_nodes].uViewportW = pBLVRenderParams->uViewportW; //v38 = pGame->pStru10Instance; //a0a = pGame->pIndoorCameraD3D; if (p->std__vector_0007A8 == -1 ) { - v29 = pGame->pStru10Instance->_49C681_DrawDebugStuff(pFace, pSectors[pNumSectors].std__vector_0007AC, - pSectors[pNumSectors].pVertices); + v29 = pGame->pStru10Instance->_49C681_DrawDebugStuff(pFace, nodes[num_nodes].std__vector_0007AC, nodes[num_nodes].pVertices); } else { @@ -1386,7 +1420,7 @@ static RenderVertexSoft static_subAddFaceToRenderList_d3d_stru_F79E08[64]; //v23 = 0; - a2 = pFace->uNumVertices; + unsigned int a2 = pFace->uNumVertices; for (uint k = 0; k < pFace->uNumVertices; ++k) { //v24 = (char *)&static_subAddFaceToRenderList_d3d_stru_F7AA08[0].vWorldPosition.z; @@ -1407,46 +1441,35 @@ } pGame->pIndoorCameraD3D->_437285_prolly_colide_vertices_against_frustrum( static_subAddFaceToRenderList_d3d_stru_F7AA08, - (unsigned int *)&a2, + &a2, static_subAddFaceToRenderList_d3d_stru_F79E08, p->std__vector_0007AC, 4, 0, 0); - v29 = pGame->pStru10Instance->_49C5DA(pFace, static_subAddFaceToRenderList_d3d_stru_F79E08, &a2, - pSectors[pNumSectors].std__vector_0007AC, - pSectors[pNumSectors].pVertices); + v29 = pGame->pStru10Instance->_49C5DA(pFace, static_subAddFaceToRenderList_d3d_stru_F79E08, (int *)&a2, + nodes[num_nodes].std__vector_0007AC, + nodes[num_nodes].pVertices); } if ( v29 ) { - pSectors[pNumSectors].std__vector_0007A8 = uFaceID; - v30 = pNumSectors; + nodes[num_nodes].std__vector_0007A8 = uFaceID; + v30 = num_nodes; if ( v30 < 150 ) { - v31 = v30 + 1; - pNumSectors = v31; - sub_440639(v31 - 1); + //v31 = v30 + 1; + num_nodes = v30 + 1; + AddBspNodeToRenderList(v30); } } if (pBLVRenderParams->uFlags & INDOOR_CAMERA_DRAW_SW_OUTLINES) pGame->pIndoorCameraD3D->PrepareAndDrawDebugOutline(pFace, 0x1E1EFF); } - } - } - } - else - { - if (uNumFaceIDs < 1000 ) - { - pFaceIDs[2 * uNumFaceIDs] = uFaceID; - pFaceIDs[2 * uNumFaceIDs++ + 1] = a2; - } - } } //----- (004AFB86) -------------------------------------------------------- -void BspRenderer::AddFaceToRenderList_sw(int a2, unsigned int uFaceID) +void BspRenderer::AddFaceToRenderList_sw(unsigned int node_id, unsigned int uFaceID) { BspRenderer *v3; // ebx@1 BLVFace *v4; // eax@1 @@ -1473,13 +1496,13 @@ v3 = this; v4 = &pIndoor->pFaces[uFaceID]; v21 = v4; - if (v4->TwoSided()) + if (v4->Portal()) { - v5 = (char *)this + 2252 * a2; + v5 = (char *)this + 2252 * node_id; v20 = v5; if ( uFaceID == *((short *)v5 + 2982) ) return; - if ( !a2 + if (!node_id && pBLVRenderParams->vPartyPos.x >= v4->pBounding.x1 - 16 && pBLVRenderParams->vPartyPos.x <= v4->pBounding.x2 + 16 && pBLVRenderParams->vPartyPos.y >= v4->pBounding.y1 - 16 @@ -1492,20 +1515,20 @@ + pBLVRenderParams->vPartyPos.z * v4->pFacePlane_old.vNormal.z) <= 589824 ) { v6 = v21->uSectorID; - if ( v3->pSectors[0].uSectorID == v6 ) + if ( v3->nodes[0].uSectorID == v6 ) v6 = v21->uBackSectorID; - v3->pSectors[v3->pNumSectors].uSectorID = v6; - v3->pSectors[v3->pNumSectors].uFaceID = uFaceID; - v3->pSectors[v3->pNumSectors].uViewportX = LOWORD(pBLVRenderParams->uViewportX); - v3->pSectors[v3->pNumSectors].uViewportZ = LOWORD(pBLVRenderParams->uViewportZ); - v3->pSectors[v3->pNumSectors].uViewportY = LOWORD(pBLVRenderParams->uViewportY); - v3->pSectors[v3->pNumSectors].uViewportW = LOWORD(pBLVRenderParams->uViewportW); - v3->pSectors[v3->pNumSectors++].field_C._43F9E1( + v3->nodes[v3->num_nodes].uSectorID = v6; + v3->nodes[v3->num_nodes].uFaceID = uFaceID; + v3->nodes[v3->num_nodes].uViewportX = LOWORD(pBLVRenderParams->uViewportX); + 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._43F9E1( SLOWORD(pBLVRenderParams->uViewportX), pBLVRenderParams->uViewportY, SLOWORD(pBLVRenderParams->uViewportZ), pBLVRenderParams->uViewportW); - v7 = v3->pNumSectors - 1; + v7 = v3->num_nodes - 1; goto LABEL_14; } v4 = v21; @@ -1523,25 +1546,25 @@ v19 = v10; if ( v10 ) { - v11 = dword_50BAC8[0]; - v12 = dword_50B9D8_ys[0]; - v23 = dword_50BAC8[0]; + v11 = _50BAC8_screen_space_x[0]; + v12 = _50B9D8_screen_space_y[0]; + v23 = _50BAC8_screen_space_x[0]; v13 = 1; - v22 = dword_50B9D8_ys[0]; + v22 = _50B9D8_screen_space_y[0]; if ( v10 > 1 ) { do { - v14 = dword_50BAC8[v13]; + v14 = _50BAC8_screen_space_x[v13]; if ( v14 < v23 ) - v23 = dword_50BAC8[v13]; + v23 = _50BAC8_screen_space_x[v13]; if ( v14 > v11 ) - v11 = dword_50BAC8[v13]; - v15 = dword_50B9D8_ys[v13]; + v11 = _50BAC8_screen_space_x[v13]; + v15 = _50B9D8_screen_space_y[v13]; if ( v15 < v22 ) - v22 = dword_50B9D8_ys[v13]; + v22 = _50B9D8_screen_space_y[v13]; if ( v15 > v12 ) - v12 = dword_50B9D8_ys[v13]; + v12 = _50B9D8_screen_space_y[v13]; v10 = v19; ++v13; } @@ -1551,25 +1574,25 @@ && v23 <= *((short *)v20 + 2007) && v12 >= *((short *)v20 + 2006) && v22 <= *((short *)v20 + 2008) - && sub_424829(v10, &v3->pSectors[v3->pNumSectors].field_C, (BspRenderer_stru2 *)(v20 + 4020), uFaceID) ) + && sub_424829(v10, &v3->nodes[v3->num_nodes].field_C, (BspRenderer_stru2 *)(v20 + 4020), uFaceID) ) { v16 = v21->uSectorID; if ( *((short *)v20 + 2004) == v16 ) v16 = v21->uBackSectorID; - v3->pSectors[v3->pNumSectors].uSectorID = v16; - v3->pSectors[v3->pNumSectors].uFaceID = uFaceID; - v3->pSectors[v3->pNumSectors].uViewportX = LOWORD(pBLVRenderParams->uViewportX); - v3->pSectors[v3->pNumSectors].uViewportZ = LOWORD(pBLVRenderParams->uViewportZ); - v3->pSectors[v3->pNumSectors].uViewportY = LOWORD(pBLVRenderParams->uViewportY); - v3->pSectors[v3->pNumSectors].uViewportW = LOWORD(pBLVRenderParams->uViewportW); - v17 = v3->pNumSectors; + v3->nodes[v3->num_nodes].uSectorID = v16; + v3->nodes[v3->num_nodes].uFaceID = uFaceID; + v3->nodes[v3->num_nodes].uViewportX = LOWORD(pBLVRenderParams->uViewportX); + 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); + v17 = v3->num_nodes; if ( v17 < 150 ) { v18 = v17 + 1; - v3->pNumSectors = v18; + v3->num_nodes = v18; v7 = v18 - 1; LABEL_14: - sub_440639(v7); + AddBspNodeToRenderList(v7); return; } } @@ -1578,10 +1601,10 @@ } else { - if ( (signed int)this->uNumFaceIDs < 1000 ) + if (num_faces < 1000) { - this->pFaceIDs[2 * this->uNumFaceIDs] = uFaceID; - this->pFaceIDs[2 * this->uNumFaceIDs++ + 1] = a2; + faces[num_faces].uFaceID = uFaceID; + faces[num_faces++].uNodeID = node_id; } } } @@ -1598,15 +1621,15 @@ int v6; // ecx@7 int v7; // esi@8 - for ( i = 0; i < (signed int)pBspRenderer->uNumFaceIDs; ++i ) + for ( i = 0; i < (signed int)pBspRenderer->num_faces; ++i ) { - v1 = pBspRenderer->pFaceIDs[2 * i]; + v1 = pBspRenderer->faces[i].uFaceID; if ( v1 >= 0 ) { if ( v1 < (signed int)pIndoor->uNumFaces ) { - v2 = pBspRenderer->pFaceIDs[2 * i]; - pBLVRenderParams->field_7C = &pBspRenderer->pSectors[pBspRenderer->pFaceIDs[2 * i + 1]].field_C; + v2 = pBspRenderer->faces[i].uFaceID; + pBLVRenderParams->field_7C = &pBspRenderer->nodes[pBspRenderer->faces[i].uNodeID].field_C; v3 = sub_423B5D(v2); if ( v3 ) { @@ -2479,21 +2502,6 @@ MessageBoxW(nullptr, L"Can't load file!", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Polydata.cpp:803", 0); return 0; } - - assert(sizeof(Vec3_short_) == 6); - assert(sizeof(BLVFace) == 96); - assert(sizeof(BLVFaceExtra) == 36); - assert(sizeof(BLVSector) == 116); - assert(sizeof(LevelDecoration) == 32); - assert(sizeof(BLVLightMM7) == 16); - assert(sizeof(BSPNode) == 8); - assert(sizeof(SpawnPointMM7) == 24); - assert(sizeof(DDM_DLV_Header) == 40); - assert(sizeof(Actor) == 836); - assert(sizeof(SpriteObject) == 112); - assert(sizeof(Chest) == 5324); - assert(sizeof(stru123) == 0xC8); - assert(sizeof(BLVMapOutline) == 12); bLoaded = true; @@ -2523,13 +2531,13 @@ pFace->pVertexIDs = ptr_2AC + j; j += pFace->uNumVertices + 1; - pFace->pXInterceptDisplacements = ptr_2AC + j; + pFace->pXInterceptDisplacements = (short *)(ptr_2AC + j); j += pFace->uNumVertices + 1; - pFace->pYInterceptDisplacements = ptr_2AC + j; + pFace->pYInterceptDisplacements = (short *)(ptr_2AC + j); j += pFace->uNumVertices + 1; - pFace->pZInterceptDisplacements = ptr_2AC + j; + pFace->pZInterceptDisplacements = (short *)(ptr_2AC + j); j += pFace->uNumVertices + 1; pFace->pVertexUIDs = (__int16 *)(ptr_2AC + j); diff -r 92c1e1250e7c -r ecfb1b3c9a39 Indoor.h --- a/Indoor.h Thu Mar 14 23:44:03 2013 +0200 +++ b/Indoor.h Fri Mar 15 04:13:24 2013 +0200 @@ -250,7 +250,7 @@ #pragma pack(pop) -#define FACE_TWO_SIDED 0x00000001 // portal/two-sided +#define FACE_PORTAL 0x00000001 // portal/two-sided #define FACE_CAN_SATURATE_COLOR 0x00000002 #define FACE_TEXTURE_ANIMATED 0x00000010 // like wavy water #define FACE_INVISIBLE 0x00002000 @@ -284,7 +284,7 @@ inline bool Invisible() const {return uAttributes & FACE_INVISIBLE;} inline bool Visible() const {return !Invisible();} - inline bool TwoSided() const {return uAttributes & FACE_TWO_SIDED;} + inline bool Portal() const {return uAttributes & FACE_PORTAL;} inline bool Animated() const {return uAttributes & FACE_TEXTURE_ANIMATED;} inline bool Clickable() const {return uAttributes & FACE_CLICKABLE;} @@ -296,9 +296,9 @@ int zCalc3; unsigned int uAttributes; unsigned __int16 *pVertexIDs; - unsigned __int16 *pXInterceptDisplacements; - unsigned __int16 *pYInterceptDisplacements; - unsigned __int16 *pZInterceptDisplacements; + signed __int16 *pXInterceptDisplacements; + signed __int16 *pYInterceptDisplacements; + signed __int16 *pZInterceptDisplacements; signed __int16 *pVertexUIDs; signed __int16 *pVertexVIDs; unsigned __int16 uFaceExtraID; diff -r 92c1e1250e7c -r ecfb1b3c9a39 IndoorCameraD3D.cpp --- a/IndoorCameraD3D.cpp Thu Mar 14 23:44:03 2013 +0200 +++ b/IndoorCameraD3D.cpp Fri Mar 15 04:13:24 2013 +0200 @@ -396,7 +396,7 @@ //----- (00438258) -------------------------------------------------------- bool IndoorCameraD3D::is_face_faced_to_camera(BLVFace *pFace, RenderVertexSoft *a2) { - if (pFace->TwoSided()) + if (pFace->Portal()) return false; //really strange cull; dot(to_cam, normal) < 0 means we see the BACK face, not font %_% diff -r 92c1e1250e7c -r ecfb1b3c9a39 Indoor_stuff.h --- a/Indoor_stuff.h Thu Mar 14 23:44:03 2013 +0200 +++ b/Indoor_stuff.h Fri Mar 15 04:13:24 2013 +0200 @@ -63,6 +63,14 @@ +#pragma pack(push, 1) +struct BspFace +{ + unsigned __int16 uFaceID; + unsigned __int16 uNodeID; +}; +#pragma pack(pop) + /* 163 */ #pragma pack(push, 1) @@ -74,21 +82,22 @@ // _eh_vector_constructor_iterator_(field_FA8, 2252, 150, // (void (__thiscall *)(void *))stru170_stru0::stru170_stru0, // (void (__thiscall *)(void *))stru170_stru0::dtor); - uNumFaceIDs = 0; - pNumSectors = 0; + num_faces = 0; + num_nodes = 0; uNumVisibleNotEmptySectors = 0; } - void AddFaceToRenderList_sw(int a2, unsigned int uFaceID); - void AddFaceToRenderList_d3d(signed int a2, unsigned int uFaceID); + void AddFaceToRenderList_sw(unsigned int node_id, unsigned int uFaceID); + void AddFaceToRenderList_d3d(unsigned int node_id, unsigned int uFaceID); void MakeVisibleSectorList(); void DrawFaceOutlines(); - unsigned int uNumFaceIDs; - __int16 pFaceIDs[2000]; + unsigned int num_faces; + //__int16 pFaceIDs[2000]; + BspFace faces[1000]; //char field_130[3700]; - unsigned int pNumSectors; - BspRenderer_stru0 pSectors[150]; + unsigned int num_nodes; + BspRenderer_stru0 nodes[150]; unsigned int uNumVisibleNotEmptySectors; unsigned __int16 pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[6]; }; diff -r 92c1e1250e7c -r ecfb1b3c9a39 Outdoor.h --- a/Outdoor.h Thu Mar 14 23:44:03 2013 +0200 +++ b/Outdoor.h Fri Mar 15 04:13:24 2013 +0200 @@ -80,7 +80,7 @@ inline bool Invisible() const {return uAttributes & FACE_INVISIBLE;} inline bool Visible() const {return !Invisible();} - inline bool TwoSided() const {return uAttributes & FACE_TWO_SIDED;} + inline bool TwoSided() const {return uAttributes & FACE_PORTAL;} struct Plane_int_ pFacePlane; int zCalc1; @@ -90,9 +90,9 @@ unsigned __int16 pVertexIDs[20]; unsigned __int16 pTextureUIDs[20]; unsigned __int16 pTextureVIDs[20]; - unsigned __int16 pXInterceptDisplacements[20]; - unsigned __int16 pYInterceptDisplacements[20]; - unsigned __int16 pZInterceptDisplacements[20]; + signed __int16 pXInterceptDisplacements[20]; + signed __int16 pYInterceptDisplacements[20]; + signed __int16 pZInterceptDisplacements[20]; unsigned __int16 uTextureID; __int16 sTextureDeltaU; __int16 sTextureDeltaV; diff -r 92c1e1250e7c -r ecfb1b3c9a39 Vis.cpp --- a/Vis.cpp Thu Mar 14 23:44:03 2013 +0200 +++ b/Vis.cpp Fri Mar 15 04:13:24 2013 +0200 @@ -349,9 +349,9 @@ v5 = 0; thisa = this; v17 = 0; - for ( a1.flt_2C = 0.0; v17 < (signed int)pBspRenderer->uNumFaceIDs; ++v17 ) + for ( a1.flt_2C = 0.0; v17 < (signed int)pBspRenderer->num_faces; ++v17 ) { - v6 = pBspRenderer->pFaceIDs[2 * v5]; + v6 = pBspRenderer->faces[v5].uFaceID; if ( v6 >= 0 ) { if ( v6 < (signed int)pIndoor->uNumFaces ) @@ -611,7 +611,7 @@ //float a5a; // [sp+30h] [bp+18h]@10 //float a5b; // [sp+30h] [bp+18h]@13 - if (a5->TwoSided() || a5->Invisible()) + if (a5->Portal() || a5->Invisible()) return false; @@ -1849,9 +1849,9 @@ result = 0; thisa = this; - for ( i = 0; i < (signed int)pBspRenderer->uNumFaceIDs; ++i ) + for ( i = 0; i < (signed int)pBspRenderer->num_faces; ++i ) { - v5 = pBspRenderer->pFaceIDs[2 * result]; + v5 = pBspRenderer->faces[result].uFaceID; if ( v5 >= 0 ) { if ( v5 < (signed int)pIndoor->uNumFaces ) diff -r 92c1e1250e7c -r ecfb1b3c9a39 mm7_1.cpp --- a/mm7_1.cpp Thu Mar 14 23:44:03 2013 +0200 +++ b/mm7_1.cpp Fri Mar 15 04:13:24 2013 +0200 @@ -5826,7 +5826,7 @@ else { dword_50B700 = 0; - if ( !v1->TwoSided() ) + if ( !v1->Portal() ) return 0; } //v66 = v1->uNumVertices; @@ -6122,15 +6122,15 @@ v70 = (signed int)(v56 - v58) * (signed __int64)(dword_50BAD4[v57 - 1] - dword_50BAD4[v57]) / (dword_50B9E4[v57 - 1] - v58); v59 = dword_50BAD4[v57]; } - dword_50BAC8[v55] = v70 + v59; + _50BAC8_screen_space_x[v55] = v70 + v59; v56 = pBLVRenderParams->uViewportW; - dword_50B9D8_ys[v55] = pBLVRenderParams->uViewportW; + _50B9D8_screen_space_y[v55] = pBLVRenderParams->uViewportW; ++v55; } if ( v85 ) { - dword_50BAC8[v55] = dword_50BAD4[v57]; - dword_50B9D8_ys[v55++] = dword_50B9E4[v57]; + _50BAC8_screen_space_x[v55] = dword_50BAD4[v57]; + _50B9D8_screen_space_y[v55++] = dword_50B9E4[v57]; } ++ie; thise = v85; @@ -6140,12 +6140,12 @@ if ( !v55 ) return 0; v61 = pRenderer->pRenderD3D == 0; - dword_50BAC8[v55] = dword_50BAC8[0]; - dword_50B9D8_ys[v55] = dword_50B9D8_ys[0]; + _50BAC8_screen_space_x[v55] = _50BAC8_screen_space_x[0]; + _50B9D8_screen_space_y[v55] = _50B9D8_screen_space_y[0]; if ( v61 && v55 > 3 ) { - dword_50BAC8[v55 + 1] = dword_50BAC8[1]; - dword_50B9D8_ys[v55 + 1] = dword_50B9D8_ys[1]; + _50BAC8_screen_space_x[v55 + 1] = _50BAC8_screen_space_x[1]; + _50B9D8_screen_space_y[v55 + 1] = _50B9D8_screen_space_y[1]; thisf = 2 * (dword_50B700 != 0) - 1; if ( v55 > 0 ) { @@ -6163,8 +6163,8 @@ if ( v64 >= v55 ) v64 -= v55; if ( thisf - * ((dword_50B9D8_ys[v64] - dword_50B9D8_ys[v63]) * (dword_50BAC8[v62] - dword_50BAC8[v63]) - - (dword_50B9D8_ys[v62] - dword_50B9D8_ys[v63]) * (dword_50BAC8[v64] - dword_50BAC8[v63])) < 0 ) + * ((_50B9D8_screen_space_y[v64] - _50B9D8_screen_space_y[v63]) * (_50BAC8_screen_space_x[v62] - _50BAC8_screen_space_x[v63]) + - (_50B9D8_screen_space_y[v62] - _50B9D8_screen_space_y[v63]) * (_50BAC8_screen_space_x[v64] - _50BAC8_screen_space_x[v63])) < 0 ) { v62 = v80; v71 = v80; @@ -6175,16 +6175,16 @@ v65 = v71; if ( v71 < v55 || (v65 = v71 - v55, v71 - v55 < v55) ) { - memcpy(&dword_50B9D8_ys[v65], &dword_50B9D8_ys[v65 + 1], 4 * ((unsigned int)(4 * (v55 - v65)) >> 2)); - memcpy(&dword_50BAC8[v65], &dword_50BAC8[v65 + 1], 4 * ((unsigned int)(4 * (v55 - v65)) >> 2)); + memcpy(&_50B9D8_screen_space_y[v65], &_50B9D8_screen_space_y[v65 + 1], 4 * ((unsigned int)(4 * (v55 - v65)) >> 2)); + memcpy(&_50BAC8_screen_space_x[v65], &_50BAC8_screen_space_x[v65 + 1], 4 * ((unsigned int)(4 * (v55 - v65)) >> 2)); } --v55; } } while ( v62 - 1 < v55 ); } - dword_50BAC8[v55] = dword_50BAC8[0]; - dword_50B9D8_ys[v55] = dword_50B9D8_ys[0]; + _50BAC8_screen_space_x[v55] = _50BAC8_screen_space_x[0]; + _50B9D8_screen_space_y[v55] = _50B9D8_screen_space_y[0]; } return v55; } @@ -6544,23 +6544,23 @@ v60 = a2; if ( !a1 || (!dword_50B700 ? (v64 = -1, v6 = 1, v63 = 1) : (v6 = 1, v63 = -1, v64 = 1), - v7 = dword_50B9D8_ys[0], + v7 = _50B9D8_screen_space_y[0], v65 = 0, - v8 = dword_50B9D8_ys[0], + v8 = _50B9D8_screen_space_y[0], a1 <= v6) ) return 0; do { - v9 = dword_50B9D8_ys[v6]; + v9 = _50B9D8_screen_space_y[v6]; if ( v9 >= v7 ) { if ( v9 > v8 ) - v8 = dword_50B9D8_ys[v6]; + v8 = _50B9D8_screen_space_y[v6]; } else { v65 = v6; - v7 = dword_50B9D8_ys[v6]; + v7 = _50B9D8_screen_space_y[v6]; } ++v6; } @@ -6588,8 +6588,8 @@ { v10 -= v74; } - v12 = dword_50B9D8_ys[v10]; - if ( v12 <= dword_50B9D8_ys[v11] ) + v12 = _50B9D8_screen_space_y[v10]; + if ( v12 <= _50B9D8_screen_space_y[v11] ) { v55 = v10; v11 = v10; @@ -6614,12 +6614,12 @@ } v67 = v13; LABEL_27: - if ( dword_50B9D8_ys[v13] != dword_50B9D8_ys[v55] ) + if ( _50B9D8_screen_space_y[v13] != _50B9D8_screen_space_y[v55] ) { - v14 = dword_50BAC8[v55]; + v14 = _50BAC8_screen_space_x[v55]; v62 = v14 << 16; - v54 = ((dword_50BAC8[v13] - v14) << 16) / (dword_50B9D8_ys[v13] - dword_50B9D8_ys[v55]); - v5->array_18[v7] = LOWORD(dword_50BAC8[v55]); + v54 = ((_50BAC8_screen_space_x[v13] - v14) << 16) / (_50B9D8_screen_space_y[v13] - _50B9D8_screen_space_y[v55]); + v5->array_18[v7] = LOWORD(_50BAC8_screen_space_x[v55]); } v15 = v65; v69 = 0; @@ -6639,8 +6639,8 @@ { v15 -= v74; } - v17 = dword_50B9D8_ys[v15]; - if ( v17 <= dword_50B9D8_ys[v16] ) + v17 = _50B9D8_screen_space_y[v15]; + if ( v17 <= _50B9D8_screen_space_y[v16] ) { v61 = v15; v16 = v15; @@ -6667,14 +6667,14 @@ LABEL_44: v19 = v18; v20 = v61; - v53 = dword_50B9D8_ys[v19] - dword_50B9D8_ys[v61]; - if ( dword_50B9D8_ys[v19] != dword_50B9D8_ys[v61] ) + v53 = _50B9D8_screen_space_y[v19] - _50B9D8_screen_space_y[v61]; + if ( _50B9D8_screen_space_y[v19] != _50B9D8_screen_space_y[v61] ) { - v21 = dword_50BAC8[v20]; + v21 = _50BAC8_screen_space_x[v20]; v5 = v60; v61 = v21 << 16; - v53 = ((dword_50BAC8[v19] - v21) << 16) / v53; - v60->array_3D8[v73] = LOWORD(dword_50BAC8[v20]); + v53 = ((_50BAC8_screen_space_x[v19] - v21) << 16) / v53; + v60->array_3D8[v73] = LOWORD(_50BAC8_screen_space_x[v20]); } v22 = v7; v70 = v7; @@ -6685,7 +6685,7 @@ do { v24 = v67; - if ( v22 < dword_50B9D8_ys[v67] || v22 == v73 ) + if ( v22 < _50B9D8_screen_space_y[v67] || v22 == v73 ) goto LABEL_57; v25 = v64 + v67; v67 = v25; @@ -6702,16 +6702,16 @@ v67 = v25; LABEL_55: v26 = v25; - v27 = dword_50B9D8_ys[v26] - dword_50B9D8_ys[v24]; - if ( dword_50B9D8_ys[v26] - dword_50B9D8_ys[v24] > 0 ) + v27 = _50B9D8_screen_space_y[v26] - _50B9D8_screen_space_y[v24]; + if ( _50B9D8_screen_space_y[v26] - _50B9D8_screen_space_y[v24] > 0 ) { - v28 = dword_50BAC8[v24]; - v54 = ((dword_50BAC8[v26] - v28) << 16) / v27; + v28 = _50BAC8_screen_space_x[v24]; + v54 = ((_50BAC8_screen_space_x[v26] - v28) << 16) / v27; v62 = v28 << 16; } LABEL_57: v29 = v66; - if ( v70 >= dword_50B9D8_ys[v66] && v70 != v73 ) + if ( v70 >= _50B9D8_screen_space_y[v66] && v70 != v73 ) { v30 = v63 + v66; v66 += v63; @@ -6727,11 +6727,11 @@ v66 = v30; } v31 = v30; - v32 = dword_50B9D8_ys[v31] - dword_50B9D8_ys[v29]; - if ( dword_50B9D8_ys[v31] - dword_50B9D8_ys[v29] > 0 ) + v32 = _50B9D8_screen_space_y[v31] - _50B9D8_screen_space_y[v29]; + if ( _50B9D8_screen_space_y[v31] - _50B9D8_screen_space_y[v29] > 0 ) { - v33 = dword_50BAC8[v29]; - v53 = ((dword_50BAC8[v31] - v33) << 16) / v32; + v33 = _50BAC8_screen_space_x[v29]; + v53 = ((_50BAC8_screen_space_x[v31] - v33) << 16) / v32; v61 = v33 << 16; } } diff -r 92c1e1250e7c -r ecfb1b3c9a39 mm7_2.cpp --- a/mm7_2.cpp Thu Mar 14 23:44:03 2013 +0200 +++ b/mm7_2.cpp Fri Mar 15 04:13:24 2013 +0200 @@ -10443,6 +10443,20 @@ assert(sizeof(stru320) == 0x3FC); assert(sizeof(TravelInfo) == 0x20); assert(sizeof(stru336) == 0x798); + assert(sizeof(Vec3_short_) == 6); + assert(sizeof(BLVFace) == 96); + assert(sizeof(BLVFaceExtra) == 36); + assert(sizeof(BLVSector) == 116); + assert(sizeof(LevelDecoration) == 32); + assert(sizeof(BLVLightMM7) == 16); + assert(sizeof(BSPNode) == 8); + assert(sizeof(SpawnPointMM7) == 24); + assert(sizeof(DDM_DLV_Header) == 40); + assert(sizeof(Actor) == 836); + assert(sizeof(SpriteObject) == 112); + assert(sizeof(Chest) == 5324); + assert(sizeof(stru123) == 0xC8); + assert(sizeof(BLVMapOutline) == 12); } bool new_sky = false; diff -r 92c1e1250e7c -r ecfb1b3c9a39 mm7_3.cpp --- a/mm7_3.cpp Thu Mar 14 23:44:03 2013 +0200 +++ b/mm7_3.cpp Fri Mar 15 04:13:24 2013 +0200 @@ -138,7 +138,7 @@ { v11 = v9->pFloors[v10]; v12 = &pIndoor->pFaces[v11]; - if ( v12->TwoSided() + if ( v12->Portal() || stru_721530.sMaxX > v12->pBounding.x2 || stru_721530.sMinX < v12->pBounding.x1 || stru_721530.sMaxY > v12->pBounding.y2 @@ -3795,7 +3795,7 @@ v6 = (unsigned __int64)(a2->z * (signed __int64)v4->pFacePlane_old.vNormal.z) >> 16, v7 = v5 + v6 + a4b, (v16 = v5 + v6 + a4b) == 0) - || v7 > 0 && !v4->TwoSided()) + || v7 > 0 && !v4->Portal()) return 0; v8 = v4->pFacePlane_old.vNormal.z * a1->z; v9 = -(v4->pFacePlane_old.dist + v8 + a1->y * v4->pFacePlane_old.vNormal.y + a1->x * v4->pFacePlane_old.vNormal.x); @@ -3855,7 +3855,7 @@ v14 = v10 + v12 + v11, v22 = v10 + v12 + v11, v13) - || v14 > 0 && !a2->TwoSided()) + || v14 > 0 && !a2->Portal()) return 0; v15 = a4 * a2->pFacePlane_old.vNormal.y; v16 = -(a2->pFacePlane_old.dist + v15 + a3 * a2->pFacePlane_old.vNormal.x + a5 * a2->pFacePlane_old.vNormal.z); @@ -11144,24 +11144,23 @@ //----- (0043F953) -------------------------------------------------------- void PrepareBspRenderList_BLV() { - pBspRenderer->uNumFaceIDs = 0; + pBspRenderer->num_faces = 0; if (pBLVRenderParams->uPartySectorID) { - pBspRenderer->pSectors[0].uSectorID = pBLVRenderParams->uPartySectorID; - pBspRenderer->pSectors[0].uViewportW = pBLVRenderParams->uViewportW; - pBspRenderer->pSectors[0].uViewportZ = pBLVRenderParams->uViewportZ; - pBspRenderer->pSectors[0].uViewportY = pBLVRenderParams->uViewportY; - pBspRenderer->pSectors[0].uViewportX = pBLVRenderParams->uViewportX; - pBspRenderer->pSectors[0].field_C._43F9E1( - pBLVRenderParams->uViewportX, - pBLVRenderParams->uViewportY, - pBLVRenderParams->uViewportZ, - pBLVRenderParams->uViewportW); - pBspRenderer->pSectors[0].uFaceID = -1; - pBspRenderer->pSectors[0].std__vector_0007A8 = -1; - pBspRenderer->pNumSectors = 1; - sub_440639(0); + pBspRenderer->nodes[0].uSectorID = pBLVRenderParams->uPartySectorID; + pBspRenderer->nodes[0].uViewportW = pBLVRenderParams->uViewportW; + 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].uFaceID = -1; + pBspRenderer->nodes[0].std__vector_0007A8 = -1; + pBspRenderer->num_nodes = 1; + AddBspNodeToRenderList(0); } pBspRenderer->MakeVisibleSectorList(); @@ -11177,8 +11176,8 @@ { if ( i < y || i > w ) { + array_18[i] = 640; array_3D8[i] = -1; - array_18[i] = 640; } else { @@ -11516,36 +11515,36 @@ //----- (00440639) -------------------------------------------------------- -void __fastcall sub_440639(int a1) -{ - int v1; // ebx@1 +void AddBspNodeToRenderList(unsigned int node_id) +{ + //int v1; // ebx@1 signed int v2; // edi@1 BLVSector *v3; // esi@1 - v1 = a1; + //v1 = sector_id; v2 = 0; - v3 = &pIndoor->pSectors[pBspRenderer->pSectors[a1].uSectorID]; + v3 = &pIndoor->pSectors[pBspRenderer->nodes[node_id].uSectorID]; if ( pRenderer->pRenderD3D ) { for (uint i = 0; i < v3->uNumNonBSPFaces; ++i) //Log::Warning(L"Non-BSP face: %X", v3->pFaceIDs[v2]); - pBspRenderer->AddFaceToRenderList_d3d(v1, v3->pFaceIDs[i]); + pBspRenderer->AddFaceToRenderList_d3d(node_id, v3->pFaceIDs[i]); } else { if ( v3->uNumNonBSPFaces > 0 ) { do - pBspRenderer->AddFaceToRenderList_sw(v1, v3->pFaceIDs[v2++]); + pBspRenderer->AddFaceToRenderList_sw(node_id, v3->pFaceIDs[v2++]); while ( v2 < v3->uNumNonBSPFaces ); } } if ( v3->field_0 & 0x10 ) - sub_4406BC(v1, v3->uFirstBSPNode); + sub_4406BC(node_id, v3->uFirstBSPNode); } //----- (004406BC) -------------------------------------------------------- -void __fastcall sub_4406BC(int a1, unsigned int uFirstNode) +void __fastcall sub_4406BC(unsigned int node_id, unsigned int uFirstNode) { BLVSector *v2; // esi@2 BSPNode *v3; // edi@2 @@ -11555,14 +11554,14 @@ int v7; // ebp@10 int v8; // ebx@10 __int16 v9; // di@18 - int v10; // [sp+10h] [bp-Ch]@1 + //int v10; // [sp+10h] [bp-Ch]@1 bool v11; // [sp+14h] [bp-8h]@5 BspRenderer_stru0 *v12; // [sp+18h] [bp-4h]@1 //Log::Warning(L"sub_4406BC(%u, %u)", a1, uFirstNode); - v10 = a1; - v12 = &pBspRenderer->pSectors[a1]; + //v10 = a1; + v12 = &pBspRenderer->nodes[node_id]; while ( 1 ) { v2 = &pIndoor->pSectors[v12->uSectorID]; @@ -11572,7 +11571,7 @@ + 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->TwoSided() && v4->uSectorID != v12->uSectorID ) + if (v4->Portal() && v4->uSectorID != v12->uSectorID ) v5 = -v5; v11 = v5 > 0; if ( v5 <= 0 ) @@ -11580,7 +11579,7 @@ else v6 = v3->uBack; if ( v6 != -1 ) - sub_4406BC(v10, v6); + sub_4406BC(node_id, v6); v7 = v3->uCoplanarOffset; v8 = v7 + v3->uCoplanarSize; @@ -11589,12 +11588,12 @@ if ( pRenderer->pRenderD3D ) { while ( v7 < v8 ) - pBspRenderer->AddFaceToRenderList_d3d(v10, v2->pFaceIDs[v7++]); + pBspRenderer->AddFaceToRenderList_d3d(node_id, v2->pFaceIDs[v7++]); } else { while ( v7 < v8 ) - pBspRenderer->AddFaceToRenderList_sw(v10, v2->pFaceIDs[v7++]); + pBspRenderer->AddFaceToRenderList_sw(node_id, v2->pFaceIDs[v7++]); } v9 = v11 ? v3->uFront : v3->uBack; if ( v9 == -1 ) diff -r 92c1e1250e7c -r ecfb1b3c9a39 mm7_4.cpp --- a/mm7_4.cpp Thu Mar 14 23:44:03 2013 +0200 +++ b/mm7_4.cpp Fri Mar 15 04:13:24 2013 +0200 @@ -778,7 +778,7 @@ BSPModel *v6; // edi@3 ODMFace *v7; // esi@10 unsigned __int8 v8; // al@10 - unsigned __int16 *v9; // eax@18 + signed __int16 *v9; // eax@18 int v10; // edx@19 int v11; // ecx@21 int v12; // ecx@23 diff -r 92c1e1250e7c -r ecfb1b3c9a39 mm7_5.cpp --- a/mm7_5.cpp Thu Mar 14 23:44:03 2013 +0200 +++ b/mm7_5.cpp Fri Mar 15 04:13:24 2013 +0200 @@ -9251,25 +9251,24 @@ int v6; // ebx@3 uNumVisibleNotEmptySectors = 0; - for (uint i = 0; i < pNumSectors; ++i) - { - v6 = 0; + for (uint i = 0; i < num_nodes; ++i) + { if (!uNumVisibleNotEmptySectors) { - pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[uNumVisibleNotEmptySectors++] = pSectors[i].uSectorID; - } - else - { - while (pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[v6] != pSectors[i].uSectorID ) + pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[uNumVisibleNotEmptySectors++] = nodes[i].uSectorID; + continue; + } + + v6 = 0; + while (pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[v6] != nodes[i].uSectorID ) { ++v6; if ( v6 >= uNumVisibleNotEmptySectors) { - pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[uNumVisibleNotEmptySectors++] = pSectors[i].uSectorID; - continue; - } - } - } + pVisibleSectorIDs_toDrawDecorsActorsEtcFrom[uNumVisibleNotEmptySectors++] = nodes[i].uSectorID; + } + } + } } @@ -11566,7 +11565,7 @@ ++sDepthb ) { v62 = &pIndoor->pFaces[(*(unsigned __int16 **)((char *)&v60->pWalls + v61))[sDepthb]]; - if ( v62->TwoSided() + if ( v62->Portal() || v119 > v62->pBounding.x2 || v123 < v62->pBounding.x1 || v127 > v62->pBounding.y2 @@ -11732,7 +11731,7 @@ while ( 1 ) { v90 = &pIndoor->pFaces[(*(unsigned __int16 **)((char *)&v88->pWalls + v89))[v162]]; - if ( v90->TwoSided() + if ( v90->Portal() || v120 > v90->pBounding.x2 || v124 < v90->pBounding.x1 || v128 > v90->pBounding.y2 diff -r 92c1e1250e7c -r ecfb1b3c9a39 mm7_data.cpp --- a/mm7_data.cpp Thu Mar 14 23:44:03 2013 +0200 +++ b/mm7_data.cpp Fri Mar 15 04:13:24 2013 +0200 @@ -1718,7 +1718,7 @@ int dword_50B918[777]; int _50B924_view_transformed_xs[45]; //int unk_50B9D4[777]; // idb -int dword_50B9D8_ys[777]; +int _50B9D8_screen_space_y[777]; int dword_50B9E4[777]; //int dword_50B9E0_ys[777]; // idb //int dword_50B9EC[777]; // idb @@ -1729,7 +1729,7 @@ int dword_50B9FC_ys[3 + 45]; int dword_50BA08_ys[48]; // idb //int dword_50BAC4[777]; // weak -int dword_50BAC8[777]; // idb +int _50BAC8_screen_space_x[777]; // idb //int dword_50BAD0[777]; // weak int dword_50BAD4[777]; // weak //int dword_50BADC_xs[777]; // weak diff -r 92c1e1250e7c -r ecfb1b3c9a39 mm7_data.h --- a/mm7_data.h Thu Mar 14 23:44:03 2013 +0200 +++ b/mm7_data.h Fri Mar 15 04:13:24 2013 +0200 @@ -1232,7 +1232,7 @@ extern int dword_50B918[]; extern int _50B924_view_transformed_xs[]; //extern int unk_50B9D4[]; // idb -extern int dword_50B9D8_ys[]; +extern int _50B9D8_screen_space_y[]; extern int dword_50B9E4[]; //extern int dword_50B9E0_ys[]; // idb //extern int dword_50B9EC[]; // idb @@ -1243,7 +1243,7 @@ extern int dword_50B9FC_ys[]; extern int dword_50BA08_ys[]; // idb //extern int dword_50BAC4[]; // weak -extern int dword_50BAC8[]; // idb +extern int _50BAC8_screen_space_x[]; // idb //extern int dword_50BAD0[]; // weak extern int dword_50BAD4[]; // weak //extern int dword_50BADC_xs[]; // weak @@ -1988,8 +1988,8 @@ void __fastcall PrepareDecorationsRenderList_BLV(unsigned int uDecorationID, unsigned int uSectorID); void PrepareActorRenderList_BLV(); void PrepareItemsRenderList_BLV(); -void __fastcall sub_440639(int a1); -void __fastcall sub_4406BC(int a1, unsigned int uFirstNode); // idb +void AddBspNodeToRenderList(unsigned int node_id); +void __fastcall sub_4406BC(unsigned int node_id, unsigned int uFirstNode); // idb void __fastcall sub_440BED(struct IndoorLocation_drawstru *_this); bool sub_44100D(); void GameUI_DrawTorchlightAndWizardEye(); diff -r 92c1e1250e7c -r ecfb1b3c9a39 stru10.cpp --- a/stru10.cpp Thu Mar 14 23:44:03 2013 +0200 +++ b/stru10.cpp Fri Mar 15 04:13:24 2013 +0200 @@ -1,3 +1,5 @@ +#include + #include "stru10.h" #include "Render.h" #include "Indoor.h" @@ -440,7 +442,7 @@ for (uint i = 0; i < pFace->uNumVertices; ++i) { v46[i].x = pIndoor->pVertices[pFace->pVertexIDs[i]].x + pFace->pXInterceptDisplacements[i]; - v46[i].y = pIndoor->pVertices[pFace->pVertexIDs[i]].y + pFace->pZInterceptDisplacements[i]; + v46[i].y = pIndoor->pVertices[pFace->pVertexIDs[i]].z + pFace->pZInterceptDisplacements[i]; v46[i].c = i; } } @@ -448,8 +450,8 @@ { for (uint i = 0; i < pFace->uNumVertices; ++i) { - v46[i].x = pIndoor->pVertices[pFace->pVertexIDs[i]].x + pFace->pYInterceptDisplacements[i]; - v46[i].y = pIndoor->pVertices[pFace->pVertexIDs[i]].y + pFace->pZInterceptDisplacements[i]; + v46[i].x = pIndoor->pVertices[pFace->pVertexIDs[i]].y + pFace->pYInterceptDisplacements[i]; + v46[i].y = pIndoor->pVertices[pFace->pVertexIDs[i]].z + pFace->pZInterceptDisplacements[i]; v46[i].c = i; } } @@ -583,6 +585,7 @@ var_28 = 1; var_24 = 0; } + else assert(false); float arg_4; @@ -595,6 +598,25 @@ //__asm { fld 0.5 } if (pFace->uAttributes & 0x0100) { + /*arg_4 = ([2].x + [0].x) * flt_4D84F0 + var_18 = ([3].y + [1].y) * flt_4D84F0 + + fld dword ptr [ecx+94h] + fadd dword ptr [ecx+34h] + fmul st, st(1) + fstp [ebp+var_18] + fld dword ptr [ecx+68h] + fadd dword ptr [ecx+8] + fmul st, st(1) + fstp [ebp+var_4] + fld [ebp+arg4] + fsub dword ptr [ecx] + fstp [ebp+a3] + fld [ebp+var_18] + fsub dword ptr [ecx+34h] + fstp [ebp+var_8]*/ + + arg_4 = (pFaceBounding[0].vWorldPosition.x + pFaceBounding[2].vWorldPosition.x) / 2; var_18 = (pFaceBounding[3].vWorldPosition.y + pFaceBounding[1].vWorldPosition.y) / 2; var_4 = (pFaceBounding[0].vWorldPosition.z + pFaceBounding[2].vWorldPosition.z) / 2; @@ -631,7 +653,7 @@ } - if ( byte_4D864C && pGame->uFlags & 8 ) + if ( byte_4D864C && pGame->uFlags & GAME_FLAGS_1_DRAW_BLV_DEBUGS) { RenderVertexSoft v26; // [sp+40h] [bp-60h]@20 v26.vWorldPosition.x = arg_4; @@ -674,7 +696,7 @@ if ( byte_4D864C ) { - if ( pGame->uFlags & 8 ) + if ( pGame->uFlags & GAME_FLAGS_1_DRAW_BLV_DEBUGS) { RenderVertexSoft v25; // [sp+10h] [bp-90h]@20 RenderVertexSoft v26; // [sp+40h] [bp-60h]@20 @@ -705,7 +727,7 @@ memcpy(arg0 + 3, &v25, sizeof(RenderVertexSoft)); } - if ( byte_4D864C && pGame->uFlags & 8 ) + if ( byte_4D864C && pGame->uFlags & GAME_FLAGS_1_DRAW_BLV_DEBUGS) { RenderVertexSoft v26; // [sp+40h] [bp-60h]@20 if ( !LOBYTE(field_4) ) @@ -741,14 +763,14 @@ //----- (0049C5DA) -------------------------------------------------------- char stru10::_49C5DA(BLVFace *a2, RenderVertexSoft *a3, int *a4, IndoorCameraD3D_Vec4 *a5, RenderVertexSoft *a6) { - stru10 *v6; // edi@1 - char *v7; // eax@1 - signed int v8; // ecx@1 - IndoorCameraD3D *v9; // esi@3 + //stru10 *v6; // edi@1 + //char *v7; // eax@1 + //signed int v8; // ecx@1 + //IndoorCameraD3D *v9; // esi@3 char result; // al@6 RenderVertexSoft a4a[4]; // [sp+Ch] [bp-C0h]@1 - v6 = this; + /*v6 = this; v7 = (char *)&a4a[0].flt_2C; v8 = 4; do @@ -758,9 +780,9 @@ --v8; } while ( v8 ); - v9 = pGame->pIndoorCameraD3D; + v9 = pGame->pIndoorCameraD3D;*/ _49CE9E(a2, a3, *a4, a4a); - if ( byte_4D864C && pGame->uFlags & 8 ) + if ( byte_4D864C && pGame->uFlags & GAME_FLAGS_1_DRAW_BLV_DEBUGS) pGame->pIndoorCameraD3D->debug_outline_sw(a4a, 4u, 0xFF1E1Eu, 0.000099999997); result = _49C9E3(a2, a4a, 4u, a6); if ( result ) @@ -775,7 +797,7 @@ RenderVertexSoft pBounding[4]; // [sp+Ch] [bp-C0h]@1 CalcPolygonBoundingBox(pFace, pBounding); - if ( byte_4D864C && pGame->uFlags & 8 ) + if ( byte_4D864C && pGame->uFlags & GAME_FLAGS_1_DRAW_BLV_DEBUGS) pGame->pIndoorCameraD3D->debug_outline_sw(pBounding, 4, 0xFF1E1E, 0.000099999997); if (_49C9E3(pFace, pBounding, 4, pArrayOf4)) return _49C720(pArrayOf4, a3); @@ -877,9 +899,9 @@ //----- (0049C8DC) -------------------------------------------------------- bool stru10::_49C8DC(RenderVertexSoft *arg0, Vec3_float_ *a2, float *a3) { - double v4; // st7@1 - double v5; // st6@1 - double v6; // st5@1 + //double v4; // st7@1 + //double v5; // st6@1 + //double v6; // st5@1 Vec3_float_ *result; // eax@1 __int16 v8; // fps@3 char v9; // c0@3 @@ -890,31 +912,33 @@ double v14; // st6@5 Vec3_float_ v1; // [sp+8h] [bp-3Ch]@1 Vec3_float_ v2; // [sp+14h] [bp-30h]@1 - float v17; // [sp+24h] [bp-20h]@1 - float v18; // [sp+28h] [bp-1Ch]@1 - float v19; // [sp+2Ch] [bp-18h]@1 - float v20; // [sp+30h] [bp-14h]@1 - float v21; // [sp+34h] [bp-10h]@1 + //float v17; // [sp+24h] [bp-20h]@1 + //float v18; // [sp+28h] [bp-1Ch]@1 + //float v19; // [sp+2Ch] [bp-18h]@1 + //float v20; // [sp+30h] [bp-14h]@1 + //float v21; // [sp+34h] [bp-10h]@1 Vec3_float_ a1; // [sp+38h] [bp-Ch]@1 - v19 = arg0->vWorldPosition.x; - v20 = arg0->vWorldPosition.y; - v21 = arg0->vWorldPosition.z; - v4 = arg0[1].vWorldPosition.x; - v5 = arg0[1].vWorldPosition.y; - v2.z = arg0[1].vWorldPosition.z; - v6 = arg0[2].vWorldPosition.x; - v17 = arg0[2].vWorldPosition.y; - v18 = arg0[2].vWorldPosition.z; - a1.x = v4 - v19; - a1.y = v5 - v20; - a1.z = v2.z - v21; - LODWORD(v1.x) = (int)a1.x; - v1.y = a1.y; - v1.z = a1.z; - a1.x = v6 - v4; - a1.y = v17 - v5; - a1.z = v18 - v2.z; + //v19 = arg0->vWorldPosition.x; + //v20 = arg0->vWorldPosition.y; + //v21 = arg0->vWorldPosition.z; + //v4 = arg0[1].vWorldPosition.x; + //v5 = arg0[1].vWorldPosition.y; + //v2.z = arg0[1].vWorldPosition.z; + //v6 = arg0[2].vWorldPosition.x; + //v17 = arg0[2].vWorldPosition.y; + //v18 = arg0[2].vWorldPosition.z; + //a1.x = v4 - v19; + //a1.y = v5 - v20; + //a1.z = v2.z - v21; + v1.x = arg0[1].vWorldPosition.x - arg0[0].vWorldPosition.x; + v1.y = arg0[1].vWorldPosition.y - arg0[0].vWorldPosition.y; + v1.z = arg0[1].vWorldPosition.z - arg0[0].vWorldPosition.z; + + a1.x = arg0[2].vWorldPosition.x - arg0[1].vWorldPosition.x; + a1.y = arg0[2].vWorldPosition.y - arg0[1].vWorldPosition.y; + a1.z = arg0[2].vWorldPosition.z - arg0[1].vWorldPosition.z; + result = Vec3_float_::Cross(&v1, &v2, a1.x, a1.y, a1.z); a1.x = result->x; a1.y = result->y; @@ -926,12 +950,12 @@ a1.Normalize(); v12 = a1.y; a2->x = a1.x; - v13 = v21 * a1.z; - v14 = v20 * a1.y; + v13 = arg0[0].vWorldPosition.z * a1.z; + v14 = arg0[0].vWorldPosition.y * a1.y; a2->y = v12; a2->z = a1.z; result = (Vec3_float_ *)a3; - *a3 = -(v13 + v14 + v19 * a1.x); + *a3 = -(v13 + v14 + arg0[0].vWorldPosition.x * a1.x); return true; } return false;