11use crate :: consts:: COLOR_OVERLAY_BLUE ;
22use crate :: messages:: portfolio:: document:: overlays:: utility_types:: { OverlayContext , Pivot } ;
33use crate :: messages:: tool:: tool_messages:: tool_prelude:: * ;
4-
54use graphene_std:: renderer:: Rect ;
65
76/// Draws a dashed line between two points transformed by the given affine transformation.
@@ -25,29 +24,50 @@ fn draw_line_with_length(line_start: DVec2, line_end: DVec2, transform: DAffine2
2524 . trim_end_matches ( '.' )
2625 . to_string ( ) ;
2726
28- const TEXT_PADDING : f64 = 5. ;
29- // Calculate midpoint of the line
30- let midpoint = ( min_viewport + max_viewport) / 2. ;
31-
32- // Adjust text position based on line orientation and flags
33- // Determine text position based on line orientation and flags
34- let ( pivot_x, pivot_y) = match ( label_alignment. is_vertical_line , label_alignment. text_on_left , label_alignment. text_on_top ) {
35- ( true , true , _) => ( Pivot :: End , Pivot :: Middle ) , // Vertical line, text on the left
36- ( true , false , _) => ( Pivot :: Start , Pivot :: Middle ) , // Vertical line, text on the right
37- ( false , _, true ) => ( Pivot :: Middle , Pivot :: End ) , // Horizontal line, text on top
38- ( false , _, false ) => ( Pivot :: Middle , Pivot :: Start ) , // Horizontal line, text on bottom
39- } ;
40- overlay_context. text ( & length, COLOR_OVERLAY_BLUE , None , DAffine2 :: from_translation ( midpoint) , TEXT_PADDING , [ pivot_x, pivot_y] ) ;
27+ const TOLERANCE : f64 = 0.01 ;
28+ if transform_to_document. transform_vector2 ( line_end - line_start) . length ( ) >= TOLERANCE {
29+ const TEXT_PADDING : f64 = 5. ;
30+ // Calculate midpoint of the line
31+ let midpoint = ( min_viewport + max_viewport) / 2. ;
32+
33+ // Adjust text position based on line orientation and flags
34+ // Determine text position based on line orientation and flags
35+ let ( pivot_x, pivot_y) = match ( label_alignment. is_vertical_line , label_alignment. text_on_left , label_alignment. text_on_top ) {
36+ ( true , true , _) => ( Pivot :: End , Pivot :: Middle ) , // Vertical line, text on the left
37+ ( true , false , _) => ( Pivot :: Start , Pivot :: Middle ) , // Vertical line, text on the right
38+ ( false , _, true ) => ( Pivot :: Middle , Pivot :: End ) , // Horizontal line, text on top
39+ ( false , _, false ) => ( Pivot :: Middle , Pivot :: Start ) , // Horizontal line, text on bottom
40+ } ;
41+ overlay_context. text ( & length, COLOR_OVERLAY_BLUE , None , DAffine2 :: from_translation ( midpoint) , TEXT_PADDING , [ pivot_x, pivot_y] ) ;
42+ }
43+ }
44+
45+ /// Draws a dashed outline around a rectangle to visualize the AABB
46+ fn draw_dashed_rect_outline ( rect : Rect , transform : DAffine2 , overlay_context : & mut OverlayContext ) {
47+ let min = rect. min ( ) ;
48+ let max = rect. max ( ) ;
49+
50+ // Create the four corners of the rectangle
51+ let top_left = transform. transform_point2 ( DVec2 :: new ( min. x , min. y ) ) ;
52+ let top_right = transform. transform_point2 ( DVec2 :: new ( max. x , min. y ) ) ;
53+ let bottom_right = transform. transform_point2 ( DVec2 :: new ( max. x , max. y ) ) ;
54+ let bottom_left = transform. transform_point2 ( DVec2 :: new ( min. x , max. y ) ) ;
55+
56+ // Draw the four sides as dashed lines
57+ draw_dashed_line ( top_left, top_right, transform, overlay_context) ;
58+ draw_dashed_line ( top_right, bottom_right, transform, overlay_context) ;
59+ draw_dashed_line ( bottom_right, bottom_left, transform, overlay_context) ;
60+ draw_dashed_line ( bottom_left, top_left, transform, overlay_context) ;
4161}
4262
4363/// Checks if the selected bounds overlap with the hovered bounds on the Y-axis.
4464fn does_overlap_y ( selected_bounds : Rect , hovered_bounds : Rect ) -> bool {
45- selected_bounds. min ( ) . x < hovered_bounds. max ( ) . x && selected_bounds. max ( ) . x > hovered_bounds. min ( ) . x
65+ selected_bounds. min ( ) . x <= hovered_bounds. max ( ) . x && selected_bounds. max ( ) . x >= hovered_bounds. min ( ) . x
4666}
4767
4868/// Checks if the selected bounds overlap with the hovered bounds on the X-axis.
4969fn does_overlap_x ( selected_bounds : Rect , hovered_bounds : Rect ) -> bool {
50- selected_bounds. min ( ) . y < hovered_bounds. max ( ) . y && selected_bounds. max ( ) . y > hovered_bounds. min ( ) . y
70+ selected_bounds. min ( ) . y <= hovered_bounds. max ( ) . y && selected_bounds. max ( ) . y >= hovered_bounds. min ( ) . y
5171}
5272
5373/// Draws measurements when both X and Y axes are involved in the overlap between selected and hovered bounds.
@@ -91,8 +111,8 @@ fn draw_single_axis_zero_crossings(selected_bounds: Rect, hovered_bounds: Rect,
91111 let ( selected_min, selected_max) = ( selected_bounds. min ( ) , selected_bounds. max ( ) ) ;
92112 let ( hovered_min, hovered_max) = ( hovered_bounds. min ( ) , hovered_bounds. max ( ) ) ;
93113
94- let overlap_y = does_overlap_y ( selected_bounds, hovered_bounds) ;
95- let overlap_x = does_overlap_x ( selected_bounds, hovered_bounds) ;
114+ let overlap_y = does_overlap_y ( selected_bounds, hovered_bounds) || does_overlap_y ( hovered_bounds , selected_bounds ) ;
115+ let overlap_x = does_overlap_x ( selected_bounds, hovered_bounds) || does_overlap_x ( hovered_bounds , selected_bounds ) ;
96116
97117 let selected_on_bottom = selected_bounds. center ( ) . y > hovered_bounds. center ( ) . y ;
98118 let selected_on_right = selected_bounds. center ( ) . x > hovered_bounds. center ( ) . x ;
@@ -151,8 +171,8 @@ fn draw_single_axis_one_crossings(selected_bounds: Rect, hovered_bounds: Rect, t
151171 let selected_center = selected_bounds. center ( ) ;
152172 let hovered_center = hovered_bounds. center ( ) ;
153173
154- let overlap_y = does_overlap_y ( selected_bounds, hovered_bounds) ;
155- let overlap_x = does_overlap_x ( selected_bounds, hovered_bounds) ;
174+ let overlap_y = does_overlap_y ( selected_bounds, hovered_bounds) || does_overlap_y ( hovered_bounds , selected_bounds ) ;
175+ let overlap_x = does_overlap_x ( selected_bounds, hovered_bounds) || does_overlap_x ( hovered_bounds , selected_bounds ) ;
156176
157177 if overlap_y {
158178 let selected_facing_edge = if hovered_max. y < selected_min. y { selected_min. y } else { selected_max. y } ;
@@ -423,14 +443,14 @@ fn handle_two_axis_overlap(selected_bounds: Rect, hovered_bounds: Rect, transfor
423443
424444/// Overlays measurement lines between selected and hovered bounds based on their spatial relationships.
425445pub fn overlay ( selected_bounds : Rect , hovered_bounds : Rect , transform : DAffine2 , document_to_viewport : DAffine2 , overlay_context : & mut OverlayContext ) {
426- // TODO: Apply object rotation to bounds before drawing lines for all cases.
427-
446+ draw_dashed_rect_outline ( selected_bounds , transform , overlay_context ) ;
447+ draw_dashed_rect_outline ( hovered_bounds , transform , overlay_context ) ;
428448 let ( selected_min, selected_max) = ( selected_bounds. min ( ) , selected_bounds. max ( ) ) ;
429449 let ( hovered_min, hovered_max) = ( hovered_bounds. min ( ) , hovered_bounds. max ( ) ) ;
430450
431451 // Determine axis overlaps
432- let overlap_x = selected_min . x <= hovered_max . x && selected_max . x >= hovered_min . x ;
433- let overlap_y = selected_min . y <= hovered_max . y && selected_max . y >= hovered_min . y ;
452+ let overlap_y = does_overlap_y ( selected_bounds , hovered_bounds ) || does_overlap_y ( hovered_bounds , selected_bounds ) ;
453+ let overlap_x = does_overlap_x ( selected_bounds , hovered_bounds ) || does_overlap_x ( hovered_bounds , selected_bounds ) ;
434454 let overlap_axes = match ( overlap_x, overlap_y) {
435455 ( true , true ) => 2 ,
436456 ( true , false ) | ( false , true ) => 1 ,
0 commit comments