diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2024-02-15 15:44:39 +0100 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2024-02-15 15:44:39 +0100 |
commit | 4859f8090f1e21d42bc81313f15367dcb1c4220c (patch) | |
tree | 119541854a214152e74504606c136c85f70af313 | |
parent | 83215bd58abf23c98d8c5e482fce482509b027a8 (diff) | |
parent | 0e344f0d0bec80f26295ac7bd1a093b32bd904a2 (diff) | |
download | redot-engine-4859f8090f1e21d42bc81313f15367dcb1c4220c.tar.gz |
Merge pull request #85455 from xiongyaohua/fix_CSGPolygon_not_following_Path3D
Notify CSGPolygon about transform changes in Path3D
-rw-r--r-- | modules/csg/csg_shape.cpp | 2 | ||||
-rw-r--r-- | scene/3d/path_3d.cpp | 12 | ||||
-rw-r--r-- | scene/3d/path_3d.h | 10 |
3 files changed, 18 insertions, 6 deletions
diff --git a/modules/csg/csg_shape.cpp b/modules/csg/csg_shape.cpp index 604ad5e1e4..7c93fbf081 100644 --- a/modules/csg/csg_shape.cpp +++ b/modules/csg/csg_shape.cpp @@ -1826,11 +1826,13 @@ CSGBrush *CSGPolygon3D::_build_brush() { if (path) { path->disconnect("tree_exited", callable_mp(this, &CSGPolygon3D::_path_exited)); path->disconnect("curve_changed", callable_mp(this, &CSGPolygon3D::_path_changed)); + path->set_update_callback(Callable()); } path = current_path; if (path) { path->connect("tree_exited", callable_mp(this, &CSGPolygon3D::_path_exited)); path->connect("curve_changed", callable_mp(this, &CSGPolygon3D::_path_changed)); + path->set_update_callback(callable_mp(this, &CSGPolygon3D::_path_changed)); } } diff --git a/scene/3d/path_3d.cpp b/scene/3d/path_3d.cpp index 76bd8c5413..12e0123242 100644 --- a/scene/3d/path_3d.cpp +++ b/scene/3d/path_3d.cpp @@ -50,6 +50,10 @@ Path3D::~Path3D() { } } +void Path3D::set_update_callback(Callable p_callback) { + update_callback = p_callback; +} + void Path3D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { @@ -67,8 +71,12 @@ void Path3D::_notification(int p_what) { } break; case NOTIFICATION_TRANSFORM_CHANGED: { - if (is_inside_tree() && debug_instance.is_valid()) { - RS::get_singleton()->instance_set_transform(debug_instance, get_global_transform()); + if (is_inside_tree()) { + if (debug_instance.is_valid()) { + RS::get_singleton()->instance_set_transform(debug_instance, get_global_transform()); + } + + update_callback.call(); } } break; } diff --git a/scene/3d/path_3d.h b/scene/3d/path_3d.h index 076af95ebc..82fbf60bb6 100644 --- a/scene/3d/path_3d.h +++ b/scene/3d/path_3d.h @@ -37,15 +37,15 @@ class Path3D : public Node3D { GDCLASS(Path3D, Node3D); +private: Ref<Curve3D> curve; - - void _curve_changed(); - RID debug_instance; Ref<ArrayMesh> debug_mesh; -private: + Callable update_callback; // Used only by CSG currently. + void _update_debug_mesh(); + void _curve_changed(); protected: void _notification(int p_what); @@ -53,6 +53,8 @@ protected: static void _bind_methods(); public: + void set_update_callback(Callable p_callback); + void set_curve(const Ref<Curve3D> &p_curve); Ref<Curve3D> get_curve() const; |