Merge pull request #20928 from JFonS/gizmo_enabling

Improvements on the gizmo disabling menu and icon selection bugfix
This commit is contained in:
Juan Linietsky 2018-08-11 19:20:08 -03:00 committed by GitHub
commit 64595f0f6a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 78 additions and 89 deletions

View File

@ -3849,10 +3849,6 @@ void SpatialEditor::select_gizmo_highlight_axis(int p_axis) {
} }
} }
int SpatialEditor::get_skeleton_visibility_state() const {
return view_menu->get_popup()->get_item_state(view_menu->get_popup()->get_item_index(MENU_VISIBILITY_SKELETON));
}
void SpatialEditor::update_transform_gizmo() { void SpatialEditor::update_transform_gizmo() {
List<Node *> &selection = editor_selection->get_selected_node_list(); List<Node *> &selection = editor_selection->get_selected_node_list();
@ -4008,9 +4004,9 @@ Dictionary SpatialEditor::get_state() const {
Dictionary gizmos_status; Dictionary gizmos_status;
for (int i = 0; i < gizmo_plugins.size(); i++) { for (int i = 0; i < gizmo_plugins.size(); i++) {
if (!gizmo_plugins[i]->can_be_hidden()) continue; if (!gizmo_plugins[i]->can_be_hidden()) continue;
bool checked = gizmos_menu->get_popup()->is_item_checked(gizmos_menu->get_popup()->get_item_index(i)); int state = gizmos_menu->get_item_state(gizmos_menu->get_item_index(i));
String name = gizmo_plugins[i]->get_name(); String name = gizmo_plugins[i]->get_name();
gizmos_status[name] = checked; gizmos_status[name] = state;
} }
d["gizmos_status"] = gizmos_status; d["gizmos_status"] = gizmos_status;
@ -4096,14 +4092,29 @@ void SpatialEditor::set_state(const Dictionary &p_state) {
for (int j = 0; j < gizmo_plugins.size(); ++j) { for (int j = 0; j < gizmo_plugins.size(); ++j) {
if (!gizmo_plugins[j]->can_be_hidden()) continue; if (!gizmo_plugins[j]->can_be_hidden()) continue;
bool checked = true; int state = EditorSpatialGizmoPlugin::ON_TOP;
for (uint32_t i = 0; i < keys.size(); i++) { for (uint32_t i = 0; i < keys.size(); i++) {
if (gizmo_plugins.write[j]->get_name() == keys[i]) { if (gizmo_plugins.write[j]->get_name() == keys[i]) {
checked = gizmos_status[keys[i]]; state = gizmos_status[keys[i]];
} }
} }
gizmos_menu->get_popup()->set_item_checked(gizmos_menu->get_popup()->get_item_index(j), checked);
gizmo_plugins.write[j]->set_hidden(!checked); const int idx = gizmos_menu->get_item_index(j);
gizmos_menu->set_item_multistate(idx, state);
gizmo_plugins.write[j]->set_state(state);
switch (state) {
case EditorSpatialGizmoPlugin::ON_TOP:
gizmos_menu->set_item_icon(idx, gizmos_menu->get_icon("visibility_visible"));
break;
case EditorSpatialGizmoPlugin::VISIBLE:
gizmos_menu->set_item_icon(idx, gizmos_menu->get_icon("visibility_xray"));
break;
case EditorSpatialGizmoPlugin::HIDDEN:
gizmos_menu->set_item_icon(idx, gizmos_menu->get_icon("visibility_hidden"));
break;
}
} }
} }
} }
@ -4200,12 +4211,27 @@ void SpatialEditor::_menu_item_toggled(bool pressed, int p_option) {
} }
void SpatialEditor::_menu_gizmo_toggled(int p_option) { void SpatialEditor::_menu_gizmo_toggled(int p_option) {
bool is_checked = gizmos_menu->get_popup()->is_item_checked(gizmos_menu->get_popup()->get_item_index(p_option));
is_checked = !is_checked; const int idx = gizmos_menu->get_item_index(p_option);
gizmo_plugins.write[p_option]->set_hidden(!is_checked); gizmos_menu->toggle_item_multistate(idx);
gizmos_menu->get_popup()->set_item_checked(gizmos_menu->get_popup()->get_item_index(p_option), is_checked); // Change icon
const int state = gizmos_menu->get_item_state(idx);
switch (state) {
case EditorSpatialGizmoPlugin::ON_TOP:
gizmos_menu->set_item_icon(idx, view_menu->get_popup()->get_icon("visibility_visible"));
break;
case EditorSpatialGizmoPlugin::VISIBLE:
gizmos_menu->set_item_icon(idx, view_menu->get_popup()->get_icon("visibility_xray"));
break;
case EditorSpatialGizmoPlugin::HIDDEN:
gizmos_menu->set_item_icon(idx, view_menu->get_popup()->get_icon("visibility_hidden"));
break;
}
gizmo_plugins.write[p_option]->set_state(state);
update_all_gizmos();
} }
void SpatialEditor::_menu_item_pressed(int p_option) { void SpatialEditor::_menu_item_pressed(int p_option) {
@ -4382,28 +4408,6 @@ void SpatialEditor::_menu_item_pressed(int p_option) {
_refresh_menu_icons(); _refresh_menu_icons();
} break; } break;
case MENU_VISIBILITY_SKELETON: {
const int idx = view_menu->get_popup()->get_item_index(MENU_VISIBILITY_SKELETON);
view_menu->get_popup()->toggle_item_multistate(idx);
// Change icon
const int state = view_menu->get_popup()->get_item_state(idx);
switch (state) {
case 0:
view_menu->get_popup()->set_item_icon(idx, view_menu->get_popup()->get_icon("visibility_hidden"));
break;
case 1:
view_menu->get_popup()->set_item_icon(idx, view_menu->get_popup()->get_icon("visibility_visible"));
break;
case 2:
view_menu->get_popup()->set_item_icon(idx, view_menu->get_popup()->get_icon("visibility_xray"));
break;
}
update_all_gizmos();
} break;
} }
} }
@ -4729,14 +4733,13 @@ struct _GizmoPluginComparator {
void SpatialEditor::_init_gizmos_menu() { void SpatialEditor::_init_gizmos_menu() {
_register_all_gizmos(); _register_all_gizmos();
PopupMenu *p = gizmos_menu->get_popup();
gizmo_plugins.sort_custom<_GizmoPluginComparator>(); gizmo_plugins.sort_custom<_GizmoPluginComparator>();
for (int i = 0; i < gizmo_plugins.size(); ++i) { for (int i = 0; i < gizmo_plugins.size(); ++i) {
if (!gizmo_plugins[i]->can_be_hidden()) continue; if (!gizmo_plugins[i]->can_be_hidden()) continue;
String plugin_name = gizmo_plugins[i]->get_name(); String plugin_name = gizmo_plugins[i]->get_name();
p->add_check_item(TTR(plugin_name), i); gizmos_menu->add_multistate_item(TTR(plugin_name), 3, EditorSpatialGizmoPlugin::ON_TOP, i);
gizmos_menu->set_item_icon(gizmos_menu->get_item_index(i), gizmos_menu->get_icon("visibility_visible"));
} }
} }
@ -5020,7 +5023,6 @@ void SpatialEditor::_notification(int p_what) {
view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), get_icon("Panels3", "EditorIcons")); view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS), get_icon("Panels3", "EditorIcons"));
view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), get_icon("Panels3Alt", "EditorIcons")); view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_3_VIEWPORTS_ALT), get_icon("Panels3Alt", "EditorIcons"));
view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), get_icon("Panels4", "EditorIcons")); view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VIEW_USE_4_VIEWPORTS), get_icon("Panels4", "EditorIcons"));
view_menu->get_popup()->set_item_icon(view_menu->get_popup()->get_item_index(MENU_VISIBILITY_SKELETON), view_menu->get_popup()->get_icon("visibility_visible"));
_menu_item_pressed(MENU_VIEW_USE_1_VIEWPORT); _menu_item_pressed(MENU_VIEW_USE_1_VIEWPORT);
@ -5397,24 +5399,22 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/4_viewports", TTR("4 Viewports"), KEY_MASK_CMD + KEY_4), MENU_VIEW_USE_4_VIEWPORTS); p->add_radio_check_shortcut(ED_SHORTCUT("spatial_editor/4_viewports", TTR("4 Viewports"), KEY_MASK_CMD + KEY_4), MENU_VIEW_USE_4_VIEWPORTS);
p->add_separator(); p->add_separator();
p->add_submenu_item(TTR("Gizmos"), "GizmosMenu");
p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_origin", TTR("View Origin")), MENU_VIEW_ORIGIN); p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_origin", TTR("View Origin")), MENU_VIEW_ORIGIN);
p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_grid", TTR("View Grid")), MENU_VIEW_GRID); p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_grid", TTR("View Grid")), MENU_VIEW_GRID);
p->add_separator(); p->add_separator();
p->add_shortcut(ED_SHORTCUT("spatial_editor/settings", TTR("Settings")), MENU_VIEW_CAMERA_SETTINGS); p->add_shortcut(ED_SHORTCUT("spatial_editor/settings", TTR("Settings")), MENU_VIEW_CAMERA_SETTINGS);
p->add_separator();
p->add_multistate_item(TTR("Skeleton Gizmo visibility"), 3, 1, MENU_VISIBILITY_SKELETON);
p->set_item_checked(p->get_item_index(MENU_VIEW_ORIGIN), true); p->set_item_checked(p->get_item_index(MENU_VIEW_ORIGIN), true);
p->set_item_checked(p->get_item_index(MENU_VIEW_GRID), true); p->set_item_checked(p->get_item_index(MENU_VIEW_GRID), true);
p->connect("id_pressed", this, "_menu_item_pressed"); p->connect("id_pressed", this, "_menu_item_pressed");
gizmos_menu = memnew(MenuButton); gizmos_menu = memnew(PopupMenu);
gizmos_menu->set_text(TTR("Gizmos")); p->add_child(gizmos_menu);
hbc_menu->add_child(gizmos_menu); gizmos_menu->set_name("GizmosMenu");
gizmos_menu->get_popup()->set_hide_on_checkable_item_selection(false); gizmos_menu->set_hide_on_checkable_item_selection(false);
gizmos_menu->get_popup()->connect("id_pressed", this, "_menu_gizmo_toggled"); gizmos_menu->connect("id_pressed", this, "_menu_gizmo_toggled");
/* REST OF MENU */ /* REST OF MENU */
@ -5662,6 +5662,7 @@ void EditorSpatialGizmoPlugin::create_material(const String &p_name, const Color
material->set_albedo(color); material->set_albedo(color);
material->set_flag(SpatialMaterial::FLAG_UNSHADED, true); material->set_flag(SpatialMaterial::FLAG_UNSHADED, true);
material->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true); material->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
material->set_render_priority(SpatialMaterial::RENDER_PRIORITY_MIN + 1);
if (p_use_vertex_color) { if (p_use_vertex_color) {
material->set_flag(SpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true); material->set_flag(SpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR, true);
@ -5709,6 +5710,7 @@ void EditorSpatialGizmoPlugin::create_icon_material(const String &p_name, const
icon->set_texture(SpatialMaterial::TEXTURE_ALBEDO, p_texture); icon->set_texture(SpatialMaterial::TEXTURE_ALBEDO, p_texture);
icon->set_flag(SpatialMaterial::FLAG_FIXED_SIZE, true); icon->set_flag(SpatialMaterial::FLAG_FIXED_SIZE, true);
icon->set_billboard_mode(SpatialMaterial::BILLBOARD_ENABLED); icon->set_billboard_mode(SpatialMaterial::BILLBOARD_ENABLED);
icon->set_render_priority(SpatialMaterial::RENDER_PRIORITY_MIN);
if (p_on_top && selected) { if (p_on_top && selected) {
icon->set_on_top_of_alpha(); icon->set_on_top_of_alpha();
@ -5755,7 +5757,16 @@ Ref<SpatialMaterial> EditorSpatialGizmoPlugin::get_material(const String &p_name
if (p_gizmo == NULL) return materials[p_name][0]; if (p_gizmo == NULL) return materials[p_name][0];
int index = (p_gizmo->is_selected() ? 1 : 0) + (p_gizmo->is_editable() ? 2 : 0); int index = (p_gizmo->is_selected() ? 1 : 0) + (p_gizmo->is_editable() ? 2 : 0);
return materials[p_name][index];
Ref<SpatialMaterial> mat = materials[p_name][index];
if (current_state == ON_TOP && p_gizmo->is_selected()) {
mat->set_flag(SpatialMaterial::FLAG_DISABLE_DEPTH_TEST, true);
} else {
mat->set_flag(SpatialMaterial::FLAG_DISABLE_DEPTH_TEST, false);
}
return mat;
} }
Ref<EditorSpatialGizmo> EditorSpatialGizmoPlugin::get_gizmo(Spatial *p_spatial) { Ref<EditorSpatialGizmo> EditorSpatialGizmoPlugin::get_gizmo(Spatial *p_spatial) {
@ -5766,7 +5777,7 @@ Ref<EditorSpatialGizmo> EditorSpatialGizmoPlugin::get_gizmo(Spatial *p_spatial)
ref->set_plugin(this); ref->set_plugin(this);
ref->set_spatial_node(p_spatial); ref->set_spatial_node(p_spatial);
ref->set_hidden(hidden); ref->set_hidden(current_state == HIDDEN);
current_gizmos.push_back(ref.ptr()); current_gizmos.push_back(ref.ptr());
return ref; return ref;
@ -5791,10 +5802,10 @@ bool EditorSpatialGizmoPlugin::is_selectable_when_hidden() const {
return false; return false;
} }
void EditorSpatialGizmoPlugin::set_hidden(bool p_hidden) { void EditorSpatialGizmoPlugin::set_state(int p_state) {
hidden = p_hidden; current_state = p_state;
for (int i = 0; i < current_gizmos.size(); ++i) { for (int i = 0; i < current_gizmos.size(); ++i) {
current_gizmos[i]->set_hidden(hidden); current_gizmos[i]->set_hidden(current_state == HIDDEN);
} }
} }
@ -5803,7 +5814,7 @@ void EditorSpatialGizmoPlugin::unregister_gizmo(EditorSpatialGizmo *p_gizmo) {
} }
EditorSpatialGizmoPlugin::EditorSpatialGizmoPlugin() { EditorSpatialGizmoPlugin::EditorSpatialGizmoPlugin() {
hidden = false; current_state = ON_TOP;
} }
EditorSpatialGizmoPlugin::~EditorSpatialGizmoPlugin() { EditorSpatialGizmoPlugin::~EditorSpatialGizmoPlugin() {

View File

@ -560,10 +560,10 @@ private:
MENU_VIEW_USE_4_VIEWPORTS, MENU_VIEW_USE_4_VIEWPORTS,
MENU_VIEW_ORIGIN, MENU_VIEW_ORIGIN,
MENU_VIEW_GRID, MENU_VIEW_GRID,
MENU_VIEW_GIZMOS_3D_ICONS,
MENU_VIEW_CAMERA_SETTINGS, MENU_VIEW_CAMERA_SETTINGS,
MENU_LOCK_SELECTED, MENU_LOCK_SELECTED,
MENU_UNLOCK_SELECTED, MENU_UNLOCK_SELECTED,
MENU_VISIBILITY_SKELETON,
MENU_SNAP_TO_FLOOR MENU_SNAP_TO_FLOOR
}; };
@ -571,7 +571,7 @@ private:
Button *tool_option_button[TOOL_OPT_MAX]; Button *tool_option_button[TOOL_OPT_MAX];
MenuButton *transform_menu; MenuButton *transform_menu;
MenuButton *gizmos_menu; PopupMenu *gizmos_menu;
MenuButton *view_menu; MenuButton *view_menu;
ToolButton *lock_button; ToolButton *lock_button;
@ -675,8 +675,6 @@ public:
Ref<ArrayMesh> get_scale_gizmo(int idx) const { return scale_gizmo[idx]; } Ref<ArrayMesh> get_scale_gizmo(int idx) const { return scale_gizmo[idx]; }
Ref<ArrayMesh> get_scale_plane_gizmo(int idx) const { return scale_plane_gizmo[idx]; } Ref<ArrayMesh> get_scale_plane_gizmo(int idx) const { return scale_plane_gizmo[idx]; }
int get_skeleton_visibility_state() const;
void update_transform_gizmo(); void update_transform_gizmo();
void update_all_gizmos(); void update_all_gizmos();
void snap_selected_nodes_to_floor(); void snap_selected_nodes_to_floor();
@ -751,7 +749,13 @@ class EditorSpatialGizmoPlugin : public Resource {
GDCLASS(EditorSpatialGizmoPlugin, Resource); GDCLASS(EditorSpatialGizmoPlugin, Resource);
bool hidden; public:
static const int ON_TOP = 0;
static const int VISIBLE = 1;
static const int HIDDEN = 2;
private:
int current_state;
List<EditorSpatialGizmo *> current_gizmos; List<EditorSpatialGizmo *> current_gizmos;
HashMap<String, Vector<Ref<SpatialMaterial> > > materials; HashMap<String, Vector<Ref<SpatialMaterial> > > materials;
@ -779,7 +783,7 @@ public:
virtual bool is_gizmo_handle_highlighted(const EditorSpatialGizmo *p_gizmo, int idx) const { return false; } virtual bool is_gizmo_handle_highlighted(const EditorSpatialGizmo *p_gizmo, int idx) const { return false; }
Ref<EditorSpatialGizmo> get_gizmo(Spatial *p_spatial); Ref<EditorSpatialGizmo> get_gizmo(Spatial *p_spatial);
void set_hidden(bool p_hidden); void set_state(int p_state);
void unregister_gizmo(EditorSpatialGizmo *p_gizmo); void unregister_gizmo(EditorSpatialGizmo *p_gizmo);
EditorSpatialGizmoPlugin(); EditorSpatialGizmoPlugin();

View File

@ -48,7 +48,7 @@
// It's so ugly it will eat them alive // It's so ugly it will eat them alive
// The previous comment is kept only for historical reasons. // The previous comment is kept only for historical reasons.
// No children will be harmed by the visioning of this file... hopefully. // No children will be harmed by the viewing of this file... hopefully.
#define HANDLE_HALF_SIZE 9.5 #define HANDLE_HALF_SIZE 9.5
@ -531,6 +531,8 @@ bool EditorSpatialGizmo::intersect_ray(Camera *p_camera, const Point2 &p_point,
rect.set_position(center - rect.get_size() / 2.0); rect.set_position(center - rect.get_size() / 2.0);
if (rect.has_point(p_point)) { if (rect.has_point(p_point)) {
r_pos = t.origin;
r_normal = -p_camera->project_ray_normal(p_point);
return true; return true;
} }
@ -1472,34 +1474,6 @@ void SkeletonSpatialGizmoPlugin::redraw(EditorSpatialGizmo *p_gizmo) {
p_gizmo->clear(); p_gizmo->clear();
Ref<Material> material = get_material("skeleton_material", p_gizmo); Ref<Material> material = get_material("skeleton_material", p_gizmo);
SpatialMaterial *sm = Object::cast_to<SpatialMaterial>(material.ptr());
{ // Reset
Color c(sm->get_albedo());
c.a = 1;
sm->set_albedo(c);
}
if (sm) {
switch (SpatialEditor::get_singleton()->get_skeleton_visibility_state()) {
case 0: {
// Hidden
Color c(sm->get_albedo());
c.a = 0;
sm->set_albedo(c);
sm->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
} break;
case 1:
// Visible
sm->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, false);
sm->set_render_priority(SpatialMaterial::RENDER_PRIORITY_MIN);
sm->set_flag(SpatialMaterial::FLAG_DISABLE_DEPTH_TEST, false);
break;
case 2:
// x-ray
sm->set_on_top_of_alpha();
break;
}
}
Ref<SurfaceTool> surface_tool(memnew(SurfaceTool)); Ref<SurfaceTool> surface_tool(memnew(SurfaceTool));