Proposal 1246: Make Path3D handles more visible.
Resolves godotengine/godot-proposals#1246. It is difficult to tell the difference between the handles for adjusting curves and the points themselves when looking at a Path gizmo. This re-uses the icons used for Path2D. Unlike Path2D, this does not use a different icon for smooth vs sharp points, as using a potentially different material for each point would prevent batching the points in add_handles (and adding them out-of-order messes up other logic based on handle indices). This includes a public API change to allow specifying a texture for a handle material. This allows spatial gizmo plugins to customize the way a handle is rendered, if desired, but does not break existing behavior (as providing no texture uses the default). The path handle icons were resized as well. 16x16 is the standard icon size. These icons were 10x10 rather than 16x16, and appeared rather small in the editor. To resize, I: - Opened the original in Inkscape - Resized the document to 16x16 - Opened the transform dialog - Scaled by 160% proportionally - Used Align/Distribute to center on the page - Saved the document - Cleaned with `svgcleaner --multipass`
This commit is contained in:
parent
4206dc6ac9
commit
8458ba0aef
|
@ -59,8 +59,11 @@
|
|||
</argument>
|
||||
<argument index="1" name="billboard" type="bool" default="false">
|
||||
</argument>
|
||||
<argument index="2" name="texture" type="Texture2D" default="null">
|
||||
</argument>
|
||||
<description>
|
||||
Creates a handle material with its variants (selected and/or editable) and adds them to the internal material list. They can then be accessed with [method get_material] and used in [method EditorNode3DGizmo.add_handles]. Should not be overridden.
|
||||
You can optionally provide a texture to use instead of the default icon.
|
||||
</description>
|
||||
</method>
|
||||
<method name="create_icon_material">
|
||||
|
|
|
@ -1 +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>
|
||||
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" fill="#fefefe" r="4.4" stroke="#000" stroke-linecap="square" stroke-width="1.6"/></svg>
|
||||
|
|
Before Width: | Height: | Size: 175 B After Width: | Height: | Size: 193 B |
|
@ -1 +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>
|
||||
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m14.868629 8.0000002-6.8686288 6.8686288-6.8686293-6.8686288 6.8686293-6.8686293z" fill="#fefefe" stroke="#000" stroke-linecap="square" stroke-width="1.6"/></svg>
|
||||
|
|
Before Width: | Height: | Size: 271 B After Width: | Height: | Size: 255 B |
|
@ -1 +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>
|
||||
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13.6 2.4v11.2h-11.2v-11.2z" fill="#fefefe" stroke="#000" stroke-linecap="square" stroke-width="1.6"/></svg>
|
||||
|
|
Before Width: | Height: | Size: 194 B After Width: | Height: | Size: 201 B |
|
@ -6718,12 +6718,12 @@ void EditorNode3DGizmoPlugin::create_icon_material(const String &p_name, const R
|
|||
materials[p_name] = icons;
|
||||
}
|
||||
|
||||
void EditorNode3DGizmoPlugin::create_handle_material(const String &p_name, bool p_billboard) {
|
||||
void EditorNode3DGizmoPlugin::create_handle_material(const String &p_name, bool p_billboard, const Ref<Texture2D> &p_icon) {
|
||||
Ref<StandardMaterial3D> handle_material = Ref<StandardMaterial3D>(memnew(StandardMaterial3D));
|
||||
|
||||
handle_material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED);
|
||||
handle_material->set_flag(StandardMaterial3D::FLAG_USE_POINT_SIZE, true);
|
||||
Ref<Texture2D> handle_t = Node3DEditor::get_singleton()->get_theme_icon("Editor3DHandle", "EditorIcons");
|
||||
Ref<Texture2D> handle_t = p_icon != nullptr ? p_icon : Node3DEditor::get_singleton()->get_theme_icon("Editor3DHandle", "EditorIcons");
|
||||
handle_material->set_point_size(handle_t->get_width());
|
||||
handle_material->set_texture(StandardMaterial3D::TEXTURE_ALBEDO, handle_t);
|
||||
handle_material->set_albedo(Color(1, 1, 1));
|
||||
|
@ -6807,7 +6807,7 @@ void EditorNode3DGizmoPlugin::_bind_methods() {
|
|||
|
||||
ClassDB::bind_method(D_METHOD("create_material", "name", "color", "billboard", "on_top", "use_vertex_color"), &EditorNode3DGizmoPlugin::create_material, DEFVAL(false), DEFVAL(false), DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("create_icon_material", "name", "texture", "on_top", "color"), &EditorNode3DGizmoPlugin::create_icon_material, DEFVAL(false), DEFVAL(Color(1, 1, 1, 1)));
|
||||
ClassDB::bind_method(D_METHOD("create_handle_material", "name", "billboard"), &EditorNode3DGizmoPlugin::create_handle_material, DEFVAL(false));
|
||||
ClassDB::bind_method(D_METHOD("create_handle_material", "name", "billboard", "texture"), &EditorNode3DGizmoPlugin::create_handle_material, DEFVAL(false), DEFVAL(Variant()));
|
||||
ClassDB::bind_method(D_METHOD("add_material", "name", "material"), &EditorNode3DGizmoPlugin::add_material);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_material", "name", "gizmo"), &EditorNode3DGizmoPlugin::get_material); //, DEFVAL(Ref<EditorNode3DGizmo>()));
|
||||
|
|
|
@ -864,7 +864,7 @@ protected:
|
|||
public:
|
||||
void create_material(const String &p_name, const Color &p_color, bool p_billboard = false, bool p_on_top = false, bool p_use_vertex_color = false);
|
||||
void create_icon_material(const String &p_name, const Ref<Texture2D> &p_texture, bool p_on_top = false, const Color &p_albedo = Color(1, 1, 1, 1));
|
||||
void create_handle_material(const String &p_name, bool p_billboard = false);
|
||||
void create_handle_material(const String &p_name, bool p_billboard = false, const Ref<Texture2D> &p_texture = nullptr);
|
||||
void add_material(const String &p_name, Ref<StandardMaterial3D> p_material);
|
||||
|
||||
Ref<StandardMaterial3D> get_material(const String &p_name, const Ref<EditorNode3DGizmo> &p_gizmo = Ref<EditorNode3DGizmo>());
|
||||
|
|
|
@ -224,6 +224,7 @@ void Path3DGizmo::redraw() {
|
|||
Ref<StandardMaterial3D> path_material = gizmo_plugin->get_material("path_material", this);
|
||||
Ref<StandardMaterial3D> path_thin_material = gizmo_plugin->get_material("path_thin_material", this);
|
||||
Ref<StandardMaterial3D> handles_material = gizmo_plugin->get_material("handles");
|
||||
Ref<StandardMaterial3D> sec_handles_material = gizmo_plugin->get_material("sec_handles");
|
||||
|
||||
Ref<Curve3D> c = path->get_curve();
|
||||
if (c.is_null()) {
|
||||
|
@ -281,7 +282,7 @@ void Path3DGizmo::redraw() {
|
|||
add_handles(handles, handles_material);
|
||||
}
|
||||
if (sec_handles.size()) {
|
||||
add_handles(sec_handles, handles_material, false, true);
|
||||
add_handles(sec_handles, sec_handles_material, false, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -641,5 +642,6 @@ Path3DGizmoPlugin::Path3DGizmoPlugin() {
|
|||
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);
|
||||
create_material("path_thin_material", Color(0.5, 0.5, 0.5));
|
||||
create_handle_material("handles");
|
||||
create_handle_material("handles", false, Node3DEditor::get_singleton()->get_theme_icon("EditorPathSmoothHandle", "EditorIcons"));
|
||||
create_handle_material("sec_handles", false, Node3DEditor::get_singleton()->get_theme_icon("EditorCurveHandle", "EditorIcons"));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue