@@ -7,8 +7,9 @@ use crate::messages::tool::common_functionality::color_selector::{ToolColorOptio
7
7
use crate :: messages:: tool:: common_functionality:: graph_modification_utils;
8
8
use crate :: messages:: tool:: common_functionality:: snapping:: SnapManager ;
9
9
10
- use graph_craft:: document:: { value :: TaggedValue , NodeId , NodeInput } ;
10
+ use graph_craft:: document:: { NodeId , NodeInput } ;
11
11
use graphene_core:: Color ;
12
+ use graphene_std:: vector:: { PointId , SegmentId , VectorModificationType } ;
12
13
13
14
#[ derive( Default ) ]
14
15
pub struct SplineTool {
@@ -177,8 +178,14 @@ impl ToolTransition for SplineTool {
177
178
178
179
#[ derive( Clone , Debug , Default ) ]
179
180
struct SplineToolData {
180
- points : Vec < DVec2 > ,
181
+ /// Points that are inserted.
182
+ points : Vec < ( PointId , DVec2 ) > ,
183
+ /// Point to be inserted.
181
184
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 > ,
182
189
weight : f64 ,
183
190
layer : Option < LayerNodeIdentifier > ,
184
191
snap_manager : SnapManager ,
@@ -205,9 +212,11 @@ impl Fsm for SplineToolFsmState {
205
212
206
213
tool_data. weight = tool_options. line_weight ;
207
214
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) ] ;
211
220
212
221
let layer = graph_modification_utils:: new_custom ( NodeId :: new ( ) , nodes, parent, responses) ;
213
222
tool_options. fill . apply_fill ( layer, responses) ;
@@ -228,12 +237,11 @@ impl Fsm for SplineToolFsmState {
228
237
let transform = document. metadata ( ) . transform_to_viewport ( layer) ;
229
238
let pos = transform. inverse ( ) . transform_point2 ( snapped_position) ;
230
239
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 ) {
233
241
tool_data. next_point = pos;
234
242
}
235
243
236
- update_spline ( document , tool_data, true , responses) ;
244
+ update_spline ( tool_data, false , responses) ;
237
245
238
246
SplineToolFsmState :: Drawing
239
247
}
@@ -246,7 +254,7 @@ impl Fsm for SplineToolFsmState {
246
254
let pos = transform. inverse ( ) . transform_point2 ( snapped_position) ;
247
255
tool_data. next_point = pos;
248
256
249
- update_spline ( document , tool_data, true , responses) ;
257
+ update_spline ( tool_data, true , responses) ;
250
258
251
259
// Auto-panning
252
260
let messages = [ SplineToolMessage :: PointerOutsideViewport . into ( ) , SplineToolMessage :: PointerMove . into ( ) ] ;
@@ -269,13 +277,15 @@ impl Fsm for SplineToolFsmState {
269
277
}
270
278
( SplineToolFsmState :: Drawing , SplineToolMessage :: Confirm | SplineToolMessage :: Abort ) => {
271
279
if tool_data. points . len ( ) >= 2 {
272
- update_spline ( document , tool_data, false , responses) ;
280
+ delete_preview ( tool_data, responses) ;
273
281
responses. add ( DocumentMessage :: EndTransaction ) ;
274
282
} else {
275
283
responses. add ( DocumentMessage :: AbortTransaction ) ;
276
284
}
277
285
278
286
tool_data. layer = None ;
287
+ tool_data. preview_point = None ;
288
+ tool_data. preview_segment = None ;
279
289
tool_data. points . clear ( ) ;
280
290
tool_data. snap_manager . cleanup ( responses) ;
281
291
@@ -310,17 +320,50 @@ impl Fsm for SplineToolFsmState {
310
320
}
311
321
}
312
322
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) ;
319
325
320
326
let Some ( layer) = tool_data. layer else { return } ;
321
327
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,
324
333
} ;
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 ;
326
369
}
0 commit comments