Make more base nodes thread safe

Ongoing work to make more of the base nodes thread safe.
This commit is contained in:
Juan Linietsky
2023-05-12 13:53:15 +02:00
parent fd4a06c515
commit 0a9f72d5a8
17 changed files with 965 additions and 133 deletions
+49 -12
View File
@@ -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
View File
@@ -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();