From f87ab40f95f98b4e03e35851baff088816238c14 Mon Sep 17 00:00:00 2001 From: Toast Date: Wed, 15 Jul 2026 11:20:58 +0200 Subject: [PATCH] separate radius for edges/nodes --- include/polyscope/curve_network.h | 8 ++++-- src/curve_network.cpp | 47 ++++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/include/polyscope/curve_network.h b/include/polyscope/curve_network.h index 45fd818b..0533c438 100644 --- a/include/polyscope/curve_network.h +++ b/include/polyscope/curve_network.h @@ -154,7 +154,10 @@ class CurveNetwork : public Structure { // set the radius of the points CurveNetwork* setRadius(float newVal, bool isRelative = true); - float getRadius(); + CurveNetwork* setEdgeRadius(float newVal, bool isRelative = true); + CurveNetwork* setNodeRadius(float newVal, bool isRelative = true); + float getEdgeRadius(); + float getNodeRadius(); // Material CurveNetwork* setMaterial(std::string name); @@ -173,7 +176,8 @@ class CurveNetwork : public Structure { // === Visualization parameters PersistentValue color; - PersistentValue> radius; + PersistentValue> edge_radius; + PersistentValue> node_radius; PersistentValue material; // Drawing related things diff --git a/src/curve_network.cpp b/src/curve_network.cpp index fbae2a74..52896d1c 100644 --- a/src/curve_network.cpp +++ b/src/curve_network.cpp @@ -20,14 +20,15 @@ const std::string CurveNetwork::structureTypeName = "Curve Network"; // Constructor CurveNetwork::CurveNetwork(std::string name, std::vector nodes_, std::vector> edges_) : // clang-format off - Structure(name, typeName()), + Structure(name, typeName()), nodePositions(this, uniquePrefix() + "nodePositions", nodePositionsData), edgeTailInds(this, uniquePrefix() + "edgeTailInds", edgeTailIndsData), edgeTipInds(this, uniquePrefix() + "edgeTipInds", edgeTipIndsData), - edgeCenters(this, uniquePrefix() + "edgeCenters", edgeCentersData, std::bind(&CurveNetwork::computeEdgeCenters, this)), - nodePositionsData(std::move(nodes_)), - color(uniquePrefix() + "#color", getNextUniqueColor()), - radius(uniquePrefix() + "#radius", relativeValue(0.005)), + edgeCenters(this, uniquePrefix() + "edgeCenters", edgeCentersData, std::bind(&CurveNetwork::computeEdgeCenters, this)), + nodePositionsData(std::move(nodes_)), + color(uniquePrefix() + "#color", getNextUniqueColor()), + edge_radius(uniquePrefix() + "#edge_radius", relativeValue(0.005)), + node_radius(uniquePrefix() + "#node_radius", relativeValue(0.005)), material(uniquePrefix() + "#material", "clay") // clang-format on { @@ -83,7 +84,7 @@ float CurveNetwork::computeNodeRadiusMultiplierUniform() { scalarQScale = std::max(0., radQ.getDataRange().second); } - return getRadius() / scalarQScale; + return getNodeRadius() / scalarQScale; } float CurveNetwork::computeEdgeRadiusMultiplierUniform() { @@ -105,7 +106,7 @@ float CurveNetwork::computeEdgeRadiusMultiplierUniform() { scalarQScale = std::max(0., radQ.getDataRange().second); } - return getRadius() / scalarQScale; + return getEdgeRadius() / scalarQScale; } // Helper to set uniforms @@ -256,7 +257,7 @@ void CurveNetwork::prepare() { // It no quantity is coloring the network, draw with a default color // clang-format off - nodeProgram = render::engine->requestShader("RAYCAST_SPHERE", + nodeProgram = render::engine->requestShader("RAYCAST_SPHERE", render::engine->addMaterialRules(getMaterial(), addCurveNetworkNodeRules( {"SHADE_BASECOLOR"} @@ -265,7 +266,7 @@ void CurveNetwork::prepare() { ); - edgeProgram = render::engine->requestShader("RAYCAST_CYLINDER", + edgeProgram = render::engine->requestShader("RAYCAST_CYLINDER", render::engine->addMaterialRules(getMaterial(), addCurveNetworkEdgeRules( {"SHADE_BASECOLOR"} @@ -483,9 +484,14 @@ void CurveNetwork::buildCustomUI() { } ImGui::SameLine(); ImGui::PushItemWidth(100 * options::uiScale); - if (ImGui::SliderFloat("Radius", radius.get().getValuePtr(), 0.0, .1, "%.5f", + if (ImGui::SliderFloat("Edge Radius", edge_radius.get().getValuePtr(), 0.0, .1, "%.5f", ImGuiSliderFlags_Logarithmic | ImGuiSliderFlags_NoRoundToFormat)) { - radius.manuallyChanged(); + edge_radius.manuallyChanged(); + requestRedraw(); + } + if (ImGui::SliderFloat("Node Radius", node_radius.get().getValuePtr(), 0.0, .1, "%.5f", + ImGuiSliderFlags_Logarithmic | ImGuiSliderFlags_NoRoundToFormat)) { + node_radius.manuallyChanged(); requestRedraw(); } ImGui::PopItemWidth(); @@ -626,11 +632,26 @@ void CurveNetwork::clearEdgeRadiusQuantity() { }; CurveNetwork* CurveNetwork::setRadius(float newVal, bool isRelative) { - radius = ScaledValue(newVal, isRelative); + edge_radius = ScaledValue(newVal, isRelative); + node_radius = ScaledValue(newVal, isRelative); + polyscope::requestRedraw(); + return this; +} + +CurveNetwork* CurveNetwork::setEdgeRadius(float newVal, bool isRelative) { + edge_radius = ScaledValue(newVal, isRelative); + polyscope::requestRedraw(); + return this; +} + +CurveNetwork* CurveNetwork::setNodeRadius(float newVal, bool isRelative) { + node_radius = ScaledValue(newVal, isRelative); polyscope::requestRedraw(); return this; } -float CurveNetwork::getRadius() { return radius.get().asAbsolute(); } + +float CurveNetwork::getEdgeRadius() { return edge_radius.get().asAbsolute(); } +float CurveNetwork::getNodeRadius() { return node_radius.get().asAbsolute(); } CurveNetwork* CurveNetwork::setMaterial(std::string m) { material = m;