Added an editor gizmo plugin for TiledWalls so they can be selected in the spatial editor directly.

This commit is contained in:
Relintai 2025-04-13 21:07:01 +02:00
parent d2ba6585c4
commit b2f33108fa
2 changed files with 118 additions and 3 deletions

View File

@ -41,6 +41,8 @@
#include "scene/gui/box_container.h"
#include "scene/gui/separator.h"
#include "../tiled_wall/tiled_wall.h"
#include "../prop_instance.h"
#include "scene/resources/mesh/mesh.h"
@ -130,8 +132,11 @@ PropEditorPlugin::PropEditorPlugin(EditorNode *p_node) {
add_control_to_container(EditorPlugin::CONTAINER_SPATIAL_EDITOR_MENU, bc);
gizmo_plugin.instance();
add_spatial_gizmo_plugin(gizmo_plugin);
prop_instance_gizmo_plugin.instance();
add_spatial_gizmo_plugin(prop_instance_gizmo_plugin);
tiled_wall_gizmo_plugin.instance();
add_spatial_gizmo_plugin(tiled_wall_gizmo_plugin);
}
PropEditorPlugin::~PropEditorPlugin() {
@ -240,3 +245,98 @@ void PropInstanceSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
p_gizmo->add_mesh(cm, material);
}
////////
TiledWallSpatialGizmoPlugin::TiledWallSpatialGizmoPlugin() {
const Color gizmo_color = EDITOR_DEF("editors/props/gizmo_colors/tiled_wall_outline", Color(0.7, 0.5, 1));
create_material("tiled_wall_outline_material", gizmo_color);
}
bool TiledWallSpatialGizmoPlugin::has_gizmo(Spatial *p_spatial) {
return Object::cast_to<TiledWall>(p_spatial) != NULL;
}
String TiledWallSpatialGizmoPlugin::get_gizmo_name() const {
return "TiledWall";
}
int TiledWallSpatialGizmoPlugin::get_priority() const {
return -1;
}
bool TiledWallSpatialGizmoPlugin::can_be_hidden() const {
return true;
}
void TiledWallSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
TiledWall *tw = Object::cast_to<TiledWall>(p_gizmo->get_spatial_node());
p_gizmo->clear();
AABB aabb = tw->get_aabb();
if (aabb.has_no_surface()) {
return; //none
}
Ref<ArrayMesh> cm;
cm.instance();
//cm->set_size(aabb.size);
Array mesh_arr;
mesh_arr.resize(Mesh::ARRAY_MAX);
// set our bounding box
PoolVector<Vector3> points;
points.push_back(aabb.position);
points.push_back(aabb.position + Vector3(aabb.size.x, 0, 0));
points.push_back(aabb.position + Vector3(aabb.size.x, 0, 0));
points.push_back(aabb.position + Vector3(aabb.size.x, 0, aabb.size.z));
points.push_back(aabb.position);
points.push_back(aabb.position + Vector3(0, 0, aabb.size.z));
points.push_back(aabb.position + Vector3(0, 0, aabb.size.z));
points.push_back(aabb.position + Vector3(aabb.size.x, 0, aabb.size.z));
points.push_back(aabb.position);
points.push_back(aabb.position + Vector3(0, aabb.size.y, 0));
points.push_back(aabb.position + Vector3(aabb.size.x, 0, 0));
points.push_back(aabb.position + Vector3(aabb.size.x, aabb.size.y, 0));
points.push_back(aabb.position + Vector3(0, 0, aabb.size.z));
points.push_back(aabb.position + Vector3(0, aabb.size.y, aabb.size.z));
points.push_back(aabb.position + Vector3(aabb.size.x, 0, aabb.size.z));
points.push_back(aabb.position + aabb.size);
points.push_back(aabb.position + Vector3(0, aabb.size.y, 0));
points.push_back(aabb.position + Vector3(aabb.size.x, aabb.size.y, 0));
points.push_back(aabb.position + Vector3(0, aabb.size.y, 0));
points.push_back(aabb.position + Vector3(0, aabb.size.y, aabb.size.z));
points.push_back(aabb.position + Vector3(0, aabb.size.y, aabb.size.z));
points.push_back(aabb.position + aabb.size);
points.push_back(aabb.position + Vector3(aabb.size.x, aabb.size.y, 0));
points.push_back(aabb.position + aabb.size);
mesh_arr[RS::ARRAY_VERTEX] = points;
cm->add_surface_from_arrays(Mesh::PRIMITIVE_LINES, mesh_arr);
Ref<TriangleMesh> tm = cm->generate_triangle_mesh_from_aabb();
if (tm.is_valid()) {
p_gizmo->add_collision_triangles(tm);
}
const Ref<Material> material = get_material("tiled_wall_outline_material");
p_gizmo->add_mesh(cm, material);
}

View File

@ -38,6 +38,7 @@
#include "editor/spatial_editor_gizmos.h"
class PropInstanceSpatialGizmoPlugin;
class TiledWallSpatialGizmoPlugin;
class PropEditorPlugin : public EditorPlugin {
GDCLASS(PropEditorPlugin, EditorPlugin);
@ -67,7 +68,8 @@ protected:
EditorNode *editor;
Ref<PropInstanceSpatialGizmoPlugin> gizmo_plugin;
Ref<PropInstanceSpatialGizmoPlugin> prop_instance_gizmo_plugin;
Ref<TiledWallSpatialGizmoPlugin> tiled_wall_gizmo_plugin;
};
class PropInstanceSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
@ -83,4 +85,17 @@ public:
PropInstanceSpatialGizmoPlugin();
};
class TiledWallSpatialGizmoPlugin : public EditorSpatialGizmoPlugin {
GDCLASS(TiledWallSpatialGizmoPlugin, EditorSpatialGizmoPlugin);
public:
bool has_gizmo(Spatial *p_spatial);
String get_gizmo_name() const;
int get_priority() const;
bool can_be_hidden() const;
void redraw(EditorSpatialGizmo *p_gizmo);
TiledWallSpatialGizmoPlugin();
};
#endif