Skip to content

Commit 6a1e4bf

Browse files
committed
refactoring worked!
1 parent c52957a commit 6a1e4bf

30 files changed

+960
-296
lines changed

editor/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ graphite-proc-macros = { workspace = true }
2424
graph-craft = { workspace = true }
2525
interpreted-executor = { workspace = true }
2626
graphene-std = { workspace = true }
27+
graphene-core = { workspace = true }
2728
preprocessor = { workspace = true }
2829

2930
# Workspace dependencies
@@ -33,7 +34,6 @@ bitflags = { workspace = true }
3334
thiserror = { workspace = true }
3435
serde = { workspace = true }
3536
serde_json = { workspace = true }
36-
bezier-rs = { workspace = true }
3737
kurbo = { workspace = true }
3838
futures = { workspace = true }
3939
glam = { workspace = true }

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

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,20 @@ use crate::messages::tool::tool_messages::select_tool::SelectToolPointerKeys;
2525
use crate::messages::tool::tool_messages::tool_prelude::Key;
2626
use crate::messages::tool::utility_types::ToolType;
2727
use crate::node_graph_executor::NodeGraphExecutor;
28-
use bezier_rs::Subpath;
2928
use glam::{DAffine2, DVec2, IVec2};
3029
use graph_craft::document::value::TaggedValue;
3130
use graph_craft::document::{NodeId, NodeInput, NodeNetwork, OldNodeNetwork};
31+
use graphene_core::subpath::Subpath;
3232
use graphene_std::math::quad::Quad;
3333
use graphene_std::path_bool::{boolean_intersect, path_bool_lib};
3434
use graphene_std::raster::BlendMode;
3535
use graphene_std::raster_types::Raster;
3636
use graphene_std::table::Table;
3737
use graphene_std::vector::PointId;
3838
use graphene_std::vector::click_target::{ClickTarget, ClickTargetType};
39+
use graphene_std::vector::misc::{dvec2_to_point, point_to_dvec2};
3940
use graphene_std::vector::style::ViewMode;
41+
use kurbo::{Affine, CubicBez, Line, ParamCurve, PathSeg, QuadBez};
4042
use std::path::PathBuf;
4143
use std::time::Duration;
4244

@@ -2949,10 +2951,10 @@ fn quad_to_path_lib_segments(quad: Quad) -> Vec<path_bool_lib::PathSegment> {
29492951
}
29502952

29512953
fn click_targets_to_path_lib_segments<'a>(click_targets: impl Iterator<Item = &'a ClickTarget>, transform: DAffine2) -> Vec<path_bool_lib::PathSegment> {
2952-
let segment = |bezier: bezier_rs::Bezier| match bezier.handles {
2953-
bezier_rs::BezierHandles::Linear => path_bool_lib::PathSegment::Line(bezier.start, bezier.end),
2954-
bezier_rs::BezierHandles::Quadratic { handle } => path_bool_lib::PathSegment::Quadratic(bezier.start, handle, bezier.end),
2955-
bezier_rs::BezierHandles::Cubic { handle_start, handle_end } => path_bool_lib::PathSegment::Cubic(bezier.start, handle_start, handle_end, bezier.end),
2954+
let segment = |bezier: PathSeg| match bezier {
2955+
PathSeg::Line(line) => path_bool_lib::PathSegment::Line(point_to_dvec2(line.p0), point_to_dvec2(line.p1)),
2956+
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)),
2957+
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)),
29562958
};
29572959
click_targets
29582960
.filter_map(|target| {
@@ -2963,7 +2965,7 @@ fn click_targets_to_path_lib_segments<'a>(click_targets: impl Iterator<Item = &'
29632965
}
29642966
})
29652967
.flatten()
2966-
.map(|bezier| segment(bezier.apply_transformation(|x| transform.transform_point2(x))))
2968+
.map(|bezier| segment(Affine::new(transform.to_cols_array()) * bezier))
29672969
.collect()
29682970
}
29692971

