3030
3131#include " sprite_2d.h"
3232
33+ #include " core/input/input.h"
3334#include " scene/main/viewport.h"
3435
3536#ifdef TOOLS_ENABLED
3637Dictionary Sprite2D::_edit_get_state () const {
3738 Dictionary state = Node2D::_edit_get_state ();
3839 state[" offset" ] = offset;
40+ state[" region_rect" ] = region_rect;
3941 return state;
4042}
4143
4244void Sprite2D::_edit_set_state (const Dictionary &p_state) {
4345 Node2D::_edit_set_state (p_state);
4446 set_offset (p_state[" offset" ]);
47+ set_region_rect (p_state[" region_rect" ]);
4548}
4649
4750void Sprite2D::_edit_set_pivot (const Point2 &p_pivot) {
@@ -56,6 +59,19 @@ Point2 Sprite2D::_edit_get_pivot() const {
5659bool Sprite2D::_edit_use_pivot () const {
5760 return true ;
5861}
62+
63+ void Sprite2D::_edit_set_rect (const Rect2 &p_rect) {
64+ if (texture.is_null ()) {
65+ return ;
66+ }
67+ if (!(region_enabled && hframes <= 1 && vframes <= 1 && Input::get_singleton ()->is_key_label_pressed (Key::CTRL))) {
68+ Node2D::_edit_set_rect (p_rect);
69+ return ;
70+ }
71+ Point2 delta = p_rect.position - (centered ? _get_rect_offset (p_rect.size ) : Vector2 ());
72+ set_region_rect (Rect2 (region_rect.position , p_rect.size ));
73+ set_position (get_position () + get_transform ().basis_xform (delta));
74+ }
5975#endif // TOOLS_ENABLED
6076
6177#ifdef DEBUG_ENABLED
@@ -113,6 +129,19 @@ void Sprite2D::_get_rects(Rect2 &r_src_rect, Rect2 &r_dst_rect, bool &r_filter_c
113129 }
114130}
115131
132+ Point2 Sprite2D::_get_rect_offset (const Size2i &p_size) const {
133+ Point2 ofs = offset;
134+ if (centered) {
135+ ofs -= Size2 (p_size) / 2 ;
136+ }
137+
138+ if (get_viewport () && get_viewport ()->is_snap_2d_transforms_to_pixel_enabled ()) {
139+ ofs = (ofs + Point2 (0.5 , 0.5 )).floor ();
140+ }
141+
142+ return ofs;
143+ }
144+
116145void Sprite2D::_notification (int p_what) {
117146 switch (p_what) {
118147 case NOTIFICATION_ACCESSIBILITY_UPDATE: {
@@ -226,6 +255,7 @@ void Sprite2D::set_region_enabled(bool p_region_enabled) {
226255 }
227256
228257 region_enabled = p_region_enabled;
258+ _emit_region_rect_enabled ();
229259 queue_redraw ();
230260 notify_property_list_changed ();
231261}
@@ -301,6 +331,7 @@ void Sprite2D::set_vframes(int p_amount) {
301331 if (frame >= vframes * hframes) {
302332 frame = 0 ;
303333 }
334+ _emit_region_rect_enabled ();
304335 queue_redraw ();
305336 item_rect_changed ();
306337 notify_property_list_changed ();
@@ -332,6 +363,7 @@ void Sprite2D::set_hframes(int p_amount) {
332363 if (frame >= vframes * hframes) {
333364 frame = 0 ;
334365 }
366+ _emit_region_rect_enabled ();
335367 queue_redraw ();
336368 item_rect_changed ();
337369 notify_property_list_changed ();
@@ -392,6 +424,10 @@ bool Sprite2D::is_pixel_opaque(const Point2 &p_point) const {
392424 return texture->is_pixel_opaque ((int )q.x , (int )q.y );
393425}
394426
427+ bool Sprite2D::is_editor_region_rect_draggable () const {
428+ return hframes <= 1 && vframes <= 1 && region_enabled;
429+ }
430+
395431Rect2 Sprite2D::get_rect () const {
396432 if (texture.is_null ()) {
397433 return Rect2 (0 , 0 , 1 , 1 );
@@ -407,14 +443,7 @@ Rect2 Sprite2D::get_rect() const {
407443
408444 s = s / Point2 (hframes, vframes);
409445
410- Point2 ofs = offset;
411- if (centered) {
412- ofs -= Size2 (s) / 2 ;
413- }
414-
415- if (get_viewport () && get_viewport ()->is_snap_2d_transforms_to_pixel_enabled ()) {
416- ofs = (ofs + Point2 (0.5 , 0.5 )).floor ();
417- }
446+ Point2 ofs = _get_rect_offset (s);
418447
419448 if (s == Size2 (0 , 0 )) {
420449 s = Size2 (1 , 1 );
@@ -447,6 +476,10 @@ void Sprite2D::_texture_changed() {
447476 }
448477}
449478
479+ void Sprite2D::_emit_region_rect_enabled () {
480+ emit_signal (" _editor_region_rect_enabled" , is_editor_region_rect_draggable ());
481+ }
482+
450483void Sprite2D::_bind_methods () {
451484 ClassDB::bind_method (D_METHOD (" set_texture" , " texture" ), &Sprite2D::set_texture);
452485 ClassDB::bind_method (D_METHOD (" get_texture" ), &Sprite2D::get_texture);
@@ -510,6 +543,9 @@ void Sprite2D::_bind_methods() {
510543}
511544
512545Sprite2D::Sprite2D () {
546+ #ifdef TOOLS_ENABLED
547+ add_user_signal (MethodInfo (" _editor_region_rect_enabled" , PropertyInfo (Variant::BOOL, " enabled" ))); // Sprite2DEditorPlugin listens to this.
548+ #endif
513549}
514550
515551Sprite2D::~Sprite2D () {
0 commit comments