Skip to content

Commit d22b2ca

Browse files
indierustyKeavon
andauthored
Refactor the Centroid node and Subpath struct and methods to use Kurbo, eliminating all remaining usages of Bezier-rs (#3036)
* define Subpath struct in gcore and refactor node-graph * Refactor few methods * refactoring worked! * refactor centoid area and length * remove unused * cleanup * fix pathseg_points function * fix tranforming segments * fix segment intersection * refactor to_path_segments fn in gpath-bool crate * refactor gcraft * add bezier-rs dep * Code review the editor directory * use path-bool for solving roots * Code review --------- Co-authored-by: Keavon Chambers <[email protected]>
1 parent 99984fc commit d22b2ca

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+2125
-452
lines changed

Cargo.lock

Lines changed: 4 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,14 @@ resolver = "2"
4545
[workspace.dependencies]
4646
# Local dependencies
4747
bezier-rs = { path = "libraries/bezier-rs", features = ["dyn-any", "serde"] }
48-
dyn-any = { path = "libraries/dyn-any", features = ["derive", "glam", "reqwest", "log-bad-types", "rc"] }
49-
preprocessor = { path = "node-graph/preprocessor"}
48+
dyn-any = { path = "libraries/dyn-any", features = [
49+
"derive",
50+
"glam",
51+
"reqwest",
52+
"log-bad-types",
53+
"rc",
54+
] }
55+
preprocessor = { path = "node-graph/preprocessor" }
5056
math-parser = { path = "libraries/math-parser" }
5157
path-bool = { path = "libraries/path-bool" }
5258
graphene-application-io = { path = "node-graph/gapplication-io" }
@@ -80,7 +86,7 @@ convert_case = "0.7"
8086
derivative = "2.2"
8187
thiserror = "2"
8288
anyhow = "1.0"
83-
proc-macro2 = { version = "1", features = [ "span-locations" ] }
89+
proc-macro2 = { version = "1", features = ["span-locations"] }
8490
quote = "1.0"
8591
axum = "0.8"
8692
chrono = "0.4"
@@ -122,9 +128,17 @@ resvg = "0.44"
122128
usvg = "0.44"
123129
rand = { version = "0.9", default-features = false, features = ["std_rng"] }
124130
rand_chacha = "0.9"
125-
glam = { version = "0.29", default-features = false, features = ["serde", "scalar-math", "debug-glam-assert"] }
131+
glam = { version = "0.29", default-features = false, features = [
132+
"serde",
133+
"scalar-math",
134+
"debug-glam-assert",
135+
] }
126136
base64 = "0.22"
127-
image = { version = "0.25", default-features = false, features = ["png", "jpeg", "bmp"] }
137+
image = { version = "0.25", default-features = false, features = [
138+
"png",
139+
"jpeg",
140+
"bmp",
141+
] }
128142
parley = "0.5.0"
129143
skrifa = "0.32.0"
130144
pretty_assertions = "1.4.1"

editor/Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ ron = ["dep:ron"]
2323
graphite-proc-macros = { workspace = true }
2424
graph-craft = { workspace = true }
2525
interpreted-executor = { workspace = true }
26-
graphene-std = { workspace = true }
26+
graphene-std = { workspace = true } # NOTE: `graphene-core` should not be added here because `graphene-std` re-exports its contents
2727
preprocessor = { workspace = true }
2828

2929
# Workspace dependencies
@@ -33,7 +33,6 @@ bitflags = { workspace = true }
3333
thiserror = { workspace = true }
3434
serde = { workspace = true }
3535
serde_json = { workspace = true }
36-
bezier-rs = { workspace = true }
3736
kurbo = { workspace = true }
3837
futures = { workspace = true }
3938
glam = { workspace = true }

editor/src/messages/portfolio/document/document_message_handler.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,20 @@ use crate::messages::tool::tool_messages::select_tool::SelectToolPointerKeys;
2727
use crate::messages::tool::tool_messages::tool_prelude::Key;
2828
use crate::messages::tool::utility_types::ToolType;
2929
use crate::node_graph_executor::NodeGraphExecutor;
30-
use bezier_rs::Subpath;
3130
use glam::{DAffine2, DVec2, IVec2};
3231
use graph_craft::document::value::TaggedValue;
3332
use graph_craft::document::{NodeId, NodeInput, NodeNetwork, OldNodeNetwork};
3433
use graphene_std::math::quad::Quad;
3534
use graphene_std::path_bool::{boolean_intersect, path_bool_lib};
3635
use graphene_std::raster::BlendMode;
3736
use graphene_std::raster_types::Raster;
37+
use graphene_std::subpath::Subpath;
3838
use graphene_std::table::Table;
3939
use graphene_std::vector::PointId;
4040
use graphene_std::vector::click_target::{ClickTarget, ClickTargetType};
41+
use graphene_std::vector::misc::{dvec2_to_point, point_to_dvec2};
4142
use graphene_std::vector::style::ViewMode;
43+
use kurbo::{Affine, CubicBez, Line, ParamCurve, PathSeg, QuadBez};
4244
use std::path::PathBuf;
4345
use std::time::Duration;
4446

@@ -2982,10 +2984,10 @@ fn quad_to_path_lib_segments(quad: Quad) -> Vec<path_bool_lib::PathSegment> {
29822984
}
29832985

29842986
fn click_targets_to_path_lib_segments<'a>(click_targets: impl Iterator<Item = &'a ClickTarget>, transform: DAffine2) -> Vec<path_bool_lib::PathSegment> {
2985-
let segment = |bezier: bezier_rs::Bezier| match bezier.handles {
2986-
bezier_rs::BezierHandles::Linear => path_bool_lib::PathSegment::Line(bezier.start, bezier.end),
2987-
bezier_rs::BezierHandles::Quadratic { handle } => path_bool_lib::PathSegment::Quadratic(bezier.start, handle, bezier.end),
2988-
bezier_rs::BezierHandles::Cubic { handle_start, handle_end } => path_bool_lib::PathSegment::Cubic(bezier.start, handle_start, handle_end, bezier.end),
2987+
let segment = |bezier: PathSeg| match bezier {
2988+
PathSeg::Line(line) => path_bool_lib::PathSegment::Line(point_to_dvec2(line.p0), point_to_dvec2(line.p1)),
2989+
PathSeg::Quad(quad_bez) => path_bool_lib::PathSegment::Quadratic(point_to_dvec2(quad_bez.p0), point_to_dvec2(quad_bez.p1), point_to_dvec2(quad_bez.p2)),
2990+
PathSeg::Cubic(cubic_bez) => path_bool_lib::PathSegment::Cubic(point_to_dvec2(cubic_bez.p0), point_to_dvec2(cubic_bez.p1), point_to_dvec2(cubic_bez.p2), point_to_dvec2(cubic_bez.p3)),
29892991
};
29902992
click_targets
29912993
.filter_map(|target| {
@@ -2996,7 +2998,7 @@ fn click_targets_to_path_lib_segments<'a>(click_targets: impl Iterator<Item = &'
29962998
}
29972999
})
29983000
.flatten()
2999-
.map(|bezier| segment(bezier.apply_transformation(|x| transform.transform_point2(x))))
3001+
.map(|bezier| segment(Affine::new(transform.to_cols_array()) * bezier))
30003002
.collect()
30013003
}
30023004

