Skip to content

Commit ad5069e

Browse files
committed
use Path and Splines from Points node to build spline replacing Spline node
1 parent 9ad6c31 commit ad5069e

File tree

1 file changed

+62
-19
lines changed

1 file changed

+62
-19
lines changed

editor/src/messages/tool/tool_messages/spline_tool.rs

Lines changed: 62 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ use crate::messages::tool::common_functionality::color_selector::{ToolColorOptio
77
use crate::messages::tool::common_functionality::graph_modification_utils;
88
use crate::messages::tool::common_functionality::snapping::SnapManager;
99

10-
use graph_craft::document::{value::TaggedValue, NodeId, NodeInput};
10+
use graph_craft::document::{NodeId, NodeInput};
1111
use graphene_core::Color;
12+
use graphene_std::vector::{PointId, SegmentId, VectorModificationType};
1213

1314
#[derive(Default)]
1415
pub struct SplineTool {
@@ -177,8 +178,14 @@ impl ToolTransition for SplineTool {
177178

178179
#[derive(Clone, Debug, Default)]
179180
struct SplineToolData {
180-
points: Vec<DVec2>,
181+
/// Points that are inserted.
182+
points: Vec<(PointId, DVec2)>,
183+
/// Point to be inserted.
181184
next_point: DVec2,
185+
/// Point that was inserted temporarily to show preview.
186+
preview_point: Option<PointId>,
187+
/// Segment that was inserted temporarily to show preview.
188+
preview_segment: Option<SegmentId>,
182189
weight: f64,
183190
layer: Option<LayerNodeIdentifier>,
184191
snap_manager: SnapManager,
@@ -205,9 +212,11 @@ impl Fsm for SplineToolFsmState {
205212

206213
tool_data.weight = tool_options.line_weight;
207214

208-
let node_type = resolve_document_node_type("Spline").expect("Spline node does not exist");
209-
let node = node_type.node_template_input_override([None, Some(NodeInput::value(TaggedValue::VecDVec2(Vec::new()), false))]);
210-
let nodes = vec![(NodeId(0), node)];
215+
let path_node_type = resolve_document_node_type("Path").expect("Path node does not exist");
216+
let path_node = path_node_type.default_node_template();
217+
let spline_node_type = resolve_document_node_type("Splines from Points").expect("Spline from Points node does not exist");
218+
let spline_node = spline_node_type.node_template_input_override([Some(NodeInput::node(NodeId(1), 0))]);
219+
let nodes = vec![(NodeId(1), path_node), (NodeId(0), spline_node)];
211220

212221
let layer = graph_modification_utils::new_custom(NodeId::new(), nodes, parent, responses);
213222
tool_options.fill.apply_fill(layer, responses);
@@ -228,12 +237,11 @@ impl Fsm for SplineToolFsmState {
228237
let transform = document.metadata().transform_to_viewport(layer);
229238
let pos = transform.inverse().transform_point2(snapped_position);
230239

231-
if tool_data.points.last().map_or(true, |last_pos| last_pos.distance(pos) > DRAG_THRESHOLD) {
232-
tool_data.points.push(pos);
240+
if tool_data.points.last().map_or(true, |last_pos| last_pos.1.distance(pos) > DRAG_THRESHOLD) {
233241
tool_data.next_point = pos;
234242
}
235243

236-
update_spline(document, tool_data, true, responses);
244+
update_spline(tool_data, false, responses);
237245

238246
SplineToolFsmState::Drawing
239247
}
@@ -246,7 +254,7 @@ impl Fsm for SplineToolFsmState {
246254
let pos = transform.inverse().transform_point2(snapped_position);
247255
tool_data.next_point = pos;
248256

249-
update_spline(document, tool_data, true, responses);
257+
update_spline(tool_data, true, responses);
250258

251259
// Auto-panning
252260
let messages = [SplineToolMessage::PointerOutsideViewport.into(), SplineToolMessage::PointerMove.into()];
@@ -269,13 +277,15 @@ impl Fsm for SplineToolFsmState {
269277
}
270278
(SplineToolFsmState::Drawing, SplineToolMessage::Confirm | SplineToolMessage::Abort) => {
271279
if tool_data.points.len() >= 2 {
272-
update_spline(document, tool_data, false, responses);
280+
delete_preview(tool_data, responses);
273281
responses.add(DocumentMessage::EndTransaction);
274282
} else {
275283
responses.add(DocumentMessage::AbortTransaction);
276284
}
277285

278286
tool_data.layer = None;
287+
tool_data.preview_point = None;
288+
tool_data.preview_segment = None;
279289
tool_data.points.clear();
280290
tool_data.snap_manager.cleanup(responses);
281291

@@ -310,17 +320,50 @@ impl Fsm for SplineToolFsmState {
310320
}
311321
}
312322

313-
fn update_spline(document: &DocumentMessageHandler, tool_data: &SplineToolData, show_preview: bool, responses: &mut VecDeque<Message>) {
314-
let mut points = tool_data.points.clone();
315-
if show_preview {
316-
points.push(tool_data.next_point)
317-
}
318-
let value = TaggedValue::VecDVec2(points);
323+
fn update_spline(tool_data: &mut SplineToolData, show_preview: bool, responses: &mut VecDeque<Message>) {
324+
delete_preview(tool_data, responses);
319325

320326
let Some(layer) = tool_data.layer else { return };
321327

322-
let Some(node_id) = graph_modification_utils::NodeGraphLayer::new(layer, &document.network_interface).upstream_node_id_from_name("Spline") else {
323-
return;
328+
let next_point_pos = tool_data.next_point;
329+
let next_point_id = PointId::generate();
330+
let modification_type = VectorModificationType::InsertPoint {
331+
id: next_point_id,
332+
position: next_point_pos,
324333
};
325-
responses.add_front(NodeGraphMessage::SetInputValue { node_id, input_index: 1, value });
334+
responses.add(GraphOperationMessage::Vector { layer, modification_type });
335+
336+
if let Some((last_point_id, _)) = tool_data.points.last() {
337+
let points = [*last_point_id, next_point_id];
338+
let id = SegmentId::generate();
339+
let modification_type = VectorModificationType::InsertSegment { id, points, handles: [None, None] };
340+
responses.add(GraphOperationMessage::Vector { layer, modification_type });
341+
342+
if show_preview {
343+
tool_data.preview_point = Some(next_point_id);
344+
tool_data.preview_segment = Some(id);
345+
} else {
346+
tool_data.points.push((next_point_id, next_point_pos));
347+
}
348+
}
349+
350+
if tool_data.points.is_empty() {
351+
tool_data.points.push((next_point_id, next_point_pos));
352+
}
353+
}
354+
355+
fn delete_preview(tool_data: &mut SplineToolData, responses: &mut VecDeque<Message>) {
356+
let Some(layer) = tool_data.layer else { return };
357+
358+
if let Some(id) = tool_data.preview_point {
359+
let modification_type = VectorModificationType::RemovePoint { id };
360+
responses.add(GraphOperationMessage::Vector { layer, modification_type });
361+
}
362+
if let Some(id) = tool_data.preview_segment {
363+
let modification_type = VectorModificationType::RemoveSegment { id };
364+
responses.add(GraphOperationMessage::Vector { layer, modification_type });
365+
}
366+
367+
tool_data.preview_point = None;
368+
tool_data.preview_segment = None;
326369
}

0 commit comments

Comments
 (0)