From 6228ba20e16e58803bf9797fb6edffe1aba1af60 Mon Sep 17 00:00:00 2001 From: Rodz Labs Date: Sun, 28 Jan 2024 14:01:56 +0100 Subject: [PATCH] More updates to painter tool. Now 2D view and graph can be hidden in the painting window --- material_maker/icons/icons.svg | 135 +++++++++++++++++- .../panels/paint/layer_types/layer.gd | 3 +- material_maker/panels/paint/paint.gd | 48 ++++--- material_maker/panels/paint/paint.tscn | 102 ++++++------- material_maker/tools/painter/painter.gd | 18 ++- .../tools/painter/shaders/brush.gdshader | 1 + .../shaders/paint_shader_template.tres | 17 ++- 7 files changed, 233 insertions(+), 91 deletions(-) diff --git a/material_maker/icons/icons.svg b/material_maker/icons/icons.svg index a63606afb..31f681436 100644 --- a/material_maker/icons/icons.svg +++ b/material_maker/icons/icons.svg @@ -211,9 +211,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="22.627417" - inkscape:cx="197.2607" - inkscape:cy="131.10202" + inkscape:zoom="9.9066148" + inkscape:cx="141.77396" + inkscape:cy="87.567753" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="true" @@ -2065,6 +2065,11 @@ y="3249.0586" ry="106.06594" /> + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/material_maker/panels/paint/layer_types/layer.gd b/material_maker/panels/paint/layer_types/layer.gd index d9e9130a2..220eef7ff 100644 --- a/material_maker/panels/paint/layer_types/layer.gd +++ b/material_maker/panels/paint/layer_types/layer.gd @@ -42,8 +42,7 @@ func load_layer(data : Dictionary, first_index : int, path : String) -> void: hidden = data.hidden for c in get_channels(): if data.has(c): - var texture = ImageTexture.new() - texture.load(path+"/"+data[c]) + var texture = ImageTexture.create_from_image(Image.load_from_file(path+"/"+data[c])) set(c, texture) _load_layer(data) diff --git a/material_maker/panels/paint/paint.gd b/material_maker/panels/paint/paint.gd index 5abdd61c9..393e4e24d 100644 --- a/material_maker/panels/paint/paint.gd +++ b/material_maker/panels/paint/paint.gd @@ -95,7 +95,6 @@ func _ready(): set_physics_process(false) set_current_tool(MODE_FREEHAND_DOTS) initialize_2D_paint_select() - initialize_debug_selects() graph_edit.undoredo.disable() graph_edit.node_factory = get_node("/root/MainWindow/NodeFactory") graph_edit.new_material({nodes=[{name="Brush", type="brush"}], connections=[]}) @@ -143,6 +142,7 @@ func get_remote(): func update_brush_graph(): if brush_graph != graph_edit.top_generator: brush_graph = graph_edit.top_generator + brush_graph.set_current_mesh(painted_mesh.mesh) brush_graph.connect("graph_changed", Callable(self, "on_brush_graph_changed")) on_brush_graph_changed() @@ -849,25 +849,6 @@ func debug_get_texture_names(): func debug_get_texture(_ID): return mask -func initialize_debug_selects(): - for s in [ $VSplitContainer/HSplitContainer/Painter/Debug/Select1, $VSplitContainer/HSplitContainer/Painter/Debug/Select2 ]: - s.clear() - var index = 0 - for p in [ self, $Painter, $PaintLayers ]: - for i in p.debug_get_texture_names(): - s.add_item(i, index) - index += 1 - -func _on_DebugSelect_item_selected(ID, t): - var texture = [$VSplitContainer/HSplitContainer/Painter/Debug/Texture1, $VSplitContainer/HSplitContainer/Painter/Debug/Texture2][t] - for p in [ self, $Painter, $PaintLayers ]: - var textures_count = p.debug_get_texture_names().size() - if ID < textures_count: - texture.texture = p.debug_get_texture(ID) - texture.visible = (texture.texture != null) - return - ID -= textures_count - # Brush options UI var ignore_button_toggle : bool = false @@ -969,3 +950,30 @@ func _on_Painter_end_of_stroke(stroke_state): undoredo.add("Paint Stroke", [undo_command], [redo_command]) +var last_hsplit_offset : int = 0 + +func _on_h_split_container_dragged(offset): + var hsplit_offset : int = $VSplitContainer/HSplitContainer.size.x - offset + if last_hsplit_offset > hsplit_offset and hsplit_offset < 25: + $VSplitContainer/HSplitContainer/Painter2D.visible = false + $VSplitContainer/HSplitContainer/Painter/Show2DPaint.visible = true + last_hsplit_offset = hsplit_offset + +func _on_show_2d_paint_pressed(): + $VSplitContainer/HSplitContainer/Painter2D.visible = true + $VSplitContainer/HSplitContainer/Painter/Show2DPaint.visible = false + $VSplitContainer/HSplitContainer.split_offset = $VSplitContainer/HSplitContainer.size.x - 100 + +var last_vsplit_offset : int = 0 + +func _on_v_split_container_dragged(offset): + var vsplit_offset : int = $VSplitContainer.size.y - offset + if last_vsplit_offset > vsplit_offset and vsplit_offset < 25: + $VSplitContainer/GraphEdit.visible = false + $VSplitContainer/HSplitContainer/Painter/ShowBrushGraph.visible = true + last_vsplit_offset = vsplit_offset + +func _on_show_brush_graph_pressed(): + $VSplitContainer/GraphEdit.visible = true + $VSplitContainer/HSplitContainer/Painter/ShowBrushGraph.visible = false + $VSplitContainer.split_offset = $VSplitContainer.size.y - 100 diff --git a/material_maker/panels/paint/paint.tscn b/material_maker/panels/paint/paint.tscn index 5d2249fe3..a6b569dde 100644 --- a/material_maker/panels/paint/paint.tscn +++ b/material_maker/panels/paint/paint.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=34 format=3 uid="uid://qx02gvymgb5o"] +[gd_scene load_steps=36 format=3 uid="uid://qx02gvymgb5o"] [ext_resource type="Script" path="res://material_maker/tools/undo_redo/undo_redo.gd" id="1"] [ext_resource type="PackedScene" uid="uid://ftx52hy53io2" path="res://material_maker/panels/paint/export.tscn" id="3"] @@ -96,6 +96,14 @@ region = Rect2(128, 224, 32, 32) atlas = ExtResource("5") region = Rect2(160, 224, 32, 32) +[sub_resource type="AtlasTexture" id="AtlasTexture_knugp"] +atlas = ExtResource("5") +region = Rect2(128, 96, 16, 32) + +[sub_resource type="AtlasTexture" id="AtlasTexture_g8gfk"] +atlas = ExtResource("5") +region = Rect2(0, 144, 32, 16) + [sub_resource type="Shader" id="30"] code = "shader_type canvas_item; @@ -128,6 +136,10 @@ shader_parameter/preview_2d_center = Vector2(0.5, 0.5) anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 +offset_right = 1199.0 +offset_bottom = 799.0 +grow_horizontal = 2 +grow_vertical = 2 mouse_filter = 2 script = ExtResource("16") @@ -168,7 +180,7 @@ stretch = true [node name="MainView" type="SubViewport" parent="VSplitContainer/HSplitContainer/Painter/View"] own_world_3d = true handle_input_locally = false -size = Vector2i(10, 10) +size = Vector2i(800, 480) render_target_update_mode = 4 [node name="CameraPosition" type="Node3D" parent="VSplitContainer/HSplitContainer/Painter/View/MainView"] @@ -462,64 +474,39 @@ max_value = 250.0 step = 1.0 float_only = true -[node name="Debug" type="Control" parent="VSplitContainer/HSplitContainer/Painter"] -visible = false -anchors_preset = 0 -anchor_right = 1.0 -anchor_bottom = 1.0 -mouse_filter = 2 - -[node name="Texture1" type="TextureRect" parent="VSplitContainer/HSplitContainer/Painter/Debug"] +[node name="Show2DPaint" type="TextureButton" parent="VSplitContainer/HSplitContainer/Painter"] visible = false -custom_minimum_size = Vector2(256, 256) -layout_mode = 0 -anchor_left = 0.5 -anchor_top = 1.0 -anchor_right = 0.5 -anchor_bottom = 1.0 -offset_left = -352.462 -offset_top = -277.766 -offset_right = -96.4617 -offset_bottom = -21.766 -mouse_filter = 2 -expand_mode = 1 - -[node name="Select1" type="OptionButton" parent="VSplitContainer/HSplitContainer/Painter/Debug"] -layout_mode = 0 -anchor_left = 0.5 +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 anchor_top = 1.0 -anchor_right = 0.5 +anchor_right = 1.0 anchor_bottom = 1.0 -offset_left = -256.799 -offset_top = -20.0 -offset_right = -181.799 -size_flags_horizontal = 0 - -[node name="Texture2" type="TextureRect" parent="VSplitContainer/HSplitContainer/Painter/Debug"] +offset_left = -16.0 +offset_top = -50.0 +offset_bottom = -18.0 +grow_horizontal = 0 +grow_vertical = 0 +texture_normal = SubResource("AtlasTexture_knugp") +ignore_texture_size = true +stretch_mode = 4 + +[node name="ShowBrushGraph" type="TextureButton" parent="VSplitContainer/HSplitContainer/Painter"] visible = false -custom_minimum_size = Vector2(256, 256) -layout_mode = 0 -anchor_left = 0.5 -anchor_top = 1.0 -anchor_right = 0.5 -anchor_bottom = 1.0 -offset_left = -95.4758 -offset_top = -277.406 -offset_right = 160.524 -offset_bottom = -21.4056 -mouse_filter = 2 -expand_mode = 1 - -[node name="Select2" type="OptionButton" parent="VSplitContainer/HSplitContainer/Painter/Debug"] -layout_mode = 0 -anchor_left = 0.5 +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 anchor_top = 1.0 -anchor_right = 0.5 +anchor_right = 1.0 anchor_bottom = 1.0 -offset_left = -8.5202 -offset_top = -20.0 -offset_right = 66.4798 -size_flags_horizontal = 0 +offset_left = -50.0 +offset_top = -16.0 +offset_right = -18.0 +grow_horizontal = 0 +grow_vertical = 0 +texture_normal = SubResource("AtlasTexture_g8gfk") +ignore_texture_size = true +stretch_mode = 4 [node name="Painter2D" type="Control" parent="VSplitContainer/HSplitContainer"] custom_minimum_size = Vector2(10, 10) @@ -555,12 +542,15 @@ mouse_filter = 2 layout_mode = 2 size_flags_vertical = 3 focus_mode = 1 +scroll_offset = Vector2(0, -308) shader_context_defs = "uniform sampler2D mesh_normal_tex; " [connection signal="end_of_stroke" from="Painter" to="." method="_on_Painter_end_of_stroke"] [connection signal="painted" from="Painter" to="PaintLayers" method="_on_Painter_painted"] [connection signal="layer_selected" from="PaintLayers" to="." method="_on_PaintLayers_layer_selected"] +[connection signal="dragged" from="VSplitContainer" to="." method="_on_v_split_container_dragged"] +[connection signal="dragged" from="VSplitContainer/HSplitContainer" to="." method="_on_h_split_container_dragged"] [connection signal="gui_input" from="VSplitContainer/HSplitContainer/Painter/View" to="." method="_on_View_gui_input"] [connection signal="mouse_entered" from="VSplitContainer/HSplitContainer/Painter/View" to="." method="_on_View_mouse_entered"] [connection signal="mouse_exited" from="VSplitContainer/HSplitContainer/Painter/View" to="." method="_on_View_mouse_exited"] @@ -584,8 +574,8 @@ shader_context_defs = "uniform sampler2D mesh_normal_tex; [connection signal="value_changed" from="VSplitContainer/HSplitContainer/Painter/Options/OptionsPanel/Jitter/JitterOpacity" to="." method="_on_Brush_value_changed" binds= ["jitter_opacity"]] [connection signal="value_changed" from="VSplitContainer/HSplitContainer/Painter/Options/OptionsPanel/Jitter/JitterHardness" to="." method="_on_BrushHardness_value_changed"] [connection signal="value_changed" from="VSplitContainer/HSplitContainer/Painter/Options/OptionsPanel/Jitter/JitterSpacing" to="." method="_on_BrushOpacity_value_changed"] -[connection signal="item_selected" from="VSplitContainer/HSplitContainer/Painter/Debug/Select1" to="." method="_on_DebugSelect_item_selected" binds= [0]] -[connection signal="item_selected" from="VSplitContainer/HSplitContainer/Painter/Debug/Select2" to="." method="_on_DebugSelect_item_selected" binds= [1]] +[connection signal="pressed" from="VSplitContainer/HSplitContainer/Painter/Show2DPaint" to="." method="_on_show_2d_paint_pressed"] +[connection signal="pressed" from="VSplitContainer/HSplitContainer/Painter/ShowBrushGraph" to="." method="_on_show_brush_graph_pressed"] [connection signal="item_selected" from="VSplitContainer/HSplitContainer/Painter2D/VBoxContainer/ChannelSelect" to="." method="_on_ChannelSelect_item_selected"] [connection signal="gui_input" from="VSplitContainer/HSplitContainer/Painter2D/VBoxContainer/Texture2D" to="." method="_on_Texture_gui_input"] [connection signal="resized" from="VSplitContainer/HSplitContainer/Painter2D/VBoxContainer/Texture2D" to="." method="_on_Texture_resized"] diff --git a/material_maker/tools/painter/painter.gd b/material_maker/tools/painter/painter.gd index 273a1afe1..709a796e1 100644 --- a/material_maker/tools/painter/painter.gd +++ b/material_maker/tools/painter/painter.gd @@ -316,12 +316,19 @@ func update_brush_params(shader_params : Dictionary) -> void: if brush_preview_material != null: brush_preview_material.set_shader_parameter(p, brush_params[p]) paint_shader.set_parameter(p, shader_params[p]) + #print(p+" = "+str(shader_params[p])) func show_pattern(b): if pattern_shown != b: pattern_shown = b update_brush() +func replace_predefs(s : String) -> String: + s = s.replace("mesh_aabb_position", "vec3(%.09f, %.09f, %.09f)" % [ mesh_aabb.position.x, mesh_aabb.position.y, mesh_aabb.position.z ]) + s = s.replace("mesh_aabb_size", "vec3(%.09f, %.09f, %.09f)" % [ mesh_aabb.size.x, mesh_aabb.size.y, mesh_aabb.size.z ]) + s = s.replace("mesh_inv_uv_tex", "mesh_%d_position" % [ abs(mesh.get_instance_id()) ]) + return s + func update_brush(update_shaders : bool = false): #if brush_params.albedo_texture_mode != 2: $Pattern.visible = false if brush_preview_material != null: @@ -379,6 +386,9 @@ func update_brush(update_shaders : bool = false): paint_shader.add_parameter_or_texture("texture_scale", "float", 1.0) paint_shader.add_parameter_or_texture("tex2view_tex", "sampler2D", t2v_texture) paint_shader.add_parameter_or_texture("seams", "sampler2D", mesh_seams_tex) + paint_shader.add_parameter_or_texture("mesh_%d_position" % [ abs(mesh.get_instance_id()) ], "sampler2D", mesh_position_tex) + paint_shader.add_parameter_or_texture("mesh_%d_normal" % [ abs(mesh.get_instance_id()) ], "sampler2D", mesh_normal_tex) + paint_shader.add_parameter_or_texture("mesh_%d_tangent" % [ abs(mesh.get_instance_id()) ], "sampler2D", mesh_tangent_tex) paint_shader.add_parameter_or_texture("seams_multiplier", "float", 256.0) paint_shader.add_parameter_or_texture("fill", "bool", false) @@ -395,6 +405,7 @@ func update_brush(update_shaders : bool = false): paint_shader.add_parameter_or_texture("pattern_angle", "float", 0.0) + paint_shader.add_parameter_or_texture("jitter", "bool", true) paint_shader.add_parameter_or_texture("jitter_position", "float", 0.0) paint_shader.add_parameter_or_texture("jitter_size", "float", 0.0) paint_shader.add_parameter_or_texture("jitter_angle", "float", 0.0) @@ -404,7 +415,6 @@ func update_brush(update_shaders : bool = false): paint_shader.add_parameter_or_texture("stroke_length", "float", 0.0) paint_shader.add_parameter_or_texture("stroke_angle", "float", 0.0) - paint_shader.add_parameter_or_texture("jitter", "bool", false) var context : MMGenContext = MMGenContext.new() var brush_shader_code : MMGenBase.ShaderCode = brush_node.get_shader_code("brush_uv", 0, context) @@ -464,9 +474,9 @@ func update_brush(update_shaders : bool = false): BRUSH_MODE="\""+get_brush_mode()+"\"", TEXTURE_TYPE="\"paint\"", GENERATED_IMAGE=texture_defs[0].name, - DEFINITIONS=global_definitions+definitions, - BRUSH_CODE=brush_code, - PATTERN_CODE=pattern_code + DEFINITIONS=replace_predefs(global_definitions+definitions), + BRUSH_CODE=replace_predefs(brush_code), + PATTERN_CODE=replace_predefs(pattern_code) } replaces["@MISC_FUNCTIONS"] = load("res://addons/material_maker/shader_functions.tres").text await paint_shader.set_shader_ext(shader_template, texture_defs, replaces) diff --git a/material_maker/tools/painter/shaders/brush.gdshader b/material_maker/tools/painter/shaders/brush.gdshader index 6be7046c0..c1ef5e66f 100644 --- a/material_maker/tools/painter/shaders/brush.gdshader +++ b/material_maker/tools/painter/shaders/brush.gdshader @@ -20,6 +20,7 @@ uniform float pattern_scale = 10.0; uniform float pattern_angle = 0.0; uniform float pattern_alpha = 0.0; uniform float pressure = 1.0; +uniform vec2 tilt = vec2(0.0, 0.0); uniform sampler2D view2tex_tex; uniform vec3 mesh_aabb_position = vec3(-0.5); diff --git a/material_maker/tools/painter/shaders/paint_shader_template.tres b/material_maker/tools/painter/shaders/paint_shader_template.tres index 80c27930c..6c7fd3d99 100644 --- a/material_maker/tools/painter/shaders/paint_shader_template.tres +++ b/material_maker/tools/painter/shaders/paint_shader_template.tres @@ -311,23 +311,28 @@ DEFINITIONS void do_paint_rgba(vec4 paint_value, float brush_value, vec4 old_stroke_value, vec4 old_layer_value, out vec4 new_stroke_value, out vec4 new_layer_value) { paint_value = clamp(paint_value, vec4(0.0), vec4(1.0)); + brush_value = clamp(brush_value, 0.0, 1.0); old_stroke_value = clamp(old_stroke_value, vec4(0.0), vec4(1.0)); old_layer_value = clamp(old_layer_value, vec4(0.0), vec4(1.0)); float stroke_alpha = paint_value.a*brush_value; - float new_alpha = min(max(stroke_alpha, old_stroke_value.a), stroke_alpha + old_stroke_value.a); - new_stroke_value = vec4((paint_value.rgb*stroke_alpha+old_stroke_value.rgb*(new_alpha-stroke_alpha))/new_alpha, new_alpha); + float new_alpha = min(1.0, max(stroke_alpha, old_stroke_value.a)); + new_stroke_value = vec4(mix(paint_value.rgb, old_stroke_value.rgb, new_alpha-stroke_alpha), new_alpha); float layer_apply_alpha = new_alpha*brush_opacity; float layer_alpha_sum = min(1.0, layer_apply_alpha + old_layer_value.a); - new_layer_value = vec4((new_stroke_value.rgb*layer_apply_alpha+old_layer_value.rgb*(layer_alpha_sum-layer_apply_alpha))/layer_alpha_sum, layer_alpha_sum); + new_layer_value = vec4(mix(new_stroke_value.rgb, old_layer_value.rgb, layer_alpha_sum-layer_apply_alpha), layer_alpha_sum); } void do_paint_ggaa(vec4 paint_value, float brush_value, vec4 old_stroke_value, vec4 old_layer_value, out vec4 new_stroke_value, out vec4 new_layer_value) { + paint_value = clamp(paint_value, vec4(0.0), vec4(1.0)); + brush_value = clamp(brush_value, 0.0, 1.0); + old_stroke_value = clamp(old_stroke_value, vec4(0.0), vec4(1.0)); + old_layer_value = clamp(old_layer_value, vec4(0.0), vec4(1.0)); vec2 stroke_alpha = paint_value.ba*brush_value; - vec2 new_alpha = min(max(stroke_alpha, old_stroke_value.ba), stroke_alpha + old_stroke_value.ba); - new_stroke_value = vec4((paint_value.rg*stroke_alpha+old_stroke_value.rg*(new_alpha-stroke_alpha))/new_alpha, new_alpha); + vec2 new_alpha = min(vec2(1.0), stroke_alpha + old_stroke_value.ba); + new_stroke_value = vec4(mix(paint_value.rg, old_stroke_value.rg, new_alpha-stroke_alpha), new_alpha); vec2 layer_apply_alpha = new_alpha*brush_opacity; vec2 layer_alpha_sum = min(vec2(1.0), layer_apply_alpha + old_layer_value.ba); - new_layer_value = vec4((new_stroke_value.rg*layer_apply_alpha+old_layer_value.rg*(layer_alpha_sum-layer_apply_alpha))/layer_alpha_sum, layer_alpha_sum); + new_layer_value = vec4(mix(new_stroke_value.rg, old_layer_value.rg, layer_alpha_sum-layer_apply_alpha), layer_alpha_sum); } void main() {