diff --git a/modules/csg/csg_shape.cpp b/modules/csg/csg_shape.cpp index dd0b95c657..47abc6c171 100644 --- a/modules/csg/csg_shape.cpp +++ b/modules/csg/csg_shape.cpp @@ -915,6 +915,13 @@ PackedStringArray CSGShape3D::get_configuration_warnings() const { return warnings; } +Ref CSGShape3D::generate_triangle_mesh() const { + if (root_mesh.is_valid()) { + return root_mesh->generate_triangle_mesh(); + } + return Ref(); +} + void CSGShape3D::_bind_methods() { ClassDB::bind_method(D_METHOD("_update_shape"), &CSGShape3D::_update_shape); ClassDB::bind_method(D_METHOD("is_root_shape"), &CSGShape3D::is_root_shape); diff --git a/modules/csg/csg_shape.h b/modules/csg/csg_shape.h index e71baae856..d748f0bb5d 100644 --- a/modules/csg/csg_shape.h +++ b/modules/csg/csg_shape.h @@ -169,6 +169,8 @@ public: Ref bake_static_mesh(); Ref bake_collision_shape(); + virtual Ref generate_triangle_mesh() const override; + CSGShape3D(); ~CSGShape3D(); }; diff --git a/scene/3d/label_3d.h b/scene/3d/label_3d.h index 332eaac18d..01281f2976 100644 --- a/scene/3d/label_3d.h +++ b/scene/3d/label_3d.h @@ -253,7 +253,7 @@ public: StandardMaterial3D::TextureFilter get_texture_filter() const; virtual AABB get_aabb() const override; - Ref generate_triangle_mesh() const; + virtual Ref generate_triangle_mesh() const override; Label3D(); ~Label3D(); diff --git a/scene/3d/mesh_instance_3d.cpp b/scene/3d/mesh_instance_3d.cpp index e6a1d39141..8126558505 100644 --- a/scene/3d/mesh_instance_3d.cpp +++ b/scene/3d/mesh_instance_3d.cpp @@ -835,6 +835,13 @@ Ref MeshInstance3D::bake_mesh_from_current_skeleton_pose(Ref MeshInstance3D::generate_triangle_mesh() const { + if (mesh.is_valid()) { + return mesh->generate_triangle_mesh(); + } + return Ref(); +} + void MeshInstance3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_mesh", "mesh"), &MeshInstance3D::set_mesh); ClassDB::bind_method(D_METHOD("get_mesh"), &MeshInstance3D::get_mesh); diff --git a/scene/3d/mesh_instance_3d.h b/scene/3d/mesh_instance_3d.h index 0eff12762d..aa7d256a35 100644 --- a/scene/3d/mesh_instance_3d.h +++ b/scene/3d/mesh_instance_3d.h @@ -104,6 +104,8 @@ public: Ref bake_mesh_from_current_blend_shape_mix(Ref p_existing = Ref()); Ref bake_mesh_from_current_skeleton_pose(Ref p_existing = Ref()); + virtual Ref generate_triangle_mesh() const override; + MeshInstance3D(); ~MeshInstance3D(); }; diff --git a/scene/3d/sprite_3d.h b/scene/3d/sprite_3d.h index bdc771444c..87327caca2 100644 --- a/scene/3d/sprite_3d.h +++ b/scene/3d/sprite_3d.h @@ -172,7 +172,7 @@ public: virtual AABB get_aabb() const override; - Ref generate_triangle_mesh() const; + virtual Ref generate_triangle_mesh() const override; SpriteBase3D(); ~SpriteBase3D(); diff --git a/scene/3d/visual_instance_3d.cpp b/scene/3d/visual_instance_3d.cpp index 2c7a004dd0..257cc28772 100644 --- a/scene/3d/visual_instance_3d.cpp +++ b/scene/3d/visual_instance_3d.cpp @@ -530,6 +530,10 @@ bool GeometryInstance3D::is_ignoring_occlusion_culling() { return ignore_occlusion_culling; } +Ref GeometryInstance3D::generate_triangle_mesh() const { + return Ref(); +} + PackedStringArray GeometryInstance3D::get_configuration_warnings() const { PackedStringArray warnings = VisualInstance3D::get_configuration_warnings(); diff --git a/scene/3d/visual_instance_3d.h b/scene/3d/visual_instance_3d.h index 073fa74573..7091a8f14d 100644 --- a/scene/3d/visual_instance_3d.h +++ b/scene/3d/visual_instance_3d.h @@ -202,6 +202,8 @@ public: void set_ignore_occlusion_culling(bool p_enabled); bool is_ignoring_occlusion_culling(); + virtual Ref generate_triangle_mesh() const; + PackedStringArray get_configuration_warnings() const override; GeometryInstance3D(); virtual ~GeometryInstance3D(); diff --git a/scene/debugger/scene_debugger.cpp b/scene/debugger/scene_debugger.cpp index 1bac94b4fa..56326597e3 100644 --- a/scene/debugger/scene_debugger.cpp +++ b/scene/debugger/scene_debugger.cpp @@ -39,11 +39,9 @@ #include "scene/2d/physics/collision_polygon_2d.h" #include "scene/2d/physics/collision_shape_2d.h" #ifndef _3D_DISABLED -#include "scene/3d/label_3d.h" -#include "scene/3d/mesh_instance_3d.h" #include "scene/3d/physics/collision_object_3d.h" #include "scene/3d/physics/collision_shape_3d.h" -#include "scene/3d/sprite_3d.h" +#include "scene/3d/visual_instance_3d.h" #include "scene/resources/surface_tool.h" #endif // _3D_DISABLED #include "scene/gui/popup_menu.h" @@ -1896,7 +1894,7 @@ void RuntimeNodeSelect::_find_3d_items_at_pos(const Point2 &p_pos, Vector items = RS::get_singleton()->instances_cull_ray(pos, to, root->get_world_3d()->get_scenario()); for (int i = 0; i < items.size(); i++) { Object *obj = ObjectDB::get_instance(items[i]); - GeometryInstance3D *geo_instance = nullptr; - Ref mesh_collision; - MeshInstance3D *mesh_instance = Object::cast_to(obj); - if (mesh_instance) { - if (mesh_instance->get_mesh().is_valid()) { - geo_instance = mesh_instance; - mesh_collision = mesh_instance->get_mesh()->generate_triangle_mesh(); - } - } else { - Label3D *label = Object::cast_to(obj); - if (label) { - geo_instance = label; - mesh_collision = label->generate_triangle_mesh(); - } else { - Sprite3D *sprite = Object::cast_to(obj); - if (sprite) { - geo_instance = sprite; - mesh_collision = sprite->generate_triangle_mesh(); + GeometryInstance3D *geo_instance = Object::cast_to(obj); + if (geo_instance) { + Ref mesh_collision = geo_instance->generate_triangle_mesh(); + + if (mesh_collision.is_valid()) { + Transform3D gt = geo_instance->get_global_transform(); + Transform3D ai = gt.affine_inverse(); + Vector3 point, normal; + if (mesh_collision->intersect_ray(ai.xform(pos), ai.basis.xform(ray).normalized(), point, normal)) { + SelectResult res; + res.item = Object::cast_to(obj); + res.order = -pos.distance_to(gt.xform(point)); + r_items.push_back(res); + + continue; } } } - if (mesh_collision.is_valid()) { - Transform3D gt = geo_instance->get_global_transform(); - Transform3D ai = gt.affine_inverse(); - Vector3 point, normal; - if (mesh_collision->intersect_ray(ai.xform(pos), ai.basis.xform(ray).normalized(), point, normal)) { - SelectResult res; - res.item = Object::cast_to(obj); - res.order = -pos.distance_to(gt.xform(point)); - r_items.push_back(res); - - continue; - } - } - items.remove_at(i); i--; }