@@ -196,6 +196,9 @@ func _draw() -> void:
196196 var selected_multiline := PackedVector2Array ()
197197 var hovered_multiline := PackedVector2Array ()
198198 var hovered_selected_multiline := PackedVector2Array ()
199+ # Store bounding rects and the transforms needed for them.
200+ var selection_transforms : Array [Transform2D ] = []
201+ var selection_rects : Array [Rect2 ] = []
199202
200203 for element : Element in State .root_element .get_all_valid_element_descendants ():
201204 # Determine if the element is hovered/selected or has a hovered/selected parent.
@@ -231,6 +234,20 @@ func _draw() -> void:
231234 else :
232235 normal_polylines .append (points )
233236 normal_multiline += extras
237+
238+ if element_selected :
239+ var bounding_box : Rect2 = element .get_bounding_box ()
240+ if bounding_box .has_area ():
241+ var element_transform := element .get_transform ()
242+ var canvas_transform := State .root_element .canvas_transform
243+ var canvas_scale := canvas_transform .get_scale ().x
244+ var element_scale := element_transform .get_scale ()
245+ var grow_amount_unscaled := 4.0 / State .zoom / canvas_scale
246+ var grow_amount_x := grow_amount_unscaled / element_scale .x
247+ var grow_amount_y := grow_amount_unscaled / element_scale .y
248+ selection_transforms .append (canvas_transform * element_transform )
249+ selection_rects .append (bounding_box .grow_individual (grow_amount_x ,
250+ grow_amount_y , grow_amount_x , grow_amount_y ))
234251
235252 "ellipse" :
236253 var c := Vector2 (element .get_attribute_num ("cx" ),
@@ -260,6 +277,20 @@ func _draw() -> void:
260277 else :
261278 normal_polylines .append (points )
262279 normal_multiline += extras
280+
281+ if element_selected :
282+ var bounding_box : Rect2 = element .get_bounding_box ()
283+ if bounding_box .has_area ():
284+ var element_transform := element .get_transform ()
285+ var canvas_transform := State .root_element .canvas_transform
286+ var canvas_scale := canvas_transform .get_scale ().x
287+ var element_scale := element_transform .get_scale ()
288+ var grow_amount_unscaled := 4.0 / State .zoom / canvas_scale
289+ var grow_amount_x := grow_amount_unscaled / element_scale .x
290+ var grow_amount_y := grow_amount_unscaled / element_scale .y
291+ selection_transforms .append (canvas_transform * element_transform )
292+ selection_rects .append (bounding_box .grow_individual (grow_amount_x ,
293+ grow_amount_y , grow_amount_x , grow_amount_y ))
263294
264295 "rect" :
265296 var x := element .get_attribute_num ("x" )
@@ -323,6 +354,20 @@ func _draw() -> void:
323354 else :
324355 normal_polylines .append (points )
325356 normal_multiline += extras
357+
358+ if element_selected :
359+ var bounding_box : Rect2 = element .get_bounding_box ()
360+ if bounding_box .has_area ():
361+ var element_transform := element .get_transform ()
362+ var canvas_transform := State .root_element .canvas_transform
363+ var canvas_scale := canvas_transform .get_scale ().x
364+ var element_scale := element_transform .get_scale ()
365+ var grow_amount_unscaled := 4.0 / State .zoom / canvas_scale
366+ var grow_amount_x := grow_amount_unscaled / element_scale .x
367+ var grow_amount_y := grow_amount_unscaled / element_scale .y
368+ selection_transforms .append (canvas_transform * element_transform )
369+ selection_rects .append (bounding_box .grow_individual (grow_amount_x ,
370+ grow_amount_y , grow_amount_x , grow_amount_y ))
326371
327372 "line" :
328373 var x1 := element .get_attribute_num ("x1" )
@@ -341,6 +386,20 @@ func _draw() -> void:
341386 selected_polylines .append (points )
342387 else :
343388 normal_polylines .append (points )
389+
390+ if element_selected :
391+ var bounding_box : Rect2 = element .get_bounding_box ()
392+ if bounding_box .has_area ():
393+ var element_transform := element .get_transform ()
394+ var canvas_transform := State .root_element .canvas_transform
395+ var canvas_scale := canvas_transform .get_scale ().x
396+ var element_scale := element_transform .get_scale ()
397+ var grow_amount_unscaled := 4.0 / State .zoom / canvas_scale
398+ var grow_amount_x := grow_amount_unscaled / element_scale .x
399+ var grow_amount_y := grow_amount_unscaled / element_scale .y
400+ selection_transforms .append (canvas_transform * element_transform )
401+ selection_rects .append (bounding_box .grow_individual (grow_amount_x ,
402+ grow_amount_y , grow_amount_x , grow_amount_y ))
344403
345404 "polygon" , "polyline" :
346405 var point_list := ListParser .list_to_points (element .get_attribute_list ("points" ))
@@ -387,6 +446,20 @@ func _draw() -> void:
387446 selected_polylines .append (points )
388447 Utils .InteractionType .HOVERED_SELECTED :
389448 hovered_selected_polylines .append (points )
449+
450+ if element_selected :
451+ var bounding_box : Rect2 = element .get_bounding_box ()
452+ if bounding_box .has_area ():
453+ var element_transform := element .get_transform ()
454+ var canvas_transform := State .root_element .canvas_transform
455+ var canvas_scale := canvas_transform .get_scale ().x
456+ var element_scale := element_transform .get_scale ()
457+ var grow_amount_unscaled := 4.0 / State .zoom / canvas_scale
458+ var grow_amount_x := grow_amount_unscaled / element_scale .x
459+ var grow_amount_y := grow_amount_unscaled / element_scale .y
460+ selection_transforms .append (canvas_transform * element_transform )
461+ selection_rects .append (bounding_box .grow_individual (grow_amount_x ,
462+ grow_amount_y , grow_amount_x , grow_amount_y ))
390463
391464 "path" :
392465 var pathdata : AttributePathdata = element .get_attribute ("d" )
@@ -593,6 +666,20 @@ func _draw() -> void:
593666 Utils .InteractionType .HOVERED_SELECTED :
594667 hovered_selected_polylines .append (points )
595668 hovered_selected_multiline += tangent_points
669+
670+ if element_selected :
671+ var bounding_box : Rect2 = element .get_bounding_box ()
672+ if bounding_box .has_area ():
673+ var element_transform := element .get_transform ()
674+ var canvas_transform := State .root_element .canvas_transform
675+ var canvas_scale := canvas_transform .get_scale ().x
676+ var element_scale := element_transform .get_scale ()
677+ var grow_amount_unscaled := 4.0 / State .zoom / canvas_scale
678+ var grow_amount_x := grow_amount_unscaled / element_scale .x
679+ var grow_amount_y := grow_amount_unscaled / element_scale .y
680+ selection_transforms .append (canvas_transform * element_transform )
681+ selection_rects .append (bounding_box .grow_individual (grow_amount_x ,
682+ grow_amount_y , grow_amount_x , grow_amount_y ))
596683
597684 draw_set_transform_matrix (State .root_element .canvas_transform )
598685 RenderingServer .canvas_item_set_transform (surface , Transform2D (0.0 ,
@@ -634,19 +721,11 @@ func _draw() -> void:
634721 hovered_selected_multiline , hovered_selected_handles ,
635722 hovered_selected_handle_textures )
636723
637- for xid in State .selected_xids :
638- var xnode := State .root_element .get_xnode (xid )
639- if xnode .is_element () and DB .is_attribute_recognized (xnode .name , "transform" ):
640- var bounding_box : Rect2 = xnode .get_bounding_box ()
641- if bounding_box .has_area ():
642- RenderingServer .canvas_item_add_set_transform (selections_surface ,
643- State .root_element .canvas_transform * xnode .get_transform ())
644- var grow_amount := Vector2 (4 , 4 ) / State .zoom
645- grow_amount /= State .root_element .canvas_transform .get_scale ()
646- grow_amount /= xnode .get_transform ().get_scale ()
647- RenderingServer .canvas_item_add_rect (selections_surface ,
648- bounding_box .grow_individual (grow_amount .x , grow_amount .y ,
649- grow_amount .x , grow_amount .y ), Color .WHITE )
724+ for idx in selection_rects .size ():
725+ RenderingServer .canvas_item_add_set_transform (selections_surface ,
726+ selection_transforms [idx ])
727+ RenderingServer .canvas_item_add_rect (selections_surface , selection_rects [idx ],
728+ Color .WHITE )
650729
651730func draw_objects_of_type (color : Color , polylines : Array [PackedVector2Array ],
652731multiline : PackedVector2Array , handles_array : Array [Handle ],
0 commit comments