@@ -3019,11 +3021,11 @@ impl<'a> ClickXRayIter<'a> {
30193021

30203022
/// Handles the checking of the layer where the target is a rect or path
30213023
fn check_layer_area_target(&mut self, click_targets: Option<&Vec<ClickTarget>>, clip: bool, layer: LayerNodeIdentifier, path: Vec<path_bool_lib::PathSegment>, transform: DAffine2) -> XRayResult {
3022-
// Convert back to Bezier-rs types for intersections
3024+
// Convert back to Kurbo types for intersections
30233025
let segment = |bezier: &path_bool_lib::PathSegment| match *bezier {
3024-
path_bool_lib::PathSegment::Line(start, end) => bezier_rs::Bezier::from_linear_dvec2(start, end),
3025-
path_bool_lib::PathSegment::Cubic(start, h1, h2, end) => bezier_rs::Bezier::from_cubic_dvec2(start, h1, h2, end),
3026-
path_bool_lib::PathSegment::Quadratic(start, h1, end) => bezier_rs::Bezier::from_quadratic_dvec2(start, h1, end),
3026+
path_bool_lib::PathSegment::Line(start, end) => PathSeg::Line(Line::new(dvec2_to_point(start), dvec2_to_point(end))),
3027+
path_bool_lib::PathSegment::Cubic(start, h1, h2, end) => PathSeg::Cubic(CubicBez::new(dvec2_to_point(start), dvec2_to_point(h1), dvec2_to_point(h2), dvec2_to_point(end))),
3028+
path_bool_lib::PathSegment::Quadratic(start, h1, end) => PathSeg::Quad(QuadBez::new(dvec2_to_point(start), dvec2_to_point(h1), dvec2_to_point(end))),
30273029
path_bool_lib::PathSegment::Arc(_, _, _, _, _, _, _) => unimplemented!(),
30283030
};
30293031
let get_clip = || path.iter().map(segment);
@@ -3072,7 +3074,10 @@ impl<'a> ClickXRayIter<'a> {
30723074
XRayTarget::Quad(quad) => self.check_layer_area_target(click_targets, clip, layer, quad_to_path_lib_segments(*quad), transform),
30733075
XRayTarget::Path(path) => self.check_layer_area_target(click_targets, clip, layer, path.clone(), transform),
30743076
XRayTarget::Polygon(polygon) => {
3075-
let polygon = polygon.iter_closed().map(|line| path_bool_lib::PathSegment::Line(line.start, line.end)).collect();
3077+
let polygon = polygon
3078+
.iter_closed()
3079+
.map(|line| path_bool_lib::PathSegment::Line(point_to_dvec2(line.start()), point_to_dvec2(line.end())))
3080+
.collect();
30763081
self.check_layer_area_target(click_targets, clip, layer, polygon, transform)
30773082
}
30783083
}

editor/src/messages/portfolio/document/graph_operation/graph_operation_message.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ use super::utility_types::TransformIn;
22
use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier;
33
use crate::messages::portfolio::document::utility_types::network_interface::NodeTemplate;
44
use crate::messages::prelude::*;
5-
use bezier_rs::Subpath;
65
use glam::{DAffine2, IVec2};
76
use graph_craft::document::NodeId;
87
use graphene_std::Artboard;
98
use graphene_std::brush::brush_stroke::BrushStroke;
109
use graphene_std::raster::BlendMode;
1110
use graphene_std::raster_types::{CPU, Raster};
11+
use graphene_std::subpath::Subpath;
1212
use graphene_std::table::Table;
1313
use graphene_std::text::{Font, TypesettingConfig};
1414
use graphene_std::vector::PointId;

editor/src/messages/portfolio/document/graph_operation/transform_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, NodeNetworkInterface};
2-
use bezier_rs::Subpath;
32
use glam::{DAffine2, DVec2};
43
use graph_craft::document::value::TaggedValue;
54
use graph_craft::document::{NodeId, NodeInput};
5+
use graphene_std::subpath::Subpath;
66
use graphene_std::vector::PointId;
77

88
/// Convert an affine transform into the tuple `(scale, angle, translation, shear)` assuming `shear.y = 0`.

editor/src/messages/portfolio/document/graph_operation/utility_types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use crate::messages::portfolio::document::node_graph::document_node_definitions:
33
use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier;
44
use crate::messages::portfolio::document::utility_types::network_interface::{self, InputConnector, NodeNetworkInterface, OutputConnector};
55
use crate::messages::prelude::*;
6-
use bezier_rs::Subpath;
76
use glam::{DAffine2, IVec2};
87
use graph_craft::concrete;
98
use graph_craft::document::value::TaggedValue;
@@ -12,6 +11,7 @@ use graphene_std::Artboard;
1211
use graphene_std::brush::brush_stroke::BrushStroke;
1312
use graphene_std::raster::BlendMode;
1413
use graphene_std::raster_types::{CPU, Raster};
14+
use graphene_std::subpath::Subpath;
1515
use graphene_std::table::Table;
1616
use graphene_std::text::{Font, TypesettingConfig};
1717
use graphene_std::vector::Vector;

editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1836,7 +1836,7 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphMessageContext<'a>> for NodeG
18361836
continue;
18371837
};
18381838
let quad = Quad::from_box([box_selection_start, box_selection_end_graph]);
1839-
if click_targets.node_click_target.intersect_path(|| quad.bezier_lines(), DAffine2::IDENTITY) {
1839+
if click_targets.node_click_target.intersect_path(|| quad.to_lines(), DAffine2::IDENTITY) {
18401840
nodes.insert(node_id);
18411841
}
18421842
}

editor/src/messages/portfolio/document/overlays/utility_functions.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ use crate::consts::HIDE_HANDLE_DISTANCE;
33
use crate::messages::portfolio::document::utility_types::network_interface::NodeNetworkInterface;
44
use crate::messages::tool::common_functionality::shape_editor::{SelectedLayerState, ShapeState};
55
use crate::messages::tool::tool_messages::tool_prelude::{DocumentMessageHandler, PreferencesMessageHandler};
6-
use bezier_rs::{Bezier, BezierHandles};
76
use glam::{DAffine2, DVec2};
7+
use graphene_std::subpath::{Bezier, BezierHandles};
88
use graphene_std::vector::misc::ManipulatorPointId;
99
use graphene_std::vector::{PointId, SegmentId};
1010
use wasm_bindgen::JsCast;
@@ -125,7 +125,7 @@ pub fn path_overlays(document: &DocumentMessageHandler, draw_handles: DrawHandle
125125
}
126126

127127
// Get the selected segments and then add a bold line overlay on them
128-
for (segment_id, bezier, _, _) in vector.segment_bezier_iter() {
128+
for (segment_id, bezier, _, _) in vector.segment_iter() {
129129
let Some(selected_shape_state) = shape_editor.selected_shape_state.get_mut(&layer) else {
130130
continue;
131131
};

0 commit comments

Comments
 (0)