@@ -648,4 +648,155 @@ mod test_spline_tool {
648648
649649 assert_point_positions ( & extended_vector_data, layer_to_viewport, & all_expected_points, 1e-10 ) ;
650650 }
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+ }
651802}
0 commit comments