diff --git a/addons/rmsmartshape/assets/icon_editor_handle.svg b/addons/rmsmartshape/assets/icon_editor_handle.svg index 328dc046..59691e44 100644 --- a/addons/rmsmartshape/assets/icon_editor_handle.svg +++ b/addons/rmsmartshape/assets/icon_editor_handle.svg @@ -1 +1,12 @@ - + + + + + + + + + + + + \ No newline at end of file diff --git a/addons/rmsmartshape/assets/icon_editor_handle.svg.import b/addons/rmsmartshape/assets/icon_editor_handle.svg.import index 5b6c8112..3856d2bc 100644 --- a/addons/rmsmartshape/assets/icon_editor_handle.svg.import +++ b/addons/rmsmartshape/assets/icon_editor_handle.svg.import @@ -32,6 +32,6 @@ process/hdr_as_srgb=false process/hdr_clamp_exposure=false process/size_limit=0 detect_3d/compress_to=1 -svg/scale=1.5 +svg/scale=1.0 editor/scale_with_editor_scale=false editor/convert_colors_with_editor_theme=false diff --git a/addons/rmsmartshape/assets/icon_editor_handle_add.svg.import b/addons/rmsmartshape/assets/icon_editor_handle_add.svg.import index d8998c0f..cbf059cd 100644 --- a/addons/rmsmartshape/assets/icon_editor_handle_add.svg.import +++ b/addons/rmsmartshape/assets/icon_editor_handle_add.svg.import @@ -32,6 +32,6 @@ process/hdr_as_srgb=false process/hdr_clamp_exposure=false process/size_limit=0 detect_3d/compress_to=1 -svg/scale=1.5 +svg/scale=2.0 editor/scale_with_editor_scale=false editor/convert_colors_with_editor_theme=false diff --git a/addons/rmsmartshape/assets/icon_editor_handle_bezier.svg b/addons/rmsmartshape/assets/icon_editor_handle_bezier.svg index b498345d..31d5c9a0 100644 --- a/addons/rmsmartshape/assets/icon_editor_handle_bezier.svg +++ b/addons/rmsmartshape/assets/icon_editor_handle_bezier.svg @@ -1 +1,3 @@ - + + + \ No newline at end of file diff --git a/addons/rmsmartshape/assets/icon_editor_handle_control.svg.import b/addons/rmsmartshape/assets/icon_editor_handle_control.svg.import index 9208cb7a..d166e23b 100644 --- a/addons/rmsmartshape/assets/icon_editor_handle_control.svg.import +++ b/addons/rmsmartshape/assets/icon_editor_handle_control.svg.import @@ -32,6 +32,6 @@ process/hdr_as_srgb=false process/hdr_clamp_exposure=false process/size_limit=0 detect_3d/compress_to=1 -svg/scale=1.5 +svg/scale=2.0 editor/scale_with_editor_scale=false editor/convert_colors_with_editor_theme=false diff --git a/addons/rmsmartshape/assets/icon_editor_handle_selected.svg b/addons/rmsmartshape/assets/icon_editor_handle_selected.svg index ac96ca69..f4c11b0c 100644 --- a/addons/rmsmartshape/assets/icon_editor_handle_selected.svg +++ b/addons/rmsmartshape/assets/icon_editor_handle_selected.svg @@ -1,3 +1,3 @@ - - - + + + \ No newline at end of file diff --git a/addons/rmsmartshape/assets/icon_editor_handle_selected.svg.import b/addons/rmsmartshape/assets/icon_editor_handle_selected.svg.import index 4b670ddf..376b1c5f 100644 --- a/addons/rmsmartshape/assets/icon_editor_handle_selected.svg.import +++ b/addons/rmsmartshape/assets/icon_editor_handle_selected.svg.import @@ -32,6 +32,6 @@ process/hdr_as_srgb=false process/hdr_clamp_exposure=false process/size_limit=0 detect_3d/compress_to=1 -svg/scale=1.25 +svg/scale=1.0 editor/scale_with_editor_scale=false editor/convert_colors_with_editor_theme=false diff --git a/addons/rmsmartshape/plugin.gd b/addons/rmsmartshape/plugin.gd index 69208e1e..172da20b 100644 --- a/addons/rmsmartshape/plugin.gd +++ b/addons/rmsmartshape/plugin.gd @@ -30,6 +30,8 @@ var ICON_SNAP: Texture2D = load("res://addons/rmsmartshape/assets/icon_editor_sn var ICON_IMPORT_CLOSED: Texture2D = load("res://addons/rmsmartshape/assets/closed_shape.png") var ICON_IMPORT_OPEN: Texture2D = load("res://addons/rmsmartshape/assets/open_shape.png") +const HANDLE_RADIUS: float = 13 + const FUNC = preload("plugin_functionality.gd") const ActionAddCollisionNodes := preload("res://addons/rmsmartshape/actions/action_add_collision_nodes.gd") const ActionMoveVerticies := preload("res://addons/rmsmartshape/actions/action_move_verticies.gd") @@ -457,9 +459,6 @@ func _forward_canvas_gui_input(event: InputEvent) -> bool: cached_shape_global_transform = shape.get_global_transform() var et: Transform2D = get_et() - var grab_threshold: float = EditorInterface.get_editor_settings().get( - "editors/polygon_editor/point_grab_radius" - ) var key_return_value := false if event is InputEventKey: @@ -467,11 +466,11 @@ func _forward_canvas_gui_input(event: InputEvent) -> bool: var mb_return_value := false if event is InputEventMouseButton: - mb_return_value = _input_handle_mouse_button_event(event, et, grab_threshold) + mb_return_value = _input_handle_mouse_button_event(event, et, HANDLE_RADIUS) var mm_return_value := false if event is InputEventMouseMotion: - mb_return_value = _input_handle_mouse_motion_event(event, et, grab_threshold) + mb_return_value = _input_handle_mouse_motion_event(event, et, HANDLE_RADIUS) var return_value := key_return_value == true or mb_return_value == true or mm_return_value == true _gui_update_info_panels() @@ -733,12 +732,15 @@ func _forward_canvas_draw_over_viewport(overlay: Control) -> void: if not is_shape_valid() or not is_inside_tree(): return + if Input.is_key_pressed(KEY_H): + return + match current_mode: MODE.CREATE_VERT: draw_mode_edit_vert(overlay) if Input.is_key_pressed(KEY_ALT) and Input.is_key_pressed(KEY_SHIFT): draw_new_shape_preview(overlay) - elif Input.is_key_pressed(KEY_ALT): + elif Input.is_key_pressed(KEY_ALT) or shape.is_shape_closed(): draw_new_point_close_preview(overlay) else: draw_new_point_preview(overlay) @@ -777,8 +779,8 @@ func draw_mode_edit_edge(overlay: Control, color_normal: Color, color_highlight: var t: Transform2D = get_et() * shape.get_global_transform() var verts: PackedVector2Array = shape.get_vertices() + draw_shape_outline(overlay, t, verts, Color.BLACK, 3) draw_shape_outline(overlay, t, verts, color_normal) - draw_vert_handles(overlay, t, verts, false) if current_action.type == ACTION_VERT.MOVE_VERT: var edge_point_keys := current_action.keys @@ -824,25 +826,18 @@ func draw_mode_edit_vert(overlay: Control, show_vert_handles: bool = true) -> vo var t: Transform2D = get_et() * shape.get_global_transform() var verts: PackedVector2Array = shape.get_vertices() var points: PackedVector2Array = shape.get_tessellated_points() - draw_shape_outline(overlay, t, points, shape.modulate) + var color := Color(1, 1, 1, 0.6) + draw_shape_outline(overlay, t, points, color) if show_vert_handles: draw_vert_handles(overlay, t, verts, true) if on_edge: overlay.draw_texture(ICON_ADD_HANDLE, edge_point - ICON_ADD_HANDLE.get_size() * 0.5) - # Draw Highlighted Handle - if current_action.is_single_vert_selected(): - var tex: Texture2D = ICON_HANDLE_SELECTED - overlay.draw_texture( - tex, t * verts[current_action.current_point_index(shape)] - tex.get_size() * 0.5 - ) - func draw_shape_outline( - overlay: Control, t: Transform2D, points: PackedVector2Array, color: Color, width: float = 2.0 + overlay: Control, t: Transform2D, points: PackedVector2Array, color: Color, width: float = 1.0 ) -> void: if points.size() >= 2: - overlay.draw_polyline(t * points, Color.BLACK, width * 1.5, true) overlay.draw_polyline(t * points, color, width, true) @@ -850,12 +845,21 @@ func draw_vert_handles( overlay: Control, t: Transform2D, verts: PackedVector2Array, control_points: bool ) -> void: var transformed_verts := t * verts - for i in verts.size(): + var draw_vert_count: int = max(verts.size() - 1, 0) if shape.is_shape_closed() else verts.size() + + for i in draw_vert_count: # Draw Vert handles var hp: Vector2 = transformed_verts[i] - var icon: Texture2D = ICON_HANDLE_BEZIER if (Input.is_key_pressed(KEY_SHIFT) and not current_mode == MODE.FREEHAND) else ICON_HANDLE + var icon: Texture2D = ICON_HANDLE overlay.draw_texture(icon, hp - icon.get_size() * 0.5) + # Draw Highlighted Handle + if current_action.is_single_vert_selected(): + var tex: Texture2D = ICON_HANDLE_SELECTED + overlay.draw_texture( + tex, t * verts[current_action.current_point_index(shape)] - tex.get_size() * 0.5 + ) + # Draw Width handle var offset: float = WIDTH_HANDLE_OFFSET var width_handle_key: int = closest_key @@ -885,26 +889,30 @@ func draw_vert_handles( for i in verts.size(): var key: int = shape.get_point_key_at_index(i) var hp: Vector2 = transformed_verts[i] + var is_bezier_vert: bool = false # Drawing the point-out for the last point makes no sense, as there's no point ahead of it if i < verts.size() - 1: var pointout: Vector2 = t * (verts[i] + shape.get_point_out(key)) if hp != pointout: _draw_control_point_line(overlay, hp, pointout, ICON_HANDLE_CONTROL) + is_bezier_vert = true # Drawing the point-in for point 0 makes no sense, as there's no point behind it if i > 0: var pointin: Vector2 = t * (verts[i] + shape.get_point_in(key)) if hp != pointin: _draw_control_point_line(overlay, hp, pointin, ICON_HANDLE_CONTROL) + is_bezier_vert = true + + if is_bezier_vert: + overlay.draw_texture(ICON_HANDLE_BEZIER, hp - ICON_HANDLE_BEZIER.get_size() * 0.5) func _draw_control_point_line(c: Control, vert: Vector2, cp: Vector2, tex: Texture2D) -> void: # Draw the line with a dark and light color to be visible on all backgrounds - var color_dark := Color(0, 0, 0, 0.3) - var color_light := Color(1, 1, 1, .5) + var color_light := Color(1, 1, 1, .6) var width := 2.0 var normal := (cp - vert).normalized() - c.draw_line(vert + normal * 4 + Vector2.DOWN, cp + Vector2.DOWN, color_dark, width) c.draw_line(vert + normal * 4, cp, color_light, width) c.draw_texture(tex, cp - tex.get_size() * 0.5) @@ -918,13 +926,8 @@ func draw_new_point_preview(overlay: Control) -> void: var mouse: Vector2 = overlay.get_local_mouse_position() if verts.size() > 0: - var a: Vector2 - if shape.is_shape_closed() and verts.size() > 1: - a = t * verts[verts.size() - 2] - overlay.draw_line(mouse, t * verts[0], color,width * .5) - else: - a = t * verts[verts.size() - 1] - overlay.draw_line(mouse, a, color, width) + var a: Vector2 = t * verts[verts.size() - 1] + overlay.draw_dashed_line(mouse, a, color, width, width * 3) overlay.draw_texture(ICON_ADD_HANDLE, mouse - ICON_ADD_HANDLE.get_size() * 0.5) @@ -938,9 +941,8 @@ func draw_new_point_close_preview(overlay: Control) -> void: var mouse: Vector2 = overlay.get_local_mouse_position() var a: Vector2 = t * shape.get_point_position(closest_edge_keys[0]) var b: Vector2 = t * shape.get_point_position(closest_edge_keys[1]) - overlay.draw_line(mouse, a, color, width) - color.a = 0.1 - overlay.draw_line(mouse, b, color, width) + overlay.draw_dashed_line(mouse, a, color, width, width * 3) + overlay.draw_dashed_line(mouse, b, color, width, width * 3) overlay.draw_texture(ICON_ADD_HANDLE, mouse - ICON_ADD_HANDLE.get_size() * 0.5) @@ -1053,12 +1055,13 @@ func _input_handle_left_click( if current_mode == MODE.EDIT_VERT or current_mode == MODE.CREATE_VERT: gui_edge_info_panel.visible = false - var can_add_point: bool = Input.is_key_pressed(KEY_ALT) or current_mode == MODE.CREATE_VERT - var is_first_selected: bool = current_action.is_single_vert_selected() and current_action.current_point_key() == shape.get_point_key_at_index(0) if _defer_mesh_updates: shape.begin_update() + var can_add_point: bool = Input.is_key_pressed(KEY_ALT) or current_mode == MODE.CREATE_VERT + var is_first_selected: bool = current_action.is_single_vert_selected() and current_action.current_point_key() == shape.get_point_key_at_index(0) + # Close the shape if the first point is clicked if can_add_point and is_first_selected and shape.can_close(): var close_action := ActionCloseShape.new(shape) @@ -1070,7 +1073,7 @@ func _input_handle_left_click( return true # Any nearby control points to move? - if not Input.is_key_pressed(KEY_ALT): + if not Input.is_key_pressed(KEY_ALT) and current_mode != MODE.CREATE_VERT: if _input_move_control_points(mb, vp_m_pos, grab_threshold): return true @@ -1105,7 +1108,7 @@ func _input_handle_left_click( selection.clear() selection.add_node(copy) shape = copy - elif Input.is_key_pressed(KEY_ALT): + elif Input.is_key_pressed(KEY_ALT) or shape.is_shape_closed(): # Add point between start and end points of the closest edge idx = shape.get_point_index(closest_edge_keys[1]) var add_point := ActionAddPoint.new(shape, local_position, idx, not _defer_mesh_updates) @@ -1212,6 +1215,9 @@ func _input_handle_keyboard_event(event: InputEventKey) -> bool: if kb.keycode == KEY_ALT: update_overlays() + if kb.keycode == KEY_H: + update_overlays() + return true return false @@ -1230,6 +1236,8 @@ func _is_valid_keyboard_scancode(kb: InputEventKey) -> bool: return true KEY_CTRL: return true + KEY_H: + return true return false @@ -1530,7 +1538,7 @@ func _input_handle_mouse_motion_event( on_edge = false on_width_handle = true current_action = select_verticies([mouse_over_width_handle], ACTION_VERT.NONE) - elif Input.is_key_pressed(KEY_ALT): + elif Input.is_key_pressed(KEY_ALT) or current_mode == MODE.CREATE_VERT: _input_find_closest_edge_keys(mm) else: deselect_verts()