From d2a5db556c163ee2ca47578627be2f6d4f19ea99 Mon Sep 17 00:00:00 2001 From: Mark Gillespie Date: Thu, 15 Feb 2024 16:37:08 -0500 Subject: [PATCH] Fix edge picks --- deps/glfw | 2 +- include/polyscope/pick.ipp | 6 +++--- include/polyscope/surface_mesh.h | 5 ++--- include/polyscope/surface_mesh.ipp | 6 ++++++ src/surface_mesh.cpp | 11 ++++++++--- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/deps/glfw b/deps/glfw index e2c92645..7d5a16ce 160000 --- a/deps/glfw +++ b/deps/glfw @@ -1 +1 @@ -Subproject commit e2c92645460f680fd272fd2eed591efb2be7dc31 +Subproject commit 7d5a16ce714f0b5f4efa3262de22e4d948851525 diff --git a/include/polyscope/pick.ipp b/include/polyscope/pick.ipp index 9d4a3476..004a7a45 100644 --- a/include/polyscope/pick.ipp +++ b/include/polyscope/pick.ipp @@ -24,11 +24,11 @@ inline glm::vec3 indToVec(size_t globalInd) { globalInd = globalInd >> bitsForPickPacking; uint64_t high = globalInd; - return glm::vec3{static_cast(low) / factorF, static_cast(med) / factorF, - static_cast(high) / factorF}; + return 2500.f * glm::vec3{static_cast(low) / factorF, static_cast(med) / factorF, + static_cast(high) / factorF}; } inline uint64_t vecToInd(glm::vec3 vec) { - + vec /= 2500.f; uint64_t factor = 1 << bitsForPickPacking; double factorF = factor; diff --git a/include/polyscope/surface_mesh.h b/include/polyscope/surface_mesh.h index 111762f1..62abd042 100644 --- a/include/polyscope/surface_mesh.h +++ b/include/polyscope/surface_mesh.h @@ -219,8 +219,8 @@ class SurfaceMesh : public QuantityStructure { size_t nEdges(); // NOTE causes population of nEdgesCount size_t nCornersCount = 0; // = nHalfedges = sum face degree - size_t nCorners() const { return nCornersCount; } - size_t nHalfedges() const { return nCornersCount; } + size_t nCorners() const { return cornerDataSize == INVALID_IND ? nCornersCount : cornerDataSize; } + size_t nHalfedges() const { return halfedgeDataSize == INVALID_IND ? nCornersCount : halfedgeDataSize; } // = Mesh helpers void nestedFacesToFlat(const std::vector>& nestedInds); @@ -334,7 +334,6 @@ class SurfaceMesh : public QuantityStructure { std::vector halfedgeEdgeCorrespondence; // ugly hack used to save a pick buffer attr, filled out lazily w/ edge indices - // Visualization settings PersistentValue surfaceColor; PersistentValue edgeColor; diff --git a/include/polyscope/surface_mesh.ipp b/include/polyscope/surface_mesh.ipp index 7d35e279..d426eba9 100644 --- a/include/polyscope/surface_mesh.ipp +++ b/include/polyscope/surface_mesh.ipp @@ -136,6 +136,8 @@ void SurfaceMesh::setEdgePermutation(const T& perm, size_t expectedSize) { // now that we have edge indexing, enable edge-related stuff markEdgesAsUsed(); + + triangleAllEdgeInds.recomputeIfPopulated(); } template @@ -163,6 +165,8 @@ void SurfaceMesh::setHalfedgePermutation(const T& perm, size_t expectedSize) { } markHalfedgesAsUsed(); + triangleAllEdgeInds.recomputeIfPopulated(); + triangleAllHalfedgeInds.recomputeIfPopulated(); } template @@ -190,6 +194,8 @@ void SurfaceMesh::setCornerPermutation(const T& perm, size_t expectedSize) { } markCornersAsUsed(); + triangleAllEdgeInds.recomputeIfPopulated(); + triangleAllCornerInds.recomputeIfPopulated(); } diff --git a/src/surface_mesh.cpp b/src/surface_mesh.cpp index 08b7d23f..e0b27852 100644 --- a/src/surface_mesh.cpp +++ b/src/surface_mesh.cpp @@ -195,6 +195,8 @@ void SurfaceMesh::computeTriangleAllEdgeInds() { triangleAllEdgeInds.data.resize(3 * 3 * nFacesTriangulation()); halfedgeEdgeCorrespondence.resize(nHalfedges()); + bool haveCustomHalfedgeIndex = !halfedgePerm.empty(); + // used to loop over edges std::unordered_map, size_t, polyscope::hash_combine::hash>> seenEdgeInds; @@ -238,7 +240,10 @@ void SurfaceMesh::computeTriangleAllEdgeInds() { thisEdgeInd = seenEdgeInds[key]; } - halfedgeEdgeCorrespondence[start + j] = thisEdgeInd; + size_t he = start + j; + if (haveCustomHalfedgeIndex) he = halfedgePerm[he]; + + halfedgeEdgeCorrespondence[he] = thisEdgeInd; thisTriInds[j] = thisEdgeInd; } @@ -1130,7 +1135,7 @@ void SurfaceMesh::buildFaceInfoGui(size_t fInd) { void SurfaceMesh::buildEdgeInfoGui(size_t eInd) { size_t displayInd = eInd; if (edgePerm.size() > 0) { - displayInd = edgePerm[eInd]; + // displayInd = edgePerm[eInd]; } ImGui::TextUnformatted(("Edge #" + std::to_string(displayInd)).c_str()); @@ -1153,7 +1158,7 @@ void SurfaceMesh::buildEdgeInfoGui(size_t eInd) { void SurfaceMesh::buildHalfedgeInfoGui(size_t heInd) { size_t displayInd = heInd; if (halfedgePerm.size() > 0) { - displayInd = halfedgePerm[heInd]; + // displayInd = halfedgePerm[heInd]; } ImGui::TextUnformatted(("Halfedge #" + std::to_string(displayInd)).c_str());