summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-02-15 15:44:39 +0100
committerRémi Verschelde <rverschelde@gmail.com>2024-02-15 15:44:39 +0100
commit4859f8090f1e21d42bc81313f15367dcb1c4220c (patch)
tree119541854a214152e74504606c136c85f70af313
parent83215bd58abf23c98d8c5e482fce482509b027a8 (diff)
parent0e344f0d0bec80f26295ac7bd1a093b32bd904a2 (diff)
downloadredot-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.cpp2
-rw-r--r--scene/3d/path_3d.cpp12
-rw-r--r--scene/3d/path_3d.h10
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;