From d1b8f12b5bb6953dbb0cf318f04aaee949bf99c1 Mon Sep 17 00:00:00 2001 From: Rodolphe Suescun Date: Tue, 14 Aug 2018 15:09:46 +0200 Subject: [PATCH] more refactoring, added combine, emboss, export nodes - Added a combine node that assembles channels into colors - Added an emboss node - Added an export node that generates additional file when exporting the material - Refactored convolution related code --- addons/procedural_material/graph_edit.gd | 4 +- addons/procedural_material/library/base.json | 17 +++ addons/procedural_material/main_window.gd | 2 +- addons/procedural_material/main_window.tscn | 2 +- addons/procedural_material/node_base.gd | 63 +++++----- addons/procedural_material/nodes/blur.gd | 48 ++------ addons/procedural_material/nodes/blur.tscn | 2 +- addons/procedural_material/nodes/combine.gd | 31 +++++ addons/procedural_material/nodes/combine.tscn | 116 ++++++++++++++++++ addons/procedural_material/nodes/emboss.gd | 60 +++++++++ addons/procedural_material/nodes/emboss.tscn | 70 +++++++++++ addons/procedural_material/nodes/export.gd | 27 ++++ addons/procedural_material/nodes/export.tscn | 64 ++++++++++ .../procedural_material/nodes/normal_map.gd | 48 ++++++-- addons/procedural_material/nodes/pattern.tscn | 2 +- examples/bricks.ptex | 2 +- examples/metal_pattern.ptex | 2 +- export_presets.cfg | 6 +- 18 files changed, 478 insertions(+), 88 deletions(-) create mode 100644 addons/procedural_material/nodes/combine.gd create mode 100644 addons/procedural_material/nodes/combine.tscn create mode 100644 addons/procedural_material/nodes/emboss.gd create mode 100644 addons/procedural_material/nodes/emboss.tscn create mode 100644 addons/procedural_material/nodes/export.gd create mode 100644 addons/procedural_material/nodes/export.tscn diff --git a/addons/procedural_material/graph_edit.gd b/addons/procedural_material/graph_edit.gd index bdf9052..3386e38 100644 --- a/addons/procedural_material/graph_edit.gd +++ b/addons/procedural_material/graph_edit.gd @@ -165,7 +165,9 @@ func do_save_file(filename): func export_textures(size = 512): if save_path != null: var prefix = save_path.left(save_path.rfind(".")) - $Material.export_textures(prefix) + for c in get_children(): + if c is GraphNode && c.has_method("export_textures"): + c.export_textures(prefix) func send_changed_signal(): set_need_save(true) diff --git a/addons/procedural_material/library/base.json b/addons/procedural_material/library/base.json index 9d4e0d1..84ab8ac 100644 --- a/addons/procedural_material/library/base.json +++ b/addons/procedural_material/library/base.json @@ -7,6 +7,10 @@ "tree_item":"Filters", "collapsed":false }, + { + "tree_item":"Miscellaneous", + "collapsed":false + }, { "tree_item":"Generators/Image", "type":"image", @@ -65,6 +69,15 @@ "type":"blur", "sigma":1.0 }, + { + "tree_item":"Filters/Combine", + "type":"combine" + }, + { + "tree_item":"Filters/Emboss", + "type":"emboss", + "direction":0 + }, { "tree_item":"Filters/Normal map", "type":"normal_map", @@ -122,5 +135,9 @@ "r": 0 } ] + }, + { + "tree_item":"Miscellaneous/Export", + "type":"export" } ]} \ No newline at end of file diff --git a/addons/procedural_material/main_window.gd b/addons/procedural_material/main_window.gd index 352fe56..55709fb 100644 --- a/addons/procedural_material/main_window.gd +++ b/addons/procedural_material/main_window.gd @@ -107,7 +107,7 @@ func close_material(): func export_material(): var graph_edit = $VBoxContainer/HBoxContainer/Projects.get_current_tab_control() if graph_edit != null: - graph_edit.export_textures(1024) + graph_edit.export_textures(2048) func quit(): get_tree().quit() diff --git a/addons/procedural_material/main_window.tscn b/addons/procedural_material/main_window.tscn index f3e47ee..73fd352 100644 --- a/addons/procedural_material/main_window.tscn +++ b/addons/procedural_material/main_window.tscn @@ -4,7 +4,7 @@ [ext_resource path="res://addons/procedural_material/library.gd" type="Script" id=2] [ext_resource path="res://addons/procedural_material/preview.tscn" type="PackedScene" id=3] -[node name="MainWindow" type="Panel" index="0"] +[node name="MainWindow" type="Panel"] anchor_left = 0.0 anchor_top = 0.0 diff --git a/addons/procedural_material/node_base.gd b/addons/procedural_material/node_base.gd index 72c7a79..517613f 100644 --- a/addons/procedural_material/node_base.gd +++ b/addons/procedural_material/node_base.gd @@ -207,6 +207,37 @@ func _rerender(): # Generic code for convolution nodes +func get_convolution_shader(convolution): + var shader_code + shader_code = "shader_type canvas_item;\n" + shader_code += "uniform sampler2D input_tex;\n" + shader_code += "void fragment() {\n" + shader_code += "vec3 color = vec3(0.0);\n" + for dy in range(-convolution.y, convolution.y+1): + for dx in range(-convolution.x, convolution.x+1): + var i = (2*convolution.x+1)*(dy+convolution.y)+dx+convolution.x + var coef = convolution.kernel[i] + if typeof(coef) == TYPE_INT: + coef = float(coef) + if typeof(coef) == TYPE_REAL: + coef = Vector3(coef, coef, coef) + if typeof(coef) != TYPE_VECTOR3 or coef == Vector3(0, 0, 0): + continue + shader_code += "color += vec3(%.9f, %.9f, %.9f) * textureLod(input_tex, UV+vec2(%.9f, %.9f), %.9f).rgb;\n" % [ coef.x, coef.y, coef.z, dx*convolution.epsilon, dy*convolution.epsilon, convolution.epsilon ] + if convolution.has("scale_before_normalize"): + shader_code += "color *= %.9f;\n" % [ convolution.scale_before_normalize ] + if convolution.has("translate_before_normalize"): + shader_code += "color += vec3(%.9f, %.9f, %.9f);\n" % [ convolution.translate_before_normalize.x, convolution.translate_before_normalize.y, convolution.translate_before_normalize.z ] + if convolution.has("normalize") and convolution.normalize: + shader_code += "color = normalize(color);\n" + if convolution.has("scale"): + shader_code += "color *= %.9f;\n" % [ convolution.scale ] + if convolution.has("translate"): + shader_code += "color += vec3(%.9f, %.9f, %.9f);\n" % [ convolution.translate.x, convolution.translate.y, convolution.translate.z ] + shader_code += "COLOR = vec4(color, 1.0);\n" + shader_code += "}\n" + return shader_code; + func get_shader_code_convolution(src, convolution, uv): var rv = { defs="", code="" } var variant_index = generated_variants.find(uv) @@ -218,38 +249,6 @@ func get_shader_code_convolution(src, convolution, uv): generated_variants.append(uv) var inputs_code = "" var code = "vec3 %s_%d_rgb = " % [ name, variant_index ] - if convolution.has("translate"): - code += "vec3(%.9f, %.9f, %.9f)+" % [ convolution.translate.x, convolution.translate.y, convolution.translate.z ] - if convolution.has("scale"): - code += "%.9f*" % [ convolution.scale ] - if convolution.has("normalize") and convolution.normalize: - code += "normalize" - code += "(" - if convolution.has("translate_before_normalize"): - code += "vec3(%.9f, %.9f, %.9f)+" % [ convolution.translate_before_normalize.x, convolution.translate_before_normalize.y, convolution.translate_before_normalize.z ] - if convolution.has("scale_before_normalize"): - code += "%.9f*" % [ convolution.scale_before_normalize ] - code += "(" - var first = true - for dy in range(-2, 3): - for dx in range(-2, 3): - var i = 5*(dy+2)+dx+2 - var coef = convolution.kernel[i] - if typeof(coef) == TYPE_REAL: - coef = Vector3(coef, coef, coef) - if typeof(coef) != TYPE_VECTOR3 or coef == Vector3(0, 0, 0): - continue - var src_code = src.get_shader_code(uv+"+vec2(%.9f, %.9f)" % [ dx*convolution.epsilon, dy*convolution.epsilon ]) - if need_defs: - rv.defs = src_code.defs - need_defs = false - inputs_code += src_code.code - if !first: - code += "+" - else: - first = false - code += "vec3(%.9f, %.9f, %.9f)*(%s)"% [ coef.x, coef.y, coef.z, src_code.rgb ] - code += "));" rv.code += inputs_code + code rv.rgb = name+"_"+str(variant_index)+"_rgb" return rv diff --git a/addons/procedural_material/nodes/blur.gd b/addons/procedural_material/nodes/blur.gd index b24e73b..b6fdb31 100644 --- a/addons/procedural_material/nodes/blur.gd +++ b/addons/procedural_material/nodes/blur.gd @@ -15,34 +15,31 @@ func _ready(): final_texture = ImageTexture.new() initialize_properties([ $HBoxContainer1/epsilon, $HBoxContainer2/sigma ]) -func get_gaussian_blur_shader(v): - var shader_code +func get_gaussian_blur_shader(horizontal): + var convolution = { x=0, y=0, kernel=[], epsilon=epsilon } var kernel_size = 10 - var kernel = [] - kernel.resize(2*kernel_size+1) - shader_code = "shader_type canvas_item;\n" - shader_code += "uniform sampler2D input_tex;\n" - shader_code += "void fragment() {\n" - shader_code += "vec3 color = vec3(0.0);" + if horizontal: + convolution.x = kernel_size + else: + convolution.y = kernel_size + convolution.kernel.resize(2*kernel_size+1) var sum = 0 for x in range(-kernel_size, kernel_size+1): var coef = exp(-0.5*(pow((x)/sigma, 2.0))) / (2.0*PI*sigma*sigma) - kernel[x+kernel_size] = coef + convolution.kernel[x+kernel_size] = coef sum += coef for x in range(-kernel_size, kernel_size+1): - shader_code += "color += %.9f*textureLod(input_tex, UV+vec2(%.9f, %.9f), %.9f).rgb;\n" % [ kernel[x+kernel_size] / sum, x*v.x, x*v.y, epsilon ] - shader_code += "COLOR = vec4(color, 1.0);\n" - shader_code += "}\n" - return shader_code; + convolution.kernel[x+kernel_size] /= sum + return get_convolution_shader(convolution) func _rerender(): get_parent().precalculate_shader(input_shader, get_source().get_textures(), 4096, input_texture, self, "pass_1", []) func pass_1(): - get_parent().precalculate_shader(get_gaussian_blur_shader(Vector2(epsilon, 0)), { input=input_texture}, 4096, mid_texture, self, "pass_2", []) + get_parent().precalculate_shader(get_gaussian_blur_shader(true), { input=input_texture}, 4096, mid_texture, self, "pass_2", []) func pass_2(): - get_parent().precalculate_shader(get_gaussian_blur_shader(Vector2(0, epsilon)), { input=mid_texture}, 4096, final_texture, self, "rerender_targets", []) + get_parent().precalculate_shader(get_gaussian_blur_shader(false), { input=mid_texture}, 4096, final_texture, self, "rerender_targets", []) func get_textures(): var list = {} @@ -65,24 +62,3 @@ func _get_shader_code(uv): rv.code = "vec3 "+name+"_"+str(variant_index)+"_rgb = texture("+name+"_tex, "+uv+").rgb;\n" rv.rgb = name+"_"+str(variant_index)+"_rgb" return rv - -func __get_shader_code(uv): - var convolution = { - kernel=[ - 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 - ], - epsilon=epsilon - } - var sum = 0 - for x in range(-2, 3): - for y in range(-2, 3): - var coef = exp(-0.5*(pow((x-2)/sigma, 2.0) + pow((y-2)/sigma, 2.0))) / (2.0*PI*sigma*sigma) - convolution.kernel[x+2+5*(y+2)] = coef - sum += coef - for i in range(25): - convolution.kernel[i] /= sum - return get_shader_code_convolution(convolution, uv) diff --git a/addons/procedural_material/nodes/blur.tscn b/addons/procedural_material/nodes/blur.tscn index 39c17bc..1dbf4d7 100644 --- a/addons/procedural_material/nodes/blur.tscn +++ b/addons/procedural_material/nodes/blur.tscn @@ -5,7 +5,7 @@ [sub_resource type="Theme" id=1] -[node name="Blur" type="GraphNode"] +[node name="Blur" type="GraphNode" index="0"] anchor_left = 0.0 anchor_top = 0.0 diff --git a/addons/procedural_material/nodes/combine.gd b/addons/procedural_material/nodes/combine.gd new file mode 100644 index 0000000..c74fa58 --- /dev/null +++ b/addons/procedural_material/nodes/combine.gd @@ -0,0 +1,31 @@ +tool +extends "res://addons/procedural_material/node_base.gd" + +func _get_shader_code(uv): + var rv = { defs="", code="" } + var src0 = get_source(0) + var src1 = get_source(1) + var src2 = get_source(2) + var src0_code = { defs="", code="", f="0.0" } + var src1_code = { defs="", code="", f="0.0" } + var src2_code = { defs="", code="", f="0.0" } + if src0 != null: + src0_code = src0.get_shader_code(uv) + if src1 != null: + src1_code = src1.get_shader_code(uv) + if src2 != null: + src2_code = src2.get_shader_code(uv) + if generated_variants.empty(): + rv.defs = src0_code.defs; + rv.defs += src1_code.defs; + rv.defs += src2_code.defs; + var variant_index = generated_variants.find(uv) + if variant_index == -1: + variant_index = generated_variants.size() + generated_variants.append(uv) + rv.code = src0_code.code + rv.code += src1_code.code + rv.code += src2_code.code + rv.code += "vec3 %s_%d_rgb = vec3(%s, %s, %s);\n" % [ name, variant_index, src0_code.f, src1_code.f, src2_code.f ] + rv.rgb = "%s_%d_rgb" % [ name, variant_index ] + return rv diff --git a/addons/procedural_material/nodes/combine.tscn b/addons/procedural_material/nodes/combine.tscn new file mode 100644 index 0000000..eec05a8 --- /dev/null +++ b/addons/procedural_material/nodes/combine.tscn @@ -0,0 +1,116 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/procedural_material/nodes/combine.gd" type="Script" id=1] + +[sub_resource type="Theme" id=1] + + +[node name="Combine" type="GraphNode" index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 204.0 +margin_top = 72.0 +margin_right = 306.0 +margin_bottom = 145.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 1 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +theme = SubResource( 1 ) +title = "Combine" +offset = Vector2( 0, 0 ) +show_close = true +resizable = false +selected = false +comment = false +overlay = 0 +slot/0/left_enabled = true +slot/0/left_type = 0 +slot/0/left_color = Color( 0.5, 0.5, 1, 1 ) +slot/0/right_enabled = true +slot/0/right_type = 0 +slot/0/right_color = Color( 0.5, 0.5, 1, 1 ) +slot/1/left_enabled = true +slot/1/left_type = 0 +slot/1/left_color = Color( 0.498039, 0.498039, 1, 1 ) +slot/1/right_enabled = false +slot/1/right_type = 0 +slot/1/right_color = Color( 0.498039, 0.498039, 1, 1 ) +slot/2/left_enabled = true +slot/2/left_type = 0 +slot/2/left_color = Color( 0.498039, 0.498039, 1, 1 ) +slot/2/right_enabled = false +slot/2/right_type = 0 +slot/2/right_color = Color( 0.498039, 0.498039, 1, 1 ) +script = ExtResource( 1 ) +_sections_unfolded = [ "Theme", "slot", "slot/0", "slot/1", "slot/2" ] + +[node name="R" type="Label" parent="." index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 16.0 +margin_top = 24.0 +margin_right = 86.0 +margin_bottom = 38.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 2 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 4 +text = "R" +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 + +[node name="G" type="Label" parent="." index="1"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 16.0 +margin_top = 38.0 +margin_right = 86.0 +margin_bottom = 52.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 2 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 4 +text = "G" +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 + +[node name="B" type="Label" parent="." index="2"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 16.0 +margin_top = 53.0 +margin_right = 86.0 +margin_bottom = 67.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 2 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 4 +text = "B" +percent_visible = 1.0 +lines_skipped = 0 +max_lines_visible = -1 + + diff --git a/addons/procedural_material/nodes/emboss.gd b/addons/procedural_material/nodes/emboss.gd new file mode 100644 index 0000000..eca8a00 --- /dev/null +++ b/addons/procedural_material/nodes/emboss.gd @@ -0,0 +1,60 @@ +tool +extends "res://addons/procedural_material/node_base.gd" + +var direction = 0 + +var input_shader = "" +var input_texture +var final_texture + +const CONVOLUTION = { + x=1, + y=1, + kernel=[ + 1, 2, 1, + 0, 0, 0, + -1, -2, -1 + ], + epsilon=1.0/1024, + scale=0.5, + translate=Vector3(0.5, 0.5, 0.5) +} + +const INDICES = [ 0, 1, 2, 5, 8, 7, 6, 3 ] +const COEFS = [ 1, 2, 1, 0, -1, -2, -1, 0 ] + +func _ready(): + input_texture = ImageTexture.new() + final_texture = ImageTexture.new() + initialize_properties([ $direction ]) + +func _rerender(): + get_parent().precalculate_shader(input_shader, get_source().get_textures(), 1024, input_texture, self, "pass_1", []) + +func pass_1(): + var convolution = CONVOLUTION + for i in range(8): + convolution.kernel[INDICES[i]] = COEFS[(i+8-int(direction))%8] + get_parent().precalculate_shader(get_convolution_shader(convolution), {input=input_texture}, 1024, final_texture, self, "rerender_targets", []) + +func get_textures(): + var list = {} + list[name] = final_texture + return list + +func _get_shader_code(uv): + var rv = { defs="", code="" } + var src = get_source() + if src == null: + return rv + input_shader = do_generate_shader(src.get_shader_code("UV")) + _rerender() + if generated_variants.empty(): + rv.defs = "uniform sampler2D "+name+"_tex;\n" + var variant_index = generated_variants.find(uv) + if variant_index == -1: + variant_index = generated_variants.size() + generated_variants.append(uv) + rv.code = "vec3 "+name+"_"+str(variant_index)+"_rgb = texture("+name+"_tex, "+uv+").rgb;\n" + rv.rgb = name+"_"+str(variant_index)+"_rgb" + return rv diff --git a/addons/procedural_material/nodes/emboss.tscn b/addons/procedural_material/nodes/emboss.tscn new file mode 100644 index 0000000..a11b5c3 --- /dev/null +++ b/addons/procedural_material/nodes/emboss.tscn @@ -0,0 +1,70 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/procedural_material/nodes/emboss.gd" type="Script" id=1] + +[sub_resource type="Theme" id=1] + + +[node name="Emboss" type="GraphNode" index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 1.0 +margin_top = 1.0 +margin_right = 124.0 +margin_bottom = 54.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 1 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +theme = SubResource( 1 ) +title = "Emboss" +offset = Vector2( 0, 0 ) +show_close = true +resizable = false +selected = false +comment = false +overlay = 0 +slot/0/left_enabled = true +slot/0/left_type = 0 +slot/0/left_color = Color( 0.5, 0.5, 1, 1 ) +slot/0/right_enabled = true +slot/0/right_type = 0 +slot/0/right_color = Color( 0.5, 0.5, 1, 1 ) +script = ExtResource( 1 ) +_sections_unfolded = [ "Theme", "slot", "slot/0" ] + +[node name="direction" type="OptionButton" parent="." index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 16.0 +margin_top = 24.0 +margin_right = 107.0 +margin_bottom = 44.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +focus_mode = 2 +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +toggle_mode = false +action_mode = 0 +enabled_focus_mode = 2 +shortcut = null +group = null +text = "Objet 0" +flat = false +align = 0 +items = [ "N", null, false, 0, null, "NE", null, false, 1, null, "E", null, false, 2, null, "SE", null, false, 3, null, "S", null, false, 4, null, "SW", null, false, 5, null, "W", null, false, 6, null, "NW", null, false, 7, null ] +selected = 0 +_sections_unfolded = [ "Caret", "Placeholder" ] + + diff --git a/addons/procedural_material/nodes/export.gd b/addons/procedural_material/nodes/export.gd new file mode 100644 index 0000000..4cf46b1 --- /dev/null +++ b/addons/procedural_material/nodes/export.gd @@ -0,0 +1,27 @@ +tool +extends "res://addons/procedural_material/node_base.gd" + +func _ready(): + pass + +func _get_shader_code(uv): + var rv = { defs="", code="", f="0.0" } + var src = get_source() + if src != null: + rv = src.get_shader_code(uv) + return rv + +func export_textures(prefix): + var suffix = $Suffix.text + if suffix != "": + get_parent().export_texture(get_source(), prefix+"_"+suffix+".png", 1024) + +func serialize(): + var data = .serialize() + data.suffix = $Suffix.text + return data + +func deserialize(data): + if data.has("suffix"): + $Suffix.text = data.suffix + .deserialize(data) diff --git a/addons/procedural_material/nodes/export.tscn b/addons/procedural_material/nodes/export.tscn new file mode 100644 index 0000000..e396a64 --- /dev/null +++ b/addons/procedural_material/nodes/export.tscn @@ -0,0 +1,64 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://addons/procedural_material/nodes/export.gd" type="Script" id=1] + +[sub_resource type="Theme" id=1] + + +[node name="Export" type="GraphNode"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_right = 114.0 +margin_bottom = 55.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +mouse_filter = 1 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +theme = SubResource( 1 ) +title = "Export" +offset = Vector2( 0, 0 ) +show_close = false +resizable = false +selected = false +comment = false +overlay = 0 +slot/0/left_enabled = true +slot/0/left_type = 0 +slot/0/left_color = Color( 0.5, 0.5, 1, 1 ) +slot/0/right_enabled = false +slot/0/right_type = 0 +slot/0/right_color = Color( 0.5, 0.5, 1, 1 ) +script = ExtResource( 1 ) +_sections_unfolded = [ "Theme", "slot", "slot/0" ] + +[node name="Suffix" type="LineEdit" parent="." index="0"] + +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 +margin_left = 16.0 +margin_top = 24.0 +margin_right = 98.0 +margin_bottom = 48.0 +rect_pivot_offset = Vector2( 0, 0 ) +rect_clip_content = false +focus_mode = 2 +mouse_filter = 0 +mouse_default_cursor_shape = 1 +size_flags_horizontal = 1 +size_flags_vertical = 1 +text = "suffix" +focus_mode = 2 +context_menu_enabled = true +placeholder_alpha = 0.6 +caret_blink = false +caret_blink_speed = 0.65 +caret_position = 0 + + diff --git a/addons/procedural_material/nodes/normal_map.gd b/addons/procedural_material/nodes/normal_map.gd index 6f8017c..979485e 100644 --- a/addons/procedural_material/nodes/normal_map.gd +++ b/addons/procedural_material/nodes/normal_map.gd @@ -3,15 +3,19 @@ extends "res://addons/procedural_material/node_base.gd" var amount = 0.0 +var input_shader = "" +var input_texture +var final_texture + const CONVOLUTION = { + x=1, + y=1, kernel=[ - 0, 0, 0, 0, 0, - 0, Vector3(-1, -1, 0), Vector3(0, -2, 0), Vector3(1, -1, 0), 0, - 0, Vector3(-2, 0, 0), 0, Vector3(2, 0, 0), 0, - 0, Vector3(-1, 1, 0), Vector3(0, 2, 0), Vector3(1, 1, 0), 0, - 0, 0, 0, 0, 0 + Vector3(-1, -1, 0), Vector3(0, -2, 0), Vector3(1, -1, 0), + Vector3(-2, 0, 0), 0, Vector3(2, 0, 0), + Vector3(-1, 1, 0), Vector3(0, 2, 0), Vector3(1, 1, 0), ], - epsilon=0.005, + epsilon=1.0/1024, normalize=true, translate_before_normalize=Vector3(0.0, 0.0, -1.0), scale_before_normalize=0.5, @@ -20,12 +24,36 @@ const CONVOLUTION = { } func _ready(): + input_texture = ImageTexture.new() + final_texture = ImageTexture.new() initialize_properties([ $amount ]) +func _rerender(): + get_parent().precalculate_shader(input_shader, get_source().get_textures(), 1024, input_texture, self, "pass_1", []) + +func pass_1(): + var convolution = CONVOLUTION + convolution.scale_before_normalize = 8.0*amount + get_parent().precalculate_shader(get_convolution_shader(convolution), { input=input_texture}, 1024, final_texture, self, "rerender_targets", []) + +func get_textures(): + var list = {} + list[name] = final_texture + return list + func _get_shader_code(uv): + var rv = { defs="", code="" } var src = get_source() if src == null: - return { defs="", code="" } - var convolution = CONVOLUTION - convolution.scale_before_normalize = amount - return get_shader_code_convolution(src, convolution, uv) + return rv + input_shader = do_generate_shader(src.get_shader_code("UV")) + _rerender() + if generated_variants.empty(): + rv.defs = "uniform sampler2D "+name+"_tex;\n" + var variant_index = generated_variants.find(uv) + if variant_index == -1: + variant_index = generated_variants.size() + generated_variants.append(uv) + rv.code = "vec3 "+name+"_"+str(variant_index)+"_rgb = texture("+name+"_tex, "+uv+").rgb;\n" + rv.rgb = name+"_"+str(variant_index)+"_rgb" + return rv diff --git a/addons/procedural_material/nodes/pattern.tscn b/addons/procedural_material/nodes/pattern.tscn index 9208d98..a510349 100644 --- a/addons/procedural_material/nodes/pattern.tscn +++ b/addons/procedural_material/nodes/pattern.tscn @@ -5,7 +5,7 @@ [sub_resource type="Theme" id=1] -[node name="Pattern" type="GraphNode" index="0"] +[node name="Pattern" type="GraphNode"] anchor_left = 0.0 anchor_top = 0.0 diff --git a/examples/bricks.ptex b/examples/bricks.ptex index c45dd77..8f37b4f 100644 --- a/examples/bricks.ptex +++ b/examples/bricks.ptex @@ -1 +1 @@ -{"connections":[{"from":"Perlin","from_port":0,"to":"Warp","to_port":1},{"from":"Warp","from_port":0,"to":"colorize_2","to_port":0},{"from":"colorize_2","from_port":0,"to":"blend_0","to_port":2},{"from":"colorize_1","from_port":0,"to":"blend_0","to_port":0},{"from":"colorize_0","from_port":0,"to":"blend_0","to_port":1},{"from":"blend_0","from_port":0,"to":"Material","to_port":0},{"from":"normal_map_0","from_port":0,"to":"Material","to_port":4},{"from":"colorize_2","from_port":0,"to":"colorize_4","to_port":0},{"from":"colorize_4","from_port":0,"to":"Material","to_port":2},{"from":"Bricks","from_port":0,"to":"Warp","to_port":0},{"from":"blend_1","from_port":0,"to":"colorize_1","to_port":0},{"from":"Bricks","from_port":1,"to":"blend_1","to_port":1},{"from":"Warp","from_port":0,"to":"blend_2","to_port":0},{"from":"Perlin","from_port":0,"to":"blend_2","to_port":1},{"from":"blend_2","from_port":0,"to":"colorize_3","to_port":0},{"from":"blend_2","from_port":0,"to":"colorize_6","to_port":0},{"from":"colorize_6","from_port":0,"to":"normal_map_0","to_port":0},{"from":"Perlin","from_port":0,"to":"blend_1","to_port":0},{"from":"Perlin","from_port":0,"to":"colorize_0","to_port":0},{"from":"uniform_0","from_port":0,"to":"Material","to_port":1},{"from":"colorize_3","from_port":0,"to":"Material","to_port":5}],"nodes":[{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":1,"g":1,"pos":1,"r":1}],"name":"colorize_0","node_position":{"x":560.943665,"y":50},"type":"colorize"},{"gradient":[{"b":0.0016,"g":0.0016,"pos":0,"r":0.307292},{"b":0,"g":0.180135,"pos":0.2,"r":0.606771},{"b":0,"g":0,"pos":0.354545,"r":0.3125},{"b":0,"g":0.19869,"pos":0.554545,"r":0.669271},{"b":0.019368,"g":0.060224,"pos":0.754545,"r":0.309896},{"b":0,"g":0.180135,"pos":1,"r":0.606771}],"name":"colorize_1","node_position":{"x":562.943665,"y":-65},"type":"colorize"},{"bevel":0.2,"columns":3,"mortar":0.05,"name":"Bricks","node_position":{"x":118,"y":-22},"row_offset":0.5,"rows":6,"type":"bricks"},{"amount":0.04,"name":"Warp","node_position":{"x":384,"y":10.75},"type":"warp"},{"albedo_color":{"a":1,"b":1,"g":1,"r":1,"type":"Color"},"ao_light_affect":1,"depth_scale":0,"emission_energy":1,"metallic":1,"name":"Material","node_position":{"x":1081,"y":208},"normal_scale":1,"roughness":1,"type":"material"},{"amount":0.5,"blend_type":0,"name":"blend_2","node_position":{"x":536,"y":331},"type":"blend"},{"gradient":[{"b":1,"g":1,"pos":0,"r":1},{"b":0.463542,"g":0.463542,"pos":1,"r":0.463542}],"name":"colorize_4","node_position":{"x":708,"y":224},"type":"colorize"},{"amount":0.5,"blend_type":0,"name":"blend_0","node_position":{"x":836.943726,"y":-71},"type":"blend"},{"color":{"a":1,"b":0,"g":0,"r":0,"type":"Color"},"name":"uniform_0","node_position":{"x":892,"y":179},"type":"uniform"},{"amount":0.5,"name":"normal_map_0","node_position":{"x":913,"y":278},"type":"normal_map"},{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":1,"g":1,"pos":0.1,"r":1}],"name":"colorize_2","node_position":{"x":544.943665,"y":159},"type":"colorize"},{"amount":0.5,"blend_type":6,"name":"blend_1","node_position":{"x":349,"y":215},"type":"blend"},{"iterations":6,"name":"Perlin","node_position":{"x":115,"y":194},"persistence":0.85,"scale_x":4,"scale_y":4,"type":"perlin"},{"gradient":[{"b":1,"g":1,"pos":0,"r":1},{"b":0,"g":0,"pos":1,"r":0}],"name":"colorize_6","node_position":{"x":743,"y":291},"type":"colorize"},{"gradient":[{"b":0.510417,"g":0.510417,"pos":0.245455,"r":0.510417},{"b":1,"g":1,"pos":0.536364,"r":1}],"name":"colorize_3","node_position":{"x":753,"y":364},"type":"colorize"}]} \ No newline at end of file +{"connections":[{"from":"Perlin","from_port":0,"to":"Warp","to_port":1},{"from":"Warp","from_port":0,"to":"colorize_2","to_port":0},{"from":"colorize_2","from_port":0,"to":"blend_0","to_port":2},{"from":"colorize_1","from_port":0,"to":"blend_0","to_port":0},{"from":"colorize_0","from_port":0,"to":"blend_0","to_port":1},{"from":"blend_0","from_port":0,"to":"Material","to_port":0},{"from":"normal_map_0","from_port":0,"to":"Material","to_port":4},{"from":"colorize_2","from_port":0,"to":"colorize_4","to_port":0},{"from":"colorize_4","from_port":0,"to":"Material","to_port":2},{"from":"Bricks","from_port":0,"to":"Warp","to_port":0},{"from":"blend_1","from_port":0,"to":"colorize_1","to_port":0},{"from":"Bricks","from_port":1,"to":"blend_1","to_port":1},{"from":"Warp","from_port":0,"to":"blend_2","to_port":0},{"from":"Perlin","from_port":0,"to":"blend_2","to_port":1},{"from":"blend_2","from_port":0,"to":"colorize_3","to_port":0},{"from":"blend_2","from_port":0,"to":"colorize_6","to_port":0},{"from":"colorize_6","from_port":0,"to":"normal_map_0","to_port":0},{"from":"Perlin","from_port":0,"to":"blend_1","to_port":0},{"from":"Perlin","from_port":0,"to":"colorize_0","to_port":0},{"from":"uniform_0","from_port":0,"to":"Material","to_port":1},{"from":"colorize_3","from_port":0,"to":"Material","to_port":5},{"from":"uniform_0","from_port":0,"to":"combine_0","to_port":0},{"from":"colorize_4","from_port":0,"to":"combine_0","to_port":1},{"from":"combine_0","from_port":0,"to":"export_0","to_port":0}],"nodes":[{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":1,"g":1,"pos":1,"r":1}],"name":"colorize_0","node_position":{"x":560.943665,"y":50},"type":"colorize"},{"gradient":[{"b":0.0016,"g":0.0016,"pos":0,"r":0.307292},{"b":0,"g":0.180135,"pos":0.2,"r":0.606771},{"b":0,"g":0,"pos":0.345455,"r":0.3125},{"b":0,"g":0.19869,"pos":0.545455,"r":0.669271},{"b":0.019368,"g":0.060224,"pos":0.745455,"r":0.309896},{"b":0,"g":0.180135,"pos":1,"r":0.606771}],"name":"colorize_1","node_position":{"x":562.943665,"y":-65},"type":"colorize"},{"bevel":0.2,"columns":3,"mortar":0.05,"name":"Bricks","node_position":{"x":118,"y":-22},"row_offset":0.5,"rows":6,"type":"bricks"},{"amount":0.04,"name":"Warp","node_position":{"x":384,"y":10.75},"type":"warp"},{"albedo_color":{"a":1,"b":1,"g":1,"r":1,"type":"Color"},"ao_light_affect":1,"depth_scale":0,"emission_energy":1,"metallic":1,"name":"Material","node_position":{"x":1081,"y":208},"normal_scale":1,"roughness":1,"type":"material"},{"amount":0.5,"blend_type":0,"name":"blend_2","node_position":{"x":536,"y":331},"type":"blend"},{"gradient":[{"b":1,"g":1,"pos":0,"r":1},{"b":0.463542,"g":0.463542,"pos":1,"r":0.463542}],"name":"colorize_4","node_position":{"x":708,"y":224},"type":"colorize"},{"amount":0.5,"blend_type":0,"name":"blend_0","node_position":{"x":836.943726,"y":-71},"type":"blend"},{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":1,"g":1,"pos":0.1,"r":1}],"name":"colorize_2","node_position":{"x":544.943665,"y":159},"type":"colorize"},{"amount":0.5,"blend_type":6,"name":"blend_1","node_position":{"x":349,"y":215},"type":"blend"},{"iterations":6,"name":"Perlin","node_position":{"x":115,"y":194},"persistence":0.85,"scale_x":4,"scale_y":4,"type":"perlin"},{"gradient":[{"b":1,"g":1,"pos":0,"r":1},{"b":0,"g":0,"pos":1,"r":0}],"name":"colorize_6","node_position":{"x":743,"y":291},"type":"colorize"},{"gradient":[{"b":0.510417,"g":0.510417,"pos":0.245455,"r":0.510417},{"b":1,"g":1,"pos":0.536364,"r":1}],"name":"colorize_3","node_position":{"x":753,"y":364},"type":"colorize"},{"amount":0.5,"name":"normal_map_0","node_position":{"x":922,"y":297},"type":"normal_map"},{"color":{"a":1,"b":0,"g":0,"r":0,"type":"Color"},"name":"uniform_0","node_position":{"x":764,"y":164},"type":"uniform"},{"name":"combine_0","node_position":{"x":896,"y":86},"type":"combine"},{"name":"export_0","node_position":{"x":1050,"y":79},"suffix":"mr","type":"export"}]} \ No newline at end of file diff --git a/examples/metal_pattern.ptex b/examples/metal_pattern.ptex index e644f1c..45dd1e6 100644 --- a/examples/metal_pattern.ptex +++ b/examples/metal_pattern.ptex @@ -1 +1 @@ -{"connections":[{"from":"pattern_0","from_port":0,"to":"colorize_0","to_port":0},{"from":"colorize_0","from_port":0,"to":"blend_0","to_port":0},{"from":"transform_0","from_port":0,"to":"blend_0","to_port":1},{"from":"colorize_0","from_port":0,"to":"transform_0","to_port":0},{"from":"blend_0","from_port":0,"to":"transform_1","to_port":0},{"from":"transform_1","from_port":0,"to":"blend_1","to_port":1},{"from":"blend_0","from_port":0,"to":"blend_1","to_port":0},{"from":"blend_1","from_port":0,"to":"colorize_1","to_port":0},{"from":"colorize_1","from_port":0,"to":"normal_map_0","to_port":0},{"from":"normal_map_0","from_port":0,"to":"Material","to_port":4},{"from":"perlin_0","from_port":0,"to":"colorize_2","to_port":0},{"from":"colorize_2","from_port":0,"to":"blend_2","to_port":0},{"from":"blend_2","from_port":0,"to":"Material","to_port":0},{"from":"colorize_4","from_port":0,"to":"blend_2","to_port":2},{"from":"colorize_4","from_port":0,"to":"colorize_5","to_port":0},{"from":"colorize_5","from_port":0,"to":"Material","to_port":1},{"from":"colorize_4","from_port":0,"to":"colorize_6","to_port":0},{"from":"colorize_6","from_port":0,"to":"Material","to_port":2},{"from":"perlin_1","from_port":0,"to":"blend_3","to_port":1},{"from":"colorize_7","from_port":0,"to":"blend_3","to_port":0},{"from":"blend_1","from_port":0,"to":"colorize_7","to_port":0},{"from":"blend_3","from_port":0,"to":"colorize_4","to_port":0},{"from":"uniform_0","from_port":0,"to":"blend_2","to_port":1}],"nodes":[{"iterations":7,"name":"perlin_0","node_position":{"x":1,"y":-330},"persistence":0.85,"scale_x":4,"scale_y":4,"type":"perlin"},{"gradient":[{"b":0,"g":0,"pos":0.018182,"r":0},{"b":1,"g":1,"pos":0.045455,"r":1}],"name":"colorize_0","node_position":{"x":-828,"y":218},"type":"colorize"},{"gradient":[{"b":0,"g":0.152344,"pos":0,"r":0.270833},{"b":0,"g":0.191569,"pos":0.954545,"r":0.557292}],"name":"colorize_2","node_position":{"x":201,"y":-298},"type":"colorize"},{"name":"Material","node_position":{"x":755,"y":-137},"type":"material"},{"amount":0.5,"blend_type":0,"name":"blend_2","node_position":{"x":407.094238,"y":-265.083313},"type":"blend"},{"gradient":[{"b":1,"g":1,"pos":0.609091,"r":1},{"b":0,"g":0,"pos":0.645455,"r":0}],"name":"colorize_5","node_position":{"x":447,"y":-146},"type":"colorize"},{"gradient":[{"b":0,"g":0,"pos":0.445455,"r":0},{"b":1,"g":1,"pos":0.545455,"r":1}],"name":"colorize_4","node_position":{"x":258,"y":-136},"type":"colorize"},{"mix":5,"name":"pattern_0","node_position":{"x":-858,"y":120},"type":"pattern","x_scale":8,"x_wave":0,"y_scale":8,"y_wave":0},{"name":"transform_1","node_position":{"x":-647,"y":285},"repeat":true,"rotate":90,"scale_x":1,"scale_y":1,"translate_x":0.06,"translate_y":0,"type":"transform"},{"amount":1,"blend_type":2,"name":"blend_0","node_position":{"x":-633,"y":181},"type":"blend"},{"amount":1,"blend_type":2,"name":"blend_1","node_position":{"x":-632,"y":77},"type":"blend"},{"color":{"a":1,"b":1,"g":1,"r":1,"type":"Color"},"name":"uniform_0","node_position":{"x":233,"y":-216},"type":"uniform"},{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":1,"g":1,"pos":0.018182,"r":1}],"name":"colorize_7","node_position":{"x":-109.265503,"y":-175},"type":"colorize"},{"amount":0.2,"blend_type":2,"name":"blend_3","node_position":{"x":72.734497,"y":-156},"type":"blend"},{"iterations":7,"name":"perlin_1","node_position":{"x":-161,"y":-86},"persistence":0.75,"scale_x":4,"scale_y":4,"type":"perlin"},{"gradient":[{"b":0.640625,"g":0.640625,"pos":0,"r":0.640625},{"b":1,"g":1,"pos":1,"r":1}],"name":"colorize_6","node_position":{"x":444,"y":-66},"type":"colorize"},{"amount":0.35,"name":"normal_map_0","node_position":{"x":294,"y":76},"type":"normal_map"},{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":1,"g":1,"pos":1,"r":1}],"name":"colorize_1","node_position":{"x":85,"y":72},"type":"colorize"},{"name":"transform_0","node_position":{"x":-845,"y":279},"repeat":true,"rotate":0,"scale_x":1,"scale_y":1,"translate_x":0.06,"translate_y":0.06,"type":"transform"}]} \ No newline at end of file +{"connections":[{"from":"pattern_0","from_port":0,"to":"colorize_0","to_port":0},{"from":"colorize_0","from_port":0,"to":"blend_0","to_port":0},{"from":"transform_0","from_port":0,"to":"blend_0","to_port":1},{"from":"colorize_0","from_port":0,"to":"transform_0","to_port":0},{"from":"blend_0","from_port":0,"to":"transform_1","to_port":0},{"from":"transform_1","from_port":0,"to":"blend_1","to_port":1},{"from":"blend_0","from_port":0,"to":"blend_1","to_port":0},{"from":"blend_1","from_port":0,"to":"colorize_1","to_port":0},{"from":"colorize_1","from_port":0,"to":"normal_map_0","to_port":0},{"from":"normal_map_0","from_port":0,"to":"Material","to_port":4},{"from":"perlin_0","from_port":0,"to":"colorize_2","to_port":0},{"from":"colorize_2","from_port":0,"to":"blend_2","to_port":0},{"from":"blend_2","from_port":0,"to":"Material","to_port":0},{"from":"colorize_4","from_port":0,"to":"blend_2","to_port":2},{"from":"colorize_4","from_port":0,"to":"colorize_5","to_port":0},{"from":"colorize_5","from_port":0,"to":"Material","to_port":1},{"from":"colorize_4","from_port":0,"to":"colorize_6","to_port":0},{"from":"colorize_6","from_port":0,"to":"Material","to_port":2},{"from":"perlin_1","from_port":0,"to":"blend_3","to_port":1},{"from":"colorize_7","from_port":0,"to":"blend_3","to_port":0},{"from":"blend_1","from_port":0,"to":"colorize_7","to_port":0},{"from":"blend_3","from_port":0,"to":"colorize_4","to_port":0},{"from":"uniform_0","from_port":0,"to":"blend_2","to_port":1},{"from":"colorize_5","from_port":0,"to":"combine_0","to_port":0},{"from":"colorize_6","from_port":0,"to":"combine_0","to_port":1},{"from":"combine_0","from_port":0,"to":"export_0","to_port":0}],"nodes":[{"iterations":7,"name":"perlin_0","node_position":{"x":1,"y":-330},"persistence":0.85,"scale_x":4,"scale_y":4,"type":"perlin"},{"gradient":[{"b":0,"g":0,"pos":0.018182,"r":0},{"b":1,"g":1,"pos":0.045455,"r":1}],"name":"colorize_0","node_position":{"x":-828,"y":218},"type":"colorize"},{"gradient":[{"b":0,"g":0.152344,"pos":0,"r":0.270833},{"b":0,"g":0.191569,"pos":0.945455,"r":0.557292}],"name":"colorize_2","node_position":{"x":201,"y":-298},"type":"colorize"},{"albedo_color":{"a":1,"b":1,"g":1,"r":1,"type":"Color"},"ao_light_affect":1,"depth_scale":1,"emission_energy":1,"metallic":1,"name":"Material","node_position":{"x":755,"y":-137},"normal_scale":1,"roughness":1,"type":"material"},{"amount":0.5,"blend_type":0,"name":"blend_2","node_position":{"x":407.094238,"y":-265.083313},"type":"blend"},{"gradient":[{"b":0,"g":0,"pos":0.445455,"r":0},{"b":1,"g":1,"pos":0.545455,"r":1}],"name":"colorize_4","node_position":{"x":258,"y":-136},"type":"colorize"},{"mix":5,"name":"pattern_0","node_position":{"x":-858,"y":120},"type":"pattern","x_scale":8,"x_wave":0,"y_scale":8,"y_wave":0},{"name":"transform_1","node_position":{"x":-647,"y":285},"repeat":true,"rotate":90,"scale_x":1,"scale_y":1,"translate_x":0.06,"translate_y":0,"type":"transform"},{"amount":1,"blend_type":2,"name":"blend_0","node_position":{"x":-633,"y":181},"type":"blend"},{"amount":1,"blend_type":2,"name":"blend_1","node_position":{"x":-632,"y":77},"type":"blend"},{"color":{"a":1,"b":1,"g":1,"r":1,"type":"Color"},"name":"uniform_0","node_position":{"x":233,"y":-216},"type":"uniform"},{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":1,"g":1,"pos":0.018182,"r":1}],"name":"colorize_7","node_position":{"x":-109.265503,"y":-175},"type":"colorize"},{"iterations":7,"name":"perlin_1","node_position":{"x":-161,"y":-86},"persistence":0.75,"scale_x":4,"scale_y":4,"type":"perlin"},{"gradient":[{"b":0.640625,"g":0.640625,"pos":0,"r":0.640625},{"b":1,"g":1,"pos":1,"r":1}],"name":"colorize_6","node_position":{"x":444,"y":-66},"type":"colorize"},{"gradient":[{"b":0,"g":0,"pos":0,"r":0},{"b":1,"g":1,"pos":1,"r":1}],"name":"colorize_1","node_position":{"x":85,"y":72},"type":"colorize"},{"name":"transform_0","node_position":{"x":-845,"y":279},"repeat":true,"rotate":0,"scale_x":1,"scale_y":1,"translate_x":0.06,"translate_y":0.06,"type":"transform"},{"gradient":[{"b":1,"g":1,"pos":0.609091,"r":1},{"b":0,"g":0,"pos":0.645455,"r":0}],"name":"colorize_5","node_position":{"x":446,"y":-150},"type":"colorize"},{"name":"combine_0","node_position":{"x":677,"y":-264},"type":"combine"},{"name":"export_0","node_position":{"x":828,"y":-268},"suffix":"mr","type":"export"},{"amount":0.6,"name":"normal_map_0","node_position":{"x":294,"y":76},"type":"normal_map"},{"amount":0.2,"blend_type":2,"name":"blend_3","node_position":{"x":72.734497,"y":-130},"type":"blend"}]} \ No newline at end of file diff --git a/export_presets.cfg b/export_presets.cfg index eaa080a..2a79fcd 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -5,15 +5,15 @@ platform="Windows Desktop" runnable=true custom_features="" export_filter="all_resources" -include_filter="" +include_filter="*.json,res://addons/procedural_material/library/base/*.png" exclude_filter="*.ptex" patch_list=PoolStringArray( ) [preset.0.options] texture_format/s3tc=true -texture_format/etc=false -texture_format/etc2=false +texture_format/etc=true +texture_format/etc2=true binary_format/64_bits=true custom_template/release="" custom_template/debug=""