diff --git a/ports/recastnavigation/fix-detail-mesh-edge-detection.patch b/ports/recastnavigation/fix-detail-mesh-edge-detection.patch new file mode 100644 index 0000000000..a4a8257a7f --- /dev/null +++ b/ports/recastnavigation/fix-detail-mesh-edge-detection.patch @@ -0,0 +1,103 @@ +diff --git a/Recast/Source/RecastMeshDetail.cpp b/Recast/Source/RecastMeshDetail.cpp +index 40f5b8c..d83bf1c 100644 +--- a/Recast/Source/RecastMeshDetail.cpp ++++ b/Recast/Source/RecastMeshDetail.cpp +@@ -634,6 +634,40 @@ inline float getJitterY(const int i) + return (((i * 0xd8163841) & 0xffff) / 65535.0f * 2.0f) - 1.0f; + } + ++static bool onHull(int a, int b, int nhull, int* hull) ++{ ++ // All internal sampled points come after the hull so we can early out for those. ++ if (a >= nhull || b >= nhull) ++ return false; ++ ++ for (int j = nhull - 1, i = 0; i < nhull; j = i++) ++ { ++ if (a == hull[j] && b == hull[i]) ++ return true; ++ } ++ ++ return false; ++} ++ ++// Find edges that lie on hull and mark them as such. ++static void setTriFlags(rcIntArray& tris, int nhull, int* hull) ++{ ++ // Matches DT_DETAIL_EDGE_BOUNDARY ++ const int DETAIL_EDGE_BOUNDARY = 0x1; ++ ++ for (int i = 0; i < tris.size(); i += 4) ++ { ++ int a = tris[i + 0]; ++ int b = tris[i + 1]; ++ int c = tris[i + 2]; ++ unsigned short flags = 0; ++ flags |= (onHull(a, b, nhull, hull) ? DETAIL_EDGE_BOUNDARY : 0) << 0; ++ flags |= (onHull(b, c, nhull, hull) ? DETAIL_EDGE_BOUNDARY : 0) << 2; ++ flags |= (onHull(c, a, nhull, hull) ? DETAIL_EDGE_BOUNDARY : 0) << 4; ++ tris[i + 3] = (int)flags; ++ } ++} ++ + static bool buildPolyDetail(rcContext* ctx, const float* in, const int nin, + const float sampleDist, const float sampleMaxError, + const int heightSearchRadius, const rcCompactHeightfield& chf, +@@ -771,6 +805,7 @@ static bool buildPolyDetail(rcContext* ctx, const float* in, const int nin, + if (minExtent < sampleDist*2) + { + triangulateHull(nverts, verts, nhull, hull, nin, tris); ++ setTriFlags(tris, nhull, hull); + return true; + } + +@@ -875,7 +910,8 @@ static bool buildPolyDetail(rcContext* ctx, const float* in, const int nin, + tris.resize(MAX_TRIS*4); + ctx->log(RC_LOG_ERROR, "rcBuildPolyMeshDetail: Shrinking triangle count from %d to max %d.", ntris, MAX_TRIS); + } +- ++ ++ setTriFlags(tris, nhull, hull); + return true; + } + +@@ -1137,30 +1173,6 @@ static void getHeightData(rcContext* ctx, const rcCompactHeightfield& chf, + } + } + +-static unsigned char getEdgeFlags(const float* va, const float* vb, +- const float* vpoly, const int npoly) +-{ +- // The flag returned by this function matches dtDetailTriEdgeFlags in Detour. +- // Figure out if edge (va,vb) is part of the polygon boundary. +- static const float thrSqr = rcSqr(0.001f); +- for (int i = 0, j = npoly-1; i < npoly; j=i++) +- { +- if (distancePtSeg2d(va, &vpoly[j*3], &vpoly[i*3]) < thrSqr && +- distancePtSeg2d(vb, &vpoly[j*3], &vpoly[i*3]) < thrSqr) +- return 1; +- } +- return 0; +-} +- +-static unsigned char getTriFlags(const float* va, const float* vb, const float* vc, +- const float* vpoly, const int npoly) +-{ +- unsigned char flags = 0; +- flags |= getEdgeFlags(va,vb,vpoly,npoly) << 0; +- flags |= getEdgeFlags(vb,vc,vpoly,npoly) << 2; +- flags |= getEdgeFlags(vc,va,vpoly,npoly) << 4; +- return flags; +-} + + /// @par + /// +@@ -1377,7 +1389,7 @@ bool rcBuildPolyMeshDetail(rcContext* ctx, const rcPolyMesh& mesh, const rcCompa + dmesh.tris[dmesh.ntris*4+0] = (unsigned char)t[0]; + dmesh.tris[dmesh.ntris*4+1] = (unsigned char)t[1]; + dmesh.tris[dmesh.ntris*4+2] = (unsigned char)t[2]; +- dmesh.tris[dmesh.ntris*4+3] = getTriFlags(&verts[t[0]*3], &verts[t[1]*3], &verts[t[2]*3], poly, npoly); ++ dmesh.tris[dmesh.ntris*4+3] = (unsigned char)t[3]; + dmesh.ntris++; + } + } diff --git a/ports/recastnavigation/portfile.cmake b/ports/recastnavigation/portfile.cmake index 69dcac3626..e6f4a0d418 100644 --- a/ports/recastnavigation/portfile.cmake +++ b/ports/recastnavigation/portfile.cmake @@ -6,6 +6,8 @@ vcpkg_from_github( REF v${VERSION} SHA512 7567aaa78219cc490a6f76210fba1f130f0c17aeaa06432ab1207e0fd03404abe31042e8b03971aa0d04ad65d39469f13575fe0072fb920c38581d39568b70fb HEAD_REF master + PATCHES + fix-detail-mesh-edge-detection.patch #Upstream fix https://github.com/recastnavigation/recastnavigation/pull/657 ) vcpkg_cmake_configure( SOURCE_PATH "${SOURCE_PATH}" @@ -25,4 +27,4 @@ vcpkg_fixup_pkgconfig() vcpkg_copy_pdbs() file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include") -file(INSTALL "${SOURCE_PATH}/License.txt" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright) +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/License.txt") diff --git a/ports/recastnavigation/vcpkg.json b/ports/recastnavigation/vcpkg.json index 08a5e13e30..839670623b 100644 --- a/ports/recastnavigation/vcpkg.json +++ b/ports/recastnavigation/vcpkg.json @@ -1,6 +1,7 @@ { "name": "recastnavigation", "version": "1.6.0", + "port-version": 1, "description": "Navigation-mesh Toolset for Games", "homepage": "https://github.com/recastnavigation/recastnavigation", "license": "Zlib", diff --git a/versions/baseline.json b/versions/baseline.json index 3398b41865..1460965b3d 100644 --- a/versions/baseline.json +++ b/versions/baseline.json @@ -7438,7 +7438,7 @@ }, "recastnavigation": { "baseline": "1.6.0", - "port-version": 0 + "port-version": 1 }, "recycle": { "baseline": "6.0.0", diff --git a/versions/r-/recastnavigation.json b/versions/r-/recastnavigation.json index a4b5216dc2..38cf40fa95 100644 --- a/versions/r-/recastnavigation.json +++ b/versions/r-/recastnavigation.json @@ -1,5 +1,10 @@ { "versions": [ + { + "git-tree": "806d9850ce88d7190649eb90863455084516d519", + "version": "1.6.0", + "port-version": 1 + }, { "git-tree": "d08244dcfe4974f58b9dd481f1e3e34414a46207", "version": "1.6.0",