# HG changeset patch # User Grumpy7 # Date 1373925605 -7200 # Node ID 270134611caf3746c4dcb6fc2b87e35ce54e17b9 # Parent 2e5c994f0833eae55af4da30a1af7f3c75fc5319# Parent 87155494292cfbb5fd878bfa14b3e4d820013b56 Merge diff -r 2e5c994f0833 -r 270134611caf Indoor.cpp --- a/Indoor.cpp Mon Jul 15 23:59:04 2013 +0200 +++ b/Indoor.cpp Tue Jul 16 00:00:05 2013 +0200 @@ -771,7 +771,7 @@ v7 = GetPortalScreenCoord(v1); if ( v7 ) { - if ( sub_424829(v7, &stru_F8A590, pBLVRenderParams->field_7C, v1) ) + if ( PortalFrustrum(v7, &stru_F8A590, pBLVRenderParams->field_7C, v1) ) { if ( v2->uPolygonType == 1 ) { @@ -1379,7 +1379,7 @@ face_min_screenspace_x <= nodes[node_id].uViewportZ && face_max_screenspace_y >= nodes[node_id].uViewportY && face_min_screenspace_y <= nodes[node_id].uViewportW && - sub_424829(num_vertices, &nodes[num_nodes].field_C, &nodes[node_id].field_C, uFaceID)) + PortalFrustrum(num_vertices, &nodes[num_nodes].field_C, &nodes[node_id].field_C, uFaceID)) { pTransitionSector = pFace->uSectorID; if (nodes[node_id].uSectorID == pTransitionSector ) @@ -1532,7 +1532,7 @@ && v23 <= *((short *)v20 + 2007) && v12 >= *((short *)v20 + 2006) && v22 <= *((short *)v20 + 2008) - && sub_424829(v10, &v3->nodes[v3->num_nodes].field_C, (BspRenderer_stru2 *)(v20 + 4020), uFaceID) ) + && PortalFrustrum(v10, &v3->nodes[v3->num_nodes].field_C, (BspRenderer_stru2 *)(v20 + 4020), uFaceID) ) { v16 = v21->uSectorID; if ( *((short *)v20 + 2004) == v16 ) @@ -1591,7 +1591,7 @@ v3 = GetPortalScreenCoord(v2); if ( v3 ) { - if ( sub_424829(v3, &stru_F8A590, pBLVRenderParams->field_7C, v1) ) + if ( PortalFrustrum(v3, &stru_F8A590, pBLVRenderParams->field_7C, v1) ) { v4 = stru_F8A590._viewport_space_y; v5 = pBLVRenderParams->pRenderTarget; @@ -6831,139 +6831,106 @@ check_event_triggers(); } //----- (00424829) -------------------------------------------------------- -bool sub_424829(int pNumVertices, BspRenderer_stru2 *a2, BspRenderer_stru2 *a3, int uFaceID) +bool PortalFrustrum(int pNumVertices, BspRenderer_stru2 *a2, BspRenderer_stru2 *a3, int uFaceID) { - //int v4; // edi@1 - //BspRenderer_stru2 *v5; // ebx@1 - int v6; // eax@3 + //int v6; // eax@3 int min_y; // esi@5 int max_y; // edx@5 - //int v9; // ecx@6 - int v10; // eax@12 - //int v11; // edi@13 - //int v12; // edx@18 + int current_ID; // eax@12 int v13; // eax@22 - //int v14; // edi@28 int v15; // ecx@29 - //int v16; // edi@30 - //int v17; // edx@35 int v18; // eax@39 int v19; // eax@44 int v20; // ecx@44 - //int v21; // edi@45 int v22; // edi@46 - //__int16 *v23; // ecx@47 int v24; // edx@48 - //int v25; // eax@50 int v26; // eax@55 signed int v27; // edi@55 - //int v28; // edx@56 int v29; // edx@57 - //int v30; // eax@59 int v31; // eax@64 signed int v32; // edi@64 - //int v33; // edx@65 int v34; // eax@66 int v35; // dx@66 __int16 v36; // dx@67 __int16 v37; // di@67 __int16 v38; // dx@67 - //BspRenderer_stru2 *v39; // ecx@69 - //int v40; // edx@69 - //int v41; // edi@70 - //__int16 *v42; // eax@76 - //__int16 *v43; // eax@81 - //__int16 *v45; // eax@87 int v46; // edx@87 - //__int16 v47; // cx@88 - //int v48; // eax@93 int v49; // esi@93 - //__int16 *v50; // ecx@94 - //int v51; // eax@95 - //int v52; // eax@97 int v53; // [sp+Ch] [bp-34h]@44 int v54; // [sp+10h] [bp-30h]@0 - int v55; // [sp+14h] [bp-2Ch]@12 - //__int16 *v56; // [sp+14h] [bp-2Ch]@47 - //__int16 v57; // [sp+14h] [bp-2Ch]@76 - //__int16 v58; // [sp+14h] [bp-2Ch]@81 + int min_y_ID2; // [sp+14h] [bp-2Ch]@12 int v59; // [sp+14h] [bp-2Ch]@87 - //BspRenderer_stru2 *v60; // [sp+18h] [bp-28h]@1 int v61; // [sp+1Ch] [bp-24h]@29 int v62; // [sp+20h] [bp-20h]@0 - signed int v63; // [sp+24h] [bp-1Ch]@3 - signed int v64; // [sp+28h] [bp-18h]@3 - int v65; // [sp+2Ch] [bp-14h]@5 - //int v66; // [sp+2Ch] [bp-14h]@39 - //int v67; // [sp+30h] [bp-10h]@22 - int v68; // [sp+34h] [bp-Ch]@12 + signed int direction1; // [sp+24h] [bp-1Ch]@3 + signed int direction2; // [sp+28h] [bp-18h]@3 + int min_y_ID; // [sp+2Ch] [bp-14h]@5 + //int v68; // [sp+34h] [bp-Ch]@12 int v69; // [sp+34h] [bp-Ch]@29 int v70; // [sp+34h] [bp-Ch]@46 int v71; // [sp+34h] [bp-Ch]@75 int v72; // [sp+34h] [bp-Ch]@80 - //int v73; // [sp+38h] [bp-8h]@11 - //int v74; // [sp+3Ch] [bp-4h]@1 - //int a3a; // [sp+48h] [bp+8h]@76 - //int a3b; // [sp+48h] [bp+8h]@87 - - //try graphic engine with function returning 1 always, and without - //return true; + if ( pNumVertices <= 1 ) return false; min_y = PortalFace._screen_space_y[0]; - v65 = 0; + min_y_ID = 0; max_y = PortalFace._screen_space_y[0]; + //face direction(направление фейса) if ( !PortalFace.direction ) { - v63 = 1; - v64 = -1; + direction1 = 1; + direction2 = -1; } else { - v63 = -1; - v64 = 1; - } - - for ( v6 = 1; v6 < pNumVertices; ++v6 ) - { - if ( PortalFace._screen_space_y[v6] >= min_y ) + direction1 = -1; + direction2 = 1; + } + + //get min and max y for portal(дать минимальное и максимальное значение y для портала) + for ( uint i = 1; i < pNumVertices; ++i ) + { + if ( PortalFace._screen_space_y[i] >= min_y ) { - if ( PortalFace._screen_space_y[v6] > max_y ) - max_y = PortalFace._screen_space_y[v6]; + if ( PortalFace._screen_space_y[i] > max_y ) + max_y = PortalFace._screen_space_y[i]; } - if ( PortalFace._screen_space_y[v6] < min_y ) + else { - v65 = v6; - min_y = PortalFace._screen_space_y[v6]; + min_y_ID = i; + min_y = PortalFace._screen_space_y[i]; } } if ( max_y == min_y ) return false; - v10 = v65; + //***************************************************************************************************************************** a2->_viewport_space_y = min_y; a2->_viewport_space_w = max_y; - v55 = v65; - - for ( v68 = 0; v68 < pNumVertices; ++v68 ) - { - v10 += v64; - if ( v10 < pNumVertices ) + current_ID = min_y_ID; + min_y_ID2 = min_y_ID; + + for ( uint i = 0; i < pNumVertices; ++i ) + { + current_ID += direction2; + if ( current_ID < pNumVertices ) { - if ( v10 < 0 ) - v10 += pNumVertices; + if ( current_ID < 0 ) + current_ID += pNumVertices; } else - v10 -= pNumVertices; - if ( PortalFace._screen_space_y[v10] <= PortalFace._screen_space_y[v65] ) + current_ID -= pNumVertices; + if ( PortalFace._screen_space_y[current_ID] <= PortalFace._screen_space_y[min_y_ID] )//определение минимальной у { - v55 = v10; - v65 = v10; + min_y_ID2 = current_ID; + min_y_ID = current_ID; } - if ( PortalFace._screen_space_y[v10] == max_y ) + if ( PortalFace._screen_space_y[current_ID] == max_y ) break; } - v13 = v55 + v64; + + v13 = min_y_ID2 + direction2; if ( v13 < pNumVertices ) { if ( v13 < 0 ) @@ -6971,18 +6938,19 @@ } else v13 -= pNumVertices; - 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; - + if ( PortalFace._screen_space_y[v13] != PortalFace._screen_space_y[min_y_ID2] ) + { + v62 = PortalFace._screen_space_x[min_y_ID2] << 16; + v54 = ((PortalFace._screen_space_x[v13] - PortalFace._screen_space_x[min_y_ID2]) << 16) / (PortalFace._screen_space_y[v13] - PortalFace._screen_space_y[min_y_ID2]); + a2->viewport_left_side[min_y] = PortalFace._screen_space_x[min_y_ID2]; + } + //**************************************************************************************************************************************** + // + v15 = min_y_ID; + v61 = min_y_ID; for ( v69 = 0; v69 < pNumVertices; ++v69 ) { - v15 += v63; + v15 += direction1; if ( v15 < pNumVertices ) { if ( v15 < 0 ) @@ -6990,15 +6958,15 @@ } else v15 -= pNumVertices; - if ( PortalFace._screen_space_y[v15] <= PortalFace._screen_space_y[v65] ) + if ( PortalFace._screen_space_y[v15] <= PortalFace._screen_space_y[min_y_ID] ) { v61 = v15; - v65 = v15; + min_y_ID = v15; } if ( PortalFace._screen_space_y[v15] == max_y ) break; } - v18 = v63 + v61; + v18 = direction1 + v61; if ( v18 < pNumVertices ) { if ( v18 < 0 ) @@ -7012,8 +6980,9 @@ { 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]); - } + a2->viewport_right_side[max_y] = PortalFace._screen_space_x[v20]; + } + //**************************************************************************************************************************************** v22 = min_y; if ( min_y <= max_y ) { @@ -7024,7 +6993,7 @@ v24 = v13; if ( v22 >= PortalFace._screen_space_y[v13] && v22 != max_y ) { - v13 = v64 + v13; + v13 = direction2 + v13; if ( v13 < pNumVertices ) { if ( v13 < 0 ) @@ -7043,7 +7012,7 @@ v29 = v18; if ( v70 >= PortalFace._screen_space_y[v18] && v70 != max_y ) { - v18 += v63; + v18 += direction1; if ( v18 < pNumVertices ) { if ( v18 < 0 ) @@ -7169,16 +7138,8 @@ BLVFace *pFace; // ebx@1 int pNextVertices; // edx@11 int t; // ST28_4@12 - signed int v13; // edx@12 - signed __int64 v14; // qtt@12 - signed int v17; // eax@14 - signed __int64 v18; // qtt@14 - signed int v20; // edx@17 - int v25; // eax@22 int pScreenX; // eax@22 - int v31; // eax@27 int pScreenY; // eax@27 - int v35; // ST30_4@30 signed int left_num_vertices; // edi@31 signed int right_num_vertices; // ebx@41 signed int top_num_vertices; // edi@51 @@ -7189,12 +7150,10 @@ int v65; // ecx@83 signed int v71; // [sp+14h] [bp-14h]@75 bool current_vertices_flag; // [sp+18h] [bp-10h]@9 - int thisb; // [sp+18h] [bp-10h]@12 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 - signed int v90; // [sp+24h] [bp-4h]@51 pFace = &pIndoor->pFaces[uFaceID]; memset(&PortalFace, 0, sizeof(stru367)); @@ -7241,8 +7200,6 @@ &PortalFace._view_transformed_z[i + 3], &PortalFace._view_transformed_x[i + 3], &PortalFace._view_transformed_y[i + 3], 0); } } - //х: 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 ) @@ -7287,11 +7244,8 @@ { if ( next_vertices_flag )//следующая вершина за ближней границей { - v13 = 524288 - PortalFace._view_transformed_z[i + 2]; - LODWORD(v14) = v13 << 16; - HIDWORD(v14) = v13 >> 16; //t = near_clip - v0.z / v1.z - v0.z - t = v14 / PortalFace._view_transformed_z[i + 3] - PortalFace._view_transformed_z[i + 2]; + t = fixpoint_div(524288 - PortalFace._view_transformed_z[i + 2], 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]; @@ -7303,11 +7257,8 @@ } else// текущая вершина за ближней границей { - v17 = 524288 - PortalFace._view_transformed_z[i + 3]; - LODWORD(v18) = v17 << 16; - HIDWORD(v18) = v17 >> 16; //t = near_clip - v1.z / v0.z - v1.z - t = v18 / PortalFace._view_transformed_z[i + 2] - PortalFace._view_transformed_z[i + 3]; + t = fixpoint_div(524288 - PortalFace._view_transformed_z[i + 3], 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]; @@ -7379,15 +7330,13 @@ 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; + current_vertices_flag = PortalFace._screen_space_x[12] >= (signed int)pBLVRenderParams->uViewportX;//8.0 if ( depth_num_vertices < 1 ) return 0; for ( uint i = 1; i <= depth_num_vertices; ++i ) @@ -7398,22 +7347,20 @@ if ( next_vertices_flag ) { //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]); + t = fixpoint_div(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]; + PortalFace._screen_space_y[left_num_vertices + 9] = ((signed int)((PortalFace._screen_space_y[i + 12]- PortalFace._screen_space_y[i + 11]) + * t) >> 16) + PortalFace._screen_space_y[i + 11]; //New_x = left_clip PortalFace._screen_space_x[left_num_vertices + 9] = pBLVRenderParams->uViewportX; } else { //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]); + t = fixpoint_div(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]; + PortalFace._screen_space_y[left_num_vertices + 9] = ((signed int)(( PortalFace._screen_space_y[i + 11] - PortalFace._screen_space_y[i + 12]) + * t) >> 16) + PortalFace._screen_space_y[i + 12]; //New_x = left_clip PortalFace._screen_space_x[left_num_vertices + 9] = pBLVRenderParams->uViewportX; } @@ -7432,7 +7379,7 @@ 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; + current_vertices_flag = PortalFace._screen_space_x[9] <= (signed int)pBLVRenderParams->uViewportZ;//468.0 if (left_num_vertices < 1) return 0; for ( uint i = 1; i <= left_num_vertices; ++i ) @@ -7443,22 +7390,20 @@ if ( next_vertices_flag ) { //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]); + t = fixpoint_div(pBLVRenderParams->uViewportZ - PortalFace._screen_space_x[i + 8], PortalFace._screen_space_x[i + 9] - PortalFace._screen_space_x[i + 8]); //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]; + PortalFace._screen_space_y[right_num_vertices + 6] = ((signed int)((PortalFace._screen_space_y[i + 9] - PortalFace._screen_space_y[i + 8]) + * t) >> 16) + PortalFace._screen_space_y[i + 8]; //New_x = right_clip PortalFace._screen_space_x[right_num_vertices + 6] = pBLVRenderParams->uViewportZ; } else { //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]); + t = fixpoint_div(pBLVRenderParams->uViewportZ - PortalFace._screen_space_x[i + 9], PortalFace._screen_space_x[i + 8] - PortalFace._screen_space_x[i + 9]); //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]; + PortalFace._screen_space_y[right_num_vertices + 6] = ((signed int)((PortalFace._screen_space_y[i + 8] - PortalFace._screen_space_y[i + 9]) + * t) >> 16) + PortalFace._screen_space_y[i + 9]; //New_x = right_clip PortalFace._screen_space_x[right_num_vertices + 6] = pBLVRenderParams->uViewportZ; } @@ -7478,7 +7423,7 @@ 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; + current_vertices_flag = PortalFace._screen_space_y[6] >= (signed int)pBLVRenderParams->uViewportY;//8.0 if ( right_num_vertices < 1 ) return 0; for ( uint i = 1; i <= right_num_vertices; ++i ) @@ -7488,18 +7433,16 @@ { if ( next_vertices_flag ) { - 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]; + t = fixpoint_div(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) >> 16) + PortalFace._screen_space_x[i + 5]; PortalFace._screen_space_y[top_num_vertices + 3] = pBLVRenderParams->uViewportY; } else { - 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]; + t = fixpoint_div(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) >> 16) + PortalFace._screen_space_x[i + 6]; PortalFace._screen_space_y[top_num_vertices + 3] = pBLVRenderParams->uViewportY; } top_num_vertices++; @@ -7517,7 +7460,7 @@ 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; + current_vertices_flag = PortalFace._screen_space_y[3] <= (signed int)pBLVRenderParams->uViewportW;//351.0 if ( top_num_vertices < 1 ) return 0; for ( uint i =1; i <= top_num_vertices; ++i ) @@ -7527,18 +7470,16 @@ { if ( next_vertices_flag ) { - 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]; + t = fixpoint_div(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) >> 16) + PortalFace._screen_space_x[i + 2]; PortalFace._screen_space_y[bottom_num_vertices] = pBLVRenderParams->uViewportW; } else { - 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]; + t = fixpoint_div(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) >> 16) + PortalFace._screen_space_x[i + 3]; PortalFace._screen_space_y[bottom_num_vertices] = pBLVRenderParams->uViewportW; } bottom_num_vertices++; @@ -7551,8 +7492,6 @@ } current_vertices_flag = next_vertices_flag; } - //out_x: 83,8,8,61,83 - //out_y: 273,293,152,172,216 //*************************************************************************************************************************************** if ( !bottom_num_vertices ) diff -r 2e5c994f0833 -r 270134611caf IndoorCameraD3D.cpp --- a/IndoorCameraD3D.cpp Mon Jul 15 23:59:04 2013 +0200 +++ b/IndoorCameraD3D.cpp Tue Jul 16 00:00:05 2013 +0200 @@ -136,17 +136,17 @@ int a2b; // [sp+18h] [bp+Ch]@5 int a3a; // [sp+1Ch] [bp+10h]@5 - to_x = (x - pBLVRenderParams->vPartyPos.x) << 16; - to_y = (y - pBLVRenderParams->vPartyPos.y) << 16; + to_x = x - pBLVRenderParams->vPartyPos.x; + to_y = y - pBLVRenderParams->vPartyPos.y; if ( pBLVRenderParams->sPartyRotX ) { to_z = (z - pBLVRenderParams->vPartyPos.z) << 16; if ( pRenderer->pRenderD3D ) { - v14 = ((unsigned __int64)(to_x * (signed __int64)pBLVRenderParams->sCosineY) >> 16) - + ((unsigned __int64)(to_y * (signed __int64)pBLVRenderParams->sSineY) >> 16); - v9 = ((unsigned __int64)(to_x * (signed __int64)pBLVRenderParams->sSineY) >> 16) - - ((unsigned __int64)(to_y * (signed __int64)pBLVRenderParams->sCosineY) >> 16); + v14 = (unsigned __int64)(to_x * (signed __int64)pBLVRenderParams->sCosineY) + + (unsigned __int64)(to_y * (signed __int64)pBLVRenderParams->sSineY); + v9 = (unsigned __int64)(to_x * (signed __int64)pBLVRenderParams->sSineY) + - (unsigned __int64)(to_y * (signed __int64)pBLVRenderParams->sCosineY); } else { @@ -169,10 +169,10 @@ if ( pRenderer->pRenderD3D ) { v10 = pOutX; - *pOutX = ((unsigned __int64)(to_x * (signed __int64)pBLVRenderParams->sCosineY) >> 16) - + ((unsigned __int64)(to_y * (signed __int64)pBLVRenderParams->sSineY) >> 16); - *pOutZ = ((unsigned __int64)(to_x * (signed __int64)pBLVRenderParams->sSineY) >> 16) - - ((unsigned __int64)(to_y * (signed __int64)pBLVRenderParams->sCosineY) >> 16); + *pOutX = (unsigned __int64)(to_x * (signed __int64)pBLVRenderParams->sCosineY) + + (unsigned __int64)(to_y * (signed __int64)pBLVRenderParams->sSineY); + *pOutZ = (unsigned __int64)(to_x * (signed __int64)pBLVRenderParams->sSineY) + - (unsigned __int64)(to_y * (signed __int64)pBLVRenderParams->sCosineY); } else { diff -r 2e5c994f0833 -r 270134611caf TurnEngine.cpp --- a/TurnEngine.cpp Mon Jul 15 23:59:04 2013 +0200 +++ b/TurnEngine.cpp Tue Jul 16 00:00:05 2013 +0200 @@ -802,16 +802,16 @@ // 50FE08: using guessed type stru298 stru_50FE08; //----- (0040680F) -------------------------------------------------------- -void stru262_TurnBased::_40680F( int a2 ) - { +void stru262_TurnBased::_40680F( int queue_index ) + { TurnBased_QueueElem *v2; // eax@1 unsigned int v3; // eax@1 - unsigned int v4; // edi@2 + unsigned int actor_id; // edi@2 Actor *v5; // ebx@2 unsigned int *v6; // esi@7 AIDirection *v7; // esi@10 int v8; // eax@10 - unsigned int v9; // ecx@10 + int v9; // ecx@10 signed int v10; // eax@13 unsigned __int8 v11; // sf@19 unsigned __int8 v12; // of@19 @@ -821,141 +821,121 @@ AIDirection a3; // [sp+Ch] [bp-44h]@10 AIDirection v18; // [sp+28h] [bp-28h]@10 int a2a; // [sp+44h] [bp-Ch]@2 - unsigned int v20; // [sp+48h] [bp-8h]@10 + int v20; // [sp+48h] [bp-8h]@10 TurnBased_QueueElem *v21; // [sp+4Ch] [bp-4h]@1 signed int v22; // [sp+58h] [bp+8h]@10 - v2 = &pQueue[a2]; + v2 = &pQueue[queue_index]; v21 = v2; v2->uActionLength = 0; v3 = v2->uPackedID; - if ( (unsigned __int8)v3 & 3 ) + if (PID_TYPE(pQueue[queue_index].uPackedID) == OBJECT_Actor) { - v3 = PID_ID(v3); - v4 = v3; + + actor_id = PID_ID(pQueue[queue_index].uPackedID); a2a = v3; - v5 = &pActors[v3]; - LOWORD(v3) = v5->uAIState; - if ( (short)v3 != 5 ) + v5 = &pActors[actor_id]; + v3 = v5->uAIState; + if (!(v3 == AIState::Dying || v3 == AIState::Dead || v3 == AIState::Summoned || + v3 == AIState::Disabled || v3 == AIState::Removed)) { - if ( (short)v3 != 4 && (short)v3 != 11 && (short)v3 != 19 && (short)v3 != 17 ) - { - v6 = (unsigned int *)&ai_near_actors_targets_pid[(int)v4]; - Actor::_SelectTarget((unsigned int)v4, &ai_near_actors_targets_pid[(int)v4], true); - if ( v5->pMonsterInfo.uHostilityType && !*v6 ) + + Actor::_SelectTarget(actor_id, &ai_near_actors_targets_pid[actor_id], true); + v22 = ai_near_actors_targets_pid[actor_id]; + if ( v5->pMonsterInfo.uHostilityType && !v22) v5->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly; - v22 = *v6; - v7 = Actor::GetDirectionInfo(PID(OBJECT_Actor,(int)v4), *v6, &a3, 0); + v7 = Actor::GetDirectionInfo(PID(OBJECT_Actor,actor_id), v22, &a3, 0); v8 = v5->uActorRadius; - memcpy(&a3, v7, sizeof(a3)); - memcpy(&v18, &a3, sizeof(v18)); + memcpy(&a3, v7, sizeof(AIDirection)); + memcpy(&v18, &a3, sizeof(AIDirection)); v9 = a3.uDistance - v8; v20 = a3.uDistance - v8; - if ( ((a3.uDistance - v8) & 0x80000000u) != 0 ) + if ( v20 < 0 ) { v9 = 0; v20 = 0; } + if (PID_TYPE(v22) == OBJECT_Actor) //v10 = (unsigned __int8)*(&byte_5C8D1A[89 * (pMonsterStats->pInfos[pActors[PID_ID(v22)].pMonsterInfo.uID].uID - 1) / 3] + (v5->pMonsterInfo.uID - 1) / 3); v10 = pFactionTable->relations[(pMonsterStats->pInfos[pActors[PID_ID(v22)].pMonsterInfo.uID].uID) / 3 + 1][(v5->pMonsterInfo.uID - 1) / 3 + 1]; else v10 = 4; - if ( v10 == 1 ) - { + + switch (v10) + { + case 1: if ( (double)(signed int)v20 < 307.2 ) - goto LABEL_25; - } - else + v5->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long; + break; + case 2: + if ( v20 < 1024 ) + v5->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long; + break; + case 3: + if ( v20 < 2560 ) + v5->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long; + break; + case 4: + if ( v20 < 5120 ) + v5->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long; + break; + } + + if ( v5->pMonsterInfo.uHostilityType == 4 && v22 && (signed int)v9 < 5120 ) { - if ( v10 == 2 ) + v14 = stru_50C198.special_ability_use_check(v5, actor_id); + v21->field_C = 0; + switch (v14) { - v12 = __OFSUB__(v9, 1024); - v11 = ((v9 - 1024) & 0x80000000u) != 0; + case 1: + if ( v5->pMonsterInfo.uMissleAttack2Type ) + { + Actor::AI_MissileAttack2(actor_id, v22, &v18); + v21->field_C = 1; + } + break; + case 2: + if(v5->pMonsterInfo.uSpell1ID) + { + Actor::AI_SpellAttack1(actor_id, v22, &v18); + v21->field_C = 1; + } + break; + case 3: + if(v5->pMonsterInfo.uSpell2ID) + { + Actor::AI_SpellAttack2(actor_id, v22, &v18); + v21->field_C = 1; + } + + break; + default: + if ( v5->pMonsterInfo.uMissleAttack1Type ) + { + Actor::AI_MissileAttack1(actor_id, v22, &v18); + v21->field_C = 1; + } } - else - { - if ( v10 == 3 ) + if (!v21->field_C) + if ( (double)v20 < 307.2) { - v12 = __OFSUB__(v9, 2560); - v11 = ((v9 - 2560) & 0x80000000u) != 0; + Actor::AI_MeleeAttack(actor_id, v22, &v18); + v21->field_C = 3; } else { - if ( v10 != 4 ) - goto LABEL_26; - v12 = __OFSUB__(v9, 5120); - v11 = ((v9 - 5120) & 0x80000000u) != 0; - } - } - if ( v11 ^ v12 ) - { -LABEL_25: - v5->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long; - goto LABEL_26; - } - } -LABEL_26: - if ( v5->pMonsterInfo.uHostilityType != 4 || !v22 || (signed int)v9 >= 5120 ) - { - v13 = a2a; - goto LABEL_47; - } - v13 = a2a; - v14 = stru_50C198.special_ability_use_check(v5, a2a); - if ( v14 == 1 ) - { - if ( v5->pMonsterInfo.uMissleAttack2Type ) - { - Actor::AI_MissileAttack2(v13, v22, &v18); - goto LABEL_43; - } - } + Actor::AI_Stand(actor_id, v22, 64, &v18); + v21->field_C = 0; + } + } else { - if ( v14 > 1 && v14 <= 3 ) - { - if ( v14 == 2 ) - v15 = v5->pMonsterInfo.uSpell1ID; - else - v15 = v5->pMonsterInfo.uSpell2ID; - if ( v15 ) - { - if ( v14 == 2 ) - Actor::AI_SpellAttack1(v13, v22, &v18); - else - Actor::AI_SpellAttack2(v13, v22, &v18); - goto LABEL_43; - } - goto LABEL_44; - } - if ( v5->pMonsterInfo.uMissleAttack1Type ) - { - Actor::AI_MissileAttack1(v13, v22, &v18); -LABEL_43: - //v3 = v21; - v21->field_C = 1; -LABEL_48: - v21->uActionLength = v5->uCurrentActionLength; - //return (signed __int16)v3; - return; - } + Actor::AI_Stand(actor_id, v22, 64, &v18); + v21->field_C = 0; } -LABEL_44: - if ( (double)(signed int)v20 < 307.2 ) - { - Actor::AI_MeleeAttack(v13, v22, &v18); - //v3 = v21; - v21->field_C = 3; - goto LABEL_48; - } -LABEL_47: - Actor::AI_Stand(v13, v22, 64, &v18); - //v3 = v21; - v21->field_C = 0; - goto LABEL_48; - } - } + v21->uActionLength = v5->uCurrentActionLength; + } } } @@ -1011,11 +991,9 @@ //----- (00406B9F) -------------------------------------------------------- void stru262_TurnBased::_406B9F() { - unsigned int v5; // esi@5 Actor *v6; // ebx@5 AIDirection a3; // [sp+0h] [bp-50h]@15 AIDirection v9; // [sp+1Ch] [bp-34h]@15 - unsigned int v12; // [sp+40h] [bp-10h]@5 unsigned int v13; // [sp+44h] [bp-Ch]@8 int i; @@ -1265,87 +1243,48 @@ return 1; } -//----- (00406FA8) -------------------------------------------------------- + //----- (00406FA8) -------------------------------------------------------- void stru262_TurnBased::_406FA8() { - unsigned __int8 v1; // zf@1 - unsigned __int8 v2; // sf@1 - TurnBased_QueueElem *v3; // edi@2 - int v4; // eax@4 - Actor *v5; // ebx@4 - unsigned __int16 v6; // cx@4 - unsigned int *v7; // edx@8 - unsigned int v8; // esi@8 - unsigned __int8 v9; // of@13 + Actor *curr_acror; // ebx@4 AIDirection a3; // [sp+Ch] [bp-6Ch]@8 - AIDirection v11; // [sp+28h] [bp-50h]@8 + AIDirection v9; // [sp+28h] [bp-50h]@8 AIDirection a4; // [sp+44h] [bp-34h]@8 - stru262_TurnBased *v13; // [sp+60h] [bp-18h]@1 - TurnBased_QueueElem *v14; // [sp+64h] [bp-14h]@2 + unsigned int target_pid; // [sp+60h] [bp-18h]@1 int uActorID; // [sp+68h] [bp-10h]@4 - unsigned int a2; // [sp+6Ch] [bp-Ch]@8 - int v17; // [sp+70h] [bp-8h]@1 - unsigned int v18; // [sp+74h] [bp-4h]@2 + int i; - v17 = 0; - v1 = this->uActorQueueSize == 0; - v2 = this->uActorQueueSize < 0; - v13 = this; - if ( !(v2 | v1) ) + for (i=0; ipQueue; - v18 = (char *)&pTurnEngine - (char *)this; - v14 = this->pQueue; - do + if (PID_TYPE(pQueue[i].uPackedID) == OBJECT_Actor) { - if (PID_TYPE(v3->uPackedID) != OBJECT_Player) - { - v4 = PID_ID(v3->uPackedID); - uActorID = v4; - v5 = &pActors[v4]; - v6 = v5->uAIState; - if ( v6 != 5 ) // Dead + uActorID=PID_ID(pQueue[i].uPackedID); + curr_acror = &pActors[uActorID]; + if ( !( curr_acror->uAIState == AIState::Summoned|| curr_acror->uAIState == AIState::Dead || + curr_acror->uAIState == AIState::Removed || curr_acror->uAIState == AIState::Disabled) ) + { + target_pid = ai_near_actors_targets_pid[uActorID]; + Actor::_SelectTarget(uActorID, &ai_near_actors_targets_pid[uActorID], true); + memcpy(&v9, Actor::GetDirectionInfo(pQueue[i].uPackedID, target_pid, &a3, 0), sizeof(AIDirection)); + memcpy(&a4, &v9, sizeof(AIDirection)); + curr_acror->uCurrentActionTime += pEventTimer->uTimeElapsed; + if ( curr_acror->uCurrentActionTime > curr_acror->uCurrentActionLength ) { - if ( v6 != 11 )// Removed + if ( curr_acror->uAIState == AIState::Dying ) { - if ( v6 != 19 ) //Disabled - { - if ( v6 != 17 ) //Summoned - { - v7 = (unsigned int *)&ai_near_actors_targets_pid[v4]; - a2 = *v7; - v8 = a2; - Actor::_SelectTarget(v4, (int *)v7, true); - memcpy(&v11, Actor::GetDirectionInfo(*(int *)((char *)&v3->uPackedID + v18), v8, &a3, 0), sizeof(AIDirection)); - memcpy(&a4, &v11, sizeof(AIDirection)); - v5->uCurrentActionTime += pMiscTimer->uTimeElapsed; - if ( (signed int)v5->uCurrentActionTime >= v5->uCurrentActionLength ) - { - if (v5->uAIState == Dying) - { - v5->uCurrentActionTime = 0; - v5->uCurrentActionLength = 0; - v5->uAIState = Dead; - v5->UpdateAnimation(); - return; - } - if ( rand() % 2 ) - Actor::AI_Stand(uActorID, a2, 64, &a4); - else - Actor::AI_Bored(uActorID, a2, &a4); - } - } - } + curr_acror->uCurrentActionTime = 0; + curr_acror->uCurrentActionLength = 0; + curr_acror->uAIState = AIState::Dead; + curr_acror->UpdateAnimation(); + break; } + if ( rand() % 2 ) + Actor::AI_Stand(uActorID, target_pid, 64, &a4); + else + Actor::AI_Bored(uActorID, target_pid, &a4); } } - ++v17; - v3 = v14 + 1; - v9 = __OFSUB__(v17, v13->uActorQueueSize); - v2 = v17 - v13->uActorQueueSize < 0; - ++v14; } - while ( v2 ^ v9 ); } } diff -r 2e5c994f0833 -r 270134611caf TurnEngine.h --- a/TurnEngine.h Mon Jul 15 23:59:04 2013 +0200 +++ b/TurnEngine.h Tue Jul 16 00:00:05 2013 +0200 @@ -56,7 +56,7 @@ void _40652A(); void _4065B0(); void AIRangedAttacks(unsigned int queue_index); - void _40680F(int a2); + void _40680F(int queue_index); void _406A63(); void _406AFE(); void _406B9F(); diff -r 2e5c994f0833 -r 270134611caf mm7_4.cpp --- a/mm7_4.cpp Mon Jul 15 23:59:04 2013 +0200 +++ b/mm7_4.cpp Tue Jul 16 00:00:05 2013 +0200 @@ -3497,7 +3497,7 @@ result = GetPortalScreenCoord(sFaceID); if ( result ) { - result = sub_424829(result, &stru_F8A590, pBLVRenderParams->field_7C, v2); + result = PortalFrustrum(result, &stru_F8A590, pBLVRenderParams->field_7C, v2); if ( result ) { result = (int)v3->GetTexture(); @@ -3962,7 +3962,7 @@ v59 = GetPortalScreenCoord(uFaceID); v3 = v59; } - if ( v3 && (pRenderer->pRenderD3D || sub_424829(v3, &stru_F8A590, pBLVRenderParams->field_7C, v1)) ) + if ( v3 && (pRenderer->pRenderD3D || PortalFrustrum(v3, &stru_F8A590, pBLVRenderParams->field_7C, v1)) ) { v4 = v2->GetTexture(); v5 = 0; diff -r 2e5c994f0833 -r 270134611caf mm7_data.h --- a/mm7_data.h Mon Jul 15 23:59:04 2013 +0200 +++ b/mm7_data.h Tue Jul 16 00:00:05 2013 +0200 @@ -1151,7 +1151,7 @@ void __cdecl sub_423B4A(); int __fastcall GetPortalScreenCoord(unsigned int uFaceID); signed int __fastcall sub_424579(int uFaceID, struct stru320 *a2); -bool sub_424829(int pNumVertices, struct BspRenderer_stru2 *a2, struct BspRenderer_stru2 *a3, int uFaceID); +bool PortalFrustrum(int pNumVertices, struct BspRenderer_stru2 *a2, struct BspRenderer_stru2 *a3, int uFaceID); signed int __fastcall sr_424CD7(unsigned int uVertexID); // idb signed int __fastcall sr_424EE0_MakeFanFromTriangle(unsigned int uVertexID); // idb signed int __fastcall sr_4250FE(unsigned int uVertexID); // idb