@@ -2988,9 +2990,9 @@ impl<'a> ClickXRayIter<'a> {
29882990
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 {
29892991
// Convert back to Bezier-rs types for intersections
29902992
let segment = |bezier: &path_bool_lib::PathSegment| match *bezier {
2991-
path_bool_lib::PathSegment::Line(start, end) => bezier_rs::Bezier::from_linear_dvec2(start, end),
2992-
path_bool_lib::PathSegment::Cubic(start, h1, h2, end) => bezier_rs::Bezier::from_cubic_dvec2(start, h1, h2, end),
2993-
path_bool_lib::PathSegment::Quadratic(start, h1, end) => bezier_rs::Bezier::from_quadratic_dvec2(start, h1, end),
2993+
path_bool_lib::PathSegment::Line(start, end) => PathSeg::Line(Line::new(dvec2_to_point(start), dvec2_to_point(end))),
2994+
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))),
2995+
path_bool_lib::PathSegment::Quadratic(start, h1, end) => PathSeg::Quad(QuadBez::new(dvec2_to_point(start), dvec2_to_point(h1), dvec2_to_point(end))),
29942996
path_bool_lib::PathSegment::Arc(_, _, _, _, _, _, _) => unimplemented!(),
29952997
};
29962998
let get_clip = || path.iter().map(segment);
@@ -3039,7 +3041,10 @@ impl<'a> ClickXRayIter<'a> {
30393041
XRayTarget::Quad(quad) => self.check_layer_area_target(click_targets, clip, layer, quad_to_path_lib_segments(*quad), transform),
30403042
XRayTarget::Path(path) => self.check_layer_area_target(click_targets, clip, layer, path.clone(), transform),
30413043
XRayTarget::Polygon(polygon) => {
3042-
let polygon = polygon.iter_closed().map(|line| path_bool_lib::PathSegment::Line(line.start, line.end)).collect();
3044+
let polygon = polygon
3045+
.iter_closed()
3046+
.map(|line| path_bool_lib::PathSegment::Line(point_to_dvec2(line.start()), point_to_dvec2(line.end())))
3047+
.collect();
30433048
self.check_layer_area_target(click_targets, clip, layer, polygon, transform)
30443049
}
30453050
}

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,9 +2,9 @@ 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;
7+
use graphene_core::subpath::Subpath;
88
use graphene_std::Artboard;
99
use graphene_std::brush::brush_stroke::BrushStroke;
1010
use graphene_std::raster::BlendMode;

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_core::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,11 +3,11 @@ 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;
109
use graph_craft::document::{NodeId, NodeInput};
10+
use graphene_core::subpath::Subpath;
1111
use graphene_std::Artboard;
1212
use graphene_std::brush::brush_stroke::BrushStroke;
1313
use graphene_std::raster::BlendMode;

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
@@ -1833,7 +1833,7 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphMessageContext<'a>> for NodeG
18331833
continue;
18341834
};
18351835
let quad = Quad::from_box([box_selection_start, box_selection_end_graph]);
1836-
if click_targets.node_click_target.intersect_path(|| quad.bezier_lines(), DAffine2::IDENTITY) {
1836+
if click_targets.node_click_target.intersect_path(|| quad.to_lines(), DAffine2::IDENTITY) {
18371837
nodes.insert(node_id);
18381838
}
18391839
}

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_core::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
};

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

Lines changed: 34 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ use crate::consts::{
55
PIVOT_CROSSHAIR_LENGTH, PIVOT_CROSSHAIR_THICKNESS, PIVOT_DIAMETER, SEGMENT_SELECTED_THICKNESS,
66
};
77
use crate::messages::prelude::Message;
8-
use bezier_rs::{Bezier, Subpath};
98
use core::borrow::Borrow;
109
use core::f64::consts::{FRAC_PI_2, PI, TAU};
1110
use glam::{DAffine2, DVec2};
11+
use graphene_core::subpath::Subpath;
1212
use graphene_std::Color;
1313
use graphene_std::math::quad::Quad;
1414
use graphene_std::vector::click_target::ClickTargetType;
15+
use graphene_std::vector::misc::{dvec2_to_point, point_to_dvec2};
1516
use graphene_std::vector::{PointId, SegmentId, Vector};
17+
use kurbo::{self, Affine, CubicBez, ParamCurve, PathSeg};
1618
use std::collections::HashMap;
1719
use wasm_bindgen::{JsCast, JsValue};
1820
use web_sys::{OffscreenCanvas, OffscreenCanvasRenderingContext2d};
@@ -571,11 +573,7 @@ impl OverlayContext {
571573
let handle_start = start + start_vec.perp() * radius * factor;
572574
let handle_end = end - end_vec.perp() * radius * factor;
573575

574-
let bezier = Bezier {
575-
start,
576-
end,
577-
handles: bezier_rs::BezierHandles::Cubic { handle_start, handle_end },
578-
};
576+
let bezier = PathSeg::Cubic(CubicBez::new(dvec2_to_point(start), dvec2_to_point(handle_start), dvec2_to_point(handle_end), dvec2_to_point(end)));
579577

580578
self.bezier_command(bezier, DAffine2::IDENTITY, i == 0);
581579
}
@@ -762,7 +760,7 @@ impl OverlayContext {
762760

763761
self.render_context.begin_path();
764762
let mut last_point = None;
765-
for (_, bezier, start_id, end_id) in vector.segment_bezier_iter() {
763+
for (_, bezier, start_id, end_id) in vector.segment_iter() {
766764
let move_to = last_point != Some(start_id);
767765
last_point = Some(end_id);
768766

@@ -776,7 +774,7 @@ impl OverlayContext {
776774
}
777775

778776
/// Used by the Pen tool in order to show how the bezier curve would look like.
779-
pub fn outline_bezier(&mut self, bezier: Bezier, transform: DAffine2) {
777+
pub fn outline_bezier(&mut self, bezier: PathSeg, transform: DAffine2) {
780778
self.start_dpi_aware_transform();
781779

782780
self.render_context.begin_path();
@@ -788,7 +786,7 @@ impl OverlayContext {
788786
}
789787

790788
/// Used by the path tool segment mode in order to show the selected segments.
791-
pub fn outline_select_bezier(&mut self, bezier: Bezier, transform: DAffine2) {
789+
pub fn outline_select_bezier(&mut self, bezier: PathSeg, transform: DAffine2) {
792790
self.start_dpi_aware_transform();
793791

794792
self.render_context.begin_path();
@@ -802,7 +800,7 @@ impl OverlayContext {
802800
self.end_dpi_aware_transform();
803801
}
804802

805-
pub fn outline_overlay_bezier(&mut self, bezier: Bezier, transform: DAffine2) {
803+
pub fn outline_overlay_bezier(&mut self, bezier: PathSeg, transform: DAffine2) {
806804
self.start_dpi_aware_transform();
807805

808806
self.render_context.begin_path();
@@ -816,18 +814,18 @@ impl OverlayContext {
816814
self.end_dpi_aware_transform();
817815
}
818816

819-
fn bezier_command(&self, bezier: Bezier, transform: DAffine2, move_to: bool) {
817+
fn bezier_command(&self, bezier: PathSeg, transform: DAffine2, move_to: bool) {
820818
self.start_dpi_aware_transform();
821819

822-
let Bezier { start, end, handles } = bezier.apply_transformation(|point| transform.transform_point2(point));
820+
let bezier = Affine::new(transform.to_cols_array()) * bezier;
823821
if move_to {
824-
self.render_context.move_to(start.x, start.y);
822+
self.render_context.move_to(bezier.start().x, bezier.start().y);
825823
}
826-
827-
match handles {
828-
bezier_rs::BezierHandles::Linear => self.render_context.line_to(end.x, end.y),
829-
bezier_rs::BezierHandles::Quadratic { handle } => self.render_context.quadratic_curve_to(handle.x, handle.y, end.x, end.y),
830-
bezier_rs::BezierHandles::Cubic { handle_start, handle_end } => self.render_context.bezier_curve_to(handle_start.x, handle_start.y, handle_end.x, handle_end.y, end.x, end.y),
824+
match bezier.as_path_el() {
825+
kurbo::PathEl::LineTo(point) => self.render_context.line_to(point.x, point.y),
826+
kurbo::PathEl::QuadTo(point, point1) => self.render_context.quadratic_curve_to(point.x, point.y, point1.x, point1.y),
827+
kurbo::PathEl::CurveTo(point, point1, point2) => self.render_context.bezier_curve_to(point.x, point.y, point1.x, point1.y, point2.x, point2.y),
828+
_ => unreachable!(),
831829
}
832830

833831
self.end_dpi_aware_transform();
@@ -841,36 +839,35 @@ impl OverlayContext {
841839
let subpath = subpath.borrow();
842840
let mut curves = subpath.iter().peekable();
843841

844-
let Some(first) = curves.peek() else {
842+
let Some(&first) = curves.peek() else {
845843
continue;
846844
};
847845

848-
self.render_context.move_to(transform.transform_point2(first.start()).x, transform.transform_point2(first.start()).y);
846+
let start_point = transform.transform_point2(point_to_dvec2(first.start()));
847+
self.render_context.move_to(start_point.x, start_point.y);
848+
849849
for curve in curves {
850-
match curve.handles {
851-
bezier_rs::BezierHandles::Linear => {
852-
let a = transform.transform_point2(curve.end());
850+
match curve {
851+
PathSeg::Line(line) => {
852+
let a = transform.transform_point2(point_to_dvec2(line.p1));
853853
let a = a.round() - DVec2::splat(0.5);
854-
855-
self.render_context.line_to(a.x, a.y)
854+
self.render_context.line_to(a.x, a.y);
856855
}
857-
bezier_rs::BezierHandles::Quadratic { handle } => {
858-
let a = transform.transform_point2(handle);
859-
let b = transform.transform_point2(curve.end());
856+
PathSeg::Quad(quad_bez) => {
857+
let a = transform.transform_point2(point_to_dvec2(quad_bez.p1));
858+
let b = transform.transform_point2(point_to_dvec2(quad_bez.p2));
860859
let a = a.round() - DVec2::splat(0.5);
861860
let b = b.round() - DVec2::splat(0.5);
862-
863-
self.render_context.quadratic_curve_to(a.x, a.y, b.x, b.y)
861+
self.render_context.quadratic_curve_to(a.x, a.y, b.x, b.y);
864862
}
865-
bezier_rs::BezierHandles::Cubic { handle_start, handle_end } => {
866-
let a = transform.transform_point2(handle_start);
867-
let b = transform.transform_point2(handle_end);
868-
let c = transform.transform_point2(curve.end());
863+
PathSeg::Cubic(cubic_bez) => {
864+
let a = transform.transform_point2(point_to_dvec2(cubic_bez.p1));
865+
let b = transform.transform_point2(point_to_dvec2(cubic_bez.p2));
866+
let c = transform.transform_point2(point_to_dvec2(cubic_bez.p3));
869867
let a = a.round() - DVec2::splat(0.5);
870868
let b = b.round() - DVec2::splat(0.5);
871869
let c = c.round() - DVec2::splat(0.5);
872-
873-
self.render_context.bezier_curve_to(a.x, a.y, b.x, b.y, c.x, c.y)
870+
self.render_context.bezier_curve_to(a.x, a.y, b.x, b.y, c.x, c.y);
874871
}
875872
}
876873
}
@@ -885,7 +882,7 @@ impl OverlayContext {
885882

886883
/// Used by the Select tool to outline a path or a free point when selected or hovered.
887884
pub fn outline(&mut self, target_types: impl Iterator<Item = impl Borrow<ClickTargetType>>, transform: DAffine2, color: Option<&str>) {
888-
let mut subpaths: Vec<bezier_rs::Subpath<PointId>> = vec![];
885+
let mut subpaths: Vec<Subpath<PointId>> = vec![];
889886

890887
target_types.for_each(|target_type| match target_type.borrow() {
891888
ClickTargetType::FreePoint(point) => {

0 commit comments

Comments
 (0)