@@ -648,4 +648,155 @@ mod test_spline_tool {
648
648
649
649
assert_point_positions ( & extended_vector_data, layer_to_viewport, & all_expected_points, 1e-10 ) ;
650
650
}
651
+
652
+ #[ tokio:: test]
653
+ async fn test_spline_with_zoomed_view ( ) {
654
+ let mut editor = EditorTestUtils :: create ( ) ;
655
+ editor. new_document ( ) . await ;
656
+
657
+ // Zooming the viewport
658
+ editor. handle_message ( NavigationMessage :: CanvasZoomSet { zoom_factor : 2.0 } ) . await ;
659
+
660
+ // Selecting the spline tool
661
+ editor. select_tool ( ToolType :: Spline ) . await ;
662
+
663
+ // Adding points by clicking at different positions
664
+ editor. click_tool ( ToolType :: Spline , MouseKeys :: LEFT , DVec2 :: new ( 50.0 , 50.0 ) , ModifierKeys :: empty ( ) ) . await ;
665
+ editor. click_tool ( ToolType :: Spline , MouseKeys :: LEFT , DVec2 :: new ( 100.0 , 50.0 ) , ModifierKeys :: empty ( ) ) . await ;
666
+ editor. click_tool ( ToolType :: Spline , MouseKeys :: LEFT , DVec2 :: new ( 150.0 , 100.0 ) , ModifierKeys :: empty ( ) ) . await ;
667
+
668
+ // Finish the spline
669
+ editor. handle_message ( SplineToolMessage :: Confirm ) . await ;
670
+
671
+ // Evaluate the graph to ensure everything is processed
672
+ editor. eval_graph ( ) . await ;
673
+
674
+ // Get the layer and vector data
675
+ let document = editor. active_document ( ) ;
676
+ let network_interface = & document. network_interface ;
677
+ let layer = network_interface
678
+ . selected_nodes ( )
679
+ . selected_visible_and_unlocked_layers ( network_interface)
680
+ . next ( )
681
+ . expect ( "Should have a selected layer" ) ;
682
+ let vector_data = network_interface. compute_modified_vector ( layer) . expect ( "Should have vector data" ) ;
683
+ let layer_to_viewport = document. metadata ( ) . transform_to_viewport ( layer) ;
684
+
685
+ // Expected points in viewport coordinates
686
+ let expected_points = vec ! [ DVec2 :: new( 50.0 , 50.0 ) , DVec2 :: new( 100.0 , 50.0 ) , DVec2 :: new( 150.0 , 100.0 ) ] ;
687
+
688
+ // Assert all points are correctly positioned
689
+ assert_point_positions ( & vector_data, layer_to_viewport, & expected_points, 1e-10 ) ;
690
+ }
691
+
692
+ #[ tokio:: test]
693
+ async fn test_spline_with_panned_view ( ) {
694
+ let mut editor = EditorTestUtils :: create ( ) ;
695
+ editor. new_document ( ) . await ;
696
+
697
+ let pan_amount = DVec2 :: new ( 200.0 , 150.0 ) ;
698
+ editor. handle_message ( NavigationMessage :: CanvasPan { delta : pan_amount } ) . await ;
699
+
700
+ editor. select_tool ( ToolType :: Spline ) . await ;
701
+
702
+ // Add points by clicking at different positions
703
+ editor. click_tool ( ToolType :: Spline , MouseKeys :: LEFT , DVec2 :: new ( 50.0 , 50.0 ) , ModifierKeys :: empty ( ) ) . await ;
704
+ editor. click_tool ( ToolType :: Spline , MouseKeys :: LEFT , DVec2 :: new ( 100.0 , 50.0 ) , ModifierKeys :: empty ( ) ) . await ;
705
+ editor. click_tool ( ToolType :: Spline , MouseKeys :: LEFT , DVec2 :: new ( 150.0 , 100.0 ) , ModifierKeys :: empty ( ) ) . await ;
706
+
707
+ editor. handle_message ( SplineToolMessage :: Confirm ) . await ;
708
+
709
+ // Evaluating the graph to ensure everything is processed
710
+ editor. eval_graph ( ) . await ;
711
+
712
+ // Get the layer and vector data
713
+ let document = editor. active_document ( ) ;
714
+ let network_interface = & document. network_interface ;
715
+ let layer = network_interface
716
+ . selected_nodes ( )
717
+ . selected_visible_and_unlocked_layers ( network_interface)
718
+ . next ( )
719
+ . expect ( "Should have a selected layer" ) ;
720
+ let vector_data = network_interface. compute_modified_vector ( layer) . expect ( "Should have vector data" ) ;
721
+ let layer_to_viewport = document. metadata ( ) . transform_to_viewport ( layer) ;
722
+
723
+ // Expected points in viewport coordinates
724
+ let expected_points = vec ! [ DVec2 :: new( 50.0 , 50.0 ) , DVec2 :: new( 100.0 , 50.0 ) , DVec2 :: new( 150.0 , 100.0 ) ] ;
725
+
726
+ // Assert all points are correctly positioned
727
+ assert_point_positions ( & vector_data, layer_to_viewport, & expected_points, 1e-10 ) ;
728
+ }
729
+
730
+ #[ tokio:: test]
731
+ async fn test_spline_with_tilted_view ( ) {
732
+ let mut editor = EditorTestUtils :: create ( ) ;
733
+ editor. new_document ( ) . await ;
734
+
735
+ // Tilt/rotate the viewport (45 degrees)
736
+ editor. handle_message ( NavigationMessage :: CanvasTiltSet { angle_radians : 45.0_f64 . to_radians ( ) } ) . await ;
737
+ editor. select_tool ( ToolType :: Spline ) . await ;
738
+
739
+ editor. click_tool ( ToolType :: Spline , MouseKeys :: LEFT , DVec2 :: new ( 50.0 , 50.0 ) , ModifierKeys :: empty ( ) ) . await ;
740
+ editor. click_tool ( ToolType :: Spline , MouseKeys :: LEFT , DVec2 :: new ( 100.0 , 50.0 ) , ModifierKeys :: empty ( ) ) . await ;
741
+ editor. click_tool ( ToolType :: Spline , MouseKeys :: LEFT , DVec2 :: new ( 150.0 , 100.0 ) , ModifierKeys :: empty ( ) ) . await ;
742
+
743
+ editor. handle_message ( SplineToolMessage :: Confirm ) . await ;
744
+
745
+ // Evaluating the graph to ensure everything is processed
746
+ editor. eval_graph ( ) . await ;
747
+
748
+ // Get the layer and vector data
749
+ let document = editor. active_document ( ) ;
750
+ let network_interface = & document. network_interface ;
751
+ let layer = network_interface
752
+ . selected_nodes ( )
753
+ . selected_visible_and_unlocked_layers ( network_interface)
754
+ . next ( )
755
+ . expect ( "Should have a selected layer" ) ;
756
+ let vector_data = network_interface. compute_modified_vector ( layer) . expect ( "Should have vector data" ) ;
757
+ let layer_to_viewport = document. metadata ( ) . transform_to_viewport ( layer) ;
758
+
759
+ // Expected points in viewport coordinates
760
+ let expected_points = vec ! [ DVec2 :: new( 50.0 , 50.0 ) , DVec2 :: new( 100.0 , 50.0 ) , DVec2 :: new( 150.0 , 100.0 ) ] ;
761
+
762
+ // Assert all points are correctly positioned
763
+ assert_point_positions ( & vector_data, layer_to_viewport, & expected_points, 1e-10 ) ;
764
+ }
765
+
766
+ #[ tokio:: test]
767
+ async fn test_spline_with_combined_transformations ( ) {
768
+ let mut editor = EditorTestUtils :: create ( ) ;
769
+ editor. new_document ( ) . await ;
770
+
771
+ // Applying multiple transformations
772
+ editor. handle_message ( NavigationMessage :: CanvasZoomSet { zoom_factor : 1.5 } ) . await ;
773
+ editor. handle_message ( NavigationMessage :: CanvasPan { delta : DVec2 :: new ( 100.0 , 75.0 ) } ) . await ;
774
+ editor. handle_message ( NavigationMessage :: CanvasTiltSet { angle_radians : 30.0_f64 . to_radians ( ) } ) . await ;
775
+
776
+ editor. select_tool ( ToolType :: Spline ) . await ;
777
+
778
+ editor. click_tool ( ToolType :: Spline , MouseKeys :: LEFT , DVec2 :: new ( 50.0 , 50.0 ) , ModifierKeys :: empty ( ) ) . await ;
779
+ editor. click_tool ( ToolType :: Spline , MouseKeys :: LEFT , DVec2 :: new ( 100.0 , 50.0 ) , ModifierKeys :: empty ( ) ) . await ;
780
+ editor. click_tool ( ToolType :: Spline , MouseKeys :: LEFT , DVec2 :: new ( 150.0 , 100.0 ) , ModifierKeys :: empty ( ) ) . await ;
781
+
782
+ editor. handle_message ( SplineToolMessage :: Confirm ) . await ;
783
+ editor. eval_graph ( ) . await ;
784
+
785
+ // Get the layer and vector data
786
+ let document = editor. active_document ( ) ;
787
+ let network_interface = & document. network_interface ;
788
+ let layer = network_interface
789
+ . selected_nodes ( )
790
+ . selected_visible_and_unlocked_layers ( network_interface)
791
+ . next ( )
792
+ . expect ( "Should have a selected layer" ) ;
793
+ let vector_data = network_interface. compute_modified_vector ( layer) . expect ( "Should have vector data" ) ;
794
+ let layer_to_viewport = document. metadata ( ) . transform_to_viewport ( layer) ;
795
+
796
+ // Expected points in viewport coordinates
797
+ let expected_points = vec ! [ DVec2 :: new( 50.0 , 50.0 ) , DVec2 :: new( 100.0 , 50.0 ) , DVec2 :: new( 150.0 , 100.0 ) ] ;
798
+
799
+ // Assert all points are correctly positioned
800
+ assert_point_positions ( & vector_data, layer_to_viewport, & expected_points, 1e-10 ) ;
801
+ }
651
802
}
0 commit comments