Skip to content

Commit 0a496ee

Browse files
authored
Change Spline tool behavior to use Path and Spline from Points nodes instead of legacy Spline node (#2200)
* use Path and Splines from Points node to build spline replacing Spline node * fix point being added on drag start event in spline tool
1 parent 2e4fb95 commit 0a496ee

1 file changed

Lines changed: 60 additions & 18 deletions

File tree

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

Lines changed: 60 additions & 18 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,49 @@ 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();
323+
fn update_spline(tool_data: &mut SplineToolData, show_preview: bool, responses: &mut VecDeque<Message>) {
324+
delete_preview(tool_data, responses);
325+
326+
let Some(layer) = tool_data.layer else { return };
327+
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,
333+
};
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_segment = Some(id);
344+
}
345+
}
346+
315347
if show_preview {
316-
points.push(tool_data.next_point)
348+
tool_data.preview_point = Some(next_point_id);
349+
} else {
350+
tool_data.points.push((next_point_id, next_point_pos));
317351
}
318-
let value = TaggedValue::VecDVec2(points);
352+
}
319353

354+
fn delete_preview(tool_data: &mut SplineToolData, responses: &mut VecDeque<Message>) {
320355
let Some(layer) = tool_data.layer else { return };
321356

322-
let Some(node_id) = graph_modification_utils::NodeGraphLayer::new(layer, &document.network_interface).upstream_node_id_from_name("Spline") else {
323-
return;
324-
};
325-
responses.add_front(NodeGraphMessage::SetInputValue { node_id, input_index: 1, value });
357+
if let Some(id) = tool_data.preview_point {
358+
let modification_type = VectorModificationType::RemovePoint { id };
359+
responses.add(GraphOperationMessage::Vector { layer, modification_type });
360+
}
361+
if let Some(id) = tool_data.preview_segment {
362+
let modification_type = VectorModificationType::RemoveSegment { id };
363+
responses.add(GraphOperationMessage::Vector { layer, modification_type });
364+
}
365+
366+
tool_data.preview_point = None;
367+
tool_data.preview_segment = None;
326368
}

0 commit comments

Comments
 (0)