mirror of
https://github.com/godotengine/godot.git
synced 2024-11-10 14:12:51 +00:00
Merge pull request #89538 from CrayolaEater/feature/custom-aabb-gizmos
Add Gizmo to display 3D custom AABB
This commit is contained in:
commit
1bd6fe81ea
@ -384,6 +384,9 @@
|
||||
<member name="editors/3d/selection_box_color" type="Color" setter="" getter="">
|
||||
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.
|
||||
</member>
|
||||
<member name="editors/3d_gizmos/gizmo_colors/aabb" type="Color" setter="" getter="">
|
||||
The color to use for the AABB gizmo that displays the [GeometryInstance3D]'s custom [AABB].
|
||||
</member>
|
||||
<member name="editors/3d_gizmos/gizmo_colors/instantiated" type="Color" setter="" getter="">
|
||||
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).
|
||||
</member>
|
||||
|
@ -690,6 +690,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> 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.
|
||||
|
79
editor/plugins/gizmos/geometry_instance_3d_gizmo_plugin.cpp
Normal file
79
editor/plugins/gizmos/geometry_instance_3d_gizmo_plugin.cpp
Normal file
@ -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<GeometryInstance3D>(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<GeometryInstance3D>(p_gizmo->get_node_3d());
|
||||
|
||||
p_gizmo->clear();
|
||||
|
||||
if (p_gizmo->is_selected()) {
|
||||
AABB aabb = geometry->get_custom_aabb();
|
||||
|
||||
Vector<Vector3> 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<StandardMaterial3D> 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);
|
||||
}
|
||||
}
|
49
editor/plugins/gizmos/geometry_instance_3d_gizmo_plugin.h
Normal file
49
editor/plugins/gizmos/geometry_instance_3d_gizmo_plugin.h
Normal file
@ -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
|
@ -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<SoftBody3DGizmoPlugin>(memnew(SoftBody3DGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<SpriteBase3DGizmoPlugin>(memnew(SpriteBase3DGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<Label3DGizmoPlugin>(memnew(Label3DGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<GeometryInstance3DGizmoPlugin>(memnew(GeometryInstance3DGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<Marker3DGizmoPlugin>(memnew(Marker3DGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<RayCast3DGizmoPlugin>(memnew(RayCast3DGizmoPlugin)));
|
||||
add_gizmo_plugin(Ref<ShapeCast3DGizmoPlugin>(memnew(ShapeCast3DGizmoPlugin)));
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user