# HG changeset patch # User Ritor1 # Date 1369292429 -21600 # Node ID efe228ab50031185f90524db75b10aeb9f150106 # Parent d36681a9e4f8273f1519737c15a64e4a86323f86 IntersectBModel_sub diff -r d36681a9e4f8 -r efe228ab5003 Player.cpp --- a/Player.cpp Thu May 23 11:17:01 2013 +0600 +++ b/Player.cpp Thu May 23 13:00:29 2013 +0600 @@ -5224,7 +5224,7 @@ v15 = pItemsTable->pItems[v29].uDamageMod; v14 = pItemsTable->pItems[v29].uDamageDice * pItemsTable->pItems[v29].uDamageRoll; v5 += v15 + v14; - return v5 + v62 + v61 + return v5 + v62 + v61; } v59 = 3; LABEL_74: diff -r d36681a9e4f8 -r efe228ab5003 Vis.cpp --- a/Vis.cpp Thu May 23 11:17:01 2013 +0600 +++ b/Vis.cpp Thu May 23 13:00:29 2013 +0600 @@ -369,8 +369,6 @@ auto bmodel = &pOutdoor->pBModels[i]; for (uint j = 0; j < bmodel->uNumFaces; ++j) { - //if ( i == 77 && j == 17 )// - //__debugbreak();// auto face = &bmodel->pFaces[j]; if (is_part_of_selection(face, filter)) { @@ -549,144 +547,59 @@ //----- (004C1C0C) -------------------------------------------------------- bool Vis::Intersect_Ray_Face(RenderVertexSoft *pRayStart, RenderVertexSoft *pRayEnd, float *pDepth, RenderVertexSoft *Intersection, BLVFace *pFace, unsigned int pBModelID) { - //BLVFace *v7; // ebx@1 - //bool result; // eax@1 - double v9; // st7@3 - //__int16 v10; // fps@3 - //char v11; // c0@3 - //char v12; // c2@3 - //char v13; // c3@3 - //__int16 v14; // fps@5 - //char v15; // c0@5 - //char v16; // c2@5 - //char v17; // c3@5 - double c1; // st5@6 - //__int16 v19; // fps@6 - //char v20; // c0@6 - //char v21; // c2@6 - //char v22; // c3@6 - //unsigned __int8 v23; // c0@6 - //char v24; // c2@6 - //unsigned __int8 v25; // c3@6 - //char v26; // zf@6 - double v27; // st6@10 - //__int16 v28; // fps@10 - //unsigned __int8 v29; // c0@10 - //char v30; // c2@10 - //unsigned __int8 v31; // c3@10 - double c2; // st7@11 - //Vec2_short_ v33; // ST1E_4@11 - Vec3_short_ v34; // ST04_6@11 - //float a5a; // [sp+30h] [bp+18h]@10 - //float a5b; // [sp+30h] [bp+18h]@13 + float c1; // st5@6 + float c2; // st7@11 + Vec3_short_ IntersectPoint; // ST04_6@11 + if (pFace->Portal() || pFace->Invisible()) return false; - int ray_dir_x = pRayEnd->vWorldPosition.x - pRayStart->vWorldPosition.x,//dir_x y z это вектор направления - ray_dir_y = pRayEnd->vWorldPosition.y - pRayStart->vWorldPosition.y,//точка В - точка А = вектор из А в В + int ray_dir_x = pRayEnd->vWorldPosition.x - pRayStart->vWorldPosition.x,//calculate the direction vector of the line(вычислим вектор направления линий) + ray_dir_y = pRayEnd->vWorldPosition.y - pRayStart->vWorldPosition.y, ray_dir_z = pRayEnd->vWorldPosition.z - pRayStart->vWorldPosition.z; - /*v9 = ray_dir_z * pFace->pFacePlane.vNormal.z - + ray_dir_y * pFace->pFacePlane.vNormal.y//скалярное произведение направления луча и нормали к полигону - + ray_dir_x * pFace->pFacePlane.vNormal.x;//= косинус угла между двумя векторами - if (v9 >= 0) // ray faces face's normal ( > 0) or parallel ( == 0) - return false;*/ - -//ray = t dir + start -//plane = (p - vertex) normal = -d -// -// -//(t dir + start - vertex) normal = -d -// -// -d - (start - vertex) norm -//t = -------------------- -// dir norm - - - /*float dir_mag = sqrtf(ray_dir_x * ray_dir_x + ray_dir_y * ray_dir_y + ray_dir_z * ray_dir_z);//модуль вектора - float ndir_x = ray_dir_x / dir_mag,//ndir - нормализованное направление - ndir_y = ray_dir_y / dir_mag,//В результате нормализации получается вектор, направление которого совпадает с исходным, а модуль равен единице (единичный вектор). - ndir_z = ray_dir_z / dir_mag;//Чтобы нормализовать произвольный вектор, достаточно разделить каждый компонент вектора на модуль вектора - - int face_center_x = (pFace->pBounding.x1 + pFace->pBounding.x2) / 2,//усреднённые координаты баундинга - face_center_y = (pFace->pBounding.y1 + pFace->pBounding.y2) / 2, - face_center_z = (pFace->pBounding.z1 + pFace->pBounding.z2) / 2; - - int to_plane_x = pRayStart->vWorldPosition.x - face_center_x,//вектор из глас к середине фейса - to_plane_y = pRayStart->vWorldPosition.y - face_center_y, - to_plane_z = pRayStart->vWorldPosition.z - face_center_z;*/ - - //float t = /*-pFace->pFacePlane.dist*/ - (to_plane_x * pFace->pFacePlane.vNormal.x + to_plane_y * pFace->pFacePlane.vNormal.y + to_plane_y * pFace->pFacePlane.vNormal.z) / - // (ndir_x * pFace->pFacePlane.vNormal.x + ndir_y * pFace->pFacePlane.vNormal.y + ndir_z * pFace->pFacePlane.vNormal.z);//насколько сильно луч из камеры отклоняется от луча до центра фейса -/* if (t <= *pDepth) - { - int intersection_x = pRayStart->vWorldPosition.x + ndir_x * t, - intersection_y = pRayStart->vWorldPosition.y + ndir_y * t, - intersection_z = pRayStart->vWorldPosition.z + ndir_z * t; - - if (intersection_x < pFace->pBounding.x1 || intersection_x > pFace->pBounding.x2 || - intersection_y < pFace->pBounding.y1 || intersection_y > pFace->pBounding.y2 || - intersection_z < pFace->pBounding.z1 || intersection_z > pFace->pBounding.z2) - return false; - - pFace->uAttributes |= 0x80000000; - return true; - } - - return false;*/ - - //c1 = -d-(n*p0) c1 = -pFace->pFacePlane.dist -(pFace->pFacePlane.vNormal.x * pRayStart->vWorldPosition.x + pFace->pFacePlane.vNormal.y * pRayStart->vWorldPosition.y + pFace->pFacePlane.vNormal.z * pRayStart->vWorldPosition.z); - //if (c1 > 0) - //return false; -#define EPSILON 0.000001 + if (c1 > 0) + return false; +#define EPSILON 1e-6 //c2 = n*u - c2 = pFace->pFacePlane.vNormal.x * ray_dir_y + c2 = pFace->pFacePlane.vNormal.x * ray_dir_y// get length of the line(Это дает нам длину линии) + pFace->pFacePlane.vNormal.y * ray_dir_x + pFace->pFacePlane.vNormal.z * ray_dir_z; if (c2 > -EPSILON && c2 < EPSILON) // ray faces face's normal ( > 0) or parallel ( == 0) return false; //t = -d-(n*p0)/n*u - double t = c1 / c2;//точка соприкосновения - - //if (t < 0 || t > 1) - //return false; + float t = c1 / c2;//How far is crossing the line in percent for 0 to 1(Как далеко пересечение линии в процентах от 0 до 1 ) - // p(t) = p0 + tu; - // p(t) - вектор указывающий в точку на плоскости - // p0 - начало вектора, точка наблюдателя, камеры - // t - - // u - вектор направления - Intersection->vWorldPosition.x = pRayStart->vWorldPosition.x + t * ray_dir_y;//12432 < X < 12656 - Intersection->vWorldPosition.y = pRayStart->vWorldPosition.y + t * ray_dir_x;//-96 < Y < 1088 - Intersection->vWorldPosition.z = pRayStart->vWorldPosition.z + t * ray_dir_z;//Z == 192 - - v34.x = (signed __int64)Intersection->vWorldPosition.x; - v34.y = (signed __int64)Intersection->vWorldPosition.y; - v34.z = (signed __int64)Intersection->vWorldPosition.z; - - if ( !_4C1D2B(pFace, v34, pBModelID) ) + if (t < 0 || t > 1) return false; - //a5b = v27; - //*pDepth = t; +// p(t) = p0 + tu; + Intersection->vWorldPosition.x = pRayStart->vWorldPosition.x + t * ray_dir_y;// add the interest to the start line(прибавляем процент линии к линии старта) + Intersection->vWorldPosition.y = pRayStart->vWorldPosition.y + t * ray_dir_x; + Intersection->vWorldPosition.z = pRayStart->vWorldPosition.z + t * ray_dir_z; + + IntersectPoint.x = (signed __int64)Intersection->vWorldPosition.x; + IntersectPoint.y = (signed __int64)Intersection->vWorldPosition.y; + IntersectPoint.z = (signed __int64)Intersection->vWorldPosition.z; + + if ( !IntersectBModel_sub(pFace, IntersectPoint, pBModelID) ) + return false; + + *pDepth = t;//Record the distance from the origin of the ray (Записываем дистанцию от начала луча) return true; } //----- (004C1D2B) -------------------------------------------------------- -bool Vis::_4C1D2B(BLVFace *pFace, Vec3_short_ a2, unsigned int uModelID) +bool Vis::IntersectBModel_sub(BLVFace *pFace, Vec3_short_ IntersectPoint, unsigned int uModelID) { - //BLVFace *v4; // esi@1 int v5; // esi@10 bool v6; // edi@10 - int v7; // ecx@12 - signed int v8; // edx@12 - signed int v9; // eax@13 signed int v10; // ebx@14 int v11; // edi@16 signed int v12; // ST28_4@18 @@ -695,114 +608,102 @@ int v15; // [sp+10h] [bp-Ch]@10 signed int v16; // [sp+18h] [bp-4h]@10 - //v4 = pFace; - if (a2.x < pFace->pBounding.x1 || a2.x > pFace->pBounding.x2 || - a2.y < pFace->pBounding.y1 || a2.y > pFace->pBounding.y2 || - a2.z < pFace->pBounding.z1 || a2.z > pFace->pBounding.z2 ) + int a1 = 0, a2 = 0; + + if (IntersectPoint.x < pFace->pBounding.x1 || IntersectPoint.x > pFace->pBounding.x2 || + IntersectPoint.y < pFace->pBounding.y1 || IntersectPoint.y > pFace->pBounding.y2 || + IntersectPoint.z < pFace->pBounding.z1 || IntersectPoint.z > pFace->pBounding.z2 ) return false; pFace->uAttributes |= 0x80000000; - return true; + if (uModelID != -1) - _4C2186_BLV_IntersectBModel(pFace, uModelID, - word_F8BC48_displaced_face_intersect_plane_coords_a, - word_F8BD18_displaced_face_intersect_plane_coords_b, - &a2, pFace, uModelID); + ODM_IntersectBModel(&a1, &a2, word_F8BC48_displaced_face_intersect_plane_coords_a, word_F8BD18_displaced_face_intersect_plane_coords_b, + &IntersectPoint, pFace, uModelID); else - _4C1EE5_BLV_IntersectBModel_2((int *)&pFace, (int *)&uModelID, - word_F8BC48_displaced_face_intersect_plane_coords_a, - word_F8BD18_displaced_face_intersect_plane_coords_b, - &a2, pFace); - + BLV_IntersectBModel(&a1, &a2, word_F8BC48_displaced_face_intersect_plane_coords_a, word_F8BD18_displaced_face_intersect_plane_coords_b, + &IntersectPoint, pFace); v5 = 2 * pFace->uNumVertices; v16 = 0; word_F8BC48_displaced_face_intersect_plane_coords_a[v5] = word_F8BC48_displaced_face_intersect_plane_coords_a[0]; word_F8BD18_displaced_face_intersect_plane_coords_b[v5] = word_F8BD18_displaced_face_intersect_plane_coords_b[0]; - v15 = 0; - v6 = word_F8BD18_displaced_face_intersect_plane_coords_b[0] >= (signed int)uModelID; + v6 = word_F8BD18_displaced_face_intersect_plane_coords_b[0] >= a2; if (v5 <= 0) return false; - - do + for ( uint i = 0; i < v5; ++i ) { if ( v16 >= 2 ) break; - v7 = 2 * v15; - v8 = word_F8BD18_displaced_face_intersect_plane_coords_b[ + v15 + 1]; - if ( v6 ^ v8 >= (signed int)uModelID ) + if ( v6 ^ word_F8BD18_displaced_face_intersect_plane_coords_b[i + 1] >= a2 ) { - v9 = word_F8BC48_displaced_face_intersect_plane_coords_a[v7/2 + 1]; - if ( v9 >= (signed int)pFace ) + if ( word_F8BC48_displaced_face_intersect_plane_coords_a[i + 1] >= a1 ) v10 = 0; else v10 = 2; - v11 = v10 | word_F8BC48_displaced_face_intersect_plane_coords_a[v7/2] < (signed int)pFace; + v11 = v10 | word_F8BC48_displaced_face_intersect_plane_coords_a[i] < a1; if ( v11 != 3 ) { if ( !v11 - || (v12 = v9 - word_F8BC48_displaced_face_intersect_plane_coords_a[v7/2], + || (v12 = word_F8BC48_displaced_face_intersect_plane_coords_a[i + 1] - word_F8BC48_displaced_face_intersect_plane_coords_a[i], LODWORD(v13) = v12 << 16, HIDWORD(v13) = v12 >> 16, - word_F8BC48_displaced_face_intersect_plane_coords_a[v7/2] - + ((signed int)(((unsigned __int64)(v13 / (v8 - word_F8BD18_displaced_face_intersect_plane_coords_b[v7/2]) - * (signed int)((uModelID - word_F8BD18_displaced_face_intersect_plane_coords_b[v7/2]) << 16)) >> 16) + 32768) >> 16) >= (signed int)pFace) ) + word_F8BC48_displaced_face_intersect_plane_coords_a[i] + + ((signed int)(((unsigned __int64)(v13 / (word_F8BD18_displaced_face_intersect_plane_coords_b[i + 1] - word_F8BD18_displaced_face_intersect_plane_coords_b[i]) + * (signed int)((a2 - word_F8BD18_displaced_face_intersect_plane_coords_b[i]) << 16)) >> 16) + 32768) >> 16) >= a1) ) ++v16; } } - ++v15; - v6 = v8 >= (signed int)uModelID; + v6 = word_F8BD18_displaced_face_intersect_plane_coords_b[i + 1] >= a2; } - while ( v15 < v5 ); result = 1; if ( v16 != 1 ) -LABEL_25: result = 0; return result; } //----- (004C1EE5) -------------------------------------------------------- -bool Vis::_4C1EE5_BLV_IntersectBModel_2(int *a1, int *a2, __int16 *a3, __int16 *a4, Vec3_short_ *a5, BLVFace *pFace) +bool Vis::BLV_IntersectBModel(int *a1, int *a2, __int16 *displaced_face_intersect_plane_coords_a, __int16 *displaced_face_intersect_plane_coords_b, Vec3_short_ *IntersectPoint, BLVFace *pFace) { if (pFace->uAttributes & FACE_XY_PLANE) { - *a1 = a5->x; - *a2 = a5->y; + *a1 = IntersectPoint->x; + *a2 = IntersectPoint->y; for (uint i = 0; i < pFace->uNumVertices; ++i) { - a3[2 * i] = pFace->pXInterceptDisplacements[i] + pIndoor->pVertices[pFace->pVertexIDs[i]].x; - a3[2 * i + 1] = pFace->pXInterceptDisplacements[i + 1] + pIndoor->pVertices[pFace->pVertexIDs[i + 1]].x; + displaced_face_intersect_plane_coords_a[2 * i] = pFace->pXInterceptDisplacements[i] + pIndoor->pVertices[pFace->pVertexIDs[i]].x; + displaced_face_intersect_plane_coords_a[2 * i + 1] = pFace->pXInterceptDisplacements[i + 1] + pIndoor->pVertices[pFace->pVertexIDs[i + 1]].x; - a4[2 * i] = pFace->pYInterceptDisplacements[i] + pIndoor->pVertices[pFace->pVertexIDs[i]].y; - a4[2 * i + 1] = pFace->pYInterceptDisplacements[i + 1] + pIndoor->pVertices[pFace->pVertexIDs[i + 1]].y; + displaced_face_intersect_plane_coords_b[2 * i] = pFace->pYInterceptDisplacements[i] + pIndoor->pVertices[pFace->pVertexIDs[i]].y; + displaced_face_intersect_plane_coords_b[2 * i + 1] = pFace->pYInterceptDisplacements[i + 1] + pIndoor->pVertices[pFace->pVertexIDs[i + 1]].y; } } else if (pFace->uAttributes & FACE_XZ_PLANE) { - *a1 = a5->x; - *a2 = a5->z; + *a1 = IntersectPoint->x; + *a2 = IntersectPoint->z; for (uint i = 0; i < pFace->uNumVertices; ++i) { - a3[2 * i] = pFace->pXInterceptDisplacements[i] + pIndoor->pVertices[pFace->pVertexIDs[i]].x; - a3[2 * i + 1] = pFace->pXInterceptDisplacements[i + 1] + pIndoor->pVertices[pFace->pVertexIDs[i + 1]].x; + displaced_face_intersect_plane_coords_a[2 * i] = pFace->pXInterceptDisplacements[i] + pIndoor->pVertices[pFace->pVertexIDs[i]].x; + displaced_face_intersect_plane_coords_a[2 * i + 1] = pFace->pXInterceptDisplacements[i + 1] + pIndoor->pVertices[pFace->pVertexIDs[i + 1]].x; - a4[2 * i] = pFace->pZInterceptDisplacements[i] + pIndoor->pVertices[pFace->pVertexIDs[i]].z; - a4[2 * i + 1] = pFace->pZInterceptDisplacements[i + 1] + pIndoor->pVertices[pFace->pVertexIDs[i + 1]].z; + displaced_face_intersect_plane_coords_b[2 * i] = pFace->pZInterceptDisplacements[i] + pIndoor->pVertices[pFace->pVertexIDs[i]].z; + displaced_face_intersect_plane_coords_b[2 * i + 1] = pFace->pZInterceptDisplacements[i + 1] + pIndoor->pVertices[pFace->pVertexIDs[i + 1]].z; } } else if (pFace->uAttributes & FACE_YZ_PLANE) { - *a1 = a5->y; - *a2 = a5->z; + *a1 = IntersectPoint->y; + *a2 = IntersectPoint->z; for (uint i = 0; i < pFace->uNumVertices; ++i) { - a3[2 * i] = pFace->pYInterceptDisplacements[i] + pIndoor->pVertices[pFace->pVertexIDs[i]].y; - a3[2 * i + 1] = pFace->pYInterceptDisplacements[i + 1] + pIndoor->pVertices[pFace->pVertexIDs[i + 1]].y; + displaced_face_intersect_plane_coords_a[2 * i] = pFace->pYInterceptDisplacements[i] + pIndoor->pVertices[pFace->pVertexIDs[i]].y; + displaced_face_intersect_plane_coords_a[2 * i + 1] = pFace->pYInterceptDisplacements[i + 1] + pIndoor->pVertices[pFace->pVertexIDs[i + 1]].y; - a4[2 * i] = pFace->pZInterceptDisplacements[i] + pIndoor->pVertices[pFace->pVertexIDs[i]].z; - a4[2 * i + 1] = pFace->pZInterceptDisplacements[i + 1] + pIndoor->pVertices[pFace->pVertexIDs[i + 1]].z; + displaced_face_intersect_plane_coords_b[2 * i] = pFace->pZInterceptDisplacements[i] + pIndoor->pVertices[pFace->pVertexIDs[i]].z; + displaced_face_intersect_plane_coords_b[2 * i + 1] = pFace->pZInterceptDisplacements[i + 1] + pIndoor->pVertices[pFace->pVertexIDs[i + 1]].z; } } else @@ -815,72 +716,48 @@ } //----- (004C2186) -------------------------------------------------------- -bool Vis::_4C2186_BLV_IntersectBModel(BLVFace *pFace, unsigned int ModelID, __int16 *displaced_face_intersect_plane_coords_a, __int16 *displaced_face_intersect_plane_coords_b, Vec3_short_ *a5, BLVFace *face, unsigned int uModelID) +bool Vis::ODM_IntersectBModel(int *a1, int *a2, __int16 *displaced_face_intersect_plane_coords_a, __int16 *displaced_face_intersect_plane_coords_b, Vec3_short_ *IntersectPoint, BLVFace *pFace, unsigned int uModelID) { - bool result; // eax@1 - //int *v9; // esi@1 - //unsigned int v10; // ecx@1 - //unsigned int v11; // edx@3 - //signed int v12; // ecx@4 - //__int16 v13; // si@4 - //__int16 *v14; // ecx@4 - unsigned int v15; // edx@8 - //signed int v16; // ecx@9 - __int16 v17; // si@9 - __int16 *v18; // ecx@9 - unsigned int v19; // edx@12 - //signed int v20; // ecx@13 - __int16 v21; // si@13 - __int16 *v22; // ecx@13 - //signed int a1a; // [sp+14h] [bp+8h]@1 - //__int16 *a5a; // [sp+24h] [bp+18h]@3 - __int16 *a5b; // [sp+24h] [bp+18h]@8 - __int16 *a5c; // [sp+24h] [bp+18h]@12 - - //result = (bool)a6; - //v9 = pFace; - //v10 = pFace->uAttributes; - //a1a = 0; if (pFace->uAttributes & FACE_XY_PLANE) { - pFace->pFacePlane.vNormal.x = a5->x; - pFace->pFacePlane.vNormal.y = a5->y; + *a1 = IntersectPoint->x; + *a2 = IntersectPoint->y; for (int i = 0; i < pFace->uNumVertices; ++i) { - displaced_face_intersect_plane_coords_a[2 * i] = pFace->pXInterceptDisplacements[i] + pOutdoor->pBModels[ModelID].pVertices.pVertices[pFace->pVertexIDs[i]].x; - displaced_face_intersect_plane_coords_a[i * 2 + 1] = pFace->pXInterceptDisplacements[i + 1] + pOutdoor->pBModels[ModelID].pVertices.pVertices[pFace->pVertexIDs[i + 1]].x; + displaced_face_intersect_plane_coords_a[2 * i] = pFace->pXInterceptDisplacements[i] + pOutdoor->pBModels[uModelID].pVertices.pVertices[pFace->pVertexIDs[i]].x; + displaced_face_intersect_plane_coords_a[i * 2 + 1] = pFace->pXInterceptDisplacements[i + 1] + pOutdoor->pBModels[uModelID].pVertices.pVertices[pFace->pVertexIDs[i + 1]].x; - displaced_face_intersect_plane_coords_b[2 * i] = pFace->pYInterceptDisplacements[i] + pOutdoor->pBModels[ModelID].pVertices.pVertices[pFace->pVertexIDs[i]].y; - displaced_face_intersect_plane_coords_b[i * 2 + 1] = pFace->pYInterceptDisplacements[i + 1] + pOutdoor->pBModels[ModelID].pVertices.pVertices[pFace->pVertexIDs[i + 1]].y; + displaced_face_intersect_plane_coords_b[2 * i] = pFace->pYInterceptDisplacements[i] + pOutdoor->pBModels[uModelID].pVertices.pVertices[pFace->pVertexIDs[i]].y; + displaced_face_intersect_plane_coords_b[i * 2 + 1] = pFace->pYInterceptDisplacements[i + 1] + pOutdoor->pBModels[uModelID].pVertices.pVertices[pFace->pVertexIDs[i + 1]].y; } } else if (pFace->uAttributes & FACE_XZ_PLANE) { - pFace->pFacePlane.vNormal.x = a5->x; - pFace->pFacePlane.vNormal.z = a5->z; + *a1 = IntersectPoint->x; + *a2 = IntersectPoint->z; for (int i = 0; i < pFace->uNumVertices; ++i) { - displaced_face_intersect_plane_coords_a[2 * i] = pFace->pXInterceptDisplacements[i] + pOutdoor->pBModels[ModelID].pVertices.pVertices[pFace->pVertexIDs[i]].x; - displaced_face_intersect_plane_coords_a[i * 2 + 1] = pFace->pXInterceptDisplacements[i + 1] + pOutdoor->pBModels[ModelID].pVertices.pVertices[pFace->pVertexIDs[i + 1]].x; + displaced_face_intersect_plane_coords_a[2 * i] = pFace->pXInterceptDisplacements[i] + pOutdoor->pBModels[uModelID].pVertices.pVertices[pFace->pVertexIDs[i]].x; + displaced_face_intersect_plane_coords_a[i * 2 + 1] = pFace->pXInterceptDisplacements[i + 1] + pOutdoor->pBModels[uModelID].pVertices.pVertices[pFace->pVertexIDs[i + 1]].x; - displaced_face_intersect_plane_coords_b[2 * i] = pFace->pZInterceptDisplacements[i] + pOutdoor->pBModels[ModelID].pVertices.pVertices[pFace->pVertexIDs[i]].z; - displaced_face_intersect_plane_coords_b[i * 2 + 1] = pFace->pZInterceptDisplacements[i + 1] + pOutdoor->pBModels[ModelID].pVertices.pVertices[pFace->pVertexIDs[i + 1]].z; + displaced_face_intersect_plane_coords_b[2 * i] = pFace->pZInterceptDisplacements[i] + pOutdoor->pBModels[uModelID].pVertices.pVertices[pFace->pVertexIDs[i]].z; + displaced_face_intersect_plane_coords_b[i * 2 + 1] = pFace->pZInterceptDisplacements[i + 1] + pOutdoor->pBModels[uModelID].pVertices.pVertices[pFace->pVertexIDs[i + 1]].z; } } else if (pFace->uAttributes & FACE_YZ_PLANE) { - pFace->pFacePlane.vNormal.y = a5->y; - pFace->pFacePlane.vNormal.z = a5->z; + *a1 = IntersectPoint->y; + *a2 = IntersectPoint->z; for (int i = 0; i < pFace->uNumVertices; ++i) { - displaced_face_intersect_plane_coords_a[2 * i] = pFace->pYInterceptDisplacements[i] + pOutdoor->pBModels[ModelID].pVertices.pVertices[pFace->pVertexIDs[i]].y; - displaced_face_intersect_plane_coords_a[i * 2 + 1] = pFace->pYInterceptDisplacements[i + 1] + pOutdoor->pBModels[ModelID].pVertices.pVertices[pFace->pVertexIDs[i + 1]].y; + displaced_face_intersect_plane_coords_a[2 * i] = pFace->pYInterceptDisplacements[i] + pOutdoor->pBModels[uModelID].pVertices.pVertices[pFace->pVertexIDs[i]].y; + displaced_face_intersect_plane_coords_a[i * 2 + 1] = pFace->pYInterceptDisplacements[i + 1] + pOutdoor->pBModels[uModelID].pVertices.pVertices[pFace->pVertexIDs[i + 1]].y; - displaced_face_intersect_plane_coords_b[2 * i] = pFace->pZInterceptDisplacements[i] + pOutdoor->pBModels[ModelID].pVertices.pVertices[pFace->pVertexIDs[i]].z; - displaced_face_intersect_plane_coords_b[i * 2 + 1] = pFace->pZInterceptDisplacements[i + 1] + pOutdoor->pBModels[ModelID].pVertices.pVertices[pFace->pVertexIDs[i + 1]].z; + displaced_face_intersect_plane_coords_b[2 * i] = pFace->pZInterceptDisplacements[i] + pOutdoor->pBModels[uModelID].pVertices.pVertices[pFace->pVertexIDs[i]].z; + displaced_face_intersect_plane_coords_b[i * 2 + 1] = pFace->pZInterceptDisplacements[i + 1] + pOutdoor->pBModels[uModelID].pVertices.pVertices[pFace->pVertexIDs[i + 1]].z; } } else assert(false); @@ -888,10 +765,6 @@ return true; } - - - - //----- (0046A0A1) -------------------------------------------------------- int UnprojectX(int x) { diff -r d36681a9e4f8 -r efe228ab5003 Vis.h --- a/Vis.h Thu May 23 11:17:01 2013 +0600 +++ b/Vis.h Thu May 23 13:00:29 2013 +0600 @@ -112,8 +112,8 @@ int get_picked_object_zbuf_val(); bool Intersect_Ray_Face(struct RenderVertexSoft *pRayStart, struct RenderVertexSoft *pRayEnd, float *pDepth, RenderVertexSoft *Intersection, BLVFace *pFace, unsigned int pBModelID); bool IntersectBModel_sub(BLVFace *pFace, Vec3_short_ IntersectPoint, unsigned int uModelID); - bool _4C1EE5_BLV_IntersectBModel_2(int *a1, int *a2, __int16 *a3, __int16 *a4, Vec3_short_ *a5, BLVFace *pFace); - bool _4C2186_BLV_IntersectBModel(BLVFace *pFace, unsigned int ModelID, __int16 *displaced_face_intersect_plane_coords_a, __int16 *displaced_face_intersect_plane_coords_b, Vec3_short_ *IntersectPoint, BLVFace *face, unsigned int uModelID); + bool BLV_IntersectBModel(int *a1, int *a2, __int16 *displaced_face_intersect_plane_coords_a, __int16 *displaced_face_intersect_plane_coords_b, Vec3_short_ *IntersectPoint, BLVFace *pFace); + bool ODM_IntersectBModel(int *a1, int *a2, __int16 *displaced_face_intersect_plane_coords_a, __int16 *displaced_face_intersect_plane_coords_b, Vec3_short_ *IntersectPoint, BLVFace *pFace, unsigned int uModelID); void CastPickRay(RenderVertexSoft *pRay, float fMouseX, float fMouseY, float fPickDepth); void sort_object_pointers(Vis_ObjectInfo **pPointers, int left, int right); bool SortVerticesByX(struct RenderVertexD3D3 *a2, unsigned int uStart, unsigned int uEnd);