Make more base nodes thread safe
Ongoing work to make more of the base nodes thread safe.
This commit is contained in:
+49
-12
@@ -113,11 +113,11 @@ void Node2D::_edit_set_rect(const Rect2 &p_edit_rect) {
|
||||
#endif
|
||||
|
||||
void Node2D::_update_xform_values() {
|
||||
position = transform.columns[2];
|
||||
rotation = transform.get_rotation();
|
||||
scale = transform.get_scale();
|
||||
skew = transform.get_skew();
|
||||
_xform_dirty = false;
|
||||
position = transform.columns[2];
|
||||
scale = transform.get_scale();
|
||||
xform_dirty.clear();
|
||||
}
|
||||
|
||||
void Node2D::_update_transform() {
|
||||
@@ -134,6 +134,7 @@ void Node2D::_update_transform() {
|
||||
}
|
||||
|
||||
void Node2D::reparent(Node *p_parent, bool p_keep_global_transform) {
|
||||
ERR_THREAD_GUARD;
|
||||
Transform2D temp = get_global_transform();
|
||||
Node::reparent(p_parent);
|
||||
if (p_keep_global_transform) {
|
||||
@@ -142,7 +143,8 @@ void Node2D::reparent(Node *p_parent, bool p_keep_global_transform) {
|
||||
}
|
||||
|
||||
void Node2D::set_position(const Point2 &p_pos) {
|
||||
if (_xform_dirty) {
|
||||
ERR_THREAD_GUARD;
|
||||
if (xform_dirty.is_set()) {
|
||||
const_cast<Node2D *>(this)->_update_xform_values();
|
||||
}
|
||||
position = p_pos;
|
||||
@@ -150,7 +152,8 @@ void Node2D::set_position(const Point2 &p_pos) {
|
||||
}
|
||||
|
||||
void Node2D::set_rotation(real_t p_radians) {
|
||||
if (_xform_dirty) {
|
||||
ERR_THREAD_GUARD;
|
||||
if (xform_dirty.is_set()) {
|
||||
const_cast<Node2D *>(this)->_update_xform_values();
|
||||
}
|
||||
rotation = p_radians;
|
||||
@@ -158,11 +161,13 @@ void Node2D::set_rotation(real_t p_radians) {
|
||||
}
|
||||
|
||||
void Node2D::set_rotation_degrees(real_t p_degrees) {
|
||||
ERR_THREAD_GUARD;
|
||||
set_rotation(Math::deg_to_rad(p_degrees));
|
||||
}
|
||||
|
||||
void Node2D::set_skew(real_t p_radians) {
|
||||
if (_xform_dirty) {
|
||||
ERR_THREAD_GUARD;
|
||||
if (xform_dirty.is_set()) {
|
||||
const_cast<Node2D *>(this)->_update_xform_values();
|
||||
}
|
||||
skew = p_radians;
|
||||
@@ -170,7 +175,8 @@ void Node2D::set_skew(real_t p_radians) {
|
||||
}
|
||||
|
||||
void Node2D::set_scale(const Size2 &p_scale) {
|
||||
if (_xform_dirty) {
|
||||
ERR_THREAD_GUARD;
|
||||
if (xform_dirty.is_set()) {
|
||||
const_cast<Node2D *>(this)->_update_xform_values();
|
||||
}
|
||||
scale = p_scale;
|
||||
@@ -185,14 +191,17 @@ void Node2D::set_scale(const Size2 &p_scale) {
|
||||
}
|
||||
|
||||
Point2 Node2D::get_position() const {
|
||||
if (_xform_dirty) {
|
||||
ERR_READ_THREAD_GUARD_V(Point2());
|
||||
if (xform_dirty.is_set()) {
|
||||
const_cast<Node2D *>(this)->_update_xform_values();
|
||||
}
|
||||
|
||||
return position;
|
||||
}
|
||||
|
||||
real_t Node2D::get_rotation() const {
|
||||
if (_xform_dirty) {
|
||||
ERR_READ_THREAD_GUARD_V(0);
|
||||
if (xform_dirty.is_set()) {
|
||||
const_cast<Node2D *>(this)->_update_xform_values();
|
||||
}
|
||||
|
||||
@@ -200,11 +209,13 @@ real_t Node2D::get_rotation() const {
|
||||
}
|
||||
|
||||
real_t Node2D::get_rotation_degrees() const {
|
||||
ERR_READ_THREAD_GUARD_V(0);
|
||||
return Math::rad_to_deg(get_rotation());
|
||||
}
|
||||
|
||||
real_t Node2D::get_skew() const {
|
||||
if (_xform_dirty) {
|
||||
ERR_READ_THREAD_GUARD_V(0);
|
||||
if (xform_dirty.is_set()) {
|
||||
const_cast<Node2D *>(this)->_update_xform_values();
|
||||
}
|
||||
|
||||
@@ -212,7 +223,8 @@ real_t Node2D::get_skew() const {
|
||||
}
|
||||
|
||||
Size2 Node2D::get_scale() const {
|
||||
if (_xform_dirty) {
|
||||
ERR_READ_THREAD_GUARD_V(Size2());
|
||||
if (xform_dirty.is_set()) {
|
||||
const_cast<Node2D *>(this)->_update_xform_values();
|
||||
}
|
||||
|
||||
@@ -220,26 +232,32 @@ Size2 Node2D::get_scale() const {
|
||||
}
|
||||
|
||||
Transform2D Node2D::get_transform() const {
|
||||
ERR_READ_THREAD_GUARD_V(Transform2D());
|
||||
return transform;
|
||||
}
|
||||
|
||||
void Node2D::rotate(real_t p_radians) {
|
||||
ERR_THREAD_GUARD;
|
||||
set_rotation(get_rotation() + p_radians);
|
||||
}
|
||||
|
||||
void Node2D::translate(const Vector2 &p_amount) {
|
||||
ERR_THREAD_GUARD;
|
||||
set_position(get_position() + p_amount);
|
||||
}
|
||||
|
||||
void Node2D::global_translate(const Vector2 &p_amount) {
|
||||
ERR_THREAD_GUARD;
|
||||
set_global_position(get_global_position() + p_amount);
|
||||
}
|
||||
|
||||
void Node2D::apply_scale(const Size2 &p_amount) {
|
||||
ERR_THREAD_GUARD;
|
||||
set_scale(get_scale() * p_amount);
|
||||
}
|
||||
|
||||
void Node2D::move_x(real_t p_delta, bool p_scaled) {
|
||||
ERR_THREAD_GUARD;
|
||||
Transform2D t = get_transform();
|
||||
Vector2 m = t[0];
|
||||
if (!p_scaled) {
|
||||
@@ -249,6 +267,7 @@ void Node2D::move_x(real_t p_delta, bool p_scaled) {
|
||||
}
|
||||
|
||||
void Node2D::move_y(real_t p_delta, bool p_scaled) {
|
||||
ERR_THREAD_GUARD;
|
||||
Transform2D t = get_transform();
|
||||
Vector2 m = t[1];
|
||||
if (!p_scaled) {
|
||||
@@ -258,10 +277,12 @@ void Node2D::move_y(real_t p_delta, bool p_scaled) {
|
||||
}
|
||||
|
||||
Point2 Node2D::get_global_position() const {
|
||||
ERR_READ_THREAD_GUARD_V(Point2());
|
||||
return get_global_transform().get_origin();
|
||||
}
|
||||
|
||||
void Node2D::set_global_position(const Point2 &p_pos) {
|
||||
ERR_THREAD_GUARD;
|
||||
CanvasItem *parent = get_parent_item();
|
||||
if (parent) {
|
||||
Transform2D inv = parent->get_global_transform().affine_inverse();
|
||||
@@ -272,18 +293,22 @@ void Node2D::set_global_position(const Point2 &p_pos) {
|
||||
}
|
||||
|
||||
real_t Node2D::get_global_rotation() const {
|
||||
ERR_READ_THREAD_GUARD_V(0);
|
||||
return get_global_transform().get_rotation();
|
||||
}
|
||||
|
||||
real_t Node2D::get_global_rotation_degrees() const {
|
||||
ERR_READ_THREAD_GUARD_V(0);
|
||||
return Math::rad_to_deg(get_global_rotation());
|
||||
}
|
||||
|
||||
real_t Node2D::get_global_skew() const {
|
||||
ERR_READ_THREAD_GUARD_V(0);
|
||||
return get_global_transform().get_skew();
|
||||
}
|
||||
|
||||
void Node2D::set_global_rotation(const real_t p_radians) {
|
||||
ERR_THREAD_GUARD;
|
||||
CanvasItem *parent = get_parent_item();
|
||||
if (parent) {
|
||||
Transform2D parent_global_transform = parent->get_global_transform();
|
||||
@@ -297,10 +322,12 @@ void Node2D::set_global_rotation(const real_t p_radians) {
|
||||
}
|
||||
|
||||
void Node2D::set_global_rotation_degrees(const real_t p_degrees) {
|
||||
ERR_THREAD_GUARD;
|
||||
set_global_rotation(Math::deg_to_rad(p_degrees));
|
||||
}
|
||||
|
||||
void Node2D::set_global_skew(const real_t p_radians) {
|
||||
ERR_THREAD_GUARD;
|
||||
CanvasItem *parent = get_parent_item();
|
||||
if (parent) {
|
||||
Transform2D parent_global_transform = parent->get_global_transform();
|
||||
@@ -314,10 +341,12 @@ void Node2D::set_global_skew(const real_t p_radians) {
|
||||
}
|
||||
|
||||
Size2 Node2D::get_global_scale() const {
|
||||
ERR_READ_THREAD_GUARD_V(Size2());
|
||||
return get_global_transform().get_scale();
|
||||
}
|
||||
|
||||
void Node2D::set_global_scale(const Size2 &p_scale) {
|
||||
ERR_THREAD_GUARD;
|
||||
CanvasItem *parent = get_parent_item();
|
||||
if (parent) {
|
||||
Transform2D parent_global_transform = parent->get_global_transform();
|
||||
@@ -331,8 +360,9 @@ void Node2D::set_global_scale(const Size2 &p_scale) {
|
||||
}
|
||||
|
||||
void Node2D::set_transform(const Transform2D &p_transform) {
|
||||
ERR_THREAD_GUARD;
|
||||
transform = p_transform;
|
||||
_xform_dirty = true;
|
||||
xform_dirty.set();
|
||||
|
||||
RenderingServer::get_singleton()->canvas_item_set_transform(get_canvas_item(), transform);
|
||||
|
||||
@@ -344,6 +374,7 @@ void Node2D::set_transform(const Transform2D &p_transform) {
|
||||
}
|
||||
|
||||
void Node2D::set_global_transform(const Transform2D &p_transform) {
|
||||
ERR_THREAD_GUARD;
|
||||
CanvasItem *parent = get_parent_item();
|
||||
if (parent) {
|
||||
set_transform(parent->get_global_transform().affine_inverse() * p_transform);
|
||||
@@ -353,6 +384,7 @@ void Node2D::set_global_transform(const Transform2D &p_transform) {
|
||||
}
|
||||
|
||||
Transform2D Node2D::get_relative_transform_to_parent(const Node *p_parent) const {
|
||||
ERR_READ_THREAD_GUARD_V(Transform2D());
|
||||
if (p_parent == this) {
|
||||
return Transform2D();
|
||||
}
|
||||
@@ -368,22 +400,27 @@ Transform2D Node2D::get_relative_transform_to_parent(const Node *p_parent) const
|
||||
}
|
||||
|
||||
void Node2D::look_at(const Vector2 &p_pos) {
|
||||
ERR_THREAD_GUARD;
|
||||
rotate(get_angle_to(p_pos));
|
||||
}
|
||||
|
||||
real_t Node2D::get_angle_to(const Vector2 &p_pos) const {
|
||||
ERR_READ_THREAD_GUARD_V(0);
|
||||
return (to_local(p_pos) * get_scale()).angle();
|
||||
}
|
||||
|
||||
Point2 Node2D::to_local(Point2 p_global) const {
|
||||
ERR_READ_THREAD_GUARD_V(Point2());
|
||||
return get_global_transform().affine_inverse().xform(p_global);
|
||||
}
|
||||
|
||||
Point2 Node2D::to_global(Point2 p_local) const {
|
||||
ERR_READ_THREAD_GUARD_V(Point2());
|
||||
return get_global_transform().xform(p_local);
|
||||
}
|
||||
|
||||
void Node2D::_notification(int p_notification) {
|
||||
ERR_THREAD_GUARD;
|
||||
switch (p_notification) {
|
||||
case NOTIFICATION_ENTER_TREE: {
|
||||
if (get_viewport()) {
|
||||
|
||||
+1
-2
@@ -36,6 +36,7 @@
|
||||
class Node2D : public CanvasItem {
|
||||
GDCLASS(Node2D, CanvasItem);
|
||||
|
||||
SafeFlag xform_dirty;
|
||||
Point2 position;
|
||||
real_t rotation = 0.0;
|
||||
Size2 scale = Vector2(1, 1);
|
||||
@@ -43,8 +44,6 @@ class Node2D : public CanvasItem {
|
||||
|
||||
Transform2D transform;
|
||||
|
||||
bool _xform_dirty = false;
|
||||
|
||||
void _update_transform();
|
||||
|
||||
void _update_xform_values();
|
||||
|
||||
Reference in New Issue
Block a user