diff --git a/doc/classes/EditorSettings.xml b/doc/classes/EditorSettings.xml index 20ee65403c2..93a7b09fce1 100644 --- a/doc/classes/EditorSettings.xml +++ b/doc/classes/EditorSettings.xml @@ -384,6 +384,9 @@ The color to use for the selection box that surrounds selected nodes in the 3D editor viewport. The color's alpha channel influences the selection box's opacity. + + The color to use for the AABB gizmo that displays the [GeometryInstance3D]'s custom [AABB]. + The color override to use for 3D editor gizmos if the [Node3D] in question is part of an instantiated scene file (from the perspective of the current scene). diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index 452715a577e..ca6be130f9d 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -690,6 +690,7 @@ void EditorSettings::_load_defaults(Ref p_extra_config) { EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/instantiated", Color(0.7, 0.7, 0.7, 0.6), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED) EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/joint", Color(0.5, 0.8, 1), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED) EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/shape", Color(0.5, 0.7, 1), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED) + EDITOR_SETTING_USAGE(Variant::COLOR, PROPERTY_HINT_NONE, "editors/3d_gizmos/gizmo_colors/aabb", Color(0.28, 0.8, 0.82), "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED) // If a line is a multiple of this, it uses the primary grid color. // Use a power of 2 value by default as it's more common to use powers of 2 in level design. diff --git a/editor/plugins/gizmos/geometry_instance_3d_gizmo_plugin.cpp b/editor/plugins/gizmos/geometry_instance_3d_gizmo_plugin.cpp new file mode 100644 index 00000000000..16be707d08f --- /dev/null +++ b/editor/plugins/gizmos/geometry_instance_3d_gizmo_plugin.cpp @@ -0,0 +1,79 @@ +/**************************************************************************/ +/* geometry_instance_3d_gizmo_plugin.cpp */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#include "geometry_instance_3d_gizmo_plugin.h" + +#include "editor/editor_node.h" +#include "editor/editor_settings.h" +#include "editor/plugins/node_3d_editor_plugin.h" +#include "scene/3d/visual_instance_3d.h" + +GeometryInstance3DGizmoPlugin::GeometryInstance3DGizmoPlugin() { +} + +bool GeometryInstance3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { + return Object::cast_to(p_spatial) != nullptr; +} + +String GeometryInstance3DGizmoPlugin::get_gizmo_name() const { + return "MeshInstance3DCustomAABB"; +} + +int GeometryInstance3DGizmoPlugin::get_priority() const { + return -1; +} + +void GeometryInstance3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { + GeometryInstance3D *geometry = Object::cast_to(p_gizmo->get_node_3d()); + + p_gizmo->clear(); + + if (p_gizmo->is_selected()) { + AABB aabb = geometry->get_custom_aabb(); + + Vector lines; + for (int i = 0; i < 12; i++) { + Vector3 a; + Vector3 b; + aabb.get_edge(i, a, b); + + lines.push_back(a); + lines.push_back(b); + } + + Ref mat = memnew(StandardMaterial3D); + mat->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED); + mat->set_flag(StandardMaterial3D::FLAG_DISABLE_FOG, true); + const Color selection_box_color = EDITOR_GET("editors/3d_gizmos/gizmo_colors/aabb"); + mat->set_albedo(selection_box_color); + mat->set_transparency(StandardMaterial3D::TRANSPARENCY_ALPHA); + p_gizmo->add_lines(lines, mat); + } +} diff --git a/editor/plugins/gizmos/geometry_instance_3d_gizmo_plugin.h b/editor/plugins/gizmos/geometry_instance_3d_gizmo_plugin.h new file mode 100644 index 00000000000..2482e277ea2 --- /dev/null +++ b/editor/plugins/gizmos/geometry_instance_3d_gizmo_plugin.h @@ -0,0 +1,49 @@ +/**************************************************************************/ +/* geometry_instance_3d_gizmo_plugin.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#ifndef GEOMETRY_INSTANCE_3D_GIZMO_PLUGIN_H +#define GEOMETRY_INSTANCE_3D_GIZMO_PLUGIN_H + +#include "editor/plugins/node_3d_editor_gizmos.h" + +class GeometryInstance3DGizmoPlugin : public EditorNode3DGizmoPlugin { + GDCLASS(GeometryInstance3DGizmoPlugin, EditorNode3DGizmoPlugin); + +public: + virtual bool has_gizmo(Node3D *p_spatial) override; + virtual String get_gizmo_name() const override; + virtual int get_priority() const override; + + virtual void redraw(EditorNode3DGizmo *p_gizmo) override; + + GeometryInstance3DGizmoPlugin(); +}; + +#endif // GEOMETRY_INSTANCE_3D_GIZMO_PLUGIN_H diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index aea3ea97005..be141321851 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -53,6 +53,7 @@ #include "editor/plugins/gizmos/cpu_particles_3d_gizmo_plugin.h" #include "editor/plugins/gizmos/decal_gizmo_plugin.h" #include "editor/plugins/gizmos/fog_volume_gizmo_plugin.h" +#include "editor/plugins/gizmos/geometry_instance_3d_gizmo_plugin.h" #include "editor/plugins/gizmos/gpu_particles_3d_gizmo_plugin.h" #include "editor/plugins/gizmos/gpu_particles_collision_3d_gizmo_plugin.h" #include "editor/plugins/gizmos/joint_3d_gizmo_plugin.h" @@ -8096,6 +8097,7 @@ void Node3DEditor::_register_all_gizmos() { add_gizmo_plugin(Ref(memnew(SoftBody3DGizmoPlugin))); add_gizmo_plugin(Ref(memnew(SpriteBase3DGizmoPlugin))); add_gizmo_plugin(Ref(memnew(Label3DGizmoPlugin))); + add_gizmo_plugin(Ref(memnew(GeometryInstance3DGizmoPlugin))); add_gizmo_plugin(Ref(memnew(Marker3DGizmoPlugin))); add_gizmo_plugin(Ref(memnew(RayCast3DGizmoPlugin))); add_gizmo_plugin(Ref(memnew(ShapeCast3DGizmoPlugin))); diff --git a/scene/3d/visual_instance_3d.cpp b/scene/3d/visual_instance_3d.cpp index 503c39ae3e9..89f7ab23918 100644 --- a/scene/3d/visual_instance_3d.cpp +++ b/scene/3d/visual_instance_3d.cpp @@ -377,6 +377,7 @@ void GeometryInstance3D::set_custom_aabb(AABB p_aabb) { } custom_aabb = p_aabb; RS::get_singleton()->instance_set_custom_aabb(get_instance(), custom_aabb); + update_gizmos(); } AABB GeometryInstance3D::get_custom_aabb() const {