Improve the gizmo axis colors and increase the manipulator opacity

The new colors should make it easier to see the manipulator gizmo.
Highlighted gizmos are now fully opaque (instead of being white),
keeping the color information while a gizmo is highlighted.

This also adds a setting hint for the manipulator gizmo opacity
editor setting.

Axis colors were taken from Blender 2.80.

This partially addresses #16154.
This commit is contained in:
Hugo Locurcio 2019-08-01 14:23:29 +02:00
parent 3a6102a6f7
commit d57680cf34
No known key found for this signature in database
GPG key ID: 39E8F8BE30B0A49C
2 changed files with 47 additions and 43 deletions

View file

@ -250,15 +250,7 @@ Vector3 SpatialEditorViewport::_get_ray(const Vector2 &p_pos) const {
return camera->project_ray_normal(p_pos / viewport_container->get_stretch_shrink()); return camera->project_ray_normal(p_pos / viewport_container->get_stretch_shrink());
} }
/*
void SpatialEditorViewport::_clear_id(Spatial *p_node) {
editor_selection->remove_node(p_node);
}
*/
void SpatialEditorViewport::_clear_selected() { void SpatialEditorViewport::_clear_selected() {
editor_selection->clear(); editor_selection->clear();
@ -4001,11 +3993,11 @@ void SpatialEditor::select_gizmo_highlight_axis(int p_axis) {
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
move_gizmo[i]->surface_set_material(0, i == p_axis ? gizmo_hl : gizmo_color[i]); move_gizmo[i]->surface_set_material(0, i == p_axis ? gizmo_color_hl[i] : gizmo_color[i]);
move_plane_gizmo[i]->surface_set_material(0, (i + 6) == p_axis ? gizmo_hl : plane_gizmo_color[i]); move_plane_gizmo[i]->surface_set_material(0, (i + 6) == p_axis ? plane_gizmo_color_hl[i] : plane_gizmo_color[i]);
rotate_gizmo[i]->surface_set_material(0, (i + 3) == p_axis ? gizmo_hl : gizmo_color[i]); rotate_gizmo[i]->surface_set_material(0, (i + 3) == p_axis ? gizmo_color_hl[i] : gizmo_color[i]);
scale_gizmo[i]->surface_set_material(0, (i + 9) == p_axis ? gizmo_hl : gizmo_color[i]); scale_gizmo[i]->surface_set_material(0, (i + 9) == p_axis ? gizmo_color_hl[i] : gizmo_color[i]);
scale_plane_gizmo[i]->surface_set_material(0, (i + 12) == p_axis ? gizmo_hl : plane_gizmo_color[i]); scale_plane_gizmo[i]->surface_set_material(0, (i + 12) == p_axis ? plane_gizmo_color_hl[i] : plane_gizmo_color[i]);
} }
} }
@ -4084,6 +4076,23 @@ Object *SpatialEditor::_get_editor_data(Object *p_what) {
return si; return si;
} }
Color SpatialEditor::_get_axis_color(int axis) {
switch (axis) {
case 0:
// X axis
return Color(0.96, 0.20, 0.32);
case 1:
// Y axis
return Color(0.53, 0.84, 0.01);
case 2:
// Z axis
return Color(0.16, 0.55, 0.96);
default:
return Color(0, 0, 0);
}
}
void SpatialEditor::_generate_selection_box() { void SpatialEditor::_generate_selection_box() {
AABB aabb(Vector3(), Vector3(1, 1, 1)); AABB aabb(Vector3(), Vector3(1, 1, 1));
@ -4097,11 +4106,6 @@ void SpatialEditor::_generate_selection_box() {
Vector3 a, b; Vector3 a, b;
aabb.get_edge(i, a, b); aabb.get_edge(i, a, b);
/*Vector<Vector3> points;
Vector<Color> colors;
points.push_back(a);
points.push_back(b);*/
st->add_color(Color(1.0, 1.0, 0.8, 0.8)); st->add_color(Color(1.0, 1.0, 0.8, 0.8));
st->add_vertex(a); st->add_vertex(a);
st->add_color(Color(1.0, 1.0, 0.8, 0.4)); st->add_color(Color(1.0, 1.0, 0.8, 0.4));
@ -4640,12 +4644,13 @@ void SpatialEditor::_init_indicators() {
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
Vector3 axis; Vector3 axis;
axis[i] = 1; axis[i] = 1;
Color origin_color = _get_axis_color(i);
grid_enable[i] = false; grid_enable[i] = false;
grid_visible[i] = false; grid_visible[i] = false;
origin_colors.push_back(Color(axis.x, axis.y, axis.z)); origin_colors.push_back(origin_color);
origin_colors.push_back(Color(axis.x, axis.y, axis.z)); origin_colors.push_back(origin_color);
origin_points.push_back(axis * 4096); origin_points.push_back(axis * 4096);
origin_points.push_back(axis * -4096); origin_points.push_back(axis * -4096);
} }
@ -4674,17 +4679,11 @@ void SpatialEditor::_init_indicators() {
//move gizmo //move gizmo
float gizmo_alph = EditorSettings::get_singleton()->get("editors/3d/manipulator_gizmo_opacity");
gizmo_hl = Ref<SpatialMaterial>(memnew(SpatialMaterial));
gizmo_hl->set_flag(SpatialMaterial::FLAG_UNSHADED, true);
gizmo_hl->set_on_top_of_alpha();
gizmo_hl->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
gizmo_hl->set_albedo(Color(1, 1, 1, gizmo_alph + 0.2f));
gizmo_hl->set_cull_mode(SpatialMaterial::CULL_DISABLED);
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
Color col = _get_axis_color(i);
col.a = EditorSettings::get_singleton()->get("editors/3d/manipulator_gizmo_opacity");
move_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh)); move_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh));
move_plane_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh)); move_plane_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh));
rotate_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh)); rotate_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh));
@ -4695,13 +4694,13 @@ void SpatialEditor::_init_indicators() {
mat->set_flag(SpatialMaterial::FLAG_UNSHADED, true); mat->set_flag(SpatialMaterial::FLAG_UNSHADED, true);
mat->set_on_top_of_alpha(); mat->set_on_top_of_alpha();
mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true); mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
Color col;
col[i] = 1.0;
col.a = gizmo_alph;
mat->set_albedo(col); mat->set_albedo(col);
gizmo_color[i] = mat; gizmo_color[i] = mat;
Ref<SpatialMaterial> mat_hl = mat->duplicate();
mat_hl->set_albedo(Color(col.r, col.g, col.b, 1.0));
gizmo_color_hl[i] = mat_hl;
Vector3 ivec; Vector3 ivec;
ivec[i] = 1; ivec[i] = 1;
Vector3 nivec; Vector3 nivec;
@ -4791,13 +4790,14 @@ void SpatialEditor::_init_indicators() {
plane_mat->set_on_top_of_alpha(); plane_mat->set_on_top_of_alpha();
plane_mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true); plane_mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
plane_mat->set_cull_mode(SpatialMaterial::CULL_DISABLED); plane_mat->set_cull_mode(SpatialMaterial::CULL_DISABLED);
Color col2; plane_mat->set_albedo(col);
col2[i] = 1.0;
col2.a = gizmo_alph;
plane_mat->set_albedo(col2);
plane_gizmo_color[i] = plane_mat; // needed, so we can draw planes from both sides plane_gizmo_color[i] = plane_mat; // needed, so we can draw planes from both sides
surftool->set_material(plane_mat); surftool->set_material(plane_mat);
surftool->commit(move_plane_gizmo[i]); surftool->commit(move_plane_gizmo[i]);
Ref<SpatialMaterial> plane_mat_hl = plane_mat->duplicate();
plane_mat_hl->set_albedo(Color(col.r, col.g, col.b, 1.0));
plane_gizmo_color_hl[i] = plane_mat_hl; // needed, so we can draw planes from both sides
} }
// Rotate // Rotate
@ -4920,13 +4920,14 @@ void SpatialEditor::_init_indicators() {
plane_mat->set_on_top_of_alpha(); plane_mat->set_on_top_of_alpha();
plane_mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true); plane_mat->set_feature(SpatialMaterial::FEATURE_TRANSPARENT, true);
plane_mat->set_cull_mode(SpatialMaterial::CULL_DISABLED); plane_mat->set_cull_mode(SpatialMaterial::CULL_DISABLED);
Color col2; plane_mat->set_albedo(col);
col2[i] = 1.0;
col2.a = gizmo_alph;
plane_mat->set_albedo(col2);
plane_gizmo_color[i] = plane_mat; // needed, so we can draw planes from both sides plane_gizmo_color[i] = plane_mat; // needed, so we can draw planes from both sides
surftool->set_material(plane_mat); surftool->set_material(plane_mat);
surftool->commit(scale_plane_gizmo[i]); surftool->commit(scale_plane_gizmo[i]);
Ref<SpatialMaterial> plane_mat_hl = plane_mat->duplicate();
plane_mat_hl->set_albedo(Color(col.r, col.g, col.b, 1.0));
plane_gizmo_color_hl[i] = plane_mat_hl; // needed, so we can draw planes from both sides
} }
} }
} }
@ -5824,7 +5825,8 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
EDITOR_DEF("editors/3d/manipulator_gizmo_size", 80); EDITOR_DEF("editors/3d/manipulator_gizmo_size", 80);
EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "editors/3d/manipulator_gizmo_size", PROPERTY_HINT_RANGE, "16,1024,1")); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "editors/3d/manipulator_gizmo_size", PROPERTY_HINT_RANGE, "16,1024,1"));
EDITOR_DEF("editors/3d/manipulator_gizmo_opacity", 0.2); EDITOR_DEF("editors/3d/manipulator_gizmo_opacity", 0.4);
EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::REAL, "editors/3d/manipulator_gizmo_opacity", PROPERTY_HINT_RANGE, "0,1,0.01"));
over_gizmo_handle = -1; over_gizmo_handle = -1;
} }

View file

@ -528,7 +528,8 @@ private:
Ref<ArrayMesh> move_gizmo[3], move_plane_gizmo[3], rotate_gizmo[3], scale_gizmo[3], scale_plane_gizmo[3]; Ref<ArrayMesh> move_gizmo[3], move_plane_gizmo[3], rotate_gizmo[3], scale_gizmo[3], scale_plane_gizmo[3];
Ref<SpatialMaterial> gizmo_color[3]; Ref<SpatialMaterial> gizmo_color[3];
Ref<SpatialMaterial> plane_gizmo_color[3]; Ref<SpatialMaterial> plane_gizmo_color[3];
Ref<SpatialMaterial> gizmo_hl; Ref<SpatialMaterial> gizmo_color_hl[3];
Ref<SpatialMaterial> plane_gizmo_color_hl[3];
int over_gizmo_handle; int over_gizmo_handle;
@ -635,6 +636,7 @@ private:
Node *custom_camera; Node *custom_camera;
Object *_get_editor_data(Object *p_what); Object *_get_editor_data(Object *p_what);
Color _get_axis_color(int axis);
Ref<Environment> viewport_environment; Ref<Environment> viewport_environment;