Browse Source

Improve the appearance of 2D path editors

- Add new handle icons for path/polygon editors
- Add smooth path point icons and curve tangent icons
- Use a gray color for tangent lines in the Path2D and Path editors
- Use antialiasing for Path2D lines
Hugo Locurcio 6 years ago
parent
commit
558e93f069

+ 1 - 0
editor/icons/icon_editor_curve_handle.svg

@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><circle cx="5" cy="5" fill="#fefefe" r="2.75" stroke="#000" stroke-linecap="square"/></svg>

+ 1 - 0
editor/icons/icon_editor_path_sharp_handle.svg

@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m-3.035534-10.106602h6.071068v6.071068h-6.071068z" fill="#fefefe" stroke="#000" stroke-linecap="square" transform="matrix(-.70710678 .70710678 -.70710678 -.70710678 0 0)"/></svg>

+ 1 - 0
editor/icons/icon_editor_path_smooth_handle.svg

@@ -0,0 +1 @@
+<svg height="10" viewBox="0 0 10 10" width="10" xmlns="http://www.w3.org/2000/svg"><path d="m1.5-8.5h7v7h-7z" fill="#fefefe" stroke="#000" stroke-linecap="square" transform="rotate(90)"/></svg>

+ 2 - 1
editor/plugins/abstract_polygon_2d_editor.cpp

@@ -571,7 +571,8 @@ void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overl
 		return;
 
 	Transform2D xform = canvas_item_editor->get_canvas_transform() * _get_node()->get_global_transform();
-	const Ref<Texture> handle = get_icon("EditorHandle", "EditorIcons");
+	// All polygon points are sharp, so use the sharp handle icon
+	const Ref<Texture> handle = get_icon("EditorPathSharpHandle", "EditorIcons");
 
 	const Vertex active_point = get_active_point();
 	const int n_polygons = _get_polygon_count();

+ 29 - 13
editor/plugins/path_2d_editor_plugin.cpp

@@ -367,18 +367,18 @@ bool Path2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
 
 void Path2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
 
-	if (!node)
+	if (!node || !node->is_visible_in_tree() || !node->get_curve().is_valid())
 		return;
 
-	if (!node->is_visible_in_tree())
-		return;
+	Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
 
-	if (!node->get_curve().is_valid())
-		return;
+	const Ref<Texture> path_sharp_handle = get_icon("EditorPathSharpHandle", "EditorIcons");
+	const Ref<Texture> path_smooth_handle = get_icon("EditorPathSmoothHandle", "EditorIcons");
+	// Both handle icons must be of the same size
+	const Size2 handle_size = path_sharp_handle->get_size();
 
-	Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
-	Ref<Texture> handle = get_icon("EditorHandle", "EditorIcons");
-	Size2 handle_size = handle->get_size();
+	const Ref<Texture> curve_handle = get_icon("EditorCurveHandle", "EditorIcons");
+	const Size2 curve_handle_size = curve_handle->get_size();
 
 	Ref<Curve2D> curve = node->get_curve();
 
@@ -387,19 +387,35 @@ void Path2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
 
 	for (int i = 0; i < len; i++) {
 		Vector2 point = xform.xform(curve->get_point_position(i));
-		vpc->draw_texture_rect(handle, Rect2(point - handle_size * 0.5, handle_size), false, Color(1, 1, 1, 1));
+		// Determines the point icon to be used
+		bool smooth = false;
 
 		if (i < len - 1) {
 			Vector2 pointout = xform.xform(curve->get_point_position(i) + curve->get_point_out(i));
-			vpc->draw_line(point, pointout, Color(0.5, 0.5, 1.0, 0.8), 1.0);
-			vpc->draw_texture_rect(handle, Rect2(pointout - handle_size * 0.5, handle_size), false, Color(1, 0.5, 1, 0.3));
+			if (point != pointout) {
+				smooth = true;
+				// Draw the line with a dark and light color to be visible on all backgrounds
+				vpc->draw_line(point, pointout, Color(0, 0, 0, 0.5), Math::round(EDSCALE), true);
+				vpc->draw_line(point, pointout, Color(1, 1, 1, 0.5), Math::round(EDSCALE), true);
+				vpc->draw_texture_rect(curve_handle, Rect2(pointout - curve_handle_size * 0.5, curve_handle_size), false, Color(1, 1, 1, 0.75));
+			}
 		}
 
 		if (i > 0) {
 			Vector2 pointin = xform.xform(curve->get_point_position(i) + curve->get_point_in(i));
-			vpc->draw_line(point, pointin, Color(0.5, 0.5, 1.0, 0.8), 1.0);
-			vpc->draw_texture_rect(handle, Rect2(pointin - handle_size * 0.5, handle_size), false, Color(1, 0.5, 1, 0.3));
+			if (point != pointin) {
+				smooth = true;
+				// Draw the line with a dark and light color to be visible on all backgrounds
+				vpc->draw_line(point, pointin, Color(0, 0, 0, 0.5), Math::round(EDSCALE), true);
+				vpc->draw_line(point, pointin, Color(1, 1, 1, 0.5), Math::round(EDSCALE), true);
+				vpc->draw_texture_rect(curve_handle, Rect2(pointin - curve_handle_size * 0.5, curve_handle_size), false, Color(1, 1, 1, 0.75));
+			}
 		}
+
+		vpc->draw_texture_rect(
+				smooth ? path_smooth_handle : path_sharp_handle,
+				Rect2(point - handle_size * 0.5, handle_size),
+				false);
 	}
 
 	if (on_edge) {

+ 1 - 2
editor/plugins/path_editor_plugin.cpp

@@ -652,7 +652,6 @@ PathSpatialGizmoPlugin::PathSpatialGizmoPlugin() {
 
 	Color path_color = EDITOR_DEF("editors/3d_gizmos/gizmo_colors/path", Color(0.5, 0.5, 1.0, 0.8));
 	create_material("path_material", path_color);
-	path_color.a = 0.4;
-	create_material("path_thin_material", path_color);
+	create_material("path_thin_material", Color(0.5, 0.5, 0.5));
 	create_handle_material("handles");
 }

+ 4 - 3
editor/plugins/polygon_2d_editor_plugin.cpp

@@ -1045,8 +1045,8 @@ void Polygon2DEditor::_uv_draw() {
 		}
 	}
 
-	Ref<Texture> handle = get_icon("EditorHandle", "EditorIcons");
-	Ref<Texture> internal_handle = get_icon("EditorInternalHandle", "EditorIcons");
+	// All UV points are sharp, so use the sharp handle icon
+	Ref<Texture> handle = get_icon("EditorPathSharpHandle", "EditorIcons");
 
 	Color poly_line_color = Color(0.9, 0.5, 0.5);
 	if (polygons.size() || polygon_create.size()) {
@@ -1120,7 +1120,8 @@ void Polygon2DEditor::_uv_draw() {
 			if (i < uv_draw_max) {
 				uv_edit_draw->draw_texture(handle, mtx.xform(uvs[i]) - handle->get_size() * 0.5);
 			} else {
-				uv_edit_draw->draw_texture(internal_handle, mtx.xform(uvs[i]) - internal_handle->get_size() * 0.5);
+				// Internal vertex
+				uv_edit_draw->draw_texture(handle, mtx.xform(uvs[i]) - handle->get_size() * 0.5, Color(0.6, 0.8, 1));
 			}
 		}
 	}

+ 1 - 1
scene/2d/path_2d.cpp

@@ -110,7 +110,7 @@ void Path2D::_notification(int p_what) {
 
 				real_t frac = j / 8.0;
 				Vector2 p = curve->interpolate(i, frac);
-				draw_line(prev_p, p, color, line_width);
+				draw_line(prev_p, p, color, line_width, true);
 				prev_p = p;
 			}
 		}