@@ -7,8 +7,9 @@ use crate::messages::tool::common_functionality::color_selector::{ToolColorOptio
77use crate :: messages:: tool:: common_functionality:: graph_modification_utils;
88use crate :: messages:: tool:: common_functionality:: snapping:: SnapManager ;
99
10- use graph_craft:: document:: { value :: TaggedValue , NodeId , NodeInput } ;
10+ use graph_craft:: document:: { NodeId , NodeInput } ;
1111use graphene_core:: Color ;
12+ use graphene_std:: vector:: { PointId , SegmentId , VectorModificationType } ;
1213
1314#[ derive( Default ) ]
1415pub struct SplineTool {
@@ -177,8 +178,14 @@ impl ToolTransition for SplineTool {
177178
178179#[ derive( Clone , Debug , Default ) ]
179180struct 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