@@ -42,6 +42,7 @@ Dictionary Node2D::_edit_get_state() const {
42
42
state[" position" ] = get_position ();
43
43
state[" rotation" ] = get_rotation ();
44
44
state[" scale" ] = get_scale ();
45
+ state[" skew" ] = get_skew ();
45
46
46
47
return state;
47
48
}
@@ -51,11 +52,14 @@ void Node2D::_edit_set_state(const Dictionary &p_state) {
51
52
pos = p_state[" position" ];
52
53
angle = p_state[" rotation" ];
53
54
_scale = p_state[" scale" ];
55
+ skew = p_state[" skew" ];
54
56
55
57
_update_transform ();
56
58
_change_notify (" rotation" );
57
59
_change_notify (" rotation_degrees" );
58
60
_change_notify (" scale" );
61
+ _change_notify (" skew" );
62
+ _change_notify (" skew_degrees" );
59
63
_change_notify (" position" );
60
64
}
61
65
@@ -111,7 +115,7 @@ void Node2D::_edit_set_rect(const Rect2 &p_edit_rect) {
111
115
Point2 new_pos = p_edit_rect.position + p_edit_rect.size * zero_offset;
112
116
113
117
Transform2D postxf;
114
- postxf.set_rotation_and_scale (angle, _scale);
118
+ postxf.set_rotation_scale_and_skew (angle, _scale, skew );
115
119
new_pos = postxf.xform (new_pos);
116
120
117
121
pos += new_pos;
@@ -128,12 +132,13 @@ void Node2D::_update_xform_values() {
128
132
pos = _mat.elements [2 ];
129
133
angle = _mat.get_rotation ();
130
134
_scale = _mat.get_scale ();
135
+ skew = _mat.get_skew ();
131
136
_xform_dirty = false ;
132
137
}
133
138
134
139
void Node2D::_update_transform () {
135
140
136
- _mat.set_rotation_and_scale (angle, _scale);
141
+ _mat.set_rotation_scale_and_skew (angle, _scale, skew );
137
142
_mat.elements [2 ] = pos;
138
143
139
144
VisualServer::get_singleton ()->canvas_item_set_transform (get_canvas_item (), _mat);
@@ -163,11 +168,26 @@ void Node2D::set_rotation(float p_radians) {
163
168
_change_notify (" rotation_degrees" );
164
169
}
165
170
171
+ void Node2D::set_skew (float p_radians) {
172
+
173
+ if (_xform_dirty)
174
+ ((Node2D *)this )->_update_xform_values ();
175
+ skew = p_radians;
176
+ _update_transform ();
177
+ _change_notify (" skew" );
178
+ _change_notify (" skew_degrees" );
179
+ }
180
+
166
181
void Node2D::set_rotation_degrees (float p_degrees) {
167
182
168
183
set_rotation (Math::deg2rad (p_degrees));
169
184
}
170
185
186
+ void Node2D::set_skew_degrees (float p_degrees) {
187
+
188
+ set_skew (Math::deg2rad (p_degrees));
189
+ }
190
+
171
191
void Node2D::set_scale (const Size2 &p_scale) {
172
192
173
193
if (_xform_dirty)
@@ -196,11 +216,22 @@ float Node2D::get_rotation() const {
196
216
return angle;
197
217
}
198
218
219
+ float Node2D::get_skew () const {
220
+ if (_xform_dirty)
221
+ ((Node2D *)this )->_update_xform_values ();
222
+
223
+ return skew;
224
+ }
225
+
199
226
float Node2D::get_rotation_degrees () const {
200
227
201
228
return Math::rad2deg (get_rotation ());
202
229
}
203
230
231
+ float Node2D::get_skew_degrees () const {
232
+
233
+ return Math::rad2deg (get_skew ());
234
+ }
204
235
Size2 Node2D::get_scale () const {
205
236
if (_xform_dirty)
206
237
((Node2D *)this )->_update_xform_values ();
@@ -398,11 +429,15 @@ void Node2D::_bind_methods() {
398
429
ClassDB::bind_method (D_METHOD (" set_position" , " position" ), &Node2D::set_position);
399
430
ClassDB::bind_method (D_METHOD (" set_rotation" , " radians" ), &Node2D::set_rotation);
400
431
ClassDB::bind_method (D_METHOD (" set_rotation_degrees" , " degrees" ), &Node2D::set_rotation_degrees);
432
+ ClassDB::bind_method (D_METHOD (" set_skew" , " radians" ), &Node2D::set_skew);
433
+ ClassDB::bind_method (D_METHOD (" set_skew_degrees" , " degrees" ), &Node2D::set_skew_degrees);
401
434
ClassDB::bind_method (D_METHOD (" set_scale" , " scale" ), &Node2D::set_scale);
402
435
403
436
ClassDB::bind_method (D_METHOD (" get_position" ), &Node2D::get_position);
404
437
ClassDB::bind_method (D_METHOD (" get_rotation" ), &Node2D::get_rotation);
405
438
ClassDB::bind_method (D_METHOD (" get_rotation_degrees" ), &Node2D::get_rotation_degrees);
439
+ ClassDB::bind_method (D_METHOD (" get_skew" ), &Node2D::get_skew);
440
+ ClassDB::bind_method (D_METHOD (" get_skew_degrees" ), &Node2D::get_skew_degrees);
406
441
ClassDB::bind_method (D_METHOD (" get_scale" ), &Node2D::get_scale);
407
442
408
443
ClassDB::bind_method (D_METHOD (" rotate" , " radians" ), &Node2D::rotate);
@@ -443,6 +478,8 @@ void Node2D::_bind_methods() {
443
478
ADD_PROPERTY (PropertyInfo (Variant::REAL, " rotation" , PROPERTY_HINT_NONE, " " , PROPERTY_USAGE_NOEDITOR), " set_rotation" , " get_rotation" );
444
479
ADD_PROPERTY (PropertyInfo (Variant::REAL, " rotation_degrees" , PROPERTY_HINT_RANGE, " -360,360,0.1,or_lesser,or_greater" , PROPERTY_USAGE_EDITOR), " set_rotation_degrees" , " get_rotation_degrees" );
445
480
ADD_PROPERTY (PropertyInfo (Variant::VECTOR2, " scale" ), " set_scale" , " get_scale" );
481
+ ADD_PROPERTY (PropertyInfo (Variant::REAL, " skew" , PROPERTY_HINT_NONE, " " , PROPERTY_USAGE_NOEDITOR), " set_skew" , " get_skew" );
482
+ ADD_PROPERTY (PropertyInfo (Variant::REAL, " skew_degrees" , PROPERTY_HINT_RANGE, " -89.9,89.9,0.1" , PROPERTY_USAGE_EDITOR), " set_skew_degrees" , " get_skew_degrees" );
446
483
ADD_PROPERTY (PropertyInfo (Variant::TRANSFORM2D, " transform" , PROPERTY_HINT_NONE, " " , 0 ), " set_transform" , " get_transform" );
447
484
448
485
ADD_PROPERTY (PropertyInfo (Variant::VECTOR2, " global_position" , PROPERTY_HINT_NONE, " " , 0 ), " set_global_position" , " get_global_position" );
@@ -460,6 +497,7 @@ Node2D::Node2D() {
460
497
461
498
angle = 0 ;
462
499
_scale = Vector2 (1 , 1 );
500
+ skew = 0 ;
463
501
_xform_dirty = false ;
464
502
z_index = 0 ;
465
503
z_relative = true ;
0 commit comments