From 2a51e3b726cc8780fc13e5a5583e14ff7528116d Mon Sep 17 00:00:00 2001 From: RodZill4 Date: Thu, 12 Dec 2019 23:11:43 +0100 Subject: [PATCH 01/15] Prepared function generation for inputs --- addons/material_maker/engine/gen_context.gd | 12 ++- addons/material_maker/engine/gen_shader.gd | 108 ++++++++++++++------ 2 files changed, 90 insertions(+), 30 deletions(-) diff --git a/addons/material_maker/engine/gen_context.gd b/addons/material_maker/engine/gen_context.gd index 068574c..827ae33 100644 --- a/addons/material_maker/engine/gen_context.gd +++ b/addons/material_maker/engine/gen_context.gd @@ -4,10 +4,19 @@ class_name MMGenContext var variants : Dictionary = {} +var parent_context : MMGenContext = null +func _init(p = null) -> void: + parent_context = p func has_variant(generator) -> bool: - return variants.has(generator) + return variants.has(generator) or parent_context != null and parent_context.has_variant(generator) + +func touch_variant(generator) -> void: + if !variants.has(generator): + variants[generator] = [] + if parent_context != null: + parent_context.touch_variant(generator) func get_variant(generator, variant) -> int: var rv = -1 @@ -17,4 +26,5 @@ func get_variant(generator, variant) -> int: variants[generator].push_back(variant) else: variants[generator] = [variant] + touch_variant(generator) return rv diff --git a/addons/material_maker/engine/gen_shader.gd b/addons/material_maker/engine/gen_shader.gd index e4d750a..1024085 100644 --- a/addons/material_maker/engine/gen_shader.gd +++ b/addons/material_maker/engine/gen_shader.gd @@ -7,6 +7,13 @@ var uses_seed = false var editable = false +const PORT_TYPES : Dictionary = { + rgba = { type="vec4" }, + rgb = { type="vec3" }, + f = { type="float" } +} +const GENERATE_FUNCTIONS : bool = false + func toggle_editable() -> bool: editable = !editable if editable: @@ -90,7 +97,19 @@ func find_keyword_call(string, keyword): parenthesis_level -= 1 return "" -func replace_input(string, context, input, type, src, default) -> Dictionary: +func replace_input_with_function_call(string : String, input : String) -> String: + var genname = "o"+str(get_instance_id()) + while true: + var uv = find_keyword_call(string, input) + if uv == null: + break + elif uv == "": + print("syntax error") + break + string = string.replace("$%s(%s)" % [ input, uv ], "%s_input_%s(%s)" % [ genname, input, uv ]) + return string + +func replace_input(string : String, context, input : String, type : String, src : OutputPort, default : String) -> Dictionary: var required_globals = [] var required_defs = "" var required_code = "" @@ -134,7 +153,7 @@ func replace_input(string, context, input, type, src, default) -> Dictionary: func is_word_letter(l) -> bool: return "azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN1234567890_".find(l) != -1 -func replace_variable(string, variable, value) -> String: +func replace_variable(string : String, variable : String, value : String) -> String: string = string.replace("$(%s)" % variable, value) var keyword_size = variable.length()+1 var new_string = "" @@ -152,7 +171,7 @@ func replace_variable(string, variable, value) -> String: string = string.right(keyword_size) return new_string -func subst(string, context, uv = "") -> Dictionary: +func subst(string : String, context : MMGenContext, uv : String = "") -> Dictionary: var genname = "o"+str(get_instance_id()) var required_globals = [] var required_defs = "" @@ -199,30 +218,36 @@ func subst(string, context, uv = "") -> Dictionary: for i in range(shader_model.inputs.size()): var input = shader_model.inputs[i] var source = get_source(i) - var result = replace_input(string, context, input.name, input.type, source, input.default) - while result is GDScriptFunctionState: - result = yield(result, "completed") - if string != result.string: - changed = true - if result.new_pass_required: - new_pass_required = true - string = result.string - # Add global definitions - for d in result.globals: - if required_globals.find(d) == -1: - required_globals.push_back(d) - # Add generated definitions - required_defs += result.defs - # Add generated code - required_code += result.code - for t in result.textures.keys(): - required_textures[t] = result.textures[t] + if GENERATE_FUNCTIONS: + string = replace_input_with_function_call(string, input.name) + else: + var result = replace_input(string, context, input.name, input.type, source, input.default) + while result is GDScriptFunctionState: + result = yield(result, "completed") + if string != result.string: + changed = true + if result.new_pass_required: + new_pass_required = true + string = result.string + # Add global definitions + for d in result.globals: + if required_globals.find(d) == -1: + required_globals.push_back(d) + # Add generated definitions + required_defs += result.defs + # Add generated code + required_code += result.code + for t in result.textures.keys(): + required_textures[t] = result.textures[t] cont = changed and new_pass_required return { string=string, globals=required_globals, defs=required_defs, code=required_code, textures=required_textures } +func create_input_function(function_name : String, input_index : int, context : MMGenContext) -> Dictionary: + var rv = { globals=[], defs="", code="", textures={} } + return rv + func _get_shader_code(uv : String, output_index : int, context : MMGenContext) -> Dictionary: var genname = "o"+str(get_instance_id()) - var output_info = [ { field="rgba", type="vec4" }, { field="rgb", type="vec3" }, { field="f", type="float" } ] var rv = { globals=[], defs="", code="", textures={} } if shader_model != null and shader_model.has("outputs") and shader_model.outputs.size() > output_index: var output = shader_model.outputs[output_index] @@ -231,8 +256,10 @@ func _get_shader_code(uv : String, output_index : int, context : MMGenContext) - while subst_output is GDScriptFunctionState: subst_output = yield(subst_output, "completed") rv.defs += subst_output.string + # process textures for t in subst_output.textures.keys(): rv.textures[t] = subst_output.textures[t] + # Generate functions for gradients for p in shader_model.parameters: if p.type == "gradient": var g = parameters[p.name] @@ -240,6 +267,29 @@ func _get_shader_code(uv : String, output_index : int, context : MMGenContext) - g = MMGradient.new() g.deserialize(parameters[p.name]) rv.defs += g.get_shader(genname+"_p_"+p.name+"_gradient_fct") + # Generate functions for inputs + if shader_model.has("inputs"): + for i in range(shader_model.inputs.size()): + if GENERATE_FUNCTIONS: + var input = shader_model.inputs[i] + var source = get_source(i) + var string = "$%s(uv)" % input.name + var local_context = MMGenContext.new(context) + var result = replace_input(string, local_context, input.name, input.type, source, input.default) + while result is GDScriptFunctionState: + result = yield(result, "completed") + # Add global definitions + for d in result.globals: + if rv.globals.find(d) == -1: + rv.globals.push_back(d) + # Add generated definitions + rv.defs += result.defs + # Add textures + for t in result.textures.keys(): + rv.textures[t] = result.textures[t] + rv.defs += "%s %s_input_%s(vec2 uv) {\n" % [ PORT_TYPES[input.type].type, genname, input.name ] + rv.defs += "%s\n" % result.code + rv.defs += "return %s;\n}\n" % result.string # Add inline code if shader_model.has("code"): var variant_index = context.get_variant(self, uv) @@ -262,9 +312,9 @@ func _get_shader_code(uv : String, output_index : int, context : MMGenContext) - var variant_index = context.get_variant(self, variant_string) if variant_index == -1: variant_index = context.get_variant(self, variant_string) - for t in output_info: - if output.has(t.field): - var subst_output = subst(output[t.field], context, uv) + for f in PORT_TYPES.keys(): + if output.has(f): + var subst_output = subst(output[f], context, uv) while subst_output is GDScriptFunctionState: subst_output = yield(subst_output, "completed") # Add global definitions @@ -275,12 +325,12 @@ func _get_shader_code(uv : String, output_index : int, context : MMGenContext) - rv.defs += subst_output.defs # Add generated code rv.code += subst_output.code - rv.code += "%s %s_%d_%d_%s = %s;\n" % [ t.type, genname, output_index, variant_index, t.field, subst_output.string ] + rv.code += "%s %s_%d_%d_%s = %s;\n" % [ PORT_TYPES[f].type, genname, output_index, variant_index, f, subst_output.string ] for t in subst_output.textures.keys(): rv.textures[t] = subst_output.textures[t] - for t in output_info: - if output.has(t.field): - rv[t.field] = "%s_%d_%d_%s" % [ genname, output_index, variant_index, t.field ] + for f in PORT_TYPES.keys(): + if output.has(f): + rv[f] = "%s_%d_%d_%s" % [ genname, output_index, variant_index, f ] if shader_model.has("global") && rv.globals.find(shader_model.global) == -1: rv.globals.push_back(shader_model.global) return rv From e919507f061c31dc3c8185673cdc10f538830d95 Mon Sep 17 00:00:00 2001 From: RodZill4 Date: Sun, 15 Dec 2019 12:41:00 +0100 Subject: [PATCH 02/15] Added support for raymarching - Added signed distance functions 2D and 2D input/output types - Updated SDF2D nodes to used SDF2D inputs/outputs - Added preview code for SDF2D and SDF3D - Updates all SDF2D templates - Added basic SDF3D nodes --- addons/material_maker/engine/gen_base.gd | 25 +- addons/material_maker/engine/gen_shader.gd | 55 +- addons/material_maker/engine/renderer.gd | 74 +- .../material_maker/examples/raymarching.ptex | 664 ++++++++++++++++++ addons/material_maker/main_window.gd | 4 +- addons/material_maker/main_window.tscn | 2 +- addons/material_maker/nodes/debug.gd | 5 +- addons/material_maker/nodes/generic.gd | 21 +- addons/material_maker/nodes/raymarching.mmg | 39 + .../material_maker/nodes/sdannularshape.mmg | 6 +- addons/material_maker/nodes/sdboolean.mmg | 20 +- addons/material_maker/nodes/sdbox.mmg | 8 +- addons/material_maker/nodes/sdcircle.mmg | 8 +- addons/material_maker/nodes/sdf3d_boolean.mmg | 65 ++ addons/material_maker/nodes/sdf3d_box.mmg | 67 ++ .../nodes/sdf3d_smoothboolean.mmg | 75 ++ addons/material_maker/nodes/sdf3d_sphere.mmg | 37 + addons/material_maker/nodes/sdf3d_torus.mmg | 50 ++ addons/material_maker/nodes/sdline.mmg | 4 +- addons/material_maker/nodes/sdrhombus.mmg | 6 +- .../material_maker/nodes/sdroundedshape.mmg | 10 +- addons/material_maker/nodes/sdshow.mmg | 47 ++ .../material_maker/nodes/sdsmoothboolean.mmg | 10 +- .../widgets/node_editor/input.gd | 11 + .../widgets/node_editor/input.tscn | 8 +- .../widgets/node_editor/output.gd | 10 + .../widgets/node_editor/output.tscn | 2 +- 27 files changed, 1243 insertions(+), 90 deletions(-) create mode 100644 addons/material_maker/examples/raymarching.ptex create mode 100644 addons/material_maker/nodes/raymarching.mmg create mode 100644 addons/material_maker/nodes/sdf3d_boolean.mmg create mode 100644 addons/material_maker/nodes/sdf3d_box.mmg create mode 100644 addons/material_maker/nodes/sdf3d_smoothboolean.mmg create mode 100644 addons/material_maker/nodes/sdf3d_sphere.mmg create mode 100644 addons/material_maker/nodes/sdf3d_torus.mmg create mode 100644 addons/material_maker/nodes/sdshow.mmg diff --git a/addons/material_maker/engine/gen_base.gd b/addons/material_maker/engine/gen_base.gd index 5cb42a2..8f053f8 100644 --- a/addons/material_maker/engine/gen_base.gd +++ b/addons/material_maker/engine/gen_base.gd @@ -37,6 +37,14 @@ var parameters = {} var seed_locked : bool = false var seed_value : int = 0 +const PORT_TYPES : Dictionary = { + rgba = { type="vec4", paramdefs="vec2 uv", params="uv" }, + rgb = { type="vec3", paramdefs="vec2 uv", params="uv" }, + f = { type="float", paramdefs="vec2 uv", params="uv" }, + sdf2d = { type="float", paramdefs="vec2 uv", params="uv" }, + sdf3d = { type="float", paramdefs="vec3 p", params="p" } +} + func _ready() -> void: init_parameters() @@ -151,14 +159,18 @@ func get_input_shader(input_index : int) -> Dictionary: func get_shader(output_index : int, context) -> Dictionary: return get_shader_code("UV", output_index, context) -func render(output_index : int, size : int) -> Object: +func render(output_index : int, size : int, preview : bool = false) -> Object: var context : MMGenContext = MMGenContext.new() - var source = get_shader_code("UV", output_index, context) + var source = get_shader_code("uv", output_index, context) while source is GDScriptFunctionState: source = yield(source, "completed") if source.empty(): source = { defs="", code="", textures={}, rgba="vec4(0.0)" } - var shader : String = mm_renderer.generate_shader(source) + var shader : String + if preview: + shader = mm_renderer.generate_preview_shader(source) + else: + shader = mm_renderer.generate_shader(source) var result = mm_renderer.render_shader(shader, source.textures, size) while result is GDScriptFunctionState: result = yield(result, "completed") @@ -174,15 +186,14 @@ func get_shader_code(uv : String, output_index : int, context : MMGenContext) -> rv.f = "(dot("+rv.rgb+", vec3(1.0))/3.0)" elif rv.has("rgba"): rv.f = "(dot("+rv.rgba+".rgb, vec3(1.0))/3.0)" - else: - rv.f = "0.0" if !rv.has("rgb"): if rv.has("rgba"): rv.rgb = rv.rgba+".rgb" - else: + elif rv.has("f"): rv.rgb = "vec3("+rv.f+")" if !rv.has("rgba"): - rv.rgba = "vec4("+rv.rgb+", 1.0)" + if rv.has("rgb"): + rv.rgba = "vec4("+rv.rgb+", 1.0)" return rv func _get_shader_code(__, __, __) -> Dictionary: diff --git a/addons/material_maker/engine/gen_shader.gd b/addons/material_maker/engine/gen_shader.gd index 1024085..cad14cb 100644 --- a/addons/material_maker/engine/gen_shader.gd +++ b/addons/material_maker/engine/gen_shader.gd @@ -2,17 +2,12 @@ tool extends MMGenBase class_name MMGenShader + var shader_model : Dictionary = {} var uses_seed = false var editable = false -const PORT_TYPES : Dictionary = { - rgba = { type="vec4" }, - rgb = { type="vec3" }, - f = { type="float" } -} -const GENERATE_FUNCTIONS : bool = false func toggle_editable() -> bool: editable = !editable @@ -60,16 +55,12 @@ func set_shader_model(data: Dictionary) -> void: for i in range(shader_model.outputs.size()): var output = shader_model.outputs[i] var output_code = "" - if output.has("rgba"): - shader_model.outputs[i].type = "rgba" - output_code = output.rgba - elif output.has("rgb"): - shader_model.outputs[i].type = "rgb" - output_code = output.rgb - elif output.has("f"): - shader_model.outputs[i].type = "f" - output_code = output.f - else: + for f in PORT_TYPES.keys(): + if output.has(f): + shader_model.outputs[i].type = f + output_code = output[f] + break + if output_code == "": print("Unsupported output type") if output_code.find("$seed") != -1 or output_code.find("$(seed)") != -1: uses_seed = true @@ -132,7 +123,10 @@ func replace_input(string : String, context, input : String, type : String, src src_code = src.generator.get_shader_code(uv, src.output_index, context) while src_code is GDScriptFunctionState: src_code = yield(src_code, "completed") - src_code.string = src_code[type] + if src_code.has(type): + src_code.string = src_code[type] + else: + src_code.string = "*error*" # Add global definitions if src_code.has("globals"): for d in src_code.globals: @@ -218,7 +212,7 @@ func subst(string : String, context : MMGenContext, uv : String = "") -> Diction for i in range(shader_model.inputs.size()): var input = shader_model.inputs[i] var source = get_source(i) - if GENERATE_FUNCTIONS: + if input.has("function") and input.function: string = replace_input_with_function_call(string, input.name) else: var result = replace_input(string, context, input.name, input.type, source, input.default) @@ -251,14 +245,7 @@ func _get_shader_code(uv : String, output_index : int, context : MMGenContext) - var rv = { globals=[], defs="", code="", textures={} } if shader_model != null and shader_model.has("outputs") and shader_model.outputs.size() > output_index: var output = shader_model.outputs[output_index] - if shader_model.has("instance") && !context.has_variant(self): - var subst_output = subst(shader_model.instance, context, "") - while subst_output is GDScriptFunctionState: - subst_output = yield(subst_output, "completed") - rv.defs += subst_output.string - # process textures - for t in subst_output.textures.keys(): - rv.textures[t] = subst_output.textures[t] + if !context.has_variant(self): # Generate functions for gradients for p in shader_model.parameters: if p.type == "gradient": @@ -270,10 +257,10 @@ func _get_shader_code(uv : String, output_index : int, context : MMGenContext) - # Generate functions for inputs if shader_model.has("inputs"): for i in range(shader_model.inputs.size()): - if GENERATE_FUNCTIONS: - var input = shader_model.inputs[i] + var input = shader_model.inputs[i] + if input.has("function") and input.function: var source = get_source(i) - var string = "$%s(uv)" % input.name + var string = "$%s(%s)" % [ input.name, PORT_TYPES[input.type].params ] var local_context = MMGenContext.new(context) var result = replace_input(string, local_context, input.name, input.type, source, input.default) while result is GDScriptFunctionState: @@ -287,9 +274,17 @@ func _get_shader_code(uv : String, output_index : int, context : MMGenContext) - # Add textures for t in result.textures.keys(): rv.textures[t] = result.textures[t] - rv.defs += "%s %s_input_%s(vec2 uv) {\n" % [ PORT_TYPES[input.type].type, genname, input.name ] + rv.defs += "%s %s_input_%s(%s) {\n" % [ PORT_TYPES[input.type].type, genname, input.name, PORT_TYPES[input.type].paramdefs ] rv.defs += "%s\n" % result.code rv.defs += "return %s;\n}\n" % result.string + if shader_model.has("instance"): + var subst_output = subst(shader_model.instance, context, "") + while subst_output is GDScriptFunctionState: + subst_output = yield(subst_output, "completed") + rv.defs += subst_output.string + # process textures + for t in subst_output.textures.keys(): + rv.textures[t] = subst_output.textures[t] # Add inline code if shader_model.has("code"): var variant_index = context.get_variant(self, uv) diff --git a/addons/material_maker/engine/renderer.gd b/addons/material_maker/engine/renderer.gd index 667be6c..0d12de4 100644 --- a/addons/material_maker/engine/renderer.gd +++ b/addons/material_maker/engine/renderer.gd @@ -27,13 +27,85 @@ static func generate_shader(src_code) -> String: code += g var shader_code = src_code.defs shader_code += "\nvoid fragment() {\n" + shader_code += "vec2 uv = UV;\n" shader_code += src_code.code - shader_code += "COLOR = "+src_code.rgba+";\n" + if src_code.has("rgba"): + shader_code += "COLOR = "+src_code.rgba+";\n" + else: + shader_code += "COLOR = vec4(1.0, 0.0, 0.0, 1.0);\n" shader_code += "}\n" #print("GENERATED SHADER:\n"+shader_code) code += shader_code return code +static func generate_preview_shader(src_code) -> String: + var code + code = "shader_type canvas_item;\n" + code += "render_mode blend_disabled;\n" + var file = File.new() + file.open("res://addons/material_maker/common.shader", File.READ) + code += file.get_as_text() + code += "\n" + if src_code.has("textures"): + for t in src_code.textures.keys(): + code += "uniform sampler2D "+t+";\n" + if src_code.has("globals"): + for g in src_code.globals: + code += g + var shader_code = src_code.defs + if src_code.has("rgba"): + shader_code += "\nvoid fragment() {\n" + shader_code += "vec2 uv = UV;\n" + shader_code += src_code.code + shader_code += "COLOR = "+src_code.rgba+";\n" + shader_code += "}\n" + elif src_code.has("sdf2d"): + shader_code += "\nvoid fragment() {\n" + shader_code += "vec2 uv = UV;\n" + shader_code += src_code.code + shader_code += "float d = "+src_code.sdf2d+";\n" + shader_code += "vec3 col = vec3(cos(d*62.8318530718*5.0));\n" + shader_code += "col *= clamp(1.0-4.0*abs(d), 0.0, 1.0);\n" + shader_code += "col *= vec3(1.0, vec2(step(-0.015, d)));\n" + shader_code += "col *= vec3(vec2(step(d, 0.015)), 1.0);\n" + shader_code += "COLOR = vec4(col, 1.0);\n" + shader_code += "}\n" + elif src_code.has("sdf3d"): + shader_code += "\nfloat calcdist(vec3 uv) {\n" + shader_code += src_code.code + shader_code += "return min("+src_code.sdf3d+", uv.z);\n" + shader_code += "}\n" + shader_code += "float raymarch(vec3 ro, vec3 rd) {\n" + shader_code += "float d=0.0;\n" + shader_code += "for (int i = 0; i < 50; i++) {\n" + shader_code += "vec3 p = ro + rd*d;\n" + shader_code += "float dstep = calcdist(p);\n" + shader_code += "d += dstep;\n" + shader_code += "if (dstep < 0.0001) break;\n" + shader_code += "}\n" + shader_code += "return d;\n" + shader_code += "}\n" + shader_code += "vec3 normal(vec3 p) {\n" + shader_code += " float d = calcdist(p);\n" + shader_code += " float e = .0001;\n" + shader_code += " vec3 n = d - vec3(calcdist(p-vec3(e, 0.0, 0.0)), calcdist(p-vec3(0.0, e, 0.0)), calcdist(p-vec3(0.0, 0.0, e)));\n" + shader_code += " return normalize(n);\n" + shader_code += "}\n" + shader_code += "\nvoid fragment() {\n" + shader_code += "vec2 uv = UV-vec2(0.5);\n" + shader_code += "vec3 p = vec3(uv, 2.0-raymarch(vec3(uv, 2.0), vec3(0.0, 0.0, -1.0)));\n" + shader_code += "vec3 n = normal(p);\n" + shader_code += "vec3 l = vec3(5.0, 5.0, 10.0);\n" + shader_code += "vec3 ld = normalize(l-p);\n" + shader_code += "float o = step(p.z, 0.001);\n" + shader_code += "float shadow = 1.0-0.75*step(raymarch(l, -ld), length(l-p)-0.01);\n" + shader_code += "float light = 0.3+0.7*dot(n, ld)*shadow;\n" + shader_code += "COLOR = vec4(vec3(0.8+0.2*o, 0.8+0.2*o, 1.0)*light, 1.0);\n" + shader_code += "}\n" + #print("GENERATED SHADER:\n"+shader_code) + code += shader_code + return code + static func generate_combined_shader(red_code, green_code, blue_code) -> String: var code code = "shader_type canvas_item;\n" diff --git a/addons/material_maker/examples/raymarching.ptex b/addons/material_maker/examples/raymarching.ptex new file mode 100644 index 0000000..5bbce84 --- /dev/null +++ b/addons/material_maker/examples/raymarching.ptex @@ -0,0 +1,664 @@ +{ + "connections": [ + { + "from": "_3", + "from_port": 1, + "to": "Material", + "to_port": 4 + }, + { + "from": "perlin", + "from_port": 0, + "to": "colorize", + "to_port": 0 + }, + { + "from": "colorize", + "from_port": 0, + "to": "Material", + "to_port": 2 + }, + { + "from": "sdf3d_sphere", + "from_port": 0, + "to": "_4", + "to_port": 0 + }, + { + "from": "sdf3d_sphere", + "from_port": 0, + "to": "_4_2", + "to_port": 0 + }, + { + "from": "_4", + "from_port": 0, + "to": "sdf3d_boolean", + "to_port": 0 + }, + { + "from": "_4_2", + "from_port": 0, + "to": "sdf3d_boolean", + "to_port": 1 + }, + { + "from": "sdf3d_boolean", + "from_port": 0, + "to": "_4_2_2", + "to_port": 0 + }, + { + "from": "_4_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean", + "to_port": 0 + }, + { + "from": "sdf3d_box", + "from_port": 0, + "to": "sdf3d_smoothboolean", + "to_port": 1 + }, + { + "from": "sdf3d_torus", + "from_port": 0, + "to": "_4_2_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean", + "from_port": 0, + "to": "sdf3d_smoothboolean_2", + "to_port": 1 + }, + { + "from": "_4_2_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_2", + "from_port": 0, + "to": "_3", + "to_port": 0 + } + ], + "label": "Graph", + "name": "49", + "node_position": { + "x": 0, + "y": 0 + }, + "nodes": [ + { + "name": "Material", + "node_position": { + "x": -36, + "y": -273 + }, + "parameters": { + "albedo_color": { + "a": 1, + "b": 1, + "g": 1, + "r": 1, + "type": "Color" + }, + "ao_light_affect": 1, + "depth_scale": 1, + "emission_energy": 1, + "metallic": 1, + "normal_scale": 1, + "roughness": 1, + "size": 11, + "subsurf_scatter_strength": 0 + }, + "type": "material" + }, + { + "name": "_3", + "node_position": { + "x": -424.5, + "y": -165 + }, + "parameters": { + + }, + "shader_model": { + "code": "float $(name_uv)_d = raymarch_$name($uv);\n", + "global": "", + "inputs": [ + { + "default": "0.0", + "function": true, + "label": "", + "name": "sdf", + "type": "sdf3d" + } + ], + "instance": "float input_$name(vec3 p) {\n\treturn min($sdf(p), p.z);\n}\n\nfloat raymarch_$name(vec2 uv) {\n\tvec3 ro = vec3(uv-vec2(0.5), 1.0);\n\tvec3 rd = vec3(0.0, 0.0, -1.0);\n\tfloat dO=0.;\n \n for (int i=0; i < 50; i++) {\n \tvec3 p = ro + rd*dO;\n float dS = input_$name(p);\n dO += dS;\n if (dO > 0.001 && dS < 0.0001) break;\n }\n \n return dO;\n}\n\nvec3 normal_$name(vec3 p) {\n\tfloat d = input_$name(p);\n float e = .001;\n \n vec3 n = d - vec3(\n input_$name(p-vec3(e, 0.0, 0.0)),\n input_$name(p-vec3(0.0, e, 0.0)),\n input_$name(p-vec3(0.0, 0.0, e)));\n \n return vec3(-1.0, -1.0, -1.0)*normalize(n);\n}\n\n", + "name": "Raymarching", + "outputs": [ + { + "f": "1.0-$(name_uv)_d", + "type": "f" + }, + { + "rgb": "vec3(0.5)+0.5*normal_$name(vec3($uv-vec2(0.5), 1.0-$(name_uv)_d))", + "type": "rgb" + } + ], + "parameters": [ + + ] + }, + "type": "shader" + }, + { + "name": "perlin", + "node_position": { + "x": -511.535645, + "y": -348.25 + }, + "parameters": { + "iterations": 5, + "persistence": 0.5, + "scale_x": 4, + "scale_y": 4 + }, + "type": "perlin" + }, + { + "name": "colorize", + "node_position": { + "x": -260.535645, + "y": -304.25 + }, + "parameters": { + "gradient": { + "interpolation": 1, + "points": [ + { + "a": 1, + "b": 0.088542, + "g": 0.088542, + "pos": 0, + "r": 0.088542 + }, + { + "a": 1, + "b": 0.494792, + "g": 0.494792, + "pos": 0.990909, + "r": 0.494792 + }, + { + "a": 1, + "b": 0.338542, + "g": 0.338542, + "pos": 1, + "r": 0.338542 + } + ], + "type": "Gradient" + } + }, + "type": "colorize" + }, + { + "name": "_4", + "node_position": { + "x": -1008.238525, + "y": -303.85495 + }, + "parameters": { + "x": -0.17, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Translate", + "outputs": [ + { + "sdf3d": "$in($uv+vec3($x, $y, $z))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "X", + "max": 1, + "min": -1, + "name": "x", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Y", + "max": 1, + "min": -1, + "name": "y", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Z", + "max": 1, + "min": -1, + "name": "z", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_boolean", + "node_position": { + "x": -821.049805, + "y": -365.10495 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "sdf3d_box", + "node_position": { + "x": -1025.376221, + "y": -92.60495 + }, + "parameters": { + "r": 0.26, + "sx": 0.1, + "sy": 0.1, + "sz": 0.02 + }, + "shader_model": { + "code": "vec3 $(name_uv)_q = abs($uv) - vec3($sx, $sy, $sz);\n", + "global": "", + "inputs": [ + + ], + "instance": "", + "name": "Box", + "outputs": [ + { + "sdf3d": "length(max($(name_uv)_q,0.0))+min(max($(name_uv)_q.x,max($(name_uv)_q.y,$(name_uv)_q.z)),0.0)-$r", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0.5, + "label": "Size X", + "max": 1, + "min": 0, + "name": "sx", + "step": 0.01, + "type": "float" + }, + { + "default": 0.5, + "label": "Size Y", + "max": 1, + "min": 0, + "name": "sy", + "step": 0.01, + "type": "float" + }, + { + "default": 0.5, + "label": "Size Z", + "max": 1, + "min": 0, + "name": "sz", + "step": 0.01, + "type": "float" + }, + { + "default": 0.5, + "label": "Radius", + "max": 1, + "min": 0, + "name": "r", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_torus", + "node_position": { + "x": -819.376282, + "y": -100.60495 + }, + "parameters": { + "R": 0.38, + "a1": 0.5, + "a2": 0.865, + "r": 0.03, + "sx": 0.1, + "sy": 0.1, + "sz": 0.02 + }, + "shader_model": { + "code": "\n", + "global": "float sdf3CappedTorus(vec3 p, float R, float r, vec2 sc) {\n\tp.x = abs(p.x);\n\tfloat k = (sc.y*p.x>sc.x*p.y)?dot(p.xy,sc):length(p.xy);\n\treturn sqrt(dot(p,p)+R*R-2.0*R*k)-r;\n}\n", + "inputs": [ + + ], + "instance": "", + "name": "Capped Torus", + "outputs": [ + { + "sdf3d": "sdf3CappedTorus($uv, $R, $r, vec2($a1, $a2))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0.5, + "label": "R", + "max": 1, + "min": 0, + "name": "R", + "step": 0.01, + "type": "float" + }, + { + "default": 0.1, + "label": "r", + "max": 0.5, + "min": 0, + "name": "r", + "step": 0.01, + "type": "float" + }, + { + "default": 0.5, + "label": "A1", + "max": 1, + "min": 0, + "name": "a1", + "step": 0.01, + "type": "float" + }, + { + "default": 0.5, + "label": "A2", + "max": 1, + "min": 0, + "name": "a2", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_smoothboolean", + "node_position": { + "x": -822.049805, + "y": -189.10495 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.02, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "_4_2", + "node_position": { + "x": -1004.406982, + "y": -196.60495 + }, + "parameters": { + "x": 0.17, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Translate", + "outputs": [ + { + "sdf3d": "$in($uv+vec3($x, $y, $z))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "X", + "max": 1, + "min": -1, + "name": "x", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Y", + "max": 1, + "min": -1, + "name": "y", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Z", + "max": 1, + "min": -1, + "name": "z", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "_4_2_2", + "node_position": { + "x": -808.049805, + "y": -300.60495 + }, + "parameters": { + "x": 0, + "y": 0.14, + "z": -0.23 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Translate", + "outputs": [ + { + "sdf3d": "$in($uv+vec3($x, $y, $z))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "X", + "max": 1, + "min": -1, + "name": "x", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Y", + "max": 1, + "min": -1, + "name": "y", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Z", + "max": 1, + "min": -1, + "name": "z", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "_4_2_2_2", + "node_position": { + "x": -813.069458, + "y": 32.162903 + }, + "parameters": { + "x": 0, + "y": 0.19, + "z": -0.23 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Translate", + "outputs": [ + { + "sdf3d": "$in($uv+vec3($x, $y, $z))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "X", + "max": 1, + "min": -1, + "name": "x", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Y", + "max": 1, + "min": -1, + "name": "y", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Z", + "max": 1, + "min": -1, + "name": "z", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_smoothboolean_2", + "node_position": { + "x": -621.569458, + "y": -171.337097 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.04, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_sphere", + "node_position": { + "x": -1000.049805, + "y": -359.10495 + }, + "parameters": { + "r": 0.07 + }, + "type": "sdf3d_sphere" + } + ], + "parameters": { + + }, + "type": "graph" +} \ No newline at end of file diff --git a/addons/material_maker/main_window.gd b/addons/material_maker/main_window.gd index 1d9855a..198b3d8 100644 --- a/addons/material_maker/main_window.gd +++ b/addons/material_maker/main_window.gd @@ -383,7 +383,7 @@ func do_add_to_user_library(name, nodes) -> void: dir.make_dir("user://library/user") data.library = "user://library/user.json" data.icon = library.get_icon_name(name) - var result = nodes[0].generator.render(0, 64) + var result = nodes[0].generator.render(0, 64, true) while result is GDScriptFunctionState: result = yield(result, "completed") result.save_to_file("user://library/user/"+data.icon+".png") @@ -480,7 +480,7 @@ func update_preview_2d(node = null) -> void: node = n break if node != null: - var result = node.generator.render(0, 1024) + var result = node.generator.render(0, 1024, true) while result is GDScriptFunctionState: result = yield(result, "completed") var tex = ImageTexture.new() diff --git a/addons/material_maker/main_window.tscn b/addons/material_maker/main_window.tscn index 4e72a8b..19c18dc 100644 --- a/addons/material_maker/main_window.tscn +++ b/addons/material_maker/main_window.tscn @@ -66,7 +66,7 @@ margin_left = 125.0 margin_right = 171.0 margin_bottom = 20.0 text = "Tools" -items = [ "Create", null, 0, false, false, -1, 0, null, "PopupMenu", false, "Create group", null, 0, false, false, 19, 268435527, null, "", false, "Make selected nodes editable", null, 0, false, false, 20, 268435543, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Add selected node to user library", null, 0, false, false, 22, 0, null, "", false, "Export the nodes library", null, 0, false, false, 23, 0, null, "", false ] +items = [ "Create", null, 0, false, false, 0, 0, null, "PopupMenu", false, "Create group", null, 0, false, false, 19, 268435527, null, "", false, "Make selected nodes editable", null, 0, false, false, 20, 268435543, null, "", false, "", null, 0, false, false, -1, 0, null, "", true, "Add selected node to user library", null, 0, false, false, 22, 0, null, "", false, "Export the nodes library", null, 0, false, false, 23, 0, null, "", false ] [node name="Help" type="MenuButton" parent="VBoxContainer/Menu"] margin_left = 175.0 diff --git a/addons/material_maker/nodes/debug.gd b/addons/material_maker/nodes/debug.gd index 07bbda2..2cb9545 100644 --- a/addons/material_maker/nodes/debug.gd +++ b/addons/material_maker/nodes/debug.gd @@ -16,7 +16,10 @@ static func generate_shader(src_code) -> String: var shader_code = src_code.defs shader_code += "\nvoid mainImage(out vec4 fragColor, in vec2 fragCoord) {\nvec2 UV = fragCoord/iResolution.xy;\n" shader_code += src_code.code - shader_code += "fragColor = "+src_code.rgba+";\n" + if src_code.has("rgba"): + shader_code += "fragColor = "+src_code.rgba+";\n" + else: + shader_code += "fragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" shader_code += "}\n" #print("GENERATED SHADER:\n"+shader_code) code += shader_code diff --git a/addons/material_maker/nodes/generic.gd b/addons/material_maker/nodes/generic.gd index a6820a4..a358276 100644 --- a/addons/material_maker/nodes/generic.gd +++ b/addons/material_maker/nodes/generic.gd @@ -175,14 +175,12 @@ func update_node() -> void: var enable_left = false var color_left = Color(0.5, 0.5, 0.5) if typeof(input) == TYPE_DICTIONARY: - if input.type == "rgb": - enable_left = true - color_left = Color(0.5, 0.5, 1.0) - elif input.type == "rgba": - enable_left = true - color_left = Color(0.0, 0.5, 0.0, 0.5) - else: - enable_left = true + enable_left = true + match input.type: + "rgb": color_left = Color(0.5, 0.5, 1.0) + "rgba": color_left = Color(0.0, 0.5, 0.0, 0.5) + "sdf2d": color_left = Color(1.0, 0.5, 0.0, 1.0) + "sdf3d": color_left = Color(1.0, 0.0, 0.0, 1.0) set_slot(i, enable_left, 0, color_left, false, 0, Color()) var hsizer : HBoxContainer = HBoxContainer.new() hsizer.size_flags_horizontal = SIZE_EXPAND | SIZE_FILL @@ -240,7 +238,8 @@ func update_node() -> void: label_widget.size_flags_horizontal = SIZE_EXPAND | SIZE_FILL hsizer.add_child(label_widget) control.size_flags_horizontal = SIZE_EXPAND | SIZE_FILL - hsizer.add_child(control) + if hsizer != null: + hsizer.add_child(control) initialize_properties() # Outputs var outputs = generator.get_output_defs() @@ -256,6 +255,8 @@ func update_node() -> void: match output.type: "rgb": color_right = Color(0.5, 0.5, 1.0) "rgba": color_right = Color(0.0, 0.5, 0.0, 0.5) + "sdf2d": color_right = Color(1.0, 0.5, 0.0, 1.0) + "sdf3d": color_right = Color(1.0, 0.0, 0.0, 1.0) set_slot(i, is_slot_enabled_left(i), get_slot_type_left(i), get_slot_color_left(i), enable_right, 0, color_right) var hsizer : HBoxContainer while i >= get_child_count(): @@ -383,7 +384,7 @@ func update_preview(size : int = 0) -> void: preview_timer.start(0.2) func do_update_preview() -> void: - var result = generator.render(preview_index, preview_size) + var result = generator.render(preview_index, preview_size, true) while result is GDScriptFunctionState: result = yield(result, "completed") if preview.texture == null: diff --git a/addons/material_maker/nodes/raymarching.mmg b/addons/material_maker/nodes/raymarching.mmg new file mode 100644 index 0000000..770058a --- /dev/null +++ b/addons/material_maker/nodes/raymarching.mmg @@ -0,0 +1,39 @@ +{ + "name": "raymarching", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + + }, + "shader_model": { + "code": "float $(name_uv)_d = raymarch_$name($uv);\n", + "global": "", + "inputs": [ + { + "default": "0.0", + "function": true, + "label": "", + "name": "sdf", + "type": "sdf3d" + } + ], + "instance": "float input_$name(vec3 p) {\n\tif (p.z > 0.0) {\n\t\treturn $sdf(p);\n\t} else {\n\t\treturn p.z;\n\t}\n}\n\nfloat raymarch_$name(vec2 uv) {\n\tvec3 ro = vec3(uv-vec2(0.5), 1.0);\n\tvec3 rd = vec3(0.0, 0.0, -1.0);\n\tfloat dO=0.;\n \n for (int i=0; i < 25; i++) {\n \tvec3 p = ro + rd*dO;\n float dS = input_$name(p);\n dO += dS;\n if (dO > 1.0 || dS < 0.0001) break;\n }\n \n return dO;\n}\n\nvec3 normal_$name(vec3 p) {\n\tfloat d = input_$name(p);\n float e = .001;\n \n vec3 n = d - vec3(\n input_$name(p-vec3(e, 0.0, 0.0)),\n input_$name(p-vec3(0.0, e, 0.0)),\n input_$name(p-vec3(0.0, 0.0, e)));\n \n return vec3(-1.0, -1.0, -1.0)*normalize(n);\n}\n\n", + "name": "Raymarching", + "outputs": [ + { + "f": "1.0-$(name_uv)_d", + "type": "f" + }, + { + "rgb": "vec3(0.5)+0.5*normal_$name(vec3($uv-vec2(0.5), 1.0-$(name_uv)_d))", + "type": "rgb" + } + ], + "parameters": [ + + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdannularshape.mmg b/addons/material_maker/nodes/sdannularshape.mmg index 9939b9d..12124a2 100644 --- a/addons/material_maker/nodes/sdannularshape.mmg +++ b/addons/material_maker/nodes/sdannularshape.mmg @@ -22,15 +22,15 @@ "default": "0.0", "label": "", "name": "in", - "type": "f" + "type": "sdf2d" } ], "instance": "", "name": "sdAnnularShape", "outputs": [ { - "f": "abs($in($uv)) - $r", - "type": "f" + "sdf2d": "abs($in($uv))-$r", + "type": "sdf2d" } ], "parameters": [ diff --git a/addons/material_maker/nodes/sdboolean.mmg b/addons/material_maker/nodes/sdboolean.mmg index 8606dab..b821949 100644 --- a/addons/material_maker/nodes/sdboolean.mmg +++ b/addons/material_maker/nodes/sdboolean.mmg @@ -9,53 +9,53 @@ "cx": 0, "cy": 0, "h": 0.08, - "op": 0, + "op": 1, "r": 0.3, "w": 0.28 }, "shader_model": { "code": "", - "global": "float sdUnion( float d1, float d2 ) { return min(d1,d2); }\nfloat sdSubtraction( float d1, float d2 ) { return max(-d1,d2); }\nfloat sdIntersection( float d1, float d2 ) { return max(d1,d2); }\n", + "global": "", "inputs": [ { "default": "0.0", "label": "", "name": "in1", - "type": "f" + "type": "sdf2d" }, { "default": "0.0", "label": "", "name": "in2", - "type": "f" + "type": "sdf2d" } ], "instance": "", "name": "sdBoolean", "outputs": [ { - "f": "sd$op($in1($uv), $in2($uv))", - "type": "f" + "sdf2d": "$op $in1($uv), $in2($uv))", + "type": "sdf2d" } ], "parameters": [ { - "default": 0, + "default": 2, "label": "", "name": "op", "type": "enum", "values": [ { "name": "Union", - "value": "Union" + "value": "min(" }, { "name": "Subtraction", - "value": "Subtraction" + "value": "max(-" }, { "name": "Intersection", - "value": "Intersection" + "value": "max(" } ] } diff --git a/addons/material_maker/nodes/sdbox.mmg b/addons/material_maker/nodes/sdbox.mmg index 05f2add..9592fdc 100644 --- a/addons/material_maker/nodes/sdbox.mmg +++ b/addons/material_maker/nodes/sdbox.mmg @@ -12,8 +12,8 @@ "w": 0.3 }, "shader_model": { - "code": "", - "global": "float sdBox(in vec2 p, in vec2 b) {\n vec2 d = abs(p)-b;\n return length(max(d,vec2(0))) + min(max(d.x,d.y),0.0);\n}\n", + "code": "vec2 $(name_uv)_d = abs($uv-0.5*vec2($cx+1.0, $cy+1.0))-vec2($w, $h);\n", + "global": "", "inputs": [ ], @@ -21,8 +21,8 @@ "name": "sdBox", "outputs": [ { - "f": "sdBox($uv-0.5*vec2($cx+1.0, $cy+1.0), vec2($w, $h))", - "type": "f" + "sdf2d": "length(max($(name_uv)_d,vec2(0)))+min(max($(name_uv)_d.x,$(name_uv)_d.y),0.0)", + "type": "sdf2d" } ], "parameters": [ diff --git a/addons/material_maker/nodes/sdcircle.mmg b/addons/material_maker/nodes/sdcircle.mmg index c920834..e9881b5 100644 --- a/addons/material_maker/nodes/sdcircle.mmg +++ b/addons/material_maker/nodes/sdcircle.mmg @@ -7,11 +7,11 @@ "parameters": { "cx": 0, "cy": 0, - "r": 0.5 + "r": 0.25 }, "shader_model": { "code": "", - "global": "float sdCircle(vec2 p, float r) {\n return length(p) - r;\n}\n", + "global": "", "inputs": [ ], @@ -19,8 +19,8 @@ "name": "sdCircle", "outputs": [ { - "f": "sdCircle($uv-0.5*vec2($cx+1.0, $cy+1.0), $r)", - "type": "f" + "sdf2d": "length($uv-0.5*vec2($cx+1.0, $cy+1.0))-$r", + "type": "sdf2d" } ], "parameters": [ diff --git a/addons/material_maker/nodes/sdf3d_boolean.mmg b/addons/material_maker/nodes/sdf3d_boolean.mmg new file mode 100644 index 0000000..417e9ba --- /dev/null +++ b/addons/material_maker/nodes/sdf3d_boolean.mmg @@ -0,0 +1,65 @@ +{ + "name": "sdf3d_boolean", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in1", + "type": "sdf3d" + }, + { + "default": "0.0", + "label": "", + "name": "in2", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Boolean", + "outputs": [ + { + "sdf3d": "$op $in1($uv), $in2($uv))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 1, + "label": "", + "name": "op", + "type": "enum", + "values": [ + { + "name": "Union", + "value": "min(" + }, + { + "name": "Subtraction", + "value": "max(-" + }, + { + "name": "Intersection", + "value": "max(" + } + ] + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdf3d_box.mmg b/addons/material_maker/nodes/sdf3d_box.mmg new file mode 100644 index 0000000..cd4405e --- /dev/null +++ b/addons/material_maker/nodes/sdf3d_box.mmg @@ -0,0 +1,67 @@ +{ + "name": "sdf3d_box", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "r": 0.01, + "sx": 0.25, + "sy": 0.25, + "sz": 0.5 + }, + "shader_model": { + "code": "vec3 $(name_uv)_q = abs($uv) - vec3($sx, $sy, $sz);\n", + "global": "", + "inputs": [ + + ], + "instance": "", + "name": "Box", + "outputs": [ + { + "sdf3d": "length(max($(name_uv)_q,0.0))+min(max($(name_uv)_q.x,max($(name_uv)_q.y,$(name_uv)_q.z)),0.0)-$r", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0.5, + "label": "Size X", + "max": 1, + "min": 0, + "name": "sx", + "step": 0.01, + "type": "float" + }, + { + "default": 0.5, + "label": "Size Y", + "max": 1, + "min": 0, + "name": "sy", + "step": 0.01, + "type": "float" + }, + { + "default": 0.5, + "label": "Size Z", + "max": 1, + "min": 0, + "name": "sz", + "step": 0.01, + "type": "float" + }, + { + "default": 0.5, + "label": "Radius", + "max": 1, + "min": 0, + "name": "r", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdf3d_smoothboolean.mmg b/addons/material_maker/nodes/sdf3d_smoothboolean.mmg new file mode 100644 index 0000000..ff3ac8a --- /dev/null +++ b/addons/material_maker/nodes/sdf3d_smoothboolean.mmg @@ -0,0 +1,75 @@ +{ + "name": "sdf3d_smoothboolean", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.1, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "shader_model": { + "code": "", + "global": "float sdf3SmoothUnion(float d1, float d2, float k) {\n float h = clamp(0.5+0.5*(d2-d1)/k, 0.0, 1.0);\n return mix(d2, d1, h)-k*h*(1.0-h);\n}\n\nfloat sdf3SmoothSubtraction( float d1, float d2, float k ) {\n float h = clamp(0.5-0.5*(d2+d1)/k, 0.0, 1.0);\n return mix( d2, -d1, h )+k*h*(1.0-h);\n}\n\nfloat sdf3SmoothIntersection( float d1, float d2, float k ) {\n float h = clamp(0.5-0.5*(d2-d1)/k, 0.0, 1.0);\n return mix(d2, d1, h)+k*h*(1.0-h);\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in1", + "type": "sdf3d" + }, + { + "default": "0.0", + "label": "", + "name": "in2", + "type": "sdf3d" + } + ], + "instance": "", + "name": "sdSmoothBoolean", + "outputs": [ + { + "sdf3d": "sdf3Smooth$op($in1($uv), $in2($uv), $k)", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "", + "name": "op", + "type": "enum", + "values": [ + { + "name": "Union", + "value": "Union" + }, + { + "name": "Subtraction", + "value": "Subtraction" + }, + { + "name": "Intersection", + "value": "Intersection" + } + ] + }, + { + "default": 0, + "label": "", + "max": 1, + "min": 0, + "name": "k", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdf3d_sphere.mmg b/addons/material_maker/nodes/sdf3d_sphere.mmg new file mode 100644 index 0000000..06891a1 --- /dev/null +++ b/addons/material_maker/nodes/sdf3d_sphere.mmg @@ -0,0 +1,37 @@ +{ + "name": "sdf3d_sphere", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "r": 0.5 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + + ], + "instance": "", + "name": "Sphere", + "outputs": [ + { + "sdf3d": "length($uv)-$r", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0.5, + "label": "", + "max": 1, + "min": 0, + "name": "r", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdf3d_torus.mmg b/addons/material_maker/nodes/sdf3d_torus.mmg new file mode 100644 index 0000000..60022c1 --- /dev/null +++ b/addons/material_maker/nodes/sdf3d_torus.mmg @@ -0,0 +1,50 @@ +{ + "name": "sdf3d_torus", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "R": 0.25, + "r": 0.1, + "sx": 0.1, + "sy": 0.1, + "sz": 0.02 + }, + "shader_model": { + "code": "vec2 $(name_uv)_q = vec2(length($uv.xy)-$R,$uv.z);\n", + "global": "", + "inputs": [ + + ], + "instance": "", + "name": "Torus", + "outputs": [ + { + "sdf3d": "length($(name_uv)_q)-$r", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0.5, + "label": "R", + "max": 1, + "min": 0, + "name": "R", + "step": 0.01, + "type": "float" + }, + { + "default": 0.1, + "label": "r", + "max": 0.5, + "min": 0, + "name": "r", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdline.mmg b/addons/material_maker/nodes/sdline.mmg index 8aaf418..763df54 100644 --- a/addons/material_maker/nodes/sdline.mmg +++ b/addons/material_maker/nodes/sdline.mmg @@ -25,8 +25,8 @@ "name": "sdLine", "outputs": [ { - "f": "sdLine($uv, vec2($ax, $ay), vec2($bx, $by))", - "type": "f" + "sdf2d": "sdLine($uv, vec2($ax, $ay), vec2($bx, $by))", + "type": "sdf2d" } ], "parameters": [ diff --git a/addons/material_maker/nodes/sdrhombus.mmg b/addons/material_maker/nodes/sdrhombus.mmg index e0be88f..02925e1 100644 --- a/addons/material_maker/nodes/sdrhombus.mmg +++ b/addons/material_maker/nodes/sdrhombus.mmg @@ -9,7 +9,7 @@ "cy": 0, "h": 0.2, "r": 0.3, - "w": 0.3 + "w": 0.5 }, "shader_model": { "code": "", @@ -21,8 +21,8 @@ "name": "sdRhombus", "outputs": [ { - "f": "sdRhombus($uv-0.5*vec2($cx+1.0, $cy+1.0), vec2($w, $h))", - "type": "f" + "sdf2d": "sdRhombus($uv-0.5*vec2($cx+1.0, $cy+1.0), vec2($w, $h))", + "type": "sdf2d" } ], "parameters": [ diff --git a/addons/material_maker/nodes/sdroundedshape.mmg b/addons/material_maker/nodes/sdroundedshape.mmg index 9557c06..80305a4 100644 --- a/addons/material_maker/nodes/sdroundedshape.mmg +++ b/addons/material_maker/nodes/sdroundedshape.mmg @@ -11,26 +11,26 @@ "h": 0.08, "k": 0.15, "op": 0, - "r": 0.2, + "r": 0.1, "w": 0.28 }, "shader_model": { "code": "", - "global": "float sdSmoothUnion( float d1, float d2, float k ) {\n float h = clamp( 0.5 + 0.5*(d2-d1)/k, 0.0, 1.0 );\n return mix( d2, d1, h ) - k*h*(1.0-h); }\n\nfloat sdSmoothSubtraction( float d1, float d2, float k ) {\n float h = clamp( 0.5 - 0.5*(d2+d1)/k, 0.0, 1.0 );\n return mix( d2, -d1, h ) + k*h*(1.0-h); }\n\nfloat sdSmoothIntersection( float d1, float d2, float k ) {\n float h = clamp( 0.5 - 0.5*(d2-d1)/k, 0.0, 1.0 );\n return mix( d2, d1, h ) + k*h*(1.0-h); }\n", + "global": "", "inputs": [ { "default": "0.0", "label": "", "name": "in", - "type": "f" + "type": "sdf2d" } ], "instance": "", "name": "sdRoundedShape", "outputs": [ { - "f": "$in($uv) - $r", - "type": "f" + "sdf2d": "$in($uv)-$r", + "type": "sdf2d" } ], "parameters": [ diff --git a/addons/material_maker/nodes/sdshow.mmg b/addons/material_maker/nodes/sdshow.mmg new file mode 100644 index 0000000..2692660 --- /dev/null +++ b/addons/material_maker/nodes/sdshow.mmg @@ -0,0 +1,47 @@ +{ + "name": "sdshow", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "bevel": 0.1, + "cx": 0, + "cy": 0, + "h": 0.08, + "r": 0.3, + "w": 0.28 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf2d" + } + ], + "instance": "", + "name": "sdShow", + "outputs": [ + { + "f": "clamp(-$in($uv)/max($bevel, 0.00001), 0.0, 1.0)", + "type": "f" + } + ], + "parameters": [ + { + "default": 0, + "label": "Bevel", + "max": 1, + "min": 0, + "name": "bevel", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdsmoothboolean.mmg b/addons/material_maker/nodes/sdsmoothboolean.mmg index ac436a9..9d1285a 100644 --- a/addons/material_maker/nodes/sdsmoothboolean.mmg +++ b/addons/material_maker/nodes/sdsmoothboolean.mmg @@ -9,7 +9,7 @@ "cx": 0, "cy": 0, "h": 0.08, - "k": 0.1, + "k": 0.04, "op": 0, "r": 0.3, "w": 0.28 @@ -22,21 +22,21 @@ "default": "0.0", "label": "", "name": "in1", - "type": "f" + "type": "sdf2d" }, { "default": "0.0", "label": "", "name": "in2", - "type": "f" + "type": "sdf2d" } ], "instance": "", "name": "sdSmoothBoolean", "outputs": [ { - "f": "sdSmooth$op($in1($uv), $in2($uv), $k)", - "type": "f" + "sdf2d": "sdSmooth$op($in1($uv), $in2($uv), $k)", + "type": "sdf2d" } ], "parameters": [ diff --git a/addons/material_maker/widgets/node_editor/input.gd b/addons/material_maker/widgets/node_editor/input.gd index 301f98d..313461b 100644 --- a/addons/material_maker/widgets/node_editor/input.gd +++ b/addons/material_maker/widgets/node_editor/input.gd @@ -15,9 +15,14 @@ func set_model_data(data) -> void: $Type.selected = 1 elif data.type == "rgba": $Type.selected = 2 + elif data.type == "sdf2d": + $Type.selected = 3 + elif data.type == "sdf3d": + $Type.selected = 4 else: $Type.selected = 0 $Default.text = data.default + $Function.pressed = data.has("function") and data.function func get_model_data() -> Dictionary: var data = { name=$Name.text, label=$Label.text, default=$Default.text } @@ -25,8 +30,14 @@ func get_model_data() -> Dictionary: data.type = "rgb" elif $Type.selected == 2: data.type = "rgba" + elif $Type.selected == 3: + data.type = "sdf2d" + elif $Type.selected == 4: + data.type = "sdf3d" else: data.type = "f" + if $Function.pressed: + data.function = true return data func _on_Delete_pressed() -> void: diff --git a/addons/material_maker/widgets/node_editor/input.tscn b/addons/material_maker/widgets/node_editor/input.tscn index a56a889..3a22a47 100644 --- a/addons/material_maker/widgets/node_editor/input.tscn +++ b/addons/material_maker/widgets/node_editor/input.tscn @@ -66,7 +66,7 @@ margin_bottom = 24.0 rect_min_size = Vector2( 102, 0 ) hint_tooltip = "Input flag" text = "GreyScale" -items = [ "GreyScale", null, false, 0, null, "Color", null, false, 1, null, "RGBA", null, false, -1, null ] +items = [ "GreyScale", null, false, 0, null, "Color", null, false, 1, null, "RGBA", null, false, 2, null, "SDF2D", null, false, 3, null, "SDF3D", null, false, 4, null ] selected = 0 [node name="Default" type="LineEdit" parent="."] @@ -77,6 +77,12 @@ rect_min_size = Vector2( 70, 0 ) hint_tooltip = "Default value" size_flags_horizontal = 3 text = "0.0" + +[node name="Function" type="CheckBox" parent="."] +margin_left = 418.0 +margin_right = 501.0 +margin_bottom = 24.0 +text = "Function" [connection signal="pressed" from="Delete" to="." method="_on_Delete_pressed"] [connection signal="pressed" from="Up" to="." method="_on_Up_pressed"] [connection signal="pressed" from="Down" to="." method="_on_Down_pressed"] diff --git a/addons/material_maker/widgets/node_editor/output.gd b/addons/material_maker/widgets/node_editor/output.gd index ca9d8c0..4af81ab 100644 --- a/addons/material_maker/widgets/node_editor/output.gd +++ b/addons/material_maker/widgets/node_editor/output.gd @@ -15,6 +15,12 @@ func set_model_data(data) -> void: elif data.has("rgba"): $Type.selected = 2 $Value.text = data.rgba + elif data.has("sdf2d"): + $Type.selected = 3 + $Value.text = data.sdf2d + elif data.has("sdf3d"): + $Type.selected = 4 + $Value.text = data.sdf3d elif data.has("f"): $Type.selected = 0 $Value.text = data.f @@ -24,6 +30,10 @@ func get_model_data() -> Dictionary: return { rgb=$Value.text } elif $Type.selected == 2: return { rgba=$Value.text } + elif $Type.selected == 3: + return { sdf2d=$Value.text } + elif $Type.selected == 4: + return { sdf3d=$Value.text } else: return { f=$Value.text } diff --git a/addons/material_maker/widgets/node_editor/output.tscn b/addons/material_maker/widgets/node_editor/output.tscn index bd1d127..17e0e77 100644 --- a/addons/material_maker/widgets/node_editor/output.tscn +++ b/addons/material_maker/widgets/node_editor/output.tscn @@ -58,7 +58,7 @@ margin_bottom = 25.0 rect_min_size = Vector2( 102, 0 ) hint_tooltip = "Input flag" text = "GreyScale" -items = [ "GreyScale", null, false, 0, null, "Color", null, false, 1, null, "RGBA", null, false, -1, null ] +items = [ "GreyScale", null, false, 0, null, "Color", null, false, 1, null, "RGBA", null, false, 2, null, "SDF2D", null, false, 3, null, "SDF3D", null, false, 4, null ] selected = 0 [node name="Value" type="LineEdit" parent="."] From 864e4e9fe8f34254b179118a7a38f8c844e00fc5 Mon Sep 17 00:00:00 2001 From: RodZill4 Date: Sun, 15 Dec 2019 16:21:15 +0100 Subject: [PATCH 03/15] More signed distance functions nodes... --- .../material_maker/examples/raymarching.ptex | 833 +++++++++++------- .../material_maker/nodes/sdf3d_extrusion.mmg | 47 + .../material_maker/nodes/sdf3d_revolution.mmg | 47 + addons/material_maker/nodes/sdf3d_rotate.mmg | 66 ++ addons/material_maker/nodes/sdf3d_scale.mmg | 46 + .../material_maker/nodes/sdf3d_translate.mmg | 62 ++ addons/material_maker/nodes/sdrotate.mmg | 45 + addons/material_maker/nodes/sdscale.mmg | 46 + addons/material_maker/nodes/sdtranslate.mmg | 53 ++ 9 files changed, 927 insertions(+), 318 deletions(-) create mode 100644 addons/material_maker/nodes/sdf3d_extrusion.mmg create mode 100644 addons/material_maker/nodes/sdf3d_revolution.mmg create mode 100644 addons/material_maker/nodes/sdf3d_rotate.mmg create mode 100644 addons/material_maker/nodes/sdf3d_scale.mmg create mode 100644 addons/material_maker/nodes/sdf3d_translate.mmg create mode 100644 addons/material_maker/nodes/sdrotate.mmg create mode 100644 addons/material_maker/nodes/sdscale.mmg create mode 100644 addons/material_maker/nodes/sdtranslate.mmg diff --git a/addons/material_maker/examples/raymarching.ptex b/addons/material_maker/examples/raymarching.ptex index 5bbce84..089f1f3 100644 --- a/addons/material_maker/examples/raymarching.ptex +++ b/addons/material_maker/examples/raymarching.ptex @@ -1,11 +1,5 @@ { "connections": [ - { - "from": "_3", - "from_port": 1, - "to": "Material", - "to_port": 4 - }, { "from": "perlin", "from_port": 0, @@ -18,54 +12,12 @@ "to": "Material", "to_port": 2 }, - { - "from": "sdf3d_sphere", - "from_port": 0, - "to": "_4", - "to_port": 0 - }, - { - "from": "sdf3d_sphere", - "from_port": 0, - "to": "_4_2", - "to_port": 0 - }, - { - "from": "_4", - "from_port": 0, - "to": "sdf3d_boolean", - "to_port": 0 - }, - { - "from": "_4_2", - "from_port": 0, - "to": "sdf3d_boolean", - "to_port": 1 - }, - { - "from": "sdf3d_boolean", - "from_port": 0, - "to": "_4_2_2", - "to_port": 0 - }, - { - "from": "_4_2_2", - "from_port": 0, - "to": "sdf3d_smoothboolean", - "to_port": 0 - }, { "from": "sdf3d_box", "from_port": 0, "to": "sdf3d_smoothboolean", "to_port": 1 }, - { - "from": "sdf3d_torus", - "from_port": 0, - "to": "_4_2_2_2", - "to_port": 0 - }, { "from": "sdf3d_smoothboolean", "from_port": 0, @@ -73,15 +25,105 @@ "to_port": 1 }, { - "from": "_4_2_2_2", + "from": "sdf3d_smoothboolean_2", + "from_port": 0, + "to": "_3", + "to_port": 0 + }, + { + "from": "sdf3d_torus", + "from_port": 0, + "to": "sdf3d_translate", + "to_port": 0 + }, + { + "from": "sdf3d_translate", "from_port": 0, "to": "sdf3d_smoothboolean_2", "to_port": 0 }, + { + "from": "sdf3d_sphere", + "from_port": 0, + "to": "sdf3d_translate_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_2", + "from_port": 0, + "to": "sdf3d_boolean", + "to_port": 0 + }, + { + "from": "sdf3d_sphere", + "from_port": 0, + "to": "sdf3d_translate_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_2_2", + "from_port": 0, + "to": "sdf3d_boolean", + "to_port": 1 + }, + { + "from": "sdf3d_boolean", + "from_port": 0, + "to": "sdf3d_translate_3", + "to_port": 0 + }, + { + "from": "sdf3d_translate_3", + "from_port": 0, + "to": "sdf3d_smoothboolean", + "to_port": 0 + }, { "from": "sdf3d_smoothboolean_2", "from_port": 0, - "to": "_3", + "to": "sdscale", + "to_port": 0 + }, + { + "from": "sdbox", + "from_port": 0, + "to": "sdboolean", + "to_port": 1 + }, + { + "from": "sdrhombus_2", + "from_port": 0, + "to": "sdboolean", + "to_port": 0 + }, + { + "from": "sdboolean", + "from_port": 0, + "to": "_4_2_3", + "to_port": 0 + }, + { + "from": "sdrotate", + "from_port": 0, + "to": "_3_2", + "to_port": 0 + }, + { + "from": "_3_2", + "from_port": 1, + "to": "Material", + "to_port": 4 + }, + { + "from": "_4_2_3", + "from_port": 0, + "to": "sdf3d_revolution", + "to_port": 0 + }, + { + "from": "sdf3d_revolution", + "from_port": 0, + "to": "sdrotate", "to_port": 0 } ], @@ -95,8 +137,8 @@ { "name": "Material", "node_position": { - "x": -36, - "y": -273 + "x": -252, + "y": 252 }, "parameters": { "albedo_color": { @@ -120,8 +162,8 @@ { "name": "_3", "node_position": { - "x": -424.5, - "y": -165 + "x": -563.5, + "y": -507 }, "parameters": { @@ -159,8 +201,8 @@ { "name": "perlin", "node_position": { - "x": -511.535645, - "y": -348.25 + "x": -523.535645, + "y": -5.25 }, "parameters": { "iterations": 5, @@ -173,8 +215,8 @@ { "name": "colorize", "node_position": { - "x": -260.535645, - "y": -304.25 + "x": -504.535645, + "y": 119.75 }, "parameters": { "gradient": { @@ -207,73 +249,11 @@ }, "type": "colorize" }, - { - "name": "_4", - "node_position": { - "x": -1008.238525, - "y": -303.85495 - }, - "parameters": { - "x": -0.17, - "y": 0, - "z": 0 - }, - "shader_model": { - "code": "", - "global": "", - "inputs": [ - { - "default": "0.0", - "label": "", - "name": "in", - "type": "sdf3d" - } - ], - "instance": "", - "name": "Translate", - "outputs": [ - { - "sdf3d": "$in($uv+vec3($x, $y, $z))", - "type": "sdf3d" - } - ], - "parameters": [ - { - "default": 0, - "label": "X", - "max": 1, - "min": -1, - "name": "x", - "step": 0.01, - "type": "float" - }, - { - "default": 0, - "label": "Y", - "max": 1, - "min": -1, - "name": "y", - "step": 0.01, - "type": "float" - }, - { - "default": 0, - "label": "Z", - "max": 1, - "min": -1, - "name": "z", - "step": 0.01, - "type": "float" - } - ] - }, - "type": "shader" - }, { "name": "sdf3d_boolean", "node_position": { - "x": -821.049805, - "y": -365.10495 + "x": -985.049805, + "y": -699.10498 }, "parameters": { "bevel": 0, @@ -289,8 +269,8 @@ { "name": "sdf3d_box", "node_position": { - "x": -1025.376221, - "y": -92.60495 + "x": -1189.376221, + "y": -426.60495 }, "parameters": { "r": 0.26, @@ -356,8 +336,8 @@ { "name": "sdf3d_torus", "node_position": { - "x": -819.376282, - "y": -100.60495 + "x": -981.376282, + "y": -453.60495 }, "parameters": { "R": 0.38, @@ -426,8 +406,8 @@ { "name": "sdf3d_smoothboolean", "node_position": { - "x": -822.049805, - "y": -189.10495 + "x": -986.049805, + "y": -523.10498 }, "parameters": { "bevel": 0, @@ -441,197 +421,11 @@ }, "type": "sdf3d_smoothboolean" }, - { - "name": "_4_2", - "node_position": { - "x": -1004.406982, - "y": -196.60495 - }, - "parameters": { - "x": 0.17, - "y": 0, - "z": 0 - }, - "shader_model": { - "code": "", - "global": "", - "inputs": [ - { - "default": "0.0", - "label": "", - "name": "in", - "type": "sdf3d" - } - ], - "instance": "", - "name": "Translate", - "outputs": [ - { - "sdf3d": "$in($uv+vec3($x, $y, $z))", - "type": "sdf3d" - } - ], - "parameters": [ - { - "default": 0, - "label": "X", - "max": 1, - "min": -1, - "name": "x", - "step": 0.01, - "type": "float" - }, - { - "default": 0, - "label": "Y", - "max": 1, - "min": -1, - "name": "y", - "step": 0.01, - "type": "float" - }, - { - "default": 0, - "label": "Z", - "max": 1, - "min": -1, - "name": "z", - "step": 0.01, - "type": "float" - } - ] - }, - "type": "shader" - }, - { - "name": "_4_2_2", - "node_position": { - "x": -808.049805, - "y": -300.60495 - }, - "parameters": { - "x": 0, - "y": 0.14, - "z": -0.23 - }, - "shader_model": { - "code": "", - "global": "", - "inputs": [ - { - "default": "0.0", - "label": "", - "name": "in", - "type": "sdf3d" - } - ], - "instance": "", - "name": "Translate", - "outputs": [ - { - "sdf3d": "$in($uv+vec3($x, $y, $z))", - "type": "sdf3d" - } - ], - "parameters": [ - { - "default": 0, - "label": "X", - "max": 1, - "min": -1, - "name": "x", - "step": 0.01, - "type": "float" - }, - { - "default": 0, - "label": "Y", - "max": 1, - "min": -1, - "name": "y", - "step": 0.01, - "type": "float" - }, - { - "default": 0, - "label": "Z", - "max": 1, - "min": -1, - "name": "z", - "step": 0.01, - "type": "float" - } - ] - }, - "type": "shader" - }, - { - "name": "_4_2_2_2", - "node_position": { - "x": -813.069458, - "y": 32.162903 - }, - "parameters": { - "x": 0, - "y": 0.19, - "z": -0.23 - }, - "shader_model": { - "code": "", - "global": "", - "inputs": [ - { - "default": "0.0", - "label": "", - "name": "in", - "type": "sdf3d" - } - ], - "instance": "", - "name": "Translate", - "outputs": [ - { - "sdf3d": "$in($uv+vec3($x, $y, $z))", - "type": "sdf3d" - } - ], - "parameters": [ - { - "default": 0, - "label": "X", - "max": 1, - "min": -1, - "name": "x", - "step": 0.01, - "type": "float" - }, - { - "default": 0, - "label": "Y", - "max": 1, - "min": -1, - "name": "y", - "step": 0.01, - "type": "float" - }, - { - "default": 0, - "label": "Z", - "max": 1, - "min": -1, - "name": "z", - "step": 0.01, - "type": "float" - } - ] - }, - "type": "shader" - }, { "name": "sdf3d_smoothboolean_2", "node_position": { - "x": -621.569458, - "y": -171.337097 + "x": -758.569458, + "y": -341.337097 }, "parameters": { "bevel": 0, @@ -648,13 +442,416 @@ { "name": "sdf3d_sphere", "node_position": { - "x": -1000.049805, - "y": -359.10495 + "x": -1164.049805, + "y": -693.10498 }, "parameters": { "r": 0.07 }, "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_translate", + "node_position": { + "x": -977.057617, + "y": -329.090332 + }, + "parameters": { + "x": 0, + "y": -0.19, + "z": 0.23 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_translate_2", + "node_position": { + "x": -1172.057617, + "y": -640.590332 + }, + "parameters": { + "x": 0.17, + "y": 0, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_translate_2_2", + "node_position": { + "x": -1171.057617, + "y": -537.090332 + }, + "parameters": { + "x": -0.17, + "y": 0, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_translate_3", + "node_position": { + "x": -983.057617, + "y": -640.340332 + }, + "parameters": { + "x": 0, + "y": -0.12, + "z": 0.23 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdscale", + "node_position": { + "x": -972.057617, + "y": -229.090332 + }, + "parameters": { + "a": 0, + "s": 1, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Scale", + "outputs": [ + { + "sdf3d": "$in(($uv)/$s)*$s", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 1, + "label": "", + "max": 5, + "min": 0, + "name": "s", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdrotate", + "node_position": { + "x": -729.057617, + "y": 370.909668 + }, + "parameters": { + "a": 0, + "ax": 18, + "ay": -28, + "az": -29, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "vec3 rotate3d(vec3 p, vec3 a) {\n\tvec3 rv;\n\tfloat c;\n\tfloat s;\n\tc = cos(a.x);\n\ts = sin(a.x);\n\trv.x = p.x;\n\trv.y = p.y*c+p.z*s;\n\trv.z = -p.y*s+p.z*c;\n\tc = cos(a.y);\n\ts = sin(a.y);\n\tp.x = rv.x*c+rv.z*s;\n\tp.y = rv.y;\n\tp.z = -rv.x*s+rv.z*c;\n\tc = cos(a.z);\n\ts = sin(a.z);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Rotate", + "outputs": [ + { + "sdf3d": "$in(rotate3d($uv, -vec3($ax, $ay, $az)*0.01745329251))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "X", + "max": 180, + "min": -180, + "name": "ax", + "step": 1, + "type": "float" + }, + { + "default": 0, + "label": "Y", + "max": 180, + "min": -180, + "name": "ay", + "step": 1, + "type": "float" + }, + { + "default": 0, + "label": "Z", + "max": 180, + "min": -180, + "name": "az", + "step": 1, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdrhombus_2", + "node_position": { + "x": -1116.057617, + "y": 261.159668 + }, + "parameters": { + "cx": 0, + "cy": 0, + "h": 0.29, + "r": 0.3, + "w": 0.3 + }, + "type": "sdrhombus" + }, + { + "name": "sdbox", + "node_position": { + "x": -1119.057617, + "y": 401.159668 + }, + "parameters": { + "cx": 0, + "cy": 0, + "h": 0.2, + "r": 0.3, + "w": 0.2 + }, + "shader_model": { + "code": "vec2 $(name_uv)_d = abs($uv-0.5*vec2($cx+1.0, $cy+1.0))-vec2($w, $h);\n", + "global": "", + "inputs": [ + + ], + "instance": "", + "name": "sdBox", + "outputs": [ + { + "sdf2d": "length(max($(name_uv)_d,vec2(0)))+min(max($(name_uv)_d.x,$(name_uv)_d.y),0.0)", + "type": "sdf2d" + } + ], + "parameters": [ + { + "default": 0.5, + "label": "Width", + "max": 1, + "min": 0, + "name": "w", + "step": 0.01, + "type": "float" + }, + { + "default": 1, + "label": "Height", + "max": 1, + "min": 0, + "name": "h", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Center X", + "max": 1, + "min": -1, + "name": "cx", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Center Y", + "max": 1, + "min": -1, + "name": "cy", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdboolean", + "node_position": { + "x": -894.057617, + "y": 297.159668 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdboolean" + }, + { + "name": "_4_2_3", + "node_position": { + "x": -903.047241, + "y": 363.697357 + }, + "parameters": { + "x": 0, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf2d" + } + ], + "instance": "", + "name": "Translate", + "outputs": [ + { + "sdf2d": "$in($uv-vec2($x, $y))", + "type": "sdf2d" + } + ], + "parameters": [ + { + "default": 0, + "label": "X", + "max": 1, + "min": -1, + "name": "x", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Y", + "max": 1, + "min": -1, + "name": "y", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "_3_2", + "node_position": { + "x": -567.336426, + "y": 335.947357 + }, + "parameters": { + + }, + "shader_model": { + "code": "float $(name_uv)_d = raymarch_$name($uv);\n", + "global": "", + "inputs": [ + { + "default": "0.0", + "function": true, + "label": "", + "name": "sdf", + "type": "sdf3d" + } + ], + "instance": "float input_$name(vec3 p) {\n\treturn min($sdf(p), p.z);\n}\n\nfloat raymarch_$name(vec2 uv) {\n\tvec3 ro = vec3(uv-vec2(0.5), 1.0);\n\tvec3 rd = vec3(0.0, 0.0, -1.0);\n\tfloat dO=0.;\n \n for (int i=0; i < 50; i++) {\n \tvec3 p = ro + rd*dO;\n float dS = input_$name(p);\n dO += dS;\n if (dO > 0.001 && dS < 0.0001) break;\n }\n \n return dO;\n}\n\nvec3 normal_$name(vec3 p) {\n\tfloat d = input_$name(p);\n float e = .001;\n \n vec3 n = d - vec3(\n input_$name(p-vec3(e, 0.0, 0.0)),\n input_$name(p-vec3(0.0, e, 0.0)),\n input_$name(p-vec3(0.0, 0.0, e)));\n \n return vec3(-1.0, -1.0, -1.0)*normalize(n);\n}\n\n", + "name": "Raymarching", + "outputs": [ + { + "f": "1.0-$(name_uv)_d", + "type": "f" + }, + { + "rgb": "vec3(0.5)+0.5*normal_$name(vec3($uv-vec2(0.5), 1.0-$(name_uv)_d))", + "type": "rgb" + } + ], + "parameters": [ + + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_revolution", + "node_position": { + "x": -723.403931, + "y": 294.330994 + }, + "parameters": { + "a": 0, + "d": 0.43, + "s": 1, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "vec2 $(name_uv)_w = vec2($in($uv.xz+vec2(0.5)),abs($uv.y)-$d);\n", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf2d" + } + ], + "instance": "", + "name": "Extrusion", + "outputs": [ + { + "sdf3d": "min(max($(name_uv)_w.x,$(name_uv)_w.y),0.0)+length(max($(name_uv)_w,0.0))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0.25, + "label": "", + "max": 1, + "min": 0, + "name": "d", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" } ], "parameters": { diff --git a/addons/material_maker/nodes/sdf3d_extrusion.mmg b/addons/material_maker/nodes/sdf3d_extrusion.mmg new file mode 100644 index 0000000..87eeac1 --- /dev/null +++ b/addons/material_maker/nodes/sdf3d_extrusion.mmg @@ -0,0 +1,47 @@ +{ + "name": "sdf3d_extrusion", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "a": 0, + "d": 0.5, + "s": 1, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "vec2 $(name_uv)_w = vec2($in($uv.xz+vec2(0.5)),abs($uv.y)-$d);\n", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf2d" + } + ], + "instance": "", + "name": "Extrusion", + "outputs": [ + { + "sdf3d": "min(max($(name_uv)_w.x,$(name_uv)_w.y),0.0)+length(max($(name_uv)_w,0.0))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0.25, + "label": "", + "max": 1, + "min": 0, + "name": "d", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdf3d_revolution.mmg b/addons/material_maker/nodes/sdf3d_revolution.mmg new file mode 100644 index 0000000..9cf93c6 --- /dev/null +++ b/addons/material_maker/nodes/sdf3d_revolution.mmg @@ -0,0 +1,47 @@ +{ + "name": "sdf3d_revolution", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "a": 0, + "d": 0.25, + "s": 1, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "vec2 $(name_uv)_q = vec2(length($uv.xy)-$d+0.5, $uv.z+0.5);\n", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf2d" + } + ], + "instance": "", + "name": "Revolution", + "outputs": [ + { + "sdf3d": "$in($(name_uv)_q)", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0.25, + "label": "", + "max": 1, + "min": 0, + "name": "d", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdf3d_rotate.mmg b/addons/material_maker/nodes/sdf3d_rotate.mmg new file mode 100644 index 0000000..588e943 --- /dev/null +++ b/addons/material_maker/nodes/sdf3d_rotate.mmg @@ -0,0 +1,66 @@ +{ + "name": "sdf3d_rotate", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "a": 0, + "ax": 0, + "ay": 0, + "az": 0, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "vec3 rotate3d(vec3 p, vec3 a) {\n\tvec3 rv;\n\tfloat c;\n\tfloat s;\n\tc = cos(a.x);\n\ts = sin(a.x);\n\trv.x = p.x;\n\trv.y = p.y*c+p.z*s;\n\trv.z = -p.y*s+p.z*c;\n\tc = cos(a.y);\n\ts = sin(a.y);\n\tp.x = rv.x*c+rv.z*s;\n\tp.y = rv.y;\n\tp.z = -rv.x*s+rv.z*c;\n\tc = cos(a.z);\n\ts = sin(a.z);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Rotate", + "outputs": [ + { + "sdf3d": "$in(rotate3d($uv, -vec3($ax, $ay, $az)*0.01745329251))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "X", + "max": 180, + "min": -180, + "name": "ax", + "step": 1, + "type": "float" + }, + { + "default": 0, + "label": "Y", + "max": 180, + "min": -180, + "name": "ay", + "step": 1, + "type": "float" + }, + { + "default": 0, + "label": "Z", + "max": 180, + "min": -180, + "name": "az", + "step": 1, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdf3d_scale.mmg b/addons/material_maker/nodes/sdf3d_scale.mmg new file mode 100644 index 0000000..304427a --- /dev/null +++ b/addons/material_maker/nodes/sdf3d_scale.mmg @@ -0,0 +1,46 @@ +{ + "name": "sdf3d_scale", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "a": 0, + "s": 1, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "vec2 rotate(vec2 uv, float a) {\n\tvec2 rv;\n\tfloat c = cos(a);\n\tfloat s = sin(a);\n\tuv -= vec2(0.5);\n\trv.x = uv.x*c+uv.y*s;\n\trv.y = -uv.x*s+uv.y*c;\n\treturn rv+vec2(0.5);\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Scale", + "outputs": [ + { + "sdf3d": "$in(($uv)/$s)*$s", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 1, + "label": "", + "max": 5, + "min": 0, + "name": "s", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdf3d_translate.mmg b/addons/material_maker/nodes/sdf3d_translate.mmg new file mode 100644 index 0000000..7a7f167 --- /dev/null +++ b/addons/material_maker/nodes/sdf3d_translate.mmg @@ -0,0 +1,62 @@ +{ + "name": "sdf3d_translate", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "x": 0, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Translate", + "outputs": [ + { + "sdf3d": "$in($uv-vec3($x, $y, $z))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "X", + "max": 1, + "min": -1, + "name": "x", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Y", + "max": 1, + "min": -1, + "name": "y", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Z", + "max": 1, + "min": -1, + "name": "z", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdrotate.mmg b/addons/material_maker/nodes/sdrotate.mmg new file mode 100644 index 0000000..c56137f --- /dev/null +++ b/addons/material_maker/nodes/sdrotate.mmg @@ -0,0 +1,45 @@ +{ + "name": "sdrotate", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "a": 0, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "vec2 rotate(vec2 uv, float a) {\n\tvec2 rv;\n\tfloat c = cos(a);\n\tfloat s = sin(a);\n\tuv -= vec2(0.5);\n\trv.x = uv.x*c+uv.y*s;\n\trv.y = -uv.x*s+uv.y*c;\n\treturn rv+vec2(0.5);\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf2d" + } + ], + "instance": "", + "name": "Rotate", + "outputs": [ + { + "sdf2d": "$in(rotate($uv, $a*0.01745329251))", + "type": "sdf2d" + } + ], + "parameters": [ + { + "default": 0, + "label": "", + "max": 180, + "min": -180, + "name": "a", + "step": 1, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdscale.mmg b/addons/material_maker/nodes/sdscale.mmg new file mode 100644 index 0000000..0b58d87 --- /dev/null +++ b/addons/material_maker/nodes/sdscale.mmg @@ -0,0 +1,46 @@ +{ + "name": "sdscale", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "a": 0, + "s": 1, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Scale", + "outputs": [ + { + "sdf3d": "$in(($uv)/$s)*$s", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 1, + "label": "", + "max": 5, + "min": 0, + "name": "s", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdtranslate.mmg b/addons/material_maker/nodes/sdtranslate.mmg new file mode 100644 index 0000000..a4b72f7 --- /dev/null +++ b/addons/material_maker/nodes/sdtranslate.mmg @@ -0,0 +1,53 @@ +{ + "name": "sdtranslate", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "x": 0, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf2d" + } + ], + "instance": "", + "name": "Translate", + "outputs": [ + { + "sdf2d": "$in($uv-vec2($x, $y))", + "type": "sdf2d" + } + ], + "parameters": [ + { + "default": 0, + "label": "X", + "max": 1, + "min": -1, + "name": "x", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Y", + "max": 1, + "min": -1, + "name": "y", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file From b7fb257d4c659ef5c8a1609263cebf0b983969eb Mon Sep 17 00:00:00 2001 From: RodZill4 Date: Wed, 18 Dec 2019 22:36:44 +0100 Subject: [PATCH 04/15] Added more raymarching nodes and examples --- .../material_maker/examples/raymarching.ptex | 1680 +++++++++++++++- addons/material_maker/examples/skulls.ptex | 1755 +++++++++++++++++ .../nodes/sdf3d_circle_repeat.mmg | 50 + addons/material_maker/nodes/sdf3d_repeat.mmg | 67 + 4 files changed, 3512 insertions(+), 40 deletions(-) create mode 100644 addons/material_maker/examples/skulls.ptex create mode 100644 addons/material_maker/nodes/sdf3d_circle_repeat.mmg create mode 100644 addons/material_maker/nodes/sdf3d_repeat.mmg diff --git a/addons/material_maker/examples/raymarching.ptex b/addons/material_maker/examples/raymarching.ptex index 089f1f3..0ce6dc4 100644 --- a/addons/material_maker/examples/raymarching.ptex +++ b/addons/material_maker/examples/raymarching.ptex @@ -102,18 +102,6 @@ "to": "_4_2_3", "to_port": 0 }, - { - "from": "sdrotate", - "from_port": 0, - "to": "_3_2", - "to_port": 0 - }, - { - "from": "_3_2", - "from_port": 1, - "to": "Material", - "to_port": 4 - }, { "from": "_4_2_3", "from_port": 0, @@ -125,6 +113,210 @@ "from_port": 0, "to": "sdrotate", "to_port": 0 + }, + { + "from": "perlin", + "from_port": 0, + "to": "colorize_2", + "to_port": 0 + }, + { + "from": "uniform_greyscale", + "from_port": 0, + "to": "Material", + "to_port": 1 + }, + { + "from": "colorize_3", + "from_port": 0, + "to": "Material", + "to_port": 6 + }, + { + "from": "_3_2", + "from_port": 0, + "to": "colorize_3", + "to_port": 0 + }, + { + "from": "graph", + "from_port": 0, + "to": "sdf3d_scale", + "to_port": 0 + }, + { + "from": "_3_2", + "from_port": 0, + "to": "occlusion", + "to_port": 0 + }, + { + "from": "occlusion", + "from_port": 0, + "to": "Material", + "to_port": 5 + }, + { + "from": "sdf3d_scale", + "from_port": 0, + "to": "sdf3d_scale_2", + "to_port": 0 + }, + { + "from": "sdf3d_scale_2", + "from_port": 0, + "to": "sdf3d_boolean_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4", + "from_port": 0, + "to": "sdf3d_boolean_2", + "to_port": 1 + }, + { + "from": "sdf3d_scale", + "from_port": 0, + "to": "sdf3d_repeat", + "to_port": 0 + }, + { + "from": "sdf3d_repeat", + "from_port": 0, + "to": "sdf3d_translate_4", + "to_port": 0 + }, + { + "from": "perlin", + "from_port": 0, + "to": "colorize_4", + "to_port": 0 + }, + { + "from": "_3_2", + "from_port": 0, + "to": "colorize_5", + "to_port": 0 + }, + { + "from": "colorize_2", + "from_port": 0, + "to": "blend", + "to_port": 0 + }, + { + "from": "colorize_5", + "from_port": 0, + "to": "blend", + "to_port": 2 + }, + { + "from": "colorize_4", + "from_port": 0, + "to": "blend", + "to_port": 1 + }, + { + "from": "blend", + "from_port": 0, + "to": "Material", + "to_port": 0 + }, + { + "from": "graph_2", + "from_port": 0, + "to": "sdf3d_scale_3", + "to_port": 0 + }, + { + "from": "sdf3d_scale_3", + "from_port": 0, + "to": "sdf3d_repeat_2", + "to_port": 0 + }, + { + "from": "sdf3d_boolean_2", + "from_port": 0, + "to": "sdf3d_boolean_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_repeat_2", + "from_port": 0, + "to": "sdf3d_translate_4_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_2", + "from_port": 0, + "to": "sdf3d_boolean_2_2", + "to_port": 1 + }, + { + "from": "sdf3d_repeat_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_scale_3", + "from_port": 0, + "to": "sdf3d_repeat_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_boolean_2_2", + "from_port": 0, + "to": "sdf3d_boolean_2_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_2_2", + "from_port": 0, + "to": "sdf3d_boolean_2_2_2", + "to_port": 1 + }, + { + "from": "sdf3d_boolean_2_2_2", + "from_port": 0, + "to": "_3_2", + "to_port": 0 + }, + { + "from": "blend_2", + "from_port": 0, + "to": "Material", + "to_port": 4 + }, + { + "from": "perlin", + "from_port": 0, + "to": "normal_map", + "to_port": 0 + }, + { + "from": "_3_2", + "from_port": 1, + "to": "blend_2", + "to_port": 0 + }, + { + "from": "normal_map", + "from_port": 0, + "to": "blend_2", + "to_port": 1 + }, + { + "from": "colorize_5_2", + "from_port": 0, + "to": "blend_2", + "to_port": 2 + }, + { + "from": "_3_2", + "from_port": 0, + "to": "colorize_5_2", + "to_port": 0 } ], "label": "Graph", @@ -137,8 +329,8 @@ { "name": "Material", "node_position": { - "x": -252, - "y": 252 + "x": 463, + "y": 1358 }, "parameters": { "albedo_color": { @@ -201,12 +393,12 @@ { "name": "perlin", "node_position": { - "x": -523.535645, - "y": -5.25 + "x": -385.399658, + "y": 1196.349854 }, "parameters": { - "iterations": 5, - "persistence": 0.5, + "iterations": 7, + "persistence": 0.75, "scale_x": 4, "scale_y": 4 }, @@ -215,8 +407,8 @@ { "name": "colorize", "node_position": { - "x": -504.535645, - "y": 119.75 + "x": -367.399658, + "y": 1344.349976 }, "parameters": { "gradient": { @@ -224,24 +416,17 @@ "points": [ { "a": 1, - "b": 0.088542, - "g": 0.088542, - "pos": 0, - "r": 0.088542 + "b": 0.171875, + "g": 0.171875, + "pos": 0.1, + "r": 0.171875 }, { "a": 1, - "b": 0.494792, - "g": 0.494792, - "pos": 0.990909, - "r": 0.494792 - }, - { - "a": 1, - "b": 0.338542, - "g": 0.338542, + "b": 1, + "g": 1, "pos": 1, - "r": 0.338542 + "r": 1 } ], "type": "Gradient" @@ -551,8 +736,8 @@ { "name": "sdrotate", "node_position": { - "x": -729.057617, - "y": 370.909668 + "x": -722.057617, + "y": 347.909668 }, "parameters": { "a": 0, @@ -770,8 +955,8 @@ { "name": "_3_2", "node_position": { - "x": -567.336426, - "y": 335.947357 + "x": -378.336426, + "y": 1476.947388 }, "parameters": { @@ -809,8 +994,8 @@ { "name": "sdf3d_revolution", "node_position": { - "x": -723.403931, - "y": 294.330994 + "x": -714.403931, + "y": 295.330994 }, "parameters": { "a": 0, @@ -852,6 +1037,1421 @@ ] }, "type": "shader" + }, + { + "connections": [ + { + "from": "sdcircle", + "from_port": 0, + "to": "sdf3d_extrusion", + "to_port": 0 + }, + { + "from": "sdf3d_sphere_2", + "from_port": 0, + "to": "sdf3d_translate_4", + "to_port": 0 + }, + { + "from": "sdf3d_extrusion", + "from_port": 0, + "to": "sdf3d_translate_4_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4", + "from_port": 0, + "to": "sdf3d_smoothboolean_3", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3", + "to_port": 1 + }, + { + "from": "sdf3d_extrusion", + "from_port": 0, + "to": "sdf3d_scale", + "to_port": 0 + }, + { + "from": "sdf3d_scale", + "from_port": 0, + "to": "sdf3d_translate_4_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2", + "to_port": 1 + }, + { + "from": "sdf3d_translate_4_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_sphere_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_2", + "to_port": 1 + }, + { + "from": "sdf3d_sphere_2_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3", + "to_port": 1 + }, + { + "from": "sdf3d_translate_4_3_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_3", + "from_port": 0, + "to": "gen_outputs", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2_3", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3_2", + "to_port": 1 + }, + { + "from": "sdf3d_box_2", + "from_port": 0, + "to": "sdf3d_rotate_2", + "to_port": 0 + }, + { + "from": "sdf3d_rotate_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_rotate_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_2_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_box_2", + "from_port": 0, + "to": "sdf3d_rotate_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_2_2_2", + "from_port": 0, + "to": "sdf3d_repeat", + "to_port": 0 + }, + { + "from": "sdf3d_repeat", + "from_port": 0, + "to": "sdf3d_rotate_2_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_rotate_2_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_2_2_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_2_2_2_2", + "from_port": 0, + "to": "sdf3d_boolean", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2_3_2", + "from_port": 0, + "to": "sdf3d_boolean", + "to_port": 1 + }, + { + "from": "sdf3d_boolean", + "from_port": 0, + "to": "sdf3d_translate_4_3_3", + "to_port": 0 + } + ], + "label": "Skull", + "name": "graph", + "node_position": { + "x": -972.86731, + "y": 1204.615234 + }, + "nodes": [ + { + "name": "sdf3d_smoothboolean_3", + "node_position": { + "x": -841.989258, + "y": 938.422729 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.1, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_translate_4", + "node_position": { + "x": -1044.989258, + "y": 830.422729 + }, + "parameters": { + "x": 0, + "y": 0, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_smoothboolean_3_2", + "node_position": { + "x": -629.489258, + "y": 873.422729 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.17, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_sphere_2_2", + "node_position": { + "x": -830.318359, + "y": 1023.672852 + }, + "parameters": { + "r": 0.07 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_translate_4_3", + "node_position": { + "x": -834.318359, + "y": 1078.672852 + }, + "parameters": { + "x": 0.13, + "y": -0.04, + "z": 0.18 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_sphere_2_2_2", + "node_position": { + "x": -831.318359, + "y": 1179.672852 + }, + "parameters": { + "r": 0.08 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_sphere_2", + "node_position": { + "x": -1040.989258, + "y": 776.922729 + }, + "parameters": { + "r": 0.28 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_box_2", + "node_position": { + "x": -855.193726, + "y": 1338.172852 + }, + "parameters": { + "r": 0, + "sx": 0.05, + "sy": 0.05, + "sz": 0.05 + }, + "type": "sdf3d_box" + }, + { + "name": "sdf3d_translate_4_3_2", + "node_position": { + "x": -834.318359, + "y": 1232.672852 + }, + "parameters": { + "x": 0.12, + "y": -0.03, + "z": 0.18 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_rotate_2", + "node_position": { + "x": -839.193726, + "y": 1471.172852 + }, + "parameters": { + "a": 0, + "ax": -32, + "ay": 45, + "az": 0, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_rotate" + }, + { + "name": "sdf3d_translate_4_3_2_2", + "node_position": { + "x": -835.193726, + "y": 1573.172852 + }, + "parameters": { + "x": 0, + "y": 0.11, + "z": 0.21 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_smoothboolean_3_2_3", + "node_position": { + "x": -623.818359, + "y": 1236.172852 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.09, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_smoothboolean_3_2_2", + "node_position": { + "x": -622.818359, + "y": 1073.172852 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.15, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_translate_4_2_2", + "node_position": { + "x": -832.989258, + "y": 826.922729 + }, + "parameters": { + "x": 0, + "y": 0.24, + "z": 0.01 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_scale", + "node_position": { + "x": -823.989258, + "y": 776.422729 + }, + "parameters": { + "a": 0, + "s": 0.48, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_scale" + }, + { + "name": "sdf3d_extrusion", + "node_position": { + "x": -1043.989258, + "y": 1045.922729 + }, + "parameters": { + "a": 0, + "d": 0.08, + "s": 1, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_extrusion" + }, + { + "name": "sdf3d_smoothboolean_3_2_3_2", + "node_position": { + "x": -638.693726, + "y": 1561.672852 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.03, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdcircle", + "node_position": { + "x": -1075.989258, + "y": 940.422729 + }, + "parameters": { + "cx": 0, + "cy": 0, + "r": 0.16 + }, + "type": "sdcircle" + }, + { + "name": "sdf3d_translate_4_2", + "node_position": { + "x": -1052.989258, + "y": 1102.922729 + }, + "parameters": { + "x": 0, + "y": 0.21, + "z": 0.08 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_translate_4_3_3", + "node_position": { + "x": -200.318359, + "y": 1531.672852 + }, + "parameters": { + "x": 0.15, + "y": 0, + "z": 0.18 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Mirror", + "outputs": [ + { + "sdf3d": "$in(vec3(abs($uv.x), $uv.y, $uv.z))", + "type": "sdf3d" + } + ], + "parameters": [ + + ] + }, + "type": "shader" + }, + { + "name": "gen_inputs", + "node_position": { + "x": -1375.989258, + "y": 1121.935181 + }, + "parameters": { + + }, + "ports": [ + + ], + "type": "ios" + }, + { + "name": "gen_outputs", + "node_position": { + "x": -146.318359, + "y": 1121.935181 + }, + "parameters": { + + }, + "ports": [ + { + "name": "port0", + "type": "rgba" + } + ], + "type": "ios" + }, + { + "name": "gen_parameters", + "node_position": { + "x": -1028.995361, + "y": 476.422729 + }, + "parameters": { + + }, + "type": "remote", + "widgets": [ + + ] + }, + { + "name": "sdf3d_translate_4_3_2_2_2", + "node_position": { + "x": -830.482544, + "y": 1793.119385 + }, + "parameters": { + "x": 0, + "y": 0.233, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_rotate_2_2", + "node_position": { + "x": -835.482544, + "y": 1692.119385 + }, + "parameters": { + "a": 0, + "ax": 0, + "ay": 0, + "az": 45, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_rotate" + }, + { + "name": "sdf3d_repeat", + "node_position": { + "x": -830.482544, + "y": 1898.119385 + }, + "parameters": { + "a": 0, + "c": 22, + "r": 0.24, + "rx": 4, + "ry": 4, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "vec3 circle_repeat_transform(vec3 p, float count) {\n\tfloat r = 6.28/count;\n\tfloat pa = atan(p.x, p.y);\n\tfloat a = mod(pa+0.5*r, r)-0.5*r;\n\tvec3 rv;\n\tfloat c = cos(a-pa);\n\tfloat s = sin(a-pa);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Circle Repeat", + "outputs": [ + { + "sdf3d": "$in(circle_repeat_transform($uv, $c))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 4, + "label": "", + "max": 32, + "min": 1, + "name": "c", + "step": 1, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_rotate_2_2_2", + "node_position": { + "x": -634.235718, + "y": 1649.869385 + }, + "parameters": { + "a": 0, + "ax": 90, + "ay": 0, + "az": 0, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_rotate" + }, + { + "name": "sdf3d_translate_4_3_2_2_2_2", + "node_position": { + "x": -631.235718, + "y": 1757.869385 + }, + "parameters": { + "x": 0, + "y": 0.3, + "z": 0.07 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_boolean", + "node_position": { + "x": -424.235718, + "y": 1607.369385 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + } + ], + "parameters": { + + }, + "type": "graph" + }, + { + "name": "colorize_2", + "node_position": { + "x": -126.553131, + "y": 1179.272949 + }, + "parameters": { + "gradient": { + "interpolation": 1, + "points": [ + { + "a": 1, + "b": 0.994792, + "g": 0.999512, + "pos": 0, + "r": 1 + }, + { + "a": 1, + "b": 0.885417, + "g": 0.989258, + "pos": 1, + "r": 1 + } + ], + "type": "Gradient" + } + }, + "type": "colorize" + }, + { + "name": "uniform_greyscale", + "node_position": { + "x": 114.446899, + "y": 1316.272949 + }, + "parameters": { + "color": 0 + }, + "type": "uniform_greyscale" + }, + { + "name": "colorize_3", + "node_position": { + "x": 38.446899, + "y": 1686.272949 + }, + "parameters": { + "gradient": { + "interpolation": 1, + "points": [ + { + "a": 1, + "b": 1, + "g": 1, + "pos": 0, + "r": 1 + }, + { + "a": 1, + "b": 0, + "g": 0, + "pos": 0.663637, + "r": 0 + } + ], + "type": "Gradient" + } + }, + "type": "colorize" + }, + { + "name": "sdf3d_scale", + "node_position": { + "x": -994.911377, + "y": 1248.772949 + }, + "parameters": { + "a": 0, + "s": 0.33, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_scale" + }, + { + "name": "sdf3d_scale_2", + "node_position": { + "x": -811.183411, + "y": 1198.851807 + }, + "parameters": { + "a": 0, + "r": 0.35, + "rx": 4, + "ry": 4, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "vec3 repeat(vec3 p, vec3 r, float seed, float randomness) {\n\tvec3 a = (rand3(floor(mod((p.xy+0.5*r.xy)/r.xy, 1.0/r.xy)+vec2(seed)))-0.5)*6.28*randomness;\n\tp = mod(p+0.5*r,r)-0.5*r;\n\tvec3 rv;\n\tfloat c;\n\tfloat s;\n\tc = cos(a.x);\n\ts = sin(a.x);\n\trv.x = p.x;\n\trv.y = p.y*c+p.z*s;\n\trv.z = -p.y*s+p.z*c;\n\tc = cos(a.y);\n\ts = sin(a.y);\n\tp.x = rv.x*c+rv.z*s;\n\tp.y = rv.y;\n\tp.z = -rv.x*s+rv.z*c;\n\tc = cos(a.z);\n\ts = sin(a.z);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Repeat", + "outputs": [ + { + "sdf3d": "$in(repeat($uv, vec3(1.0/$rx, 1.0/$ry, 0.0), $seed, $r))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 4, + "label": "X", + "max": 32, + "min": 1, + "name": "rx", + "step": 1, + "type": "float" + }, + { + "default": 4, + "label": "Y", + "max": 32, + "min": 1, + "name": "ry", + "step": 1, + "type": "float" + }, + { + "default": 0.5, + "label": "R", + "max": 1, + "min": 0, + "name": "r", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "occlusion", + "node_position": { + "x": 12.088623, + "y": 1608.272949 + }, + "parameters": { + "param0": 10, + "param1": 50, + "param2": 15 + }, + "type": "occlusion" + }, + { + "name": "sdf3d_translate_4", + "node_position": { + "x": -813.195313, + "y": 1400.797363 + }, + "parameters": { + "x": 0.35, + "y": 0.35, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_boolean_2", + "node_position": { + "x": -622.79303, + "y": 1304.297363 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "sdf3d_repeat", + "node_position": { + "x": -812.79303, + "y": 1300.297363 + }, + "parameters": { + "a": 0, + "r": 0.35, + "rx": 4, + "ry": 4, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_repeat" + }, + { + "name": "colorize_4", + "node_position": { + "x": -128.79303, + "y": 1246.013184 + }, + "parameters": { + "gradient": { + "interpolation": 1, + "points": [ + { + "a": 1, + "b": 0.027452, + "g": 0.047034, + "pos": 0, + "r": 0.057292 + }, + { + "a": 1, + "b": 0.003581, + "g": 0.076426, + "pos": 1, + "r": 0.114583 + } + ], + "type": "Gradient" + } + }, + "type": "colorize" + }, + { + "name": "colorize_5", + "node_position": { + "x": -131.127869, + "y": 1320.013184 + }, + "parameters": { + "gradient": { + "interpolation": 1, + "points": [ + { + "a": 1, + "b": 0, + "g": 0, + "pos": 0, + "r": 0 + }, + { + "a": 1, + "b": 1, + "g": 1, + "pos": 0.063636, + "r": 1 + } + ], + "type": "Gradient" + } + }, + "type": "colorize" + }, + { + "name": "blend", + "node_position": { + "x": 78.872131, + "y": 1216.013184 + }, + "parameters": { + "amount": 0.5, + "blend_type": 0 + }, + "type": "blend" + }, + { + "name": "sdf3d_repeat_2", + "node_position": { + "x": -928.880676, + "y": 1590.431152 + }, + "parameters": { + "a": 0, + "r": 0.46, + "rx": 4, + "ry": 4, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_repeat" + }, + { + "connections": [ + { + "from": "sdf3d_sphere_2", + "from_port": 0, + "to": "sdf3d_translate_4_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_sphere_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3", + "to_port": 1 + }, + { + "from": "sdf3d_smoothboolean_3", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_sphere_2_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2", + "to_port": 1 + }, + { + "from": "sdf3d_sphere_2_2_3", + "from_port": 0, + "to": "sdf3d_translate_4_2_3", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2", + "from_port": 0, + "to": "sdf3d_boolean_2_2", + "to_port": 1 + }, + { + "from": "sdf3d_translate_4_2_3", + "from_port": 0, + "to": "sdf3d_boolean_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_boolean_2_2", + "from_port": 0, + "to": "gen_outputs", + "to_port": 0 + } + ], + "label": "Bone", + "name": "graph_2", + "node_position": { + "x": -978.480713, + "y": 1472.556274 + }, + "nodes": [ + { + "name": "sdf3d_translate_4_2_2", + "node_position": { + "x": -935.880676, + "y": 1383.431152 + }, + "parameters": { + "x": -0.03, + "y": -0.22, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_sphere_2", + "node_position": { + "x": -930.880676, + "y": 1327.931152 + }, + "parameters": { + "r": 0.03 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_sphere_2_2_2", + "node_position": { + "x": -937.880676, + "y": 1638.431152 + }, + "parameters": { + "h": 0.4, + "r": 0.025 + }, + "shader_model": { + "code": "vec3 $(name_uv)_p = $uv;\n$(name_uv)_p.y -= clamp($(name_uv)_p.y, -0.5*$h, 0.5*$h);\n", + "global": "", + "inputs": [ + + ], + "instance": "", + "name": "Sphere", + "outputs": [ + { + "sdf3d": "length($(name_uv)_p)-$r", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0.5, + "label": "H", + "max": 1, + "min": 0, + "name": "h", + "step": 0.01, + "type": "float" + }, + { + "default": 0.1, + "label": "R", + "max": 0.5, + "min": 0, + "name": "r", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_smoothboolean_3_2", + "node_position": { + "x": -757.380676, + "y": 1593.931152 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.02, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_smoothboolean_3", + "node_position": { + "x": -752.880676, + "y": 1509.931152 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.01, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_sphere_2_2", + "node_position": { + "x": -929.880676, + "y": 1483.431152 + }, + "parameters": { + "r": 0.04 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_translate_4_2", + "node_position": { + "x": -934.880676, + "y": 1534.431152 + }, + "parameters": { + "x": 0.02, + "y": -0.25, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_translate_4_2_3", + "node_position": { + "x": -936.380676, + "y": 1792.181152 + }, + "parameters": { + "x": -0.04, + "y": 0.21, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_sphere_2_2_3", + "node_position": { + "x": -931.380676, + "y": 1741.181152 + }, + "parameters": { + "r": 0.06 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_boolean_2_2", + "node_position": { + "x": -747.380676, + "y": 1680.681152 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "gen_inputs", + "node_position": { + "x": -1237.880615, + "y": 1568.556274 + }, + "parameters": { + + }, + "ports": [ + + ], + "type": "ios" + }, + { + "name": "gen_outputs", + "node_position": { + "x": -447.380676, + "y": 1568.556274 + }, + "parameters": { + + }, + "ports": [ + { + "name": "port0", + "type": "rgba" + } + ], + "type": "ios" + }, + { + "name": "gen_parameters", + "node_position": { + "x": -1079.480713, + "y": 1027.931152 + }, + "parameters": { + + }, + "type": "remote", + "widgets": [ + + ] + } + ], + "parameters": { + + }, + "type": "graph" + }, + { + "name": "sdf3d_scale_3", + "node_position": { + "x": -923.764893, + "y": 1534.628418 + }, + "parameters": { + "a": 0, + "s": 0.4, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_scale" + }, + { + "name": "sdf3d_boolean_2_2", + "node_position": { + "x": -546.264893, + "y": 1515.128418 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "sdf3d_translate_4_2", + "node_position": { + "x": -753.844666, + "y": 1576.628418 + }, + "parameters": { + "x": 0.35, + "y": 0.52, + "z": 0.02 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_repeat_2_2", + "node_position": { + "x": -933.362671, + "y": 1695.529785 + }, + "parameters": { + "a": 0, + "r": 0.5, + "rx": 4, + "ry": 4, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_repeat" + }, + { + "name": "sdf3d_translate_4_2_2", + "node_position": { + "x": -758.32666, + "y": 1681.727051 + }, + "parameters": { + "x": 0.51, + "y": 0.38, + "z": 0.02 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_boolean_2_2_2", + "node_position": { + "x": -550.344666, + "y": 1585.128418 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "normal_map", + "node_position": { + "x": 52.85556, + "y": 1392.238892 + }, + "parameters": { + "amount": 0.5, + "param0": 10, + "param1": 1.02, + "param2": 0, + "size": 4 + }, + "type": "normal_map" + }, + { + "name": "blend_2", + "node_position": { + "x": 23.85556, + "y": 1485.238892 + }, + "parameters": { + "amount": 1, + "blend_type": 0 + }, + "type": "blend" + }, + { + "name": "colorize_5_2", + "node_position": { + "x": -190.144485, + "y": 1443.488892 + }, + "parameters": { + "gradient": { + "interpolation": 0, + "points": [ + { + "a": 1, + "b": 0, + "g": 0, + "pos": 0, + "r": 0 + }, + { + "a": 1, + "b": 1, + "g": 1, + "pos": 0.027272, + "r": 1 + } + ], + "type": "Gradient" + } + }, + "type": "colorize" } ], "parameters": { diff --git a/addons/material_maker/examples/skulls.ptex b/addons/material_maker/examples/skulls.ptex new file mode 100644 index 0000000..ad0a082 --- /dev/null +++ b/addons/material_maker/examples/skulls.ptex @@ -0,0 +1,1755 @@ +{ + "connections": [ + { + "from": "perlin", + "from_port": 0, + "to": "colorize", + "to_port": 0 + }, + { + "from": "colorize", + "from_port": 0, + "to": "Material", + "to_port": 2 + }, + { + "from": "perlin", + "from_port": 0, + "to": "colorize_2", + "to_port": 0 + }, + { + "from": "uniform_greyscale", + "from_port": 0, + "to": "Material", + "to_port": 1 + }, + { + "from": "colorize_3", + "from_port": 0, + "to": "Material", + "to_port": 6 + }, + { + "from": "_3_2", + "from_port": 0, + "to": "colorize_3", + "to_port": 0 + }, + { + "from": "graph", + "from_port": 0, + "to": "sdf3d_scale", + "to_port": 0 + }, + { + "from": "_3_2", + "from_port": 0, + "to": "occlusion", + "to_port": 0 + }, + { + "from": "occlusion", + "from_port": 0, + "to": "Material", + "to_port": 5 + }, + { + "from": "sdf3d_scale", + "from_port": 0, + "to": "sdf3d_scale_2", + "to_port": 0 + }, + { + "from": "sdf3d_scale_2", + "from_port": 0, + "to": "sdf3d_boolean_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4", + "from_port": 0, + "to": "sdf3d_boolean_2", + "to_port": 1 + }, + { + "from": "sdf3d_scale", + "from_port": 0, + "to": "sdf3d_repeat", + "to_port": 0 + }, + { + "from": "sdf3d_repeat", + "from_port": 0, + "to": "sdf3d_translate_4", + "to_port": 0 + }, + { + "from": "perlin", + "from_port": 0, + "to": "colorize_4", + "to_port": 0 + }, + { + "from": "_3_2", + "from_port": 0, + "to": "colorize_5", + "to_port": 0 + }, + { + "from": "colorize_2", + "from_port": 0, + "to": "blend", + "to_port": 0 + }, + { + "from": "colorize_5", + "from_port": 0, + "to": "blend", + "to_port": 2 + }, + { + "from": "colorize_4", + "from_port": 0, + "to": "blend", + "to_port": 1 + }, + { + "from": "blend", + "from_port": 0, + "to": "Material", + "to_port": 0 + }, + { + "from": "graph_2", + "from_port": 0, + "to": "sdf3d_scale_3", + "to_port": 0 + }, + { + "from": "sdf3d_scale_3", + "from_port": 0, + "to": "sdf3d_repeat_2", + "to_port": 0 + }, + { + "from": "sdf3d_boolean_2", + "from_port": 0, + "to": "sdf3d_boolean_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_repeat_2", + "from_port": 0, + "to": "sdf3d_translate_4_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_2", + "from_port": 0, + "to": "sdf3d_boolean_2_2", + "to_port": 1 + }, + { + "from": "sdf3d_repeat_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_scale_3", + "from_port": 0, + "to": "sdf3d_repeat_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_boolean_2_2", + "from_port": 0, + "to": "sdf3d_boolean_2_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_2_2", + "from_port": 0, + "to": "sdf3d_boolean_2_2_2", + "to_port": 1 + }, + { + "from": "sdf3d_boolean_2_2_2", + "from_port": 0, + "to": "_3_2", + "to_port": 0 + }, + { + "from": "blend_2", + "from_port": 0, + "to": "Material", + "to_port": 4 + }, + { + "from": "perlin", + "from_port": 0, + "to": "normal_map", + "to_port": 0 + }, + { + "from": "_3_2", + "from_port": 1, + "to": "blend_2", + "to_port": 0 + }, + { + "from": "normal_map", + "from_port": 0, + "to": "blend_2", + "to_port": 1 + }, + { + "from": "colorize_5_2", + "from_port": 0, + "to": "blend_2", + "to_port": 2 + }, + { + "from": "_3_2", + "from_port": 0, + "to": "colorize_5_2", + "to_port": 0 + } + ], + "label": "Graph", + "name": "49", + "node_position": { + "x": 0, + "y": 0 + }, + "nodes": [ + { + "name": "Material", + "node_position": { + "x": 463, + "y": 1358 + }, + "parameters": { + "albedo_color": { + "a": 1, + "b": 1, + "g": 1, + "r": 1, + "type": "Color" + }, + "ao_light_affect": 1, + "depth_scale": 1, + "emission_energy": 1, + "metallic": 1, + "normal_scale": 1, + "roughness": 1, + "size": 11, + "subsurf_scatter_strength": 0 + }, + "type": "material" + }, + { + "name": "perlin", + "node_position": { + "x": -385.399658, + "y": 1196.349854 + }, + "parameters": { + "iterations": 7, + "persistence": 0.75, + "scale_x": 4, + "scale_y": 4 + }, + "type": "perlin" + }, + { + "name": "colorize", + "node_position": { + "x": -367.399658, + "y": 1344.349976 + }, + "parameters": { + "gradient": { + "interpolation": 1, + "points": [ + { + "a": 1, + "b": 0.171875, + "g": 0.171875, + "pos": 0.1, + "r": 0.171875 + }, + { + "a": 1, + "b": 1, + "g": 1, + "pos": 1, + "r": 1 + } + ], + "type": "Gradient" + } + }, + "type": "colorize" + }, + { + "name": "_3_2", + "node_position": { + "x": -378.336426, + "y": 1476.947388 + }, + "parameters": { + + }, + "shader_model": { + "code": "float $(name_uv)_d = raymarch_$name($uv);\n", + "global": "", + "inputs": [ + { + "default": "0.0", + "function": true, + "label": "", + "name": "sdf", + "type": "sdf3d" + } + ], + "instance": "float input_$name(vec3 p) {\n\treturn min($sdf(p), p.z);\n}\n\nfloat raymarch_$name(vec2 uv) {\n\tvec3 ro = vec3(uv-vec2(0.5), 1.0);\n\tvec3 rd = vec3(0.0, 0.0, -1.0);\n\tfloat dO=0.;\n \n for (int i=0; i < 50; i++) {\n \tvec3 p = ro + rd*dO;\n float dS = input_$name(p);\n dO += dS;\n if (dO > 0.001 && dS < 0.0001) break;\n }\n \n return dO;\n}\n\nvec3 normal_$name(vec3 p) {\n\tfloat d = input_$name(p);\n float e = .001;\n \n vec3 n = d - vec3(\n input_$name(p-vec3(e, 0.0, 0.0)),\n input_$name(p-vec3(0.0, e, 0.0)),\n input_$name(p-vec3(0.0, 0.0, e)));\n \n return vec3(-1.0, -1.0, -1.0)*normalize(n);\n}\n\n", + "name": "Raymarching", + "outputs": [ + { + "f": "1.0-$(name_uv)_d", + "type": "f" + }, + { + "rgb": "vec3(0.5)+0.5*normal_$name(vec3($uv-vec2(0.5), 1.0-$(name_uv)_d))", + "type": "rgb" + } + ], + "parameters": [ + + ] + }, + "type": "shader" + }, + { + "connections": [ + { + "from": "sdcircle", + "from_port": 0, + "to": "sdf3d_extrusion", + "to_port": 0 + }, + { + "from": "sdf3d_sphere_2", + "from_port": 0, + "to": "sdf3d_translate_4", + "to_port": 0 + }, + { + "from": "sdf3d_extrusion", + "from_port": 0, + "to": "sdf3d_translate_4_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4", + "from_port": 0, + "to": "sdf3d_smoothboolean_3", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3", + "to_port": 1 + }, + { + "from": "sdf3d_extrusion", + "from_port": 0, + "to": "sdf3d_scale", + "to_port": 0 + }, + { + "from": "sdf3d_scale", + "from_port": 0, + "to": "sdf3d_translate_4_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2", + "to_port": 1 + }, + { + "from": "sdf3d_translate_4_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_sphere_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_2", + "to_port": 1 + }, + { + "from": "sdf3d_sphere_2_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3", + "to_port": 1 + }, + { + "from": "sdf3d_translate_4_3_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_3", + "from_port": 0, + "to": "gen_outputs", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2_3", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3_2", + "to_port": 1 + }, + { + "from": "sdf3d_box_2", + "from_port": 0, + "to": "sdf3d_rotate_2", + "to_port": 0 + }, + { + "from": "sdf3d_rotate_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_rotate_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_2_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_box_2", + "from_port": 0, + "to": "sdf3d_rotate_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_2_2_2", + "from_port": 0, + "to": "sdf3d_repeat", + "to_port": 0 + }, + { + "from": "sdf3d_repeat", + "from_port": 0, + "to": "sdf3d_rotate_2_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_rotate_2_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_2_2_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_2_2_2_2", + "from_port": 0, + "to": "sdf3d_boolean", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2_3_2", + "from_port": 0, + "to": "sdf3d_boolean", + "to_port": 1 + }, + { + "from": "sdf3d_boolean", + "from_port": 0, + "to": "sdf3d_translate_4_3_3", + "to_port": 0 + } + ], + "label": "Skull", + "name": "graph", + "node_position": { + "x": -976.147278, + "y": 1205.431274 + }, + "nodes": [ + { + "name": "sdf3d_smoothboolean_3", + "node_position": { + "x": -841.989258, + "y": 938.422729 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.1, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_translate_4", + "node_position": { + "x": -1044.989258, + "y": 830.422729 + }, + "parameters": { + "x": 0, + "y": 0, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_smoothboolean_3_2", + "node_position": { + "x": -629.489258, + "y": 873.422729 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.17, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_sphere_2_2", + "node_position": { + "x": -830.318359, + "y": 1023.672852 + }, + "parameters": { + "r": 0.07 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_translate_4_3", + "node_position": { + "x": -834.318359, + "y": 1078.672852 + }, + "parameters": { + "x": 0.13, + "y": -0.04, + "z": 0.18 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_sphere_2_2_2", + "node_position": { + "x": -831.318359, + "y": 1179.672852 + }, + "parameters": { + "r": 0.08 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_sphere_2", + "node_position": { + "x": -1040.989258, + "y": 776.922729 + }, + "parameters": { + "r": 0.28 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_box_2", + "node_position": { + "x": -855.193726, + "y": 1338.172852 + }, + "parameters": { + "r": 0, + "sx": 0.05, + "sy": 0.05, + "sz": 0.05 + }, + "type": "sdf3d_box" + }, + { + "name": "sdf3d_translate_4_3_2", + "node_position": { + "x": -834.318359, + "y": 1232.672852 + }, + "parameters": { + "x": 0.12, + "y": -0.03, + "z": 0.18 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_rotate_2", + "node_position": { + "x": -839.193726, + "y": 1471.172852 + }, + "parameters": { + "a": 0, + "ax": -32, + "ay": 45, + "az": 0, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_rotate" + }, + { + "name": "sdf3d_translate_4_3_2_2", + "node_position": { + "x": -835.193726, + "y": 1573.172852 + }, + "parameters": { + "x": 0, + "y": 0.11, + "z": 0.21 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_smoothboolean_3_2_3", + "node_position": { + "x": -623.818359, + "y": 1236.172852 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.09, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_smoothboolean_3_2_2", + "node_position": { + "x": -622.818359, + "y": 1073.172852 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.15, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_translate_4_2_2", + "node_position": { + "x": -832.989258, + "y": 826.922729 + }, + "parameters": { + "x": 0, + "y": 0.24, + "z": 0.01 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_scale", + "node_position": { + "x": -823.989258, + "y": 776.422729 + }, + "parameters": { + "a": 0, + "s": 0.48, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_scale" + }, + { + "name": "sdf3d_extrusion", + "node_position": { + "x": -1043.989258, + "y": 1045.922729 + }, + "parameters": { + "a": 0, + "d": 0.08, + "s": 1, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_extrusion" + }, + { + "name": "sdf3d_smoothboolean_3_2_3_2", + "node_position": { + "x": -638.693726, + "y": 1561.672852 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.03, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdcircle", + "node_position": { + "x": -1075.989258, + "y": 940.422729 + }, + "parameters": { + "cx": 0, + "cy": 0, + "r": 0.16 + }, + "type": "sdcircle" + }, + { + "name": "sdf3d_translate_4_2", + "node_position": { + "x": -1052.989258, + "y": 1102.922729 + }, + "parameters": { + "x": 0, + "y": 0.21, + "z": 0.08 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_translate_4_3_3", + "node_position": { + "x": -200.318359, + "y": 1531.672852 + }, + "parameters": { + "x": 0.15, + "y": 0, + "z": 0.18 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Mirror", + "outputs": [ + { + "sdf3d": "$in(vec3(abs($uv.x), $uv.y, $uv.z))", + "type": "sdf3d" + } + ], + "parameters": [ + + ] + }, + "type": "shader" + }, + { + "name": "gen_inputs", + "node_position": { + "x": -1375.989258, + "y": 1121.935181 + }, + "parameters": { + + }, + "ports": [ + + ], + "type": "ios" + }, + { + "name": "gen_outputs", + "node_position": { + "x": -146.318359, + "y": 1121.935181 + }, + "parameters": { + + }, + "ports": [ + { + "name": "port0", + "type": "rgba" + } + ], + "type": "ios" + }, + { + "name": "gen_parameters", + "node_position": { + "x": -1028.995361, + "y": 476.422729 + }, + "parameters": { + + }, + "type": "remote", + "widgets": [ + + ] + }, + { + "name": "sdf3d_translate_4_3_2_2_2", + "node_position": { + "x": -830.482544, + "y": 1793.119385 + }, + "parameters": { + "x": 0, + "y": 0.233, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_rotate_2_2", + "node_position": { + "x": -835.482544, + "y": 1692.119385 + }, + "parameters": { + "a": 0, + "ax": 0, + "ay": 0, + "az": 45, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_rotate" + }, + { + "name": "sdf3d_repeat", + "node_position": { + "x": -830.482544, + "y": 1898.119385 + }, + "parameters": { + "a": 0, + "c": 22, + "r": 0.24, + "rx": 4, + "ry": 4, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "vec3 circle_repeat_transform(vec3 p, float count) {\n\tfloat r = 6.28/count;\n\tfloat pa = atan(p.x, p.y);\n\tfloat a = mod(pa+0.5*r, r)-0.5*r;\n\tvec3 rv;\n\tfloat c = cos(a-pa);\n\tfloat s = sin(a-pa);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Circle Repeat", + "outputs": [ + { + "sdf3d": "$in(circle_repeat_transform($uv, $c))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 4, + "label": "", + "max": 32, + "min": 1, + "name": "c", + "step": 1, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_rotate_2_2_2", + "node_position": { + "x": -634.235718, + "y": 1649.869385 + }, + "parameters": { + "a": 0, + "ax": 90, + "ay": 0, + "az": 0, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_rotate" + }, + { + "name": "sdf3d_translate_4_3_2_2_2_2", + "node_position": { + "x": -631.235718, + "y": 1757.869385 + }, + "parameters": { + "x": 0, + "y": 0.3, + "z": 0.07 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_boolean", + "node_position": { + "x": -424.235718, + "y": 1607.369385 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + } + ], + "parameters": { + + }, + "type": "graph" + }, + { + "name": "colorize_2", + "node_position": { + "x": -126.553131, + "y": 1179.272949 + }, + "parameters": { + "gradient": { + "interpolation": 1, + "points": [ + { + "a": 1, + "b": 0.994792, + "g": 0.999512, + "pos": 0, + "r": 1 + }, + { + "a": 1, + "b": 0.885417, + "g": 0.989258, + "pos": 1, + "r": 1 + } + ], + "type": "Gradient" + } + }, + "type": "colorize" + }, + { + "name": "uniform_greyscale", + "node_position": { + "x": 114.446899, + "y": 1316.272949 + }, + "parameters": { + "color": 0 + }, + "type": "uniform_greyscale" + }, + { + "name": "colorize_3", + "node_position": { + "x": 38.446899, + "y": 1686.272949 + }, + "parameters": { + "gradient": { + "interpolation": 1, + "points": [ + { + "a": 1, + "b": 1, + "g": 1, + "pos": 0, + "r": 1 + }, + { + "a": 1, + "b": 0, + "g": 0, + "pos": 0.663637, + "r": 0 + } + ], + "type": "Gradient" + } + }, + "type": "colorize" + }, + { + "name": "sdf3d_scale", + "node_position": { + "x": -994.911377, + "y": 1248.772949 + }, + "parameters": { + "a": 0, + "s": 0.33, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_scale" + }, + { + "name": "sdf3d_scale_2", + "node_position": { + "x": -811.183411, + "y": 1198.851807 + }, + "parameters": { + "a": 0, + "r": 0.35, + "rx": 4, + "ry": 4, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "vec3 repeat(vec3 p, vec3 r, float seed, float randomness) {\n\tvec3 a = (rand3(floor(mod((p.xy+0.5*r.xy)/r.xy, 1.0/r.xy)+vec2(seed)))-0.5)*6.28*randomness;\n\tp = mod(p+0.5*r,r)-0.5*r;\n\tvec3 rv;\n\tfloat c;\n\tfloat s;\n\tc = cos(a.x);\n\ts = sin(a.x);\n\trv.x = p.x;\n\trv.y = p.y*c+p.z*s;\n\trv.z = -p.y*s+p.z*c;\n\tc = cos(a.y);\n\ts = sin(a.y);\n\tp.x = rv.x*c+rv.z*s;\n\tp.y = rv.y;\n\tp.z = -rv.x*s+rv.z*c;\n\tc = cos(a.z);\n\ts = sin(a.z);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Repeat", + "outputs": [ + { + "sdf3d": "$in(repeat($uv, vec3(1.0/$rx, 1.0/$ry, 0.0), $seed, $r))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 4, + "label": "X", + "max": 32, + "min": 1, + "name": "rx", + "step": 1, + "type": "float" + }, + { + "default": 4, + "label": "Y", + "max": 32, + "min": 1, + "name": "ry", + "step": 1, + "type": "float" + }, + { + "default": 0.5, + "label": "R", + "max": 1, + "min": 0, + "name": "r", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "occlusion", + "node_position": { + "x": 12.088623, + "y": 1608.272949 + }, + "parameters": { + "param0": 10, + "param1": 50, + "param2": 15 + }, + "type": "occlusion" + }, + { + "name": "sdf3d_translate_4", + "node_position": { + "x": -813.195313, + "y": 1400.797363 + }, + "parameters": { + "x": 0.35, + "y": 0.35, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_boolean_2", + "node_position": { + "x": -622.79303, + "y": 1304.297363 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "sdf3d_repeat", + "node_position": { + "x": -812.79303, + "y": 1300.297363 + }, + "parameters": { + "a": 0, + "r": 0.35, + "rx": 4, + "ry": 4, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_repeat" + }, + { + "name": "colorize_4", + "node_position": { + "x": -128.79303, + "y": 1246.013184 + }, + "parameters": { + "gradient": { + "interpolation": 1, + "points": [ + { + "a": 1, + "b": 0.027452, + "g": 0.047034, + "pos": 0, + "r": 0.057292 + }, + { + "a": 1, + "b": 0.003581, + "g": 0.076426, + "pos": 1, + "r": 0.114583 + } + ], + "type": "Gradient" + } + }, + "type": "colorize" + }, + { + "name": "colorize_5", + "node_position": { + "x": -131.127869, + "y": 1320.013184 + }, + "parameters": { + "gradient": { + "interpolation": 1, + "points": [ + { + "a": 1, + "b": 0, + "g": 0, + "pos": 0, + "r": 0 + }, + { + "a": 1, + "b": 1, + "g": 1, + "pos": 0.063636, + "r": 1 + } + ], + "type": "Gradient" + } + }, + "type": "colorize" + }, + { + "name": "blend", + "node_position": { + "x": 78.872131, + "y": 1216.013184 + }, + "parameters": { + "amount": 0.5, + "blend_type": 0 + }, + "type": "blend" + }, + { + "name": "sdf3d_repeat_2", + "node_position": { + "x": -931.880676, + "y": 1576.431152 + }, + "parameters": { + "a": 0, + "r": 0.46, + "rx": 4, + "ry": 4, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_repeat" + }, + { + "connections": [ + { + "from": "sdf3d_sphere_2", + "from_port": 0, + "to": "sdf3d_translate_4_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_sphere_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3", + "to_port": 1 + }, + { + "from": "sdf3d_smoothboolean_3", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_sphere_2_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2", + "to_port": 1 + }, + { + "from": "sdf3d_sphere_2_2_3", + "from_port": 0, + "to": "sdf3d_translate_4_2_3", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2", + "from_port": 0, + "to": "sdf3d_boolean_2_2", + "to_port": 1 + }, + { + "from": "sdf3d_translate_4_2_3", + "from_port": 0, + "to": "sdf3d_boolean_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_boolean_2_2", + "from_port": 0, + "to": "gen_outputs", + "to_port": 0 + } + ], + "label": "Bone", + "name": "graph_2", + "node_position": { + "x": -1109.480713, + "y": 1577.556274 + }, + "nodes": [ + { + "name": "sdf3d_translate_4_2_2", + "node_position": { + "x": -935.880676, + "y": 1383.431152 + }, + "parameters": { + "x": -0.03, + "y": -0.22, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_sphere_2", + "node_position": { + "x": -930.880676, + "y": 1327.931152 + }, + "parameters": { + "r": 0.03 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_sphere_2_2_2", + "node_position": { + "x": -937.880676, + "y": 1638.431152 + }, + "parameters": { + "h": 0.4, + "r": 0.025 + }, + "shader_model": { + "code": "vec3 $(name_uv)_p = $uv;\n$(name_uv)_p.y -= clamp($(name_uv)_p.y, -0.5*$h, 0.5*$h);\n", + "global": "", + "inputs": [ + + ], + "instance": "", + "name": "Sphere", + "outputs": [ + { + "sdf3d": "length($(name_uv)_p)-$r", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0.5, + "label": "H", + "max": 1, + "min": 0, + "name": "h", + "step": 0.01, + "type": "float" + }, + { + "default": 0.1, + "label": "R", + "max": 0.5, + "min": 0, + "name": "r", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_smoothboolean_3_2", + "node_position": { + "x": -757.380676, + "y": 1593.931152 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.02, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_smoothboolean_3", + "node_position": { + "x": -752.880676, + "y": 1509.931152 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.01, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_sphere_2_2", + "node_position": { + "x": -929.880676, + "y": 1483.431152 + }, + "parameters": { + "r": 0.04 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_translate_4_2", + "node_position": { + "x": -934.880676, + "y": 1534.431152 + }, + "parameters": { + "x": 0.02, + "y": -0.25, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_translate_4_2_3", + "node_position": { + "x": -936.380676, + "y": 1792.181152 + }, + "parameters": { + "x": -0.04, + "y": 0.21, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_sphere_2_2_3", + "node_position": { + "x": -931.380676, + "y": 1741.181152 + }, + "parameters": { + "r": 0.06 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_boolean_2_2", + "node_position": { + "x": -747.380676, + "y": 1680.681152 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "gen_inputs", + "node_position": { + "x": -1237.880615, + "y": 1568.556274 + }, + "parameters": { + + }, + "ports": [ + + ], + "type": "ios" + }, + { + "name": "gen_outputs", + "node_position": { + "x": -447.380676, + "y": 1568.556274 + }, + "parameters": { + + }, + "ports": [ + { + "name": "port0", + "type": "rgba" + } + ], + "type": "ios" + }, + { + "name": "gen_parameters", + "node_position": { + "x": -1079.480713, + "y": 1027.931152 + }, + "parameters": { + + }, + "type": "remote", + "widgets": [ + + ] + } + ], + "parameters": { + + }, + "type": "graph" + }, + { + "name": "sdf3d_scale_3", + "node_position": { + "x": -1130.764893, + "y": 1621.628418 + }, + "parameters": { + "a": 0, + "s": 0.4, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_scale" + }, + { + "name": "sdf3d_boolean_2_2", + "node_position": { + "x": -546.264893, + "y": 1515.128418 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "sdf3d_translate_4_2", + "node_position": { + "x": -753.844666, + "y": 1576.628418 + }, + "parameters": { + "x": 0.35, + "y": 0.52, + "z": 0.02 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_repeat_2_2", + "node_position": { + "x": -936.362671, + "y": 1681.529785 + }, + "parameters": { + "a": 0, + "r": 0.5, + "rx": 4, + "ry": 4, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_repeat" + }, + { + "name": "sdf3d_translate_4_2_2", + "node_position": { + "x": -753.32666, + "y": 1681.727051 + }, + "parameters": { + "x": 0.51, + "y": 0.38, + "z": 0.02 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_boolean_2_2_2", + "node_position": { + "x": -546.344666, + "y": 1580.128418 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "normal_map", + "node_position": { + "x": 52.85556, + "y": 1392.238892 + }, + "parameters": { + "amount": 0.5, + "param0": 10, + "param1": 1.02, + "param2": 0, + "size": 4 + }, + "type": "normal_map" + }, + { + "name": "blend_2", + "node_position": { + "x": 23.85556, + "y": 1485.238892 + }, + "parameters": { + "amount": 1, + "blend_type": 0 + }, + "type": "blend" + }, + { + "name": "colorize_5_2", + "node_position": { + "x": -190.144485, + "y": 1443.488892 + }, + "parameters": { + "gradient": { + "interpolation": 0, + "points": [ + { + "a": 1, + "b": 0, + "g": 0, + "pos": 0, + "r": 0 + }, + { + "a": 1, + "b": 1, + "g": 1, + "pos": 0.027272, + "r": 1 + } + ], + "type": "Gradient" + } + }, + "type": "colorize" + } + ], + "parameters": { + + }, + "type": "graph" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdf3d_circle_repeat.mmg b/addons/material_maker/nodes/sdf3d_circle_repeat.mmg new file mode 100644 index 0000000..889944a --- /dev/null +++ b/addons/material_maker/nodes/sdf3d_circle_repeat.mmg @@ -0,0 +1,50 @@ +{ + "name": "sdf3d_circle_repeat", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "a": 0, + "c": 4, + "r": 0.24, + "rx": 4, + "ry": 4, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "vec3 circle_repeat_transform(vec3 p, float count) {\n\tfloat r = 6.28/count;\n\tfloat pa = atan(p.x, p.y);\n\tfloat a = mod(pa+0.5*r, r)-0.5*r;\n\tvec3 rv;\n\tfloat c = cos(a-pa);\n\tfloat s = sin(a-pa);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Circle Repeat", + "outputs": [ + { + "sdf3d": "$in(circle_repeat_transform($uv, $c))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 4, + "label": "", + "max": 32, + "min": 1, + "name": "c", + "step": 1, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdf3d_repeat.mmg b/addons/material_maker/nodes/sdf3d_repeat.mmg new file mode 100644 index 0000000..3e2875c --- /dev/null +++ b/addons/material_maker/nodes/sdf3d_repeat.mmg @@ -0,0 +1,67 @@ +{ + "name": "sdf3d_repeat", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "a": 0, + "r": 0.24, + "rx": 4, + "ry": 4, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "vec3 repeat(vec3 p, vec3 r, float seed, float randomness) {\n\tvec3 a = (rand3(floor(mod((p.xy+0.5*r.xy)/r.xy, 1.0/r.xy)+vec2(seed)))-0.5)*6.28*randomness;\n\tp = mod(p+0.5*r,r)-0.5*r;\n\tvec3 rv;\n\tfloat c;\n\tfloat s;\n\tc = cos(a.x);\n\ts = sin(a.x);\n\trv.x = p.x;\n\trv.y = p.y*c+p.z*s;\n\trv.z = -p.y*s+p.z*c;\n\tc = cos(a.y);\n\ts = sin(a.y);\n\tp.x = rv.x*c+rv.z*s;\n\tp.y = rv.y;\n\tp.z = -rv.x*s+rv.z*c;\n\tc = cos(a.z);\n\ts = sin(a.z);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Repeat", + "outputs": [ + { + "sdf3d": "$in(repeat($uv, vec3(1.0/$rx, 1.0/$ry, 0.0), $seed, $r))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 4, + "label": "X", + "max": 32, + "min": 1, + "name": "rx", + "step": 1, + "type": "float" + }, + { + "default": 4, + "label": "Y", + "max": 32, + "min": 1, + "name": "ry", + "step": 1, + "type": "float" + }, + { + "default": 0.5, + "label": "R", + "max": 1, + "min": 0, + "name": "r", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file From 78891affaefaf11892f63f7c848aae175f33af0b Mon Sep 17 00:00:00 2001 From: RodZill4 Date: Wed, 18 Dec 2019 23:18:28 +0100 Subject: [PATCH 05/15] Added capsule and cylinder --- .../material_maker/examples/raymarching.ptex | 2122 +---------------- addons/material_maker/nodes/sdf3d_capsule.mmg | 50 + .../material_maker/nodes/sdf3d_cylinder.mmg | 50 + 3 files changed, 125 insertions(+), 2097 deletions(-) create mode 100644 addons/material_maker/nodes/sdf3d_capsule.mmg create mode 100644 addons/material_maker/nodes/sdf3d_cylinder.mmg diff --git a/addons/material_maker/examples/raymarching.ptex b/addons/material_maker/examples/raymarching.ptex index 0ce6dc4..4d20255 100644 --- a/addons/material_maker/examples/raymarching.ptex +++ b/addons/material_maker/examples/raymarching.ptex @@ -1,89 +1,5 @@ { "connections": [ - { - "from": "perlin", - "from_port": 0, - "to": "colorize", - "to_port": 0 - }, - { - "from": "colorize", - "from_port": 0, - "to": "Material", - "to_port": 2 - }, - { - "from": "sdf3d_box", - "from_port": 0, - "to": "sdf3d_smoothboolean", - "to_port": 1 - }, - { - "from": "sdf3d_smoothboolean", - "from_port": 0, - "to": "sdf3d_smoothboolean_2", - "to_port": 1 - }, - { - "from": "sdf3d_smoothboolean_2", - "from_port": 0, - "to": "_3", - "to_port": 0 - }, - { - "from": "sdf3d_torus", - "from_port": 0, - "to": "sdf3d_translate", - "to_port": 0 - }, - { - "from": "sdf3d_translate", - "from_port": 0, - "to": "sdf3d_smoothboolean_2", - "to_port": 0 - }, - { - "from": "sdf3d_sphere", - "from_port": 0, - "to": "sdf3d_translate_2", - "to_port": 0 - }, - { - "from": "sdf3d_translate_2", - "from_port": 0, - "to": "sdf3d_boolean", - "to_port": 0 - }, - { - "from": "sdf3d_sphere", - "from_port": 0, - "to": "sdf3d_translate_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_translate_2_2", - "from_port": 0, - "to": "sdf3d_boolean", - "to_port": 1 - }, - { - "from": "sdf3d_boolean", - "from_port": 0, - "to": "sdf3d_translate_3", - "to_port": 0 - }, - { - "from": "sdf3d_translate_3", - "from_port": 0, - "to": "sdf3d_smoothboolean", - "to_port": 0 - }, - { - "from": "sdf3d_smoothboolean_2", - "from_port": 0, - "to": "sdscale", - "to_port": 0 - }, { "from": "sdbox", "from_port": 0, @@ -115,208 +31,28 @@ "to_port": 0 }, { - "from": "perlin", - "from_port": 0, - "to": "colorize_2", - "to_port": 0 - }, - { - "from": "uniform_greyscale", - "from_port": 0, - "to": "Material", - "to_port": 1 - }, - { - "from": "colorize_3", - "from_port": 0, - "to": "Material", - "to_port": 6 - }, - { - "from": "_3_2", - "from_port": 0, - "to": "colorize_3", - "to_port": 0 - }, - { - "from": "graph", - "from_port": 0, - "to": "sdf3d_scale", - "to_port": 0 - }, - { - "from": "_3_2", - "from_port": 0, - "to": "occlusion", - "to_port": 0 - }, - { - "from": "occlusion", - "from_port": 0, - "to": "Material", - "to_port": 5 - }, - { - "from": "sdf3d_scale", - "from_port": 0, - "to": "sdf3d_scale_2", - "to_port": 0 - }, - { - "from": "sdf3d_scale_2", - "from_port": 0, - "to": "sdf3d_boolean_2", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4", - "from_port": 0, - "to": "sdf3d_boolean_2", - "to_port": 1 - }, - { - "from": "sdf3d_scale", - "from_port": 0, - "to": "sdf3d_repeat", - "to_port": 0 - }, - { - "from": "sdf3d_repeat", - "from_port": 0, - "to": "sdf3d_translate_4", - "to_port": 0 - }, - { - "from": "perlin", - "from_port": 0, - "to": "colorize_4", - "to_port": 0 - }, - { - "from": "_3_2", - "from_port": 0, - "to": "colorize_5", - "to_port": 0 - }, - { - "from": "colorize_2", - "from_port": 0, - "to": "blend", - "to_port": 0 - }, - { - "from": "colorize_5", - "from_port": 0, - "to": "blend", - "to_port": 2 - }, - { - "from": "colorize_4", - "from_port": 0, - "to": "blend", - "to_port": 1 - }, - { - "from": "blend", - "from_port": 0, - "to": "Material", - "to_port": 0 - }, - { - "from": "graph_2", - "from_port": 0, - "to": "sdf3d_scale_3", - "to_port": 0 - }, - { - "from": "sdf3d_scale_3", - "from_port": 0, - "to": "sdf3d_repeat_2", - "to_port": 0 - }, - { - "from": "sdf3d_boolean_2", - "from_port": 0, - "to": "sdf3d_boolean_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_repeat_2", - "from_port": 0, - "to": "sdf3d_translate_4_2", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4_2", - "from_port": 0, - "to": "sdf3d_boolean_2_2", - "to_port": 1 - }, - { - "from": "sdf3d_repeat_2_2", - "from_port": 0, - "to": "sdf3d_translate_4_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_scale_3", - "from_port": 0, - "to": "sdf3d_repeat_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_boolean_2_2", - "from_port": 0, - "to": "sdf3d_boolean_2_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4_2_2", - "from_port": 0, - "to": "sdf3d_boolean_2_2_2", - "to_port": 1 - }, - { - "from": "sdf3d_boolean_2_2_2", - "from_port": 0, - "to": "_3_2", - "to_port": 0 - }, - { - "from": "blend_2", - "from_port": 0, + "from": "raymarching", + "from_port": 1, "to": "Material", "to_port": 4 }, { - "from": "perlin", + "from": "sdrotate", "from_port": 0, - "to": "normal_map", + "to": "raymarching", "to_port": 0 }, { - "from": "_3_2", - "from_port": 1, - "to": "blend_2", + "from": "uniform", + "from_port": 0, + "to": "Material", "to_port": 0 }, { - "from": "normal_map", + "from": "uniform", "from_port": 0, - "to": "blend_2", + "to": "Material", "to_port": 1 - }, - { - "from": "colorize_5_2", - "from_port": 0, - "to": "blend_2", - "to_port": 2 - }, - { - "from": "_3_2", - "from_port": 0, - "to": "colorize_5_2", - "to_port": 0 } ], "label": "Graph", @@ -329,8 +65,8 @@ { "name": "Material", "node_position": { - "x": 463, - "y": 1358 + "x": -336, + "y": 266 }, "parameters": { "albedo_color": { @@ -351,388 +87,6 @@ }, "type": "material" }, - { - "name": "_3", - "node_position": { - "x": -563.5, - "y": -507 - }, - "parameters": { - - }, - "shader_model": { - "code": "float $(name_uv)_d = raymarch_$name($uv);\n", - "global": "", - "inputs": [ - { - "default": "0.0", - "function": true, - "label": "", - "name": "sdf", - "type": "sdf3d" - } - ], - "instance": "float input_$name(vec3 p) {\n\treturn min($sdf(p), p.z);\n}\n\nfloat raymarch_$name(vec2 uv) {\n\tvec3 ro = vec3(uv-vec2(0.5), 1.0);\n\tvec3 rd = vec3(0.0, 0.0, -1.0);\n\tfloat dO=0.;\n \n for (int i=0; i < 50; i++) {\n \tvec3 p = ro + rd*dO;\n float dS = input_$name(p);\n dO += dS;\n if (dO > 0.001 && dS < 0.0001) break;\n }\n \n return dO;\n}\n\nvec3 normal_$name(vec3 p) {\n\tfloat d = input_$name(p);\n float e = .001;\n \n vec3 n = d - vec3(\n input_$name(p-vec3(e, 0.0, 0.0)),\n input_$name(p-vec3(0.0, e, 0.0)),\n input_$name(p-vec3(0.0, 0.0, e)));\n \n return vec3(-1.0, -1.0, -1.0)*normalize(n);\n}\n\n", - "name": "Raymarching", - "outputs": [ - { - "f": "1.0-$(name_uv)_d", - "type": "f" - }, - { - "rgb": "vec3(0.5)+0.5*normal_$name(vec3($uv-vec2(0.5), 1.0-$(name_uv)_d))", - "type": "rgb" - } - ], - "parameters": [ - - ] - }, - "type": "shader" - }, - { - "name": "perlin", - "node_position": { - "x": -385.399658, - "y": 1196.349854 - }, - "parameters": { - "iterations": 7, - "persistence": 0.75, - "scale_x": 4, - "scale_y": 4 - }, - "type": "perlin" - }, - { - "name": "colorize", - "node_position": { - "x": -367.399658, - "y": 1344.349976 - }, - "parameters": { - "gradient": { - "interpolation": 1, - "points": [ - { - "a": 1, - "b": 0.171875, - "g": 0.171875, - "pos": 0.1, - "r": 0.171875 - }, - { - "a": 1, - "b": 1, - "g": 1, - "pos": 1, - "r": 1 - } - ], - "type": "Gradient" - } - }, - "type": "colorize" - }, - { - "name": "sdf3d_boolean", - "node_position": { - "x": -985.049805, - "y": -699.10498 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "op": 0, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_boolean" - }, - { - "name": "sdf3d_box", - "node_position": { - "x": -1189.376221, - "y": -426.60495 - }, - "parameters": { - "r": 0.26, - "sx": 0.1, - "sy": 0.1, - "sz": 0.02 - }, - "shader_model": { - "code": "vec3 $(name_uv)_q = abs($uv) - vec3($sx, $sy, $sz);\n", - "global": "", - "inputs": [ - - ], - "instance": "", - "name": "Box", - "outputs": [ - { - "sdf3d": "length(max($(name_uv)_q,0.0))+min(max($(name_uv)_q.x,max($(name_uv)_q.y,$(name_uv)_q.z)),0.0)-$r", - "type": "sdf3d" - } - ], - "parameters": [ - { - "default": 0.5, - "label": "Size X", - "max": 1, - "min": 0, - "name": "sx", - "step": 0.01, - "type": "float" - }, - { - "default": 0.5, - "label": "Size Y", - "max": 1, - "min": 0, - "name": "sy", - "step": 0.01, - "type": "float" - }, - { - "default": 0.5, - "label": "Size Z", - "max": 1, - "min": 0, - "name": "sz", - "step": 0.01, - "type": "float" - }, - { - "default": 0.5, - "label": "Radius", - "max": 1, - "min": 0, - "name": "r", - "step": 0.01, - "type": "float" - } - ] - }, - "type": "shader" - }, - { - "name": "sdf3d_torus", - "node_position": { - "x": -981.376282, - "y": -453.60495 - }, - "parameters": { - "R": 0.38, - "a1": 0.5, - "a2": 0.865, - "r": 0.03, - "sx": 0.1, - "sy": 0.1, - "sz": 0.02 - }, - "shader_model": { - "code": "\n", - "global": "float sdf3CappedTorus(vec3 p, float R, float r, vec2 sc) {\n\tp.x = abs(p.x);\n\tfloat k = (sc.y*p.x>sc.x*p.y)?dot(p.xy,sc):length(p.xy);\n\treturn sqrt(dot(p,p)+R*R-2.0*R*k)-r;\n}\n", - "inputs": [ - - ], - "instance": "", - "name": "Capped Torus", - "outputs": [ - { - "sdf3d": "sdf3CappedTorus($uv, $R, $r, vec2($a1, $a2))", - "type": "sdf3d" - } - ], - "parameters": [ - { - "default": 0.5, - "label": "R", - "max": 1, - "min": 0, - "name": "R", - "step": 0.01, - "type": "float" - }, - { - "default": 0.1, - "label": "r", - "max": 0.5, - "min": 0, - "name": "r", - "step": 0.01, - "type": "float" - }, - { - "default": 0.5, - "label": "A1", - "max": 1, - "min": 0, - "name": "a1", - "step": 0.01, - "type": "float" - }, - { - "default": 0.5, - "label": "A2", - "max": 1, - "min": 0, - "name": "a2", - "step": 0.01, - "type": "float" - } - ] - }, - "type": "shader" - }, - { - "name": "sdf3d_smoothboolean", - "node_position": { - "x": -986.049805, - "y": -523.10498 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "k": 0.02, - "op": 1, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_smoothboolean" - }, - { - "name": "sdf3d_smoothboolean_2", - "node_position": { - "x": -758.569458, - "y": -341.337097 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "k": 0.04, - "op": 1, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_smoothboolean" - }, - { - "name": "sdf3d_sphere", - "node_position": { - "x": -1164.049805, - "y": -693.10498 - }, - "parameters": { - "r": 0.07 - }, - "type": "sdf3d_sphere" - }, - { - "name": "sdf3d_translate", - "node_position": { - "x": -977.057617, - "y": -329.090332 - }, - "parameters": { - "x": 0, - "y": -0.19, - "z": 0.23 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_translate_2", - "node_position": { - "x": -1172.057617, - "y": -640.590332 - }, - "parameters": { - "x": 0.17, - "y": 0, - "z": 0 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_translate_2_2", - "node_position": { - "x": -1171.057617, - "y": -537.090332 - }, - "parameters": { - "x": -0.17, - "y": 0, - "z": 0 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_translate_3", - "node_position": { - "x": -983.057617, - "y": -640.340332 - }, - "parameters": { - "x": 0, - "y": -0.12, - "z": 0.23 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdscale", - "node_position": { - "x": -972.057617, - "y": -229.090332 - }, - "parameters": { - "a": 0, - "s": 1, - "x": 0.35, - "y": 0, - "z": 0 - }, - "shader_model": { - "code": "", - "global": "", - "inputs": [ - { - "default": "0.0", - "label": "", - "name": "in", - "type": "sdf3d" - } - ], - "instance": "", - "name": "Scale", - "outputs": [ - { - "sdf3d": "$in(($uv)/$s)*$s", - "type": "sdf3d" - } - ], - "parameters": [ - { - "default": 1, - "label": "", - "max": 5, - "min": 0, - "name": "s", - "step": 0.01, - "type": "float" - } - ] - }, - "type": "shader" - }, { "name": "sdrotate", "node_position": { @@ -952,45 +306,6 @@ }, "type": "shader" }, - { - "name": "_3_2", - "node_position": { - "x": -378.336426, - "y": 1476.947388 - }, - "parameters": { - - }, - "shader_model": { - "code": "float $(name_uv)_d = raymarch_$name($uv);\n", - "global": "", - "inputs": [ - { - "default": "0.0", - "function": true, - "label": "", - "name": "sdf", - "type": "sdf3d" - } - ], - "instance": "float input_$name(vec3 p) {\n\treturn min($sdf(p), p.z);\n}\n\nfloat raymarch_$name(vec2 uv) {\n\tvec3 ro = vec3(uv-vec2(0.5), 1.0);\n\tvec3 rd = vec3(0.0, 0.0, -1.0);\n\tfloat dO=0.;\n \n for (int i=0; i < 50; i++) {\n \tvec3 p = ro + rd*dO;\n float dS = input_$name(p);\n dO += dS;\n if (dO > 0.001 && dS < 0.0001) break;\n }\n \n return dO;\n}\n\nvec3 normal_$name(vec3 p) {\n\tfloat d = input_$name(p);\n float e = .001;\n \n vec3 n = d - vec3(\n input_$name(p-vec3(e, 0.0, 0.0)),\n input_$name(p-vec3(0.0, e, 0.0)),\n input_$name(p-vec3(0.0, 0.0, e)));\n \n return vec3(-1.0, -1.0, -1.0)*normalize(n);\n}\n\n", - "name": "Raymarching", - "outputs": [ - { - "f": "1.0-$(name_uv)_d", - "type": "f" - }, - { - "rgb": "vec3(0.5)+0.5*normal_$name(vec3($uv-vec2(0.5), 1.0-$(name_uv)_d))", - "type": "rgb" - } - ], - "parameters": [ - - ] - }, - "type": "shader" - }, { "name": "sdf3d_revolution", "node_position": { @@ -1039,1419 +354,32 @@ "type": "shader" }, { - "connections": [ - { - "from": "sdcircle", - "from_port": 0, - "to": "sdf3d_extrusion", - "to_port": 0 - }, - { - "from": "sdf3d_sphere_2", - "from_port": 0, - "to": "sdf3d_translate_4", - "to_port": 0 - }, - { - "from": "sdf3d_extrusion", - "from_port": 0, - "to": "sdf3d_translate_4_2", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4", - "from_port": 0, - "to": "sdf3d_smoothboolean_3", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4_2", - "from_port": 0, - "to": "sdf3d_smoothboolean_3", - "to_port": 1 - }, - { - "from": "sdf3d_extrusion", - "from_port": 0, - "to": "sdf3d_scale", - "to_port": 0 - }, - { - "from": "sdf3d_scale", - "from_port": 0, - "to": "sdf3d_translate_4_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_smoothboolean_3", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2", - "to_port": 1 - }, - { - "from": "sdf3d_translate_4_2_2", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2", - "to_port": 0 - }, - { - "from": "sdf3d_sphere_2_2", - "from_port": 0, - "to": "sdf3d_translate_4_3", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4_3", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_smoothboolean_3_2", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2_2", - "to_port": 1 - }, - { - "from": "sdf3d_sphere_2_2_2", - "from_port": 0, - "to": "sdf3d_translate_4_3_2", - "to_port": 0 - }, - { - "from": "sdf3d_smoothboolean_3_2_2", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2_3", - "to_port": 1 - }, - { - "from": "sdf3d_translate_4_3_2", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2_3", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4_3_3", - "from_port": 0, - "to": "gen_outputs", - "to_port": 0 - }, - { - "from": "sdf3d_smoothboolean_3_2_3", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2_3_2", - "to_port": 1 - }, - { - "from": "sdf3d_box_2", - "from_port": 0, - "to": "sdf3d_rotate_2", - "to_port": 0 - }, - { - "from": "sdf3d_rotate_2", - "from_port": 0, - "to": "sdf3d_translate_4_3_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4_3_2_2", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2_3_2", - "to_port": 0 - }, - { - "from": "sdf3d_rotate_2_2", - "from_port": 0, - "to": "sdf3d_translate_4_3_2_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_box_2", - "from_port": 0, - "to": "sdf3d_rotate_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4_3_2_2_2", - "from_port": 0, - "to": "sdf3d_repeat", - "to_port": 0 - }, - { - "from": "sdf3d_repeat", - "from_port": 0, - "to": "sdf3d_rotate_2_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_rotate_2_2_2", - "from_port": 0, - "to": "sdf3d_translate_4_3_2_2_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4_3_2_2_2_2", - "from_port": 0, - "to": "sdf3d_boolean", - "to_port": 0 - }, - { - "from": "sdf3d_smoothboolean_3_2_3_2", - "from_port": 0, - "to": "sdf3d_boolean", - "to_port": 1 - }, - { - "from": "sdf3d_boolean", - "from_port": 0, - "to": "sdf3d_translate_4_3_3", - "to_port": 0 - } - ], - "label": "Skull", - "name": "graph", + "name": "raymarching", "node_position": { - "x": -972.86731, - "y": 1204.615234 + "x": -522.23468, + "y": 348.748474 }, - "nodes": [ - { - "name": "sdf3d_smoothboolean_3", - "node_position": { - "x": -841.989258, - "y": 938.422729 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "k": 0.1, - "op": 0, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_smoothboolean" - }, - { - "name": "sdf3d_translate_4", - "node_position": { - "x": -1044.989258, - "y": 830.422729 - }, - "parameters": { - "x": 0, - "y": 0, - "z": 0 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_smoothboolean_3_2", - "node_position": { - "x": -629.489258, - "y": 873.422729 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "k": 0.17, - "op": 1, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_smoothboolean" - }, - { - "name": "sdf3d_sphere_2_2", - "node_position": { - "x": -830.318359, - "y": 1023.672852 - }, - "parameters": { - "r": 0.07 - }, - "type": "sdf3d_sphere" - }, - { - "name": "sdf3d_translate_4_3", - "node_position": { - "x": -834.318359, - "y": 1078.672852 - }, - "parameters": { - "x": 0.13, - "y": -0.04, - "z": 0.18 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_sphere_2_2_2", - "node_position": { - "x": -831.318359, - "y": 1179.672852 - }, - "parameters": { - "r": 0.08 - }, - "type": "sdf3d_sphere" - }, - { - "name": "sdf3d_sphere_2", - "node_position": { - "x": -1040.989258, - "y": 776.922729 - }, - "parameters": { - "r": 0.28 - }, - "type": "sdf3d_sphere" - }, - { - "name": "sdf3d_box_2", - "node_position": { - "x": -855.193726, - "y": 1338.172852 - }, - "parameters": { - "r": 0, - "sx": 0.05, - "sy": 0.05, - "sz": 0.05 - }, - "type": "sdf3d_box" - }, - { - "name": "sdf3d_translate_4_3_2", - "node_position": { - "x": -834.318359, - "y": 1232.672852 - }, - "parameters": { - "x": 0.12, - "y": -0.03, - "z": 0.18 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_rotate_2", - "node_position": { - "x": -839.193726, - "y": 1471.172852 - }, - "parameters": { - "a": 0, - "ax": -32, - "ay": 45, - "az": 0, - "x": 0.35, - "y": 0, - "z": 0 - }, - "type": "sdf3d_rotate" - }, - { - "name": "sdf3d_translate_4_3_2_2", - "node_position": { - "x": -835.193726, - "y": 1573.172852 - }, - "parameters": { - "x": 0, - "y": 0.11, - "z": 0.21 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_smoothboolean_3_2_3", - "node_position": { - "x": -623.818359, - "y": 1236.172852 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "k": 0.09, - "op": 1, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_smoothboolean" - }, - { - "name": "sdf3d_smoothboolean_3_2_2", - "node_position": { - "x": -622.818359, - "y": 1073.172852 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "k": 0.15, - "op": 0, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_smoothboolean" - }, - { - "name": "sdf3d_translate_4_2_2", - "node_position": { - "x": -832.989258, - "y": 826.922729 - }, - "parameters": { - "x": 0, - "y": 0.24, - "z": 0.01 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_scale", - "node_position": { - "x": -823.989258, - "y": 776.422729 - }, - "parameters": { - "a": 0, - "s": 0.48, - "x": 0.35, - "y": 0, - "z": 0 - }, - "type": "sdf3d_scale" - }, - { - "name": "sdf3d_extrusion", - "node_position": { - "x": -1043.989258, - "y": 1045.922729 - }, - "parameters": { - "a": 0, - "d": 0.08, - "s": 1, - "x": 0.35, - "y": 0, - "z": 0 - }, - "type": "sdf3d_extrusion" - }, - { - "name": "sdf3d_smoothboolean_3_2_3_2", - "node_position": { - "x": -638.693726, - "y": 1561.672852 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "k": 0.03, - "op": 1, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_smoothboolean" - }, - { - "name": "sdcircle", - "node_position": { - "x": -1075.989258, - "y": 940.422729 - }, - "parameters": { - "cx": 0, - "cy": 0, - "r": 0.16 - }, - "type": "sdcircle" - }, - { - "name": "sdf3d_translate_4_2", - "node_position": { - "x": -1052.989258, - "y": 1102.922729 - }, - "parameters": { - "x": 0, - "y": 0.21, - "z": 0.08 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_translate_4_3_3", - "node_position": { - "x": -200.318359, - "y": 1531.672852 - }, - "parameters": { - "x": 0.15, - "y": 0, - "z": 0.18 - }, - "shader_model": { - "code": "", - "global": "", - "inputs": [ - { - "default": "0.0", - "label": "", - "name": "in", - "type": "sdf3d" - } - ], - "instance": "", - "name": "Mirror", - "outputs": [ - { - "sdf3d": "$in(vec3(abs($uv.x), $uv.y, $uv.z))", - "type": "sdf3d" - } - ], - "parameters": [ - - ] - }, - "type": "shader" - }, - { - "name": "gen_inputs", - "node_position": { - "x": -1375.989258, - "y": 1121.935181 - }, - "parameters": { - - }, - "ports": [ - - ], - "type": "ios" - }, - { - "name": "gen_outputs", - "node_position": { - "x": -146.318359, - "y": 1121.935181 - }, - "parameters": { - - }, - "ports": [ - { - "name": "port0", - "type": "rgba" - } - ], - "type": "ios" - }, - { - "name": "gen_parameters", - "node_position": { - "x": -1028.995361, - "y": 476.422729 - }, - "parameters": { - - }, - "type": "remote", - "widgets": [ - - ] - }, - { - "name": "sdf3d_translate_4_3_2_2_2", - "node_position": { - "x": -830.482544, - "y": 1793.119385 - }, - "parameters": { - "x": 0, - "y": 0.233, - "z": 0 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_rotate_2_2", - "node_position": { - "x": -835.482544, - "y": 1692.119385 - }, - "parameters": { - "a": 0, - "ax": 0, - "ay": 0, - "az": 45, - "x": 0.35, - "y": 0, - "z": 0 - }, - "type": "sdf3d_rotate" - }, - { - "name": "sdf3d_repeat", - "node_position": { - "x": -830.482544, - "y": 1898.119385 - }, - "parameters": { - "a": 0, - "c": 22, - "r": 0.24, - "rx": 4, - "ry": 4, - "s": 0.3, - "x": 0.35, - "y": 0, - "z": 0 - }, - "shader_model": { - "code": "", - "global": "vec3 circle_repeat_transform(vec3 p, float count) {\n\tfloat r = 6.28/count;\n\tfloat pa = atan(p.x, p.y);\n\tfloat a = mod(pa+0.5*r, r)-0.5*r;\n\tvec3 rv;\n\tfloat c = cos(a-pa);\n\tfloat s = sin(a-pa);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", - "inputs": [ - { - "default": "0.0", - "label": "", - "name": "in", - "type": "sdf3d" - } - ], - "instance": "", - "name": "Circle Repeat", - "outputs": [ - { - "sdf3d": "$in(circle_repeat_transform($uv, $c))", - "type": "sdf3d" - } - ], - "parameters": [ - { - "default": 4, - "label": "", - "max": 32, - "min": 1, - "name": "c", - "step": 1, - "type": "float" - } - ] - }, - "type": "shader" - }, - { - "name": "sdf3d_rotate_2_2_2", - "node_position": { - "x": -634.235718, - "y": 1649.869385 - }, - "parameters": { - "a": 0, - "ax": 90, - "ay": 0, - "az": 0, - "x": 0.35, - "y": 0, - "z": 0 - }, - "type": "sdf3d_rotate" - }, - { - "name": "sdf3d_translate_4_3_2_2_2_2", - "node_position": { - "x": -631.235718, - "y": 1757.869385 - }, - "parameters": { - "x": 0, - "y": 0.3, - "z": 0.07 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_boolean", - "node_position": { - "x": -424.235718, - "y": 1607.369385 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "op": 1, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_boolean" - } - ], "parameters": { }, - "type": "graph" + "type": "raymarching" }, { - "name": "colorize_2", + "name": "uniform", "node_position": { - "x": -126.553131, - "y": 1179.272949 + "x": -576.760742, + "y": 211.755493 }, "parameters": { - "gradient": { - "interpolation": 1, - "points": [ - { - "a": 1, - "b": 0.994792, - "g": 0.999512, - "pos": 0, - "r": 1 - }, - { - "a": 1, - "b": 0.885417, - "g": 0.989258, - "pos": 1, - "r": 1 - } - ], - "type": "Gradient" + "color": { + "a": 1, + "b": 1, + "g": 0.415686, + "r": 0, + "type": "Color" } }, - "type": "colorize" - }, - { - "name": "uniform_greyscale", - "node_position": { - "x": 114.446899, - "y": 1316.272949 - }, - "parameters": { - "color": 0 - }, - "type": "uniform_greyscale" - }, - { - "name": "colorize_3", - "node_position": { - "x": 38.446899, - "y": 1686.272949 - }, - "parameters": { - "gradient": { - "interpolation": 1, - "points": [ - { - "a": 1, - "b": 1, - "g": 1, - "pos": 0, - "r": 1 - }, - { - "a": 1, - "b": 0, - "g": 0, - "pos": 0.663637, - "r": 0 - } - ], - "type": "Gradient" - } - }, - "type": "colorize" - }, - { - "name": "sdf3d_scale", - "node_position": { - "x": -994.911377, - "y": 1248.772949 - }, - "parameters": { - "a": 0, - "s": 0.33, - "x": 0.35, - "y": 0, - "z": 0 - }, - "type": "sdf3d_scale" - }, - { - "name": "sdf3d_scale_2", - "node_position": { - "x": -811.183411, - "y": 1198.851807 - }, - "parameters": { - "a": 0, - "r": 0.35, - "rx": 4, - "ry": 4, - "s": 0.3, - "x": 0.35, - "y": 0, - "z": 0 - }, - "shader_model": { - "code": "", - "global": "vec3 repeat(vec3 p, vec3 r, float seed, float randomness) {\n\tvec3 a = (rand3(floor(mod((p.xy+0.5*r.xy)/r.xy, 1.0/r.xy)+vec2(seed)))-0.5)*6.28*randomness;\n\tp = mod(p+0.5*r,r)-0.5*r;\n\tvec3 rv;\n\tfloat c;\n\tfloat s;\n\tc = cos(a.x);\n\ts = sin(a.x);\n\trv.x = p.x;\n\trv.y = p.y*c+p.z*s;\n\trv.z = -p.y*s+p.z*c;\n\tc = cos(a.y);\n\ts = sin(a.y);\n\tp.x = rv.x*c+rv.z*s;\n\tp.y = rv.y;\n\tp.z = -rv.x*s+rv.z*c;\n\tc = cos(a.z);\n\ts = sin(a.z);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", - "inputs": [ - { - "default": "0.0", - "label": "", - "name": "in", - "type": "sdf3d" - } - ], - "instance": "", - "name": "Repeat", - "outputs": [ - { - "sdf3d": "$in(repeat($uv, vec3(1.0/$rx, 1.0/$ry, 0.0), $seed, $r))", - "type": "sdf3d" - } - ], - "parameters": [ - { - "default": 4, - "label": "X", - "max": 32, - "min": 1, - "name": "rx", - "step": 1, - "type": "float" - }, - { - "default": 4, - "label": "Y", - "max": 32, - "min": 1, - "name": "ry", - "step": 1, - "type": "float" - }, - { - "default": 0.5, - "label": "R", - "max": 1, - "min": 0, - "name": "r", - "step": 0.01, - "type": "float" - } - ] - }, - "type": "shader" - }, - { - "name": "occlusion", - "node_position": { - "x": 12.088623, - "y": 1608.272949 - }, - "parameters": { - "param0": 10, - "param1": 50, - "param2": 15 - }, - "type": "occlusion" - }, - { - "name": "sdf3d_translate_4", - "node_position": { - "x": -813.195313, - "y": 1400.797363 - }, - "parameters": { - "x": 0.35, - "y": 0.35, - "z": 0 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_boolean_2", - "node_position": { - "x": -622.79303, - "y": 1304.297363 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "op": 0, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_boolean" - }, - { - "name": "sdf3d_repeat", - "node_position": { - "x": -812.79303, - "y": 1300.297363 - }, - "parameters": { - "a": 0, - "r": 0.35, - "rx": 4, - "ry": 4, - "s": 0.3, - "x": 0.35, - "y": 0, - "z": 0 - }, - "type": "sdf3d_repeat" - }, - { - "name": "colorize_4", - "node_position": { - "x": -128.79303, - "y": 1246.013184 - }, - "parameters": { - "gradient": { - "interpolation": 1, - "points": [ - { - "a": 1, - "b": 0.027452, - "g": 0.047034, - "pos": 0, - "r": 0.057292 - }, - { - "a": 1, - "b": 0.003581, - "g": 0.076426, - "pos": 1, - "r": 0.114583 - } - ], - "type": "Gradient" - } - }, - "type": "colorize" - }, - { - "name": "colorize_5", - "node_position": { - "x": -131.127869, - "y": 1320.013184 - }, - "parameters": { - "gradient": { - "interpolation": 1, - "points": [ - { - "a": 1, - "b": 0, - "g": 0, - "pos": 0, - "r": 0 - }, - { - "a": 1, - "b": 1, - "g": 1, - "pos": 0.063636, - "r": 1 - } - ], - "type": "Gradient" - } - }, - "type": "colorize" - }, - { - "name": "blend", - "node_position": { - "x": 78.872131, - "y": 1216.013184 - }, - "parameters": { - "amount": 0.5, - "blend_type": 0 - }, - "type": "blend" - }, - { - "name": "sdf3d_repeat_2", - "node_position": { - "x": -928.880676, - "y": 1590.431152 - }, - "parameters": { - "a": 0, - "r": 0.46, - "rx": 4, - "ry": 4, - "s": 0.3, - "x": 0.35, - "y": 0, - "z": 0 - }, - "type": "sdf3d_repeat" - }, - { - "connections": [ - { - "from": "sdf3d_sphere_2", - "from_port": 0, - "to": "sdf3d_translate_4_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_sphere_2_2", - "from_port": 0, - "to": "sdf3d_translate_4_2", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4_2_2", - "from_port": 0, - "to": "sdf3d_smoothboolean_3", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4_2", - "from_port": 0, - "to": "sdf3d_smoothboolean_3", - "to_port": 1 - }, - { - "from": "sdf3d_smoothboolean_3", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2", - "to_port": 0 - }, - { - "from": "sdf3d_sphere_2_2_2", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2", - "to_port": 1 - }, - { - "from": "sdf3d_sphere_2_2_3", - "from_port": 0, - "to": "sdf3d_translate_4_2_3", - "to_port": 0 - }, - { - "from": "sdf3d_smoothboolean_3_2", - "from_port": 0, - "to": "sdf3d_boolean_2_2", - "to_port": 1 - }, - { - "from": "sdf3d_translate_4_2_3", - "from_port": 0, - "to": "sdf3d_boolean_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_boolean_2_2", - "from_port": 0, - "to": "gen_outputs", - "to_port": 0 - } - ], - "label": "Bone", - "name": "graph_2", - "node_position": { - "x": -978.480713, - "y": 1472.556274 - }, - "nodes": [ - { - "name": "sdf3d_translate_4_2_2", - "node_position": { - "x": -935.880676, - "y": 1383.431152 - }, - "parameters": { - "x": -0.03, - "y": -0.22, - "z": 0 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_sphere_2", - "node_position": { - "x": -930.880676, - "y": 1327.931152 - }, - "parameters": { - "r": 0.03 - }, - "type": "sdf3d_sphere" - }, - { - "name": "sdf3d_sphere_2_2_2", - "node_position": { - "x": -937.880676, - "y": 1638.431152 - }, - "parameters": { - "h": 0.4, - "r": 0.025 - }, - "shader_model": { - "code": "vec3 $(name_uv)_p = $uv;\n$(name_uv)_p.y -= clamp($(name_uv)_p.y, -0.5*$h, 0.5*$h);\n", - "global": "", - "inputs": [ - - ], - "instance": "", - "name": "Sphere", - "outputs": [ - { - "sdf3d": "length($(name_uv)_p)-$r", - "type": "sdf3d" - } - ], - "parameters": [ - { - "default": 0.5, - "label": "H", - "max": 1, - "min": 0, - "name": "h", - "step": 0.01, - "type": "float" - }, - { - "default": 0.1, - "label": "R", - "max": 0.5, - "min": 0, - "name": "r", - "step": 0.01, - "type": "float" - } - ] - }, - "type": "shader" - }, - { - "name": "sdf3d_smoothboolean_3_2", - "node_position": { - "x": -757.380676, - "y": 1593.931152 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "k": 0.02, - "op": 0, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_smoothboolean" - }, - { - "name": "sdf3d_smoothboolean_3", - "node_position": { - "x": -752.880676, - "y": 1509.931152 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "k": 0.01, - "op": 0, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_smoothboolean" - }, - { - "name": "sdf3d_sphere_2_2", - "node_position": { - "x": -929.880676, - "y": 1483.431152 - }, - "parameters": { - "r": 0.04 - }, - "type": "sdf3d_sphere" - }, - { - "name": "sdf3d_translate_4_2", - "node_position": { - "x": -934.880676, - "y": 1534.431152 - }, - "parameters": { - "x": 0.02, - "y": -0.25, - "z": 0 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_translate_4_2_3", - "node_position": { - "x": -936.380676, - "y": 1792.181152 - }, - "parameters": { - "x": -0.04, - "y": 0.21, - "z": 0 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_sphere_2_2_3", - "node_position": { - "x": -931.380676, - "y": 1741.181152 - }, - "parameters": { - "r": 0.06 - }, - "type": "sdf3d_sphere" - }, - { - "name": "sdf3d_boolean_2_2", - "node_position": { - "x": -747.380676, - "y": 1680.681152 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "op": 1, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_boolean" - }, - { - "name": "gen_inputs", - "node_position": { - "x": -1237.880615, - "y": 1568.556274 - }, - "parameters": { - - }, - "ports": [ - - ], - "type": "ios" - }, - { - "name": "gen_outputs", - "node_position": { - "x": -447.380676, - "y": 1568.556274 - }, - "parameters": { - - }, - "ports": [ - { - "name": "port0", - "type": "rgba" - } - ], - "type": "ios" - }, - { - "name": "gen_parameters", - "node_position": { - "x": -1079.480713, - "y": 1027.931152 - }, - "parameters": { - - }, - "type": "remote", - "widgets": [ - - ] - } - ], - "parameters": { - - }, - "type": "graph" - }, - { - "name": "sdf3d_scale_3", - "node_position": { - "x": -923.764893, - "y": 1534.628418 - }, - "parameters": { - "a": 0, - "s": 0.4, - "x": 0.35, - "y": 0, - "z": 0 - }, - "type": "sdf3d_scale" - }, - { - "name": "sdf3d_boolean_2_2", - "node_position": { - "x": -546.264893, - "y": 1515.128418 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "op": 0, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_boolean" - }, - { - "name": "sdf3d_translate_4_2", - "node_position": { - "x": -753.844666, - "y": 1576.628418 - }, - "parameters": { - "x": 0.35, - "y": 0.52, - "z": 0.02 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_repeat_2_2", - "node_position": { - "x": -933.362671, - "y": 1695.529785 - }, - "parameters": { - "a": 0, - "r": 0.5, - "rx": 4, - "ry": 4, - "s": 0.3, - "x": 0.35, - "y": 0, - "z": 0 - }, - "type": "sdf3d_repeat" - }, - { - "name": "sdf3d_translate_4_2_2", - "node_position": { - "x": -758.32666, - "y": 1681.727051 - }, - "parameters": { - "x": 0.51, - "y": 0.38, - "z": 0.02 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_boolean_2_2_2", - "node_position": { - "x": -550.344666, - "y": 1585.128418 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "op": 0, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_boolean" - }, - { - "name": "normal_map", - "node_position": { - "x": 52.85556, - "y": 1392.238892 - }, - "parameters": { - "amount": 0.5, - "param0": 10, - "param1": 1.02, - "param2": 0, - "size": 4 - }, - "type": "normal_map" - }, - { - "name": "blend_2", - "node_position": { - "x": 23.85556, - "y": 1485.238892 - }, - "parameters": { - "amount": 1, - "blend_type": 0 - }, - "type": "blend" - }, - { - "name": "colorize_5_2", - "node_position": { - "x": -190.144485, - "y": 1443.488892 - }, - "parameters": { - "gradient": { - "interpolation": 0, - "points": [ - { - "a": 1, - "b": 0, - "g": 0, - "pos": 0, - "r": 0 - }, - { - "a": 1, - "b": 1, - "g": 1, - "pos": 0.027272, - "r": 1 - } - ], - "type": "Gradient" - } - }, - "type": "colorize" + "type": "uniform" } ], "parameters": { diff --git a/addons/material_maker/nodes/sdf3d_capsule.mmg b/addons/material_maker/nodes/sdf3d_capsule.mmg new file mode 100644 index 0000000..e67b994 --- /dev/null +++ b/addons/material_maker/nodes/sdf3d_capsule.mmg @@ -0,0 +1,50 @@ +{ + "name": "sdf3d_capsule", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "l": 0.25, + "r": 0.1, + "sx": 0.25, + "sy": 0.25, + "sz": 0.5 + }, + "shader_model": { + "code": "vec3 $(name_uv)_p = $uv;\n$(name_uv)_p.y -= clamp($(name_uv)_p.y, -0.5*$l, 0.5*$l);\n", + "global": "", + "inputs": [ + + ], + "instance": "", + "name": "Capsule", + "outputs": [ + { + "sdf3d": "length($(name_uv)_p)-$r", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0.5, + "label": "Length", + "max": 1, + "min": 0, + "name": "l", + "step": 0.01, + "type": "float" + }, + { + "default": 0.2, + "label": "Radius", + "max": 1, + "min": 0, + "name": "r", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdf3d_cylinder.mmg b/addons/material_maker/nodes/sdf3d_cylinder.mmg new file mode 100644 index 0000000..d26e8f1 --- /dev/null +++ b/addons/material_maker/nodes/sdf3d_cylinder.mmg @@ -0,0 +1,50 @@ +{ + "name": "sdf3d_cylinder", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "l": 0.25, + "r": 0.1, + "sx": 0.25, + "sy": 0.25, + "sz": 0.5 + }, + "shader_model": { + "code": "vec2 $(name_uv)_d = abs(vec2(length($uv.xz),$uv.y)) - vec2($r,$l);\n", + "global": "", + "inputs": [ + + ], + "instance": "", + "name": "Cylinder", + "outputs": [ + { + "sdf3d": "min(max($(name_uv)_d.x,$(name_uv)_d.y),0.0) + length(max($(name_uv)_d,0.0))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0.5, + "label": "Length", + "max": 1, + "min": 0, + "name": "l", + "step": 0.01, + "type": "float" + }, + { + "default": 0.2, + "label": "Radius", + "max": 1, + "min": 0, + "name": "r", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file From 4b968cc63e7c4d0ec1ed9af2b392e07f6023f54e Mon Sep 17 00:00:00 2001 From: RodZill4 Date: Sat, 21 Dec 2019 07:44:44 +0100 Subject: [PATCH 06/15] More 3D SDF nodes --- addons/material_maker/examples/skulls.ptex | 1510 +++++++++-------- addons/material_maker/nodes/sdf3d_cone.mmg | 41 + addons/material_maker/nodes/sdf3d_rounded.mmg | 49 + .../material_maker/nodes/sdsmoothboolean.mmg | 2 +- 4 files changed, 927 insertions(+), 675 deletions(-) create mode 100644 addons/material_maker/nodes/sdf3d_cone.mmg create mode 100644 addons/material_maker/nodes/sdf3d_rounded.mmg diff --git a/addons/material_maker/examples/skulls.ptex b/addons/material_maker/examples/skulls.ptex index ad0a082..f24711d 100644 --- a/addons/material_maker/examples/skulls.ptex +++ b/addons/material_maker/examples/skulls.ptex @@ -36,12 +36,6 @@ "to": "colorize_3", "to_port": 0 }, - { - "from": "graph", - "from_port": 0, - "to": "sdf3d_scale", - "to_port": 0 - }, { "from": "_3_2", "from_port": 0, @@ -215,6 +209,12 @@ "from_port": 0, "to": "colorize_5_2", "to_port": 0 + }, + { + "from": "graph_3", + "from_port": 0, + "to": "sdf3d_scale", + "to_port": 0 } ], "label": "Graph", @@ -332,674 +332,6 @@ }, "type": "shader" }, - { - "connections": [ - { - "from": "sdcircle", - "from_port": 0, - "to": "sdf3d_extrusion", - "to_port": 0 - }, - { - "from": "sdf3d_sphere_2", - "from_port": 0, - "to": "sdf3d_translate_4", - "to_port": 0 - }, - { - "from": "sdf3d_extrusion", - "from_port": 0, - "to": "sdf3d_translate_4_2", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4", - "from_port": 0, - "to": "sdf3d_smoothboolean_3", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4_2", - "from_port": 0, - "to": "sdf3d_smoothboolean_3", - "to_port": 1 - }, - { - "from": "sdf3d_extrusion", - "from_port": 0, - "to": "sdf3d_scale", - "to_port": 0 - }, - { - "from": "sdf3d_scale", - "from_port": 0, - "to": "sdf3d_translate_4_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_smoothboolean_3", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2", - "to_port": 1 - }, - { - "from": "sdf3d_translate_4_2_2", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2", - "to_port": 0 - }, - { - "from": "sdf3d_sphere_2_2", - "from_port": 0, - "to": "sdf3d_translate_4_3", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4_3", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_smoothboolean_3_2", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2_2", - "to_port": 1 - }, - { - "from": "sdf3d_sphere_2_2_2", - "from_port": 0, - "to": "sdf3d_translate_4_3_2", - "to_port": 0 - }, - { - "from": "sdf3d_smoothboolean_3_2_2", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2_3", - "to_port": 1 - }, - { - "from": "sdf3d_translate_4_3_2", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2_3", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4_3_3", - "from_port": 0, - "to": "gen_outputs", - "to_port": 0 - }, - { - "from": "sdf3d_smoothboolean_3_2_3", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2_3_2", - "to_port": 1 - }, - { - "from": "sdf3d_box_2", - "from_port": 0, - "to": "sdf3d_rotate_2", - "to_port": 0 - }, - { - "from": "sdf3d_rotate_2", - "from_port": 0, - "to": "sdf3d_translate_4_3_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4_3_2_2", - "from_port": 0, - "to": "sdf3d_smoothboolean_3_2_3_2", - "to_port": 0 - }, - { - "from": "sdf3d_rotate_2_2", - "from_port": 0, - "to": "sdf3d_translate_4_3_2_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_box_2", - "from_port": 0, - "to": "sdf3d_rotate_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4_3_2_2_2", - "from_port": 0, - "to": "sdf3d_repeat", - "to_port": 0 - }, - { - "from": "sdf3d_repeat", - "from_port": 0, - "to": "sdf3d_rotate_2_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_rotate_2_2_2", - "from_port": 0, - "to": "sdf3d_translate_4_3_2_2_2_2", - "to_port": 0 - }, - { - "from": "sdf3d_translate_4_3_2_2_2_2", - "from_port": 0, - "to": "sdf3d_boolean", - "to_port": 0 - }, - { - "from": "sdf3d_smoothboolean_3_2_3_2", - "from_port": 0, - "to": "sdf3d_boolean", - "to_port": 1 - }, - { - "from": "sdf3d_boolean", - "from_port": 0, - "to": "sdf3d_translate_4_3_3", - "to_port": 0 - } - ], - "label": "Skull", - "name": "graph", - "node_position": { - "x": -976.147278, - "y": 1205.431274 - }, - "nodes": [ - { - "name": "sdf3d_smoothboolean_3", - "node_position": { - "x": -841.989258, - "y": 938.422729 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "k": 0.1, - "op": 0, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_smoothboolean" - }, - { - "name": "sdf3d_translate_4", - "node_position": { - "x": -1044.989258, - "y": 830.422729 - }, - "parameters": { - "x": 0, - "y": 0, - "z": 0 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_smoothboolean_3_2", - "node_position": { - "x": -629.489258, - "y": 873.422729 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "k": 0.17, - "op": 1, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_smoothboolean" - }, - { - "name": "sdf3d_sphere_2_2", - "node_position": { - "x": -830.318359, - "y": 1023.672852 - }, - "parameters": { - "r": 0.07 - }, - "type": "sdf3d_sphere" - }, - { - "name": "sdf3d_translate_4_3", - "node_position": { - "x": -834.318359, - "y": 1078.672852 - }, - "parameters": { - "x": 0.13, - "y": -0.04, - "z": 0.18 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_sphere_2_2_2", - "node_position": { - "x": -831.318359, - "y": 1179.672852 - }, - "parameters": { - "r": 0.08 - }, - "type": "sdf3d_sphere" - }, - { - "name": "sdf3d_sphere_2", - "node_position": { - "x": -1040.989258, - "y": 776.922729 - }, - "parameters": { - "r": 0.28 - }, - "type": "sdf3d_sphere" - }, - { - "name": "sdf3d_box_2", - "node_position": { - "x": -855.193726, - "y": 1338.172852 - }, - "parameters": { - "r": 0, - "sx": 0.05, - "sy": 0.05, - "sz": 0.05 - }, - "type": "sdf3d_box" - }, - { - "name": "sdf3d_translate_4_3_2", - "node_position": { - "x": -834.318359, - "y": 1232.672852 - }, - "parameters": { - "x": 0.12, - "y": -0.03, - "z": 0.18 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_rotate_2", - "node_position": { - "x": -839.193726, - "y": 1471.172852 - }, - "parameters": { - "a": 0, - "ax": -32, - "ay": 45, - "az": 0, - "x": 0.35, - "y": 0, - "z": 0 - }, - "type": "sdf3d_rotate" - }, - { - "name": "sdf3d_translate_4_3_2_2", - "node_position": { - "x": -835.193726, - "y": 1573.172852 - }, - "parameters": { - "x": 0, - "y": 0.11, - "z": 0.21 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_smoothboolean_3_2_3", - "node_position": { - "x": -623.818359, - "y": 1236.172852 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "k": 0.09, - "op": 1, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_smoothboolean" - }, - { - "name": "sdf3d_smoothboolean_3_2_2", - "node_position": { - "x": -622.818359, - "y": 1073.172852 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "k": 0.15, - "op": 0, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_smoothboolean" - }, - { - "name": "sdf3d_translate_4_2_2", - "node_position": { - "x": -832.989258, - "y": 826.922729 - }, - "parameters": { - "x": 0, - "y": 0.24, - "z": 0.01 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_scale", - "node_position": { - "x": -823.989258, - "y": 776.422729 - }, - "parameters": { - "a": 0, - "s": 0.48, - "x": 0.35, - "y": 0, - "z": 0 - }, - "type": "sdf3d_scale" - }, - { - "name": "sdf3d_extrusion", - "node_position": { - "x": -1043.989258, - "y": 1045.922729 - }, - "parameters": { - "a": 0, - "d": 0.08, - "s": 1, - "x": 0.35, - "y": 0, - "z": 0 - }, - "type": "sdf3d_extrusion" - }, - { - "name": "sdf3d_smoothboolean_3_2_3_2", - "node_position": { - "x": -638.693726, - "y": 1561.672852 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "k": 0.03, - "op": 1, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_smoothboolean" - }, - { - "name": "sdcircle", - "node_position": { - "x": -1075.989258, - "y": 940.422729 - }, - "parameters": { - "cx": 0, - "cy": 0, - "r": 0.16 - }, - "type": "sdcircle" - }, - { - "name": "sdf3d_translate_4_2", - "node_position": { - "x": -1052.989258, - "y": 1102.922729 - }, - "parameters": { - "x": 0, - "y": 0.21, - "z": 0.08 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_translate_4_3_3", - "node_position": { - "x": -200.318359, - "y": 1531.672852 - }, - "parameters": { - "x": 0.15, - "y": 0, - "z": 0.18 - }, - "shader_model": { - "code": "", - "global": "", - "inputs": [ - { - "default": "0.0", - "label": "", - "name": "in", - "type": "sdf3d" - } - ], - "instance": "", - "name": "Mirror", - "outputs": [ - { - "sdf3d": "$in(vec3(abs($uv.x), $uv.y, $uv.z))", - "type": "sdf3d" - } - ], - "parameters": [ - - ] - }, - "type": "shader" - }, - { - "name": "gen_inputs", - "node_position": { - "x": -1375.989258, - "y": 1121.935181 - }, - "parameters": { - - }, - "ports": [ - - ], - "type": "ios" - }, - { - "name": "gen_outputs", - "node_position": { - "x": -146.318359, - "y": 1121.935181 - }, - "parameters": { - - }, - "ports": [ - { - "name": "port0", - "type": "rgba" - } - ], - "type": "ios" - }, - { - "name": "gen_parameters", - "node_position": { - "x": -1028.995361, - "y": 476.422729 - }, - "parameters": { - - }, - "type": "remote", - "widgets": [ - - ] - }, - { - "name": "sdf3d_translate_4_3_2_2_2", - "node_position": { - "x": -830.482544, - "y": 1793.119385 - }, - "parameters": { - "x": 0, - "y": 0.233, - "z": 0 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_rotate_2_2", - "node_position": { - "x": -835.482544, - "y": 1692.119385 - }, - "parameters": { - "a": 0, - "ax": 0, - "ay": 0, - "az": 45, - "x": 0.35, - "y": 0, - "z": 0 - }, - "type": "sdf3d_rotate" - }, - { - "name": "sdf3d_repeat", - "node_position": { - "x": -830.482544, - "y": 1898.119385 - }, - "parameters": { - "a": 0, - "c": 22, - "r": 0.24, - "rx": 4, - "ry": 4, - "s": 0.3, - "x": 0.35, - "y": 0, - "z": 0 - }, - "shader_model": { - "code": "", - "global": "vec3 circle_repeat_transform(vec3 p, float count) {\n\tfloat r = 6.28/count;\n\tfloat pa = atan(p.x, p.y);\n\tfloat a = mod(pa+0.5*r, r)-0.5*r;\n\tvec3 rv;\n\tfloat c = cos(a-pa);\n\tfloat s = sin(a-pa);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", - "inputs": [ - { - "default": "0.0", - "label": "", - "name": "in", - "type": "sdf3d" - } - ], - "instance": "", - "name": "Circle Repeat", - "outputs": [ - { - "sdf3d": "$in(circle_repeat_transform($uv, $c))", - "type": "sdf3d" - } - ], - "parameters": [ - { - "default": 4, - "label": "", - "max": 32, - "min": 1, - "name": "c", - "step": 1, - "type": "float" - } - ] - }, - "type": "shader" - }, - { - "name": "sdf3d_rotate_2_2_2", - "node_position": { - "x": -634.235718, - "y": 1649.869385 - }, - "parameters": { - "a": 0, - "ax": 90, - "ay": 0, - "az": 0, - "x": 0.35, - "y": 0, - "z": 0 - }, - "type": "sdf3d_rotate" - }, - { - "name": "sdf3d_translate_4_3_2_2_2_2", - "node_position": { - "x": -631.235718, - "y": 1757.869385 - }, - "parameters": { - "x": 0, - "y": 0.3, - "z": 0.07 - }, - "type": "sdf3d_translate" - }, - { - "name": "sdf3d_boolean", - "node_position": { - "x": -424.235718, - "y": 1607.369385 - }, - "parameters": { - "bevel": 0, - "cx": 0, - "cy": 0, - "h": 0.08, - "op": 1, - "r": 0.3, - "w": 0.28 - }, - "type": "sdf3d_boolean" - } - ], - "parameters": { - - }, - "type": "graph" - }, { "name": "colorize_2", "node_position": { @@ -1746,6 +1078,836 @@ } }, "type": "colorize" + }, + { + "connections": [ + { + "from": "sdf3d_sphere_2", + "from_port": 0, + "to": "sdf3d_translate_4", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3", + "to_port": 1 + }, + { + "from": "sdf3d_scale", + "from_port": 0, + "to": "sdf3d_translate_4_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2", + "to_port": 1 + }, + { + "from": "sdf3d_translate_4_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_sphere_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_2", + "to_port": 1 + }, + { + "from": "sdf3d_sphere_2_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3", + "to_port": 1 + }, + { + "from": "sdf3d_translate_4_3_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_3", + "from_port": 0, + "to": "gen_outputs", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2_3", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3_2", + "to_port": 1 + }, + { + "from": "sdf3d_box_2", + "from_port": 0, + "to": "sdf3d_rotate_2", + "to_port": 0 + }, + { + "from": "sdf3d_rotate_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_2_2_2", + "from_port": 0, + "to": "sdf3d_repeat", + "to_port": 0 + }, + { + "from": "sdf3d_rotate_2_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_2_2_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_cylinder", + "from_port": 0, + "to": "sdf3d_translate_4_2", + "to_port": 0 + }, + { + "from": "sdf3d_cylinder", + "from_port": 0, + "to": "sdf3d_scale", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_3", + "from_port": 0, + "to": "sdf3d_smoothboolean_3", + "to_port": 0 + }, + { + "from": "sdf3d_sphere_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_3", + "to_port": 1 + }, + { + "from": "sdf3d_translate_4", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_3", + "to_port": 0 + }, + { + "from": "sdf3d_box_2_2", + "from_port": 0, + "to": "sdf3d_rotate_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_box_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_2_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2_3_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2_3_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_3", + "to_port": 0 + }, + { + "from": "sdf3d_sphere_2_3", + "from_port": 0, + "to": "sdf3d_translate_4_3_2_2_2_3", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_2_2_2_3", + "from_port": 0, + "to": "sdf3d_boolean", + "to_port": 0 + }, + { + "from": "sdf3d_boolean", + "from_port": 0, + "to": "sdf3d_rotate_2_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_2_2_2_2", + "from_port": 0, + "to": "sdroundedshape", + "to_port": 0 + }, + { + "from": "sdroundedshape", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3_2_2", + "to_port": 1 + }, + { + "from": "sdf3d_repeat", + "from_port": 0, + "to": "sdf3d_rotate_2_2_3", + "to_port": 0 + }, + { + "from": "sdf3d_rotate_2_2_3", + "from_port": 0, + "to": "sdf3d_boolean", + "to_port": 1 + } + ], + "label": "Skull", + "name": "graph_3", + "node_position": { + "x": -977.932495, + "y": 1205.712646 + }, + "nodes": [ + { + "name": "sdf3d_smoothboolean_3", + "node_position": { + "x": -841.989258, + "y": 938.422729 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.1, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_translate_4", + "node_position": { + "x": -1309.989258, + "y": 736.422729 + }, + "parameters": { + "x": 0.52, + "y": -0.22, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_smoothboolean_3_2", + "node_position": { + "x": -629.489258, + "y": 873.422729 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.17, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_sphere_2_2", + "node_position": { + "x": -830.318359, + "y": 1023.672852 + }, + "parameters": { + "r": 0.07 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_translate_4_3", + "node_position": { + "x": -834.318359, + "y": 1078.672852 + }, + "parameters": { + "x": 0.13, + "y": -0.04, + "z": 0.18 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_sphere_2_2_2", + "node_position": { + "x": -831.318359, + "y": 1179.672852 + }, + "parameters": { + "r": 0.08 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_sphere_2", + "node_position": { + "x": -1297.989258, + "y": 844.922729 + }, + "parameters": { + "r": 0.28 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_box_2", + "node_position": { + "x": -855.193726, + "y": 1338.172852 + }, + "parameters": { + "r": 0, + "sx": 0.05, + "sy": 0.05, + "sz": 0.05 + }, + "type": "sdf3d_box" + }, + { + "name": "sdf3d_translate_4_3_2", + "node_position": { + "x": -834.318359, + "y": 1232.672852 + }, + "parameters": { + "x": 0.12, + "y": -0.03, + "z": 0.18 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_rotate_2", + "node_position": { + "x": -839.193726, + "y": 1471.172852 + }, + "parameters": { + "a": 0, + "ax": -32, + "ay": 45, + "az": 0, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_rotate" + }, + { + "name": "sdf3d_translate_4_3_2_2", + "node_position": { + "x": -835.193726, + "y": 1573.172852 + }, + "parameters": { + "x": 0, + "y": 0.11, + "z": 0.21 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_smoothboolean_3_2_3", + "node_position": { + "x": -623.818359, + "y": 1236.172852 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.09, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_smoothboolean_3_2_2", + "node_position": { + "x": -622.818359, + "y": 1073.172852 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.15, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_translate_4_2_2", + "node_position": { + "x": -832.989258, + "y": 826.922729 + }, + "parameters": { + "x": 0, + "y": 0.24, + "z": 0.01 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_scale", + "node_position": { + "x": -823.989258, + "y": 776.422729 + }, + "parameters": { + "a": 0, + "s": 0.48, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_scale" + }, + { + "name": "sdf3d_smoothboolean_3_2_3_2", + "node_position": { + "x": -602.693726, + "y": 1454.672852 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.03, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_translate_4_2", + "node_position": { + "x": -1141.989258, + "y": 1070.922729 + }, + "parameters": { + "x": 0, + "y": 0.21, + "z": 0.08 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_translate_4_3_3", + "node_position": { + "x": -363.318359, + "y": 1762.672852 + }, + "parameters": { + "x": 0.15, + "y": 0, + "z": 0.18 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Mirror", + "outputs": [ + { + "sdf3d": "$in(vec3(abs($uv.x), $uv.y, $uv.z))", + "type": "sdf3d" + } + ], + "parameters": [ + + ] + }, + "type": "shader" + }, + { + "name": "gen_inputs", + "node_position": { + "x": -1375.989258, + "y": 1121.935181 + }, + "parameters": { + + }, + "ports": [ + + ], + "type": "ios" + }, + { + "name": "gen_outputs", + "node_position": { + "x": -238.318359, + "y": 1764.935181 + }, + "parameters": { + + }, + "ports": [ + { + "name": "port0", + "type": "rgba" + } + ], + "type": "ios" + }, + { + "name": "gen_parameters", + "node_position": { + "x": -1028.995361, + "y": 476.422729 + }, + "parameters": { + + }, + "type": "remote", + "widgets": [ + + ] + }, + { + "name": "sdf3d_translate_4_3_2_2_2", + "node_position": { + "x": -1172.482544, + "y": 1931.119385 + }, + "parameters": { + "x": 0, + "y": 0.14, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_rotate_2_2", + "node_position": { + "x": -1172.482544, + "y": 1829.119385 + }, + "parameters": { + "a": 0, + "ax": 0, + "ay": 0, + "az": 45, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_rotate" + }, + { + "name": "sdf3d_repeat", + "node_position": { + "x": -1166.482544, + "y": 2035.119385 + }, + "parameters": { + "a": 0, + "c": 15, + "r": 0.24, + "rx": 4, + "ry": 4, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "vec3 circle_repeat_transform(vec3 p, float count) {\n\tfloat r = 6.28/count;\n\tfloat pa = atan(p.x, p.y);\n\tfloat a = mod(pa+0.5*r, r)-0.5*r;\n\tvec3 rv;\n\tfloat c = cos(a-pa);\n\tfloat s = sin(a-pa);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Circle Repeat", + "outputs": [ + { + "sdf3d": "$in(circle_repeat_transform($uv, $c))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 4, + "label": "", + "max": 32, + "min": 1, + "name": "c", + "step": 1, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_rotate_2_2_2", + "node_position": { + "x": -791.235718, + "y": 1859.869385 + }, + "parameters": { + "a": 0, + "ax": -90, + "ay": 0, + "az": 0, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_rotate" + }, + { + "name": "sdf3d_translate_4_3_2_2_2_2", + "node_position": { + "x": -788.235718, + "y": 1967.869385 + }, + "parameters": { + "x": 0, + "y": 0.315, + "z": 0.08 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_cylinder", + "node_position": { + "x": -1161, + "y": 994.5 + }, + "parameters": { + "l": 0.06, + "r": 0.15, + "sx": 0.25, + "sy": 0.25, + "sz": 0.5 + }, + "type": "sdf3d_cylinder" + }, + { + "name": "sdf3d_smoothboolean_3_3", + "node_position": { + "x": -1104.305908, + "y": 815.75 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.1, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_box_2_2", + "node_position": { + "x": -1190.880981, + "y": 1701 + }, + "parameters": { + "r": 0, + "sx": 0.01, + "sy": 0.01, + "sz": 0.015 + }, + "type": "sdf3d_box" + }, + { + "name": "sdf3d_smoothboolean_3_2_3_2_2", + "node_position": { + "x": -562.468933, + "y": 1761.75 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.05, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_sphere_2_3", + "node_position": { + "x": -1165.397095, + "y": 2204.25 + }, + "parameters": { + "r": 0.28 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_translate_4_3_2_2_2_3", + "node_position": { + "x": -1175.397095, + "y": 2261.5 + }, + "parameters": { + "x": 0, + "y": 0.28, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_boolean", + "node_position": { + "x": -990.397095, + "y": 2076 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 2, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "sdroundedshape", + "node_position": { + "x": -794.225342, + "y": 2070.75 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.15, + "op": 0, + "r": 0.01, + "w": 0.28 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Rounded", + "outputs": [ + { + "sdf3d": "$in($uv)-$r", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "", + "max": 1, + "min": 0, + "name": "r", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_rotate_2_2_3", + "node_position": { + "x": -1172.268311, + "y": 2085.75 + }, + "parameters": { + "a": 0, + "ax": 0, + "ay": 0, + "az": 11, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_rotate" + } + ], + "parameters": { + + }, + "type": "graph" } ], "parameters": { diff --git a/addons/material_maker/nodes/sdf3d_cone.mmg b/addons/material_maker/nodes/sdf3d_cone.mmg new file mode 100644 index 0000000..c706eb2 --- /dev/null +++ b/addons/material_maker/nodes/sdf3d_cone.mmg @@ -0,0 +1,41 @@ +{ + "name": "sdf3d_cone", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "a": 30, + "r": 0, + "sx": 0.01, + "sy": 0.01, + "sz": 0.015 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + + ], + "instance": "", + "name": "Cone", + "outputs": [ + { + "sdf3d": "dot(vec2(cos($a*0.01745329251),sin($a*0.01745329251)),vec2(length($uv.xz),$uv.y))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 30, + "label": "Angle", + "max": 90, + "min": 0, + "name": "a", + "step": 1, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdf3d_rounded.mmg b/addons/material_maker/nodes/sdf3d_rounded.mmg new file mode 100644 index 0000000..87ce10b --- /dev/null +++ b/addons/material_maker/nodes/sdf3d_rounded.mmg @@ -0,0 +1,49 @@ +{ + "name": "sdf3d_rounded", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.15, + "op": 0, + "r": 0.05, + "w": 0.28 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Rounded", + "outputs": [ + { + "sdf3d": "$in($uv)-$r", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "", + "max": 1, + "min": 0, + "name": "r", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/sdsmoothboolean.mmg b/addons/material_maker/nodes/sdsmoothboolean.mmg index 9d1285a..e52e09c 100644 --- a/addons/material_maker/nodes/sdsmoothboolean.mmg +++ b/addons/material_maker/nodes/sdsmoothboolean.mmg @@ -9,7 +9,7 @@ "cx": 0, "cy": 0, "h": 0.08, - "k": 0.04, + "k": 0.1, "op": 0, "r": 0.3, "w": 0.28 From 9b961e50c5e534259f0791c698aacbd0bfdfc97d Mon Sep 17 00:00:00 2001 From: RodZill4 Date: Sat, 21 Dec 2019 10:11:39 +0100 Subject: [PATCH 07/15] Added all 3D SDF nodes in the base library. Updated thumbnails of 2D SDF nodes. --- addons/material_maker/engine/renderer.gd | 6 +- addons/material_maker/library/base.json | 392 ++++++++++++++++-- .../library/base/3d_sdf_operators_boolean.png | Bin 0 -> 1827 bytes .../base/3d_sdf_operators_circlerepeat.png | Bin 0 -> 1469 bytes .../base/3d_sdf_operators_extrusion.png | Bin 0 -> 860 bytes .../library/base/3d_sdf_operators_repeat.png | Bin 0 -> 2596 bytes .../base/3d_sdf_operators_revolution.png | Bin 0 -> 4327 bytes .../library/base/3d_sdf_operators_rounded.png | Bin 0 -> 1630 bytes .../base/3d_sdf_operators_smoothboolean.png | Bin 0 -> 2155 bytes .../library/base/3d_sdf_render.png | Bin 0 -> 2340 bytes .../library/base/3d_sdf_shapes_box.png | Bin 0 -> 730 bytes .../library/base/3d_sdf_shapes_capsule.png | Bin 0 -> 1682 bytes .../library/base/3d_sdf_shapes_cone.png | Bin 0 -> 1612 bytes .../library/base/3d_sdf_shapes_cylinder.png | Bin 0 -> 864 bytes .../library/base/3d_sdf_shapes_sphere.png | Bin 0 -> 2637 bytes .../library/base/3d_sdf_shapes_torus.png | Bin 0 -> 3876 bytes .../library/base/3d_sdf_transforms_rotate.png | Bin 0 -> 904 bytes .../library/base/3d_sdf_transforms_scale.png | Bin 0 -> 745 bytes .../base/3d_sdf_transforms_translate.png | Bin 0 -> 643 bytes .../library/base/pattern_beehive.png | Bin 0 -> 1171 bytes .../library/base/pattern_fibers.png | Bin 5429 -> 5017 bytes .../simple_sdf_operators_sdannularshape.png | Bin 814 -> 984 bytes .../base/simple_sdf_operators_sdboolean.png | Bin 951 -> 3025 bytes .../simple_sdf_operators_sdroundedshape.png | Bin 1145 -> 1565 bytes .../base/simple_sdf_operators_sdshow.png | Bin 1413 -> 1505 bytes .../simple_sdf_operators_sdsmoothboolean.png | Bin 1070 -> 3389 bytes .../library/base/simple_sdf_shapes_sdbox.png | Bin 750 -> 1211 bytes .../base/simple_sdf_shapes_sdcircle.png | Bin 1300 -> 2845 bytes .../library/base/simple_sdf_shapes_sdline.png | Bin 723 -> 1443 bytes .../base/simple_sdf_shapes_sdrhombus.png | Bin 1124 -> 1319 bytes .../base/simple_sdf_transforms_translate.png | Bin 0 -> 3448 bytes 31 files changed, 351 insertions(+), 47 deletions(-) create mode 100644 addons/material_maker/library/base/3d_sdf_operators_boolean.png create mode 100644 addons/material_maker/library/base/3d_sdf_operators_circlerepeat.png create mode 100644 addons/material_maker/library/base/3d_sdf_operators_extrusion.png create mode 100644 addons/material_maker/library/base/3d_sdf_operators_repeat.png create mode 100644 addons/material_maker/library/base/3d_sdf_operators_revolution.png create mode 100644 addons/material_maker/library/base/3d_sdf_operators_rounded.png create mode 100644 addons/material_maker/library/base/3d_sdf_operators_smoothboolean.png create mode 100644 addons/material_maker/library/base/3d_sdf_render.png create mode 100644 addons/material_maker/library/base/3d_sdf_shapes_box.png create mode 100644 addons/material_maker/library/base/3d_sdf_shapes_capsule.png create mode 100644 addons/material_maker/library/base/3d_sdf_shapes_cone.png create mode 100644 addons/material_maker/library/base/3d_sdf_shapes_cylinder.png create mode 100644 addons/material_maker/library/base/3d_sdf_shapes_sphere.png create mode 100644 addons/material_maker/library/base/3d_sdf_shapes_torus.png create mode 100644 addons/material_maker/library/base/3d_sdf_transforms_rotate.png create mode 100644 addons/material_maker/library/base/3d_sdf_transforms_scale.png create mode 100644 addons/material_maker/library/base/3d_sdf_transforms_translate.png create mode 100644 addons/material_maker/library/base/pattern_beehive.png create mode 100644 addons/material_maker/library/base/simple_sdf_transforms_translate.png diff --git a/addons/material_maker/engine/renderer.gd b/addons/material_maker/engine/renderer.gd index 0d12de4..6041e6f 100644 --- a/addons/material_maker/engine/renderer.gd +++ b/addons/material_maker/engine/renderer.gd @@ -42,6 +42,7 @@ static func generate_preview_shader(src_code) -> String: var code code = "shader_type canvas_item;\n" code += "render_mode blend_disabled;\n" + code += "uniform float preview_size = 64;\n" var file = File.new() file.open("res://addons/material_maker/common.shader", File.READ) code += file.get_as_text() @@ -64,8 +65,8 @@ static func generate_preview_shader(src_code) -> String: shader_code += "vec2 uv = UV;\n" shader_code += src_code.code shader_code += "float d = "+src_code.sdf2d+";\n" - shader_code += "vec3 col = vec3(cos(d*62.8318530718*5.0));\n" - shader_code += "col *= clamp(1.0-4.0*abs(d), 0.0, 1.0);\n" + shader_code += "vec3 col = vec3(cos(d*min(256, preview_size)));\n" + shader_code += "col *= clamp(1.0-d*d, 0.0, 1.0);\n" shader_code += "col *= vec3(1.0, vec2(step(-0.015, d)));\n" shader_code += "col *= vec3(vec2(step(d, 0.015)), 1.0);\n" shader_code += "COLOR = vec4(col, 1.0);\n" @@ -167,6 +168,7 @@ func render_shader(shader, textures, render_size) -> Object: if textures != null: for k in textures.keys(): shader_material.set_shader_param(k, textures[k]) + shader_material.set_shader_param("preview_size", render_size) render_target_update_mode = Viewport.UPDATE_ONCE update_worlds() yield(get_tree(), "idle_frame") diff --git a/addons/material_maker/library/base.json b/addons/material_maker/library/base.json index 19eaab4..8c75de0 100644 --- a/addons/material_maker/library/base.json +++ b/addons/material_maker/library/base.json @@ -730,7 +730,7 @@ "parameters": { "cx": 0, "cy": 0, - "r": 0.25 + "r": 0.4 }, "tree_item": "Simple/SDF/Shapes/sdCircle", "type": "sdcircle" @@ -746,8 +746,61 @@ "r": 0.3, "w": 0.3 }, + "shader_model": { + "code": "vec2 $(name_uv)_d = abs($uv-0.5*vec2($cx+1.0, $cy+1.0))-vec2($w, $h);\n", + "global": "", + "inputs": [ + + ], + "instance": "", + "name": "sdBox", + "outputs": [ + { + "sdf2d": "length(max($(name_uv)_d,vec2(0)))+min(max($(name_uv)_d.x,$(name_uv)_d.y),0.0)", + "type": "sdf2d" + } + ], + "parameters": [ + { + "default": 0.5, + "label": "Width", + "max": 1, + "min": 0, + "name": "w", + "step": 0.01, + "type": "float" + }, + { + "default": 1, + "label": "Height", + "max": 1, + "min": 0, + "name": "h", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Center X", + "max": 1, + "min": -1, + "name": "cx", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Center Y", + "max": 1, + "min": -1, + "name": "cy", + "step": 0.01, + "type": "float" + } + ] + }, "tree_item": "Simple/SDF/Shapes/sdBox", - "type": "sdbox" + "type": "shader" }, { "collapsed": true, @@ -819,21 +872,21 @@ "default": "0.0", "label": "", "name": "in1", - "type": "f" + "type": "sdf2d" }, { "default": "0.0", "label": "", "name": "in2", - "type": "f" + "type": "sdf2d" } ], "instance": "", "name": "sdSmoothBoolean", "outputs": [ { - "f": "sdSmooth$op($in1($uv), $in2($uv), $k)", - "type": "f" + "sdf2d": "sdSmooth$op($in1($uv), $in2($uv), $k)", + "type": "sdf2d" } ], "parameters": [ @@ -882,7 +935,7 @@ "h": 0.08, "k": 0.15, "op": 0, - "r": 0.1, + "r": 0.2, "w": 0.28 }, "tree_item": "Simple/SDF/Operators/sdRoundedShape", @@ -899,7 +952,7 @@ "h": 0.08, "k": 0.15, "op": 0, - "r": 0.05, + "r": 0.1, "w": 0.28 }, "tree_item": "Simple/SDF/Operators/sdAnnularShape", @@ -908,7 +961,7 @@ { "collapsed": true, "icon": "simple_sdf_operators_sdshow", - "name": "sdshow", + "name": "sdshow_2", "parameters": { "bevel": 0.1, "cx": 0, @@ -917,39 +970,274 @@ "r": 0.3, "w": 0.28 }, - "shader_model": { - "code": "", - "global": "", - "inputs": [ - { - "default": "0.0", - "label": "", - "name": "in", - "type": "f" - } - ], - "instance": "", - "name": "sdShow", - "outputs": [ - { - "f": "clamp(-$in($uv)/max($bevel, 0.00001), 0.0, 1.0)", - "type": "f" - } - ], - "parameters": [ - { - "default": 0, - "label": "Bevel", - "max": 1, - "min": 0, - "name": "bevel", - "step": 0.01, - "type": "float" - } - ] - }, "tree_item": "Simple/SDF/Operators/sdShow", - "type": "shader" + "type": "sdshow" + }, + { + "collapsed": false, + "tree_item": "Simple/SDF/Transforms" + }, + { + "collapsed": true, + "icon": "simple_sdf_transforms_translate", + "name": "sdtranslate", + "parameters": { + "x": 0, + "y": 0, + "z": 0 + }, + "tree_item": "Simple/SDF/Transforms/Translate", + "type": "sdtranslate" + }, + { + "collapsed": false, + "tree_item": "3D" + }, + { + "collapsed": true, + "icon": "3d_sdf_shapes_sphere", + "name": "sdf3d_sphere", + "parameters": { + "r": 0.4 + }, + "tree_item": "3D/SDF/Shapes/Sphere", + "type": "sdf3d_sphere" + }, + { + "collapsed": true, + "icon": "3d_sdf_shapes_box", + "name": "sdf3d_box", + "parameters": { + "r": 0.01, + "sx": 0.3, + "sy": 0.25, + "sz": 0.25 + }, + "tree_item": "3D/SDF/Shapes/Box", + "type": "sdf3d_box" + }, + { + "collapsed": true, + "icon": "3d_sdf_shapes_cylinder", + "name": "sdf3d_cylinder", + "parameters": { + "l": 0.25, + "r": 0.25, + "sx": 0.25, + "sy": 0.25, + "sz": 0.5 + }, + "tree_item": "3D/SDF/Shapes/Cylinder", + "type": "sdf3d_cylinder" + }, + { + "collapsed": true, + "icon": "3d_sdf_shapes_capsule", + "name": "sdf3d_capsule", + "parameters": { + "l": 0.3, + "r": 0.2, + "sx": 0.25, + "sy": 0.25, + "sz": 0.5 + }, + "tree_item": "3D/SDF/Shapes/Capsule", + "type": "sdf3d_capsule" + }, + { + "collapsed": true, + "icon": "3d_sdf_shapes_cone", + "name": "sdf3d_cone", + "parameters": { + "a": 30, + "r": 0, + "sx": 0.01, + "sy": 0.01, + "sz": 0.015 + }, + "tree_item": "3D/SDF/Shapes/Cone", + "type": "sdf3d_cone" + }, + { + "collapsed": true, + "icon": "3d_sdf_shapes_torus", + "name": "sdf3d_torus", + "parameters": { + "R": 0.3, + "r": 0.15, + "sx": 0.1, + "sy": 0.1, + "sz": 0.02 + }, + "tree_item": "3D/SDF/Shapes/Torus", + "type": "sdf3d_torus" + }, + { + "collapsed": true, + "icon": "3d_sdf_operators_boolean", + "name": "sdf3d_boolean", + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "tree_item": "3D/SDF/Operators/Boolean", + "type": "sdf3d_boolean" + }, + { + "collapsed": true, + "icon": "3d_sdf_operators_smoothboolean", + "name": "sdf3d_smoothboolean", + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.15, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "tree_item": "3D/SDF/Operators/SmoothBoolean", + "type": "sdf3d_smoothboolean" + }, + { + "collapsed": true, + "icon": "3d_sdf_operators_rounded", + "name": "sdf3d_rounded", + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.15, + "op": 0, + "r": 0.15, + "w": 0.28 + }, + "tree_item": "3D/SDF/Operators/Rounded", + "type": "sdf3d_rounded" + }, + { + "collapsed": true, + "icon": "3d_sdf_operators_repeat", + "name": "sdf3d_repeat", + "parameters": { + "a": 0, + "r": 0.3, + "rx": 3, + "ry": 3, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "tree_item": "3D/SDF/Operators/Repeat", + "type": "sdf3d_repeat" + }, + { + "collapsed": true, + "icon": "3d_sdf_operators_circlerepeat", + "name": "sdf3d_circle_repeat", + "parameters": { + "a": 0, + "c": 5, + "r": 0.24, + "rx": 4, + "ry": 4, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "tree_item": "3D/SDF/Operators/CircleRepeat", + "type": "sdf3d_circle_repeat" + }, + { + "collapsed": true, + "icon": "3d_sdf_operators_extrusion", + "name": "sdf3d_extrusion", + "parameters": { + "a": 0, + "d": 0.3, + "s": 1, + "x": 0.35, + "y": 0, + "z": 0 + }, + "tree_item": "3D/SDF/Operators/Extrusion", + "type": "sdf3d_extrusion" + }, + { + "collapsed": true, + "icon": "3d_sdf_operators_revolution", + "name": "sdf3d_revolution", + "parameters": { + "a": 0, + "d": 0.25, + "s": 1, + "x": 0.35, + "y": 0, + "z": 0 + }, + "tree_item": "3D/SDF/Operators/Revolution", + "type": "sdf3d_revolution" + }, + { + "collapsed": true, + "icon": "3d_sdf_transforms_translate", + "name": "sdf3d_translate_3_2", + "parameters": { + "x": 0, + "y": 0, + "z": 0 + }, + "tree_item": "3D/SDF/Transforms/Translate", + "type": "sdf3d_translate" + }, + { + "collapsed": true, + "icon": "3d_sdf_transforms_scale", + "name": "sdf3d_scale_2", + "parameters": { + "a": 0, + "s": 1, + "x": 0.35, + "y": 0, + "z": 0 + }, + "tree_item": "3D/SDF/Transforms/Scale", + "type": "sdf3d_scale" + }, + { + "collapsed": true, + "icon": "3d_sdf_transforms_rotate", + "name": "sdf3d_rotate_2", + "parameters": { + "a": 0, + "ax": 0, + "ay": 0, + "az": 0, + "x": 0.35, + "y": 0, + "z": 0 + }, + "tree_item": "3D/SDF/Transforms/Rotate", + "type": "sdf3d_rotate" + }, + { + "collapsed": true, + "icon": "3d_sdf_render", + "name": "raymarching", + "parameters": { + + }, + "tree_item": "3D/SDF/Render", + "type": "raymarching" }, { "collapsed": false, @@ -1130,7 +1418,7 @@ ], "icon": "pattern_fibers", "label": "Fibers", - "name": "graph", + "name": "graph_4", "nodes": [ { "name": "transform", @@ -1140,7 +1428,7 @@ }, "parameters": { "repeat": true, - "rotate": 45, + "rotate": 30.125, "scale_x": 0.5, "scale_y": 1, "translate_x": 0.975, @@ -1156,6 +1444,7 @@ }, "parameters": { "gradient": { + "interpolation": 1, "points": [ { "a": 1, @@ -1186,9 +1475,11 @@ "parameters": { "bevel": 0.1, "columns": 4, + "corner": 0, "mortar": 0.1, "pattern": 0, "repeat": 1, + "round": 0, "row_offset": 0.5, "rows": 1 }, @@ -1239,8 +1530,8 @@ { "name": "gen_parameters", "node_position": { - "x": -433.557495, - "y": -236.5 + "x": -429.557495, + "y": -266.5 }, "parameters": { "param0": 4 @@ -1322,6 +1613,17 @@ "tree_item": "Pattern/Scratches", "type": "scratches" }, + { + "collapsed": true, + "icon": "pattern_beehive", + "name": "beehive", + "parameters": { + "sx": 4, + "sy": 4 + }, + "tree_item": "Pattern/Beehive", + "type": "beehive" + }, { "collapsed": false, "icon": "noise", diff --git a/addons/material_maker/library/base/3d_sdf_operators_boolean.png b/addons/material_maker/library/base/3d_sdf_operators_boolean.png new file mode 100644 index 0000000000000000000000000000000000000000..584571293ea589383733c5a5bc1f542844a6f336 GIT binary patch literal 1827 zcmV+;2i*9HP)1 z&5IOA6#rFq^~a0~!9zTlqah&}FA;^k?0+D+c$3_NJ9zY#fR_;P;;K35MNr5=2ssL_ zs{}$m%t_)BKM)~-Xv9^}th+m1)j3pGb#+gFRaeir#s|gpbl0m_zhA%is$R`5xpU`E zLI{DabkW(0dh~4u4*+y4P3CpzSrM>RLAdC#X;0?t*|W9J7Zw(Jv(+h_@7}$eOk?0C z;AOI~urPaXX(GUO;I_b*mwyGNUOIk)`T0-uv(ac|Wz&VUS^{haZUTPo+Am{bbUtU(g87TGACV^8*!I+=Bmn47?9OLmO z;&_Y$2R^7IqK|MXO@dtqHs#8d9}q=D1VLngr=ZkB5QOmk5Werj^ORS3pj3K;@`CYr z6Duo^aOB8QT)LDexvyL?;Q@Wb{L<1-2!c?9lLSzN;Q&Dp)eu0neIbM^{J^K^KqIY=)M;5^27yn*%gHLR}w zgT=)!ZE@FPV@(}wAEP4yR+sPTu8VmRE6!C+g#{Ui8(FyR3z4-i6AFUZ0` zdBNu92421T7tfzR!SUmtIfDl*w!%$=n{P4*q7=AlgOUW8_keN&fFuzRLLiREU@U;= zHBWgewLsnAH*WlfAc#Pz2gZC1217*A&~W`B!Z2z@Kz?(S=>t$;_lPniHC?fz;RR0-4blm}2KQzik5C;*7#u`_tUq8zRod}--ty}kAQ zKm%6su0ZEM%UY%rhQ;rZPNHErKoo7maJT~}Pk!qJ9%$(Sb%XnUww29;&YE<2vjrs~ z!1PX0ErkHmda1w2r)3bX~UYIH(mQ-zQGEH+kX#e4bhW?nEGrK;r% zr>@|Ef(LX-C`po}x>WDw&3IOCs+^Ggb(sewNusYQ71{zMwpxX z*feEqWT;*t6e;G3PsT2zB)&YWp9BE3L)0?~<49(xgk zkhY)ZIbi}q663qH$2oTbuB6jXV?{%9tIBl^FYl{K5Q7wx99nWs3Od?~wkL}tj`j65 zEG{lq&Z(_f|1?%+=-|N*F&=M1h!{c$gNVsWTg^>=65~73_su0xN}{Vm&N;^84cxx{ z9RN&_VEaNl6Hqj?w)O {mZAu#q+{?o|U|WP`rHkyw*k^VqFZmf;VNyj(4<<5CWT<8vr&M^!t75rZg5q zeS$Z2^7icd+v%%5<()bgL;nZxK<9nH{{uWwAi%D?Y~2-G6+GZr4Yre6fhUDNEsG(W z&h-;0?P;kyTkt>+)nK)3eei%|HCQdS;9HD11@ORB2dA zy?Q|Tq+H^D+TelS2zWEW0}TYUODbUjUH@kN z>4FCwtHHb>yZ+7k?%Q*#VyLY`TjR#l4*FfdI}}583Qd2z|0aV6T2_NqB+R0wZ`OA# zhT1BOMk9;=8j9BQ}QY4_i9C zMF$<{Ka}iKXV&0>mITadVzaPeRSflIWEwhs+32AfoV`w;HXN(L+3WOe<3D!OXWzx2 R)ZYLA002ovPDHLkV1n0fVDSI| literal 0 HcmV?d00001 diff --git a/addons/material_maker/library/base/3d_sdf_operators_circlerepeat.png b/addons/material_maker/library/base/3d_sdf_operators_circlerepeat.png new file mode 100644 index 0000000000000000000000000000000000000000..1c721247b45f5dc2c2949e3c4acd25750ea7d279 GIT binary patch literal 1469 zcmV;u1w#6XP)1 z&us)h6;s64{De=08=0c@PRVyJbfFckg zK|uvBfb3LFVn^^V@DI>~J@)ME{CG1v{z3aLws-fv?|pCH%+8w`vx9?!FN`s`ijU4T z>XrV_dZ@<)%XN;lUwmYLEU#aNFkxC`T>(_sigP`M9 zvOQpua=D7zxBsvL%0ZxDnaFclUjBKI4LY&S4N4S;s?~f8>swuIFG*Gh4vC^_{q60S zMt>wkR4R!w2&7uTwdKtz-*ZSM*RR(}K%K%Cf&n>^rA4aRYdd-oFIn%*Iu z#PN#sJ9g;zYOHRz?KO~lRfA{FeABC=I6W*9{bTU+_y^u5sdW}j{9gfV6x1Wjp`rYX7Kx=e`yd929m^2dvi2P_%j zTWrYUNw)@%QCjt!i%@jVo$Iywix=6zY;0@{zEgrR$N(z&XU|^Y)~(+~ z699n6kAKDT^0!&zfym3P|MclA z4ghcctZw%A+S)J}x*#ydvRyzFk+iMgk-^9Rs>@$nTf0B_e(~aWc<|tU=DxKUQnz@< zgc3Y7dE4NpR?S`%gCXN(0zlu-QEc>c?W6aDZ9c{@~Y9_mAp-qdxQLQ*bOGr z^7$#Q(xTDEhYx$k`^IW;Zf*vXPJ46FW4CwZiaz~;{zORS7@riW_UFygdsvV$^PP(yTCP zStzA%FBl*PLnVwcux__&eQ)s@Uc3DkmoCxBie2FO^EbG8^EVDla17YndxFKq^CT=W zTk7>+aN)u=0OrM6uA?o6MB#>_h(TGAaOf86SDT;~yig0A}6Xm7qAJV{%16 zzIO6JfxW^10(pRVQq%`PSH?~gdBEeOX!r$MgC?rT|oskzqp+Q3GgvR(6 XU}=3Ic%I>*00000NkvXXu0mjfu-V)= literal 0 HcmV?d00001 diff --git a/addons/material_maker/library/base/3d_sdf_operators_extrusion.png b/addons/material_maker/library/base/3d_sdf_operators_extrusion.png new file mode 100644 index 0000000000000000000000000000000000000000..c27c48891c57880f95923391c1188dddb1dd0e45 GIT binary patch literal 860 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 Veo=8~D+~Yt002ovPDHLkV1ioUJ5c}t literal 0 HcmV?d00001 diff --git a/addons/material_maker/library/base/3d_sdf_operators_rounded.png b/addons/material_maker/library/base/3d_sdf_operators_rounded.png new file mode 100644 index 0000000000000000000000000000000000000000..accd2d4d5561b8c97acf27e09e20e799066696dc GIT binary patch literal 1630 zcmV-k2BG1 zON$g&6#nk3-qq8YI0WM=*~V2!;##tC=|&J223%!eM%{`b1WA~!ID_IYLD0V-%&f9d z@DD@e4xI=RjPnb6+BQ-0eA1-ZRD^k$pf^pu~E5gl^EpZ z%a?xg;I2%`+-wzt0v|7U0NCE%ZWW{UJm9FLX(m;hs}Qvl6` zfDpj<0Vy2-+ws6yCAZ21JbwH)Ow)#Gj=;G9=K{KJg0b2hb}Ec&y{EA4F@#XSxqxMjVHh@a-ROXT;=5FK6DeijT!2yrz=!KftgU^C z_4S*$ckhqV=%v~3?mmHGSP(*mt{brJRan*thG9X|k_6Q23hjGN;DE7!0LB=ApbDg% z!nQxd_3OXm_U&H^y%Z7G=oDA08io456@lz^h;4hZ|Ap{uX&~-B|cTF>6)pY}^YJl^yada{9Hh|N9 zDCG+k;QJn=bU+A&ln&O`PNwW;zH_sulz~zTMbV%r8dOz-qNq?56{@O+*Hkc8UI9V8 zCS9O>ED7cT3OG-80S}Zi_`Z+nREMtHiCj8e3{|^JM+H9LF4ANU*)zjJ0-^zAaUiRf zRbSxK?Xm{m4i`hi0$&`zT#jTlxNPusq~^Im)i!;BPdCmoE_PUZB~z4Of8e_-ks3^EMxNncg`)*zs08ao8=&ALSg6|g+;?H`q-4FOG~cMZPTqcfTq^}H+G z{hd#C!P)z=ZMF)Fq0-bE&C&ZT`>a)H&9y*xviv^Z>A^_7U7lrvFE^@4K+~l90pDiZ zjduBigOr!hSH1R&xiqsm;?-caNy#$6*KJFI`5zgyzxy8#cmUuL;LXiV?Ck8!8FH>b z2n9lj@Ku2jYT~_;+7_P=)&@kj?cznoc({Qp<~BtMA#hz6LI_ZrA8T$Nu(7cblMrky zQZUBBn1~NV)0*5AZ3?(5*er=QMd!~2JorAqm;*{F4i7)%+AoX&(V%$t?04|IfJsVe zs0@s;@Rf(kVx^QPuBVlyboO1gU4HxgwzJQa()h&q%9S5;h|gIIL?lS*z;#{tz8@Pz zgb)(wj2sF|N!%v-K1-vvGtF;1(-u3rLMEaS|VZ65_)1JUGr22M6!5zyAgoFMhw! zJ}HF+5JK?a!49rnyES(r>^LeMCm48q-@{Q2a8+h_QB_7HNGWl6_#SWH{)=n|;RRZB0MqC*8=`(UJx#QGj5DiiQ2f(MT9Z*zSNlwIUiO27~wU0uc~B;ZpA4-^n^ c9KZv>|7uKp2oN8A)&Kwi07*qoM6N<$g6HuDKmY&$ literal 0 HcmV?d00001 diff --git a/addons/material_maker/library/base/3d_sdf_operators_smoothboolean.png b/addons/material_maker/library/base/3d_sdf_operators_smoothboolean.png new file mode 100644 index 0000000000000000000000000000000000000000..7abd17f3379c856080eb133641b25d29d6c60234 GIT binary patch literal 2155 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 KMNUMnLSTX)Id!@K literal 0 HcmV?d00001 diff --git a/addons/material_maker/library/base/3d_sdf_shapes_box.png b/addons/material_maker/library/base/3d_sdf_shapes_box.png new file mode 100644 index 0000000000000000000000000000000000000000..b8c3cb7f914f293003cf863e8a8a89af376c0a8f GIT binary patch literal 730 zcmV<00ww*4P)% zJ95G>5QhKtq-7@epd|;$T_|yrjv_T(8a$kXGFPGC5=q7_DT0G-{McPRyfQn(gz@Ot z>RZW@HWG9?oi0QKscAG8b=f1s13+e}F;nP70k8_;qICG3se+^x7Wo?0Hi?s{oacY69Lfn zrX&b`KC-a_q0QCrSP+P4&`0K@5nA)*w=W2+Tp)G$%GyET*3aGwS9UypVzqje$~uhK zKuMgo+Yjt^Z((wQ%GT?5ESE2}C$gUWYn!I`Z<;>7#o`%6U!qzaR{=ZlT5||M`tX1{ z0P}z+qVO9b%kV(ponTyezMuLkAzlUeP5>8pS+7&;??A~I$;_tlkGq4ex7rs5l(`|E6$f3m#Cu z0=h}l9=tdi(ytb=;N{CBI{mMHI$p+ikP)6L<9LqI4?RdqNUOJL{ zR{>rSY{6@6a2e!|1S{~;K(KOw{vb$~yBIwmC>N+E$F`$z@QfNA^rBm0?G-}a06%+! zao@UKp=c|d=Q+yq=lZ<)sqW(3f6)1SSlg}X(%$qyS$>P)0f5fu^MzY@%u>{N+X|sc zQ4U5d!vld2My$gF0e?0ZW1{rYt{?{^DUBBI2O}xL0|Nng1b6`W1#&7haE{<=GXMYp M07*qoM6N<$f+bx~bN~PV literal 0 HcmV?d00001 diff --git a/addons/material_maker/library/base/3d_sdf_shapes_capsule.png b/addons/material_maker/library/base/3d_sdf_shapes_capsule.png new file mode 100644 index 0000000000000000000000000000000000000000..fef46af557d1fac358694e64273484685de69a4e GIT binary patch literal 1682 zcmV;D25tF?P)0 z%Z?N`6g{r@qh}^jP!v|lE{cSd6(Aub*s(+WM3l`m$~uV2Vk8zUhyrAl#Yl(`$PYkf zc2NW$z>N3<5;fD)>8^+EEL^UtuIcKohuyS@B}?`2eVkL*uDW$i-n@Ck2_b0Py2xyz zobi7K4*DL?sl@(#>U)vl>ilr>wv#_@h5ECg=v~F3=@W7 zfDn?)a?U|1#kFgfmJ*>dI_C(`1zrNTEIS8JhyllOVcQN&(}H1$<%ltgIF2x#PVns6 zlSUxg`Z#x85}*tG;o++sq-k2PEE}E|z;%5%jv&Rd?2Hrw&UsG4WO9nfkAGSUppAcv znx#|u(b4N1q-k34{Sdw%!gT|eD|wdw)EX#szI~WXh5Qbau{Q*2Lfam#eocRbS)&TiFnj%R8IF5(? z{oio^{&!0JE4S7JG*K?XUVs`5wh@Ng83AEw{!0Sve2Rz&5YvEj21+T?G|Ar_s{AXr zRs=Lret7r_uIs}zErj7Vf?x|lFv!DS5a7Xayo{)F1QhFloCbmb2Zmwd$&=qP9Ny{W zU$rU82FvqbK26v4bI_s(S@;)kfP#P`0t5jB00(0XX_~;YY!E^~Y1+xZWvvkbZIp`z z&4lL#70^Lx{>w$s$reF7e-jX5K$>HWfzlL~Wi2H@TQbyE`O(p97={VkcHwz`w%UvN zUWEPparxYJW%ooTGL5Km) zIb1hJ7;bg)tqzycY*0EcLtD&mCj;qZ*XNJLIJ>e4%G`kE=Zw)z##II$sQDq%$3O!Y zP^ho@KG$S^5w3Ft=mp=Usqv={m(gTU7scntwN|aHE%VW6GN_5-DLky5YPDF|%q z=E}-YlR>K#HOYc_3EM6cBU79LGeUz`OZA>y$qoL-w&fY2=)$#q3AuXk`hAvcWEwaBtgMy#A z%1dL*4Xf0p<_)1a8Cs>M+Xs}&Z@8Cm0i3Q2;rGN`FBWcpXuYY>EvN6j3zo>|33T@@(+Rm9LQ`5hzW;Se1zK{9T;ii#g6SIiA-C<2b_2 zn_u+uZIO)fZ1C>gyBLp0h~o&9CSXhu!5GUxvAmao7WV{b#waLFk){daIKp^5>g`+O zWT>x!gM*)OcJ>}oG((caNYezACV5l{fMTjhu(Au#0(g?dh@vUZ&feq3jn9?%R&C0% z!K%!oM?Ydb9$`A2AdY8<;}}U2BS{jZX;LC3DFIHhF%jZ;hUs*I@py!*R|iUcD>o(C zV4ckV{w_wNcbH60F`G>gMN`D_G$SM`^;zDdXo~4{g306*qtQEDz8q-rEx-Tv?b}{E zMVpM@+xrz4FMf%gozD=4I|u@~RZi>>kzav;+$cH2X!JL3-TJDtUrlA^2+*AqJbd^Z z7cN}H*48KR{Sc1h!?wj|FaS`R;_U1cw{L&b%T61aoPc#CM4KqH(b?cS2y0y%RPiTP zmmTfNP}jDp;2RZ2R2bPb8)X^IwZY8>4`{3nu4AFpo(!onqC-Y|GNjUoY8maxkZL0; cWmMbv56na<-8xTQ0ssI207*qoM6N<$f(Jw-00000 literal 0 HcmV?d00001 diff --git a/addons/material_maker/library/base/3d_sdf_shapes_cone.png b/addons/material_maker/library/base/3d_sdf_shapes_cone.png new file mode 100644 index 0000000000000000000000000000000000000000..052f3780c7c64e58d9632cda9010f5a135966b7e GIT binary patch literal 1612 zcmV-S2DABzP)}6* z@*URJzCx>Y8LifrSY2&lb+v_+l`nAV(kfO~R?uw5uS;k&nrJqgsMnilG@7W_8>rXo zsMYGxpEWp6{BjWIrL~S;3Q9>xDIo+0V-!K)!*vJP+FHxZbr!c;QSt!LZnxq4E(q~K zDFx>YLU2eaAft1P)b2c2`M=^rx*;nnTR~x zYB@Qda(egfb-3;Tl=|R2E`o>>laNwDDPuh z3vmDbSEb1pDnORgcDs$ysD~i%!B{YM6v6_?u`bAd`e#Noem2P~2qC~2gXfJ-R^oH))n@wEL_boK>=;GmS?;lr*IS>+rl$v=!*70!*6&*>T4wKcxY-w$`kX2PO(Iuj5Xq zgMR;0)CE~|yKKc4)YQ@HNHDtW*tfGx+jZv64$^w!GkNM@|(u3mPMk7^GWM;I_P!};d$ZRfU&R(loH7>j4w8+pE%KU3z$!zF^Yaa z`@UZ^zey`4hGse6-F;~c#31Pca~5RZ2veVN0XSzM#7)+ojr>e2EQazr54&K1AV|9) zJqD9QFuehq?H^uw0~{W{vz}jUrPbgpd-LW`^m@l2WCX@YB$ULdJ3%abOt zhIsPin)Uo*E3F3e*!An*U^ME3kaR7YbHMP7@%9g&eh?6BZni4R513O8&a!9Ep5gfT zqal{!E*Regro~U6bBf{cBzLUJ#86r1F=l7yHw*?{5aJnE zOpbG_!917`AO42xh69mv9&Lkk21FhhoK(32`Z()7{$iM^bZVd zkq0cQ!C9D2r-P%T_wc+S7^9F?^=H0t}c-{~~Fk=-ukW!%6JGK@lFLo|9SO)Xr#jogg z4-f( ze#hbAdkDc$tJT05!PeI4OHUO_b0e}6yM*A$=Qs4N0kxfrS%GcRr-VyG&N4ctP+P!$+kxQ0#V%T7L*7O?5O z3XJVo3l&52VycK$>SOV|&TV3}qAP~uuFXRCWzbI)Vp|Us|80%`VjD61Q_rks!TUN}uQ-hU@ zp=C&Fk(hI%1}hgsWr8ddk+PVjSA&&{p)x@((t2Eo8Z3ibN-{7Bh*3xk*$PqxrgAZ4Gl*?W0 zOK#gR5Pg*Ov1oDoIw zky3}lVN^;X)Hs+Dan=8vJOETBHD(H2PytF!A_iBN)R-w^k$S*aO&%Z=;43GulyW}; zT;lzHZ#=)EJNWR<{wa+27QR4n90%xr7Y5{5^Qdnr*zVFfZy(m9R3`tl_ zTuKp=Xn|1jRCvJM8Dy2cqtU>q;FT>jvEKI44;!2A1eyuJOx z>+8>`zHylXfGw;I7$>AUbMGM#*<<0i0a}A8t9%VpMw1CTTI*V@) zNeh&0G53VDGemW!2Q{Acp~M$Lg1!z zD_YsqpiUF=W^nO@w?lgjPp6adJ3*5(CqU^K(XFvLV#L(oTrnbQaL$ui%0!&-JX@{Z!00001 zO^e({8h%P8sk>(;@tP3!nB9dXfgDUAIGBK$lQD$+gIpGpgO{GY?Ii;~#MlStVv;y> zh#_FeEx#aR&uR1FU9P*QDumx>S9kG~_$>;K76H zB!w;uI+Ui<=?hg$F9Li8uNt^7ZEbD!es^iox(KifUIp;GcYi_@@w#kPeud4=x4rd- zOeECCzKJo`PQWU_@9ut&I8JK75uzxP71!Wt9gG20-I}T@Q4|HvpMML$^Yary0!|8k zZ|@$Wh}Ss+V-k22F#w7LfRaF~ltfghstRRU;@r760hmOr!dG}lfs=rjz+)syN_yPi z^Xi&&r4DKmXuubRz%Rc%Kv|XmzF4WFbQG{G_&axgY@{AVHgFA|F$T`#I&S#3rO{D9H)rm*h2t!h|&a90F)966on*V zK0n5pGq3d~A*7gwfMvjc_uapcB%@C7X*xn2CpGw_0pCV|O@cIs!XjaYr%w-X`}XI9 zfvXhvdC8Y{cYi>dju1trl&QTZNs2g5kt7M?I05HLqkt&l&95RYtO5WiQI?W~vMeCP z7^BeyqtOH(e)vz^y7lQ`@BqLbK78nm0$shoyZZx@Bn|dF=h6u#$*2J@35c6tNkE%& zRO1-{X$HzEDkTV!Bg+<8ERJz__!v7oR|kOy2F?WlDf={4vXASAYXEVa)WFkP0ZC)~ z3Ou#{ka}!q2q;r18xn*NO+B0^xO8b7J3ChgDcT{RtM`*+R0HP@_#_!2O(}T4{QaYV z8z|X8v@ehZ#BqV5NQiUggUxx60`~TPZYr{+D}j%ZrfH)9-TR590PZn^aJ*m>Kvf_K z$eZ#mU;YxGeDe3z6L9Cwk4Tc#0j|KO>DZ%y#K>mvy9%&J560kehLivqBYz!O8~1UN);hNsUWUNh{+7I!nJE(nw-5 z5gG2N<8uk1LtwWLupJ>)L1hF+Wm(qk%NybVpeTw?@Ia3>!M(kE;M@&V6v$B44lu2U zMoNf!mKe|I$YGBp@;%C(obbN3Kv zMuPresM`-H707m~RF)++HePN84|FJCclUd%VXU@&4Nm@sNa&N}Uhm1?_g!m+Ni|4c zG#ZUD93e`F{?R$xjw1WbB;I|c|xf;t#tFhgRscw#P;C`TAY97Q3T z_p3@yqlK8@^yybygQJE3uRN^iOipQCkh&K&P4-3jBnhg6 z09KPzAWcV@OxD}_xP3Ng+oBFRZIB9}?d{DhpY!HkE5Hnd+)0sN0a2v=fL>zLD@jR` zBTXmm1hmORHjEMww@A7@s}R~Wfw&g|p*evv1L~mV-%FIGG|@CoTL}m{!Mk^Vstc5| zY6r*zzg?NPyvqaEnoxISQJI=$iW@h+4J#nr``qXO-!hiJ@!SHZ9i0u@b%GHX<1J25 zMtRB%%CZ7uB^WCV`AY?8qQ>L3;RMi%B>@~}kC|TF1#8>7a(J;ppcx8NGhmGZLr##f z3RR^^sw#kUY5$xTP5ns{HiMR7(2T`(L%9RM1mXhokz^~$zb2sV+P6?Dot?S6R8ElJhZ+Lkp#VLlR0a97+hCWB z5IMeb>@@-ZC?MruInOC@buC2h1rM~00-Kv}*Y*$Ml-$DYXLbYpM0Lx#yc<^nz<b&18qJ<~;>Pdyj&5-!o0YY%ZM`nVYDK#k>_f&~Z?5I-TO& zxi_2r`La|hD1!v(;&fwez&0WDU0)e?qCzwmNc65zo@aRPy}t&rsnqMBq*8$-p+H%> ztn0Hqs&!p!^L@6k>@q6jnuf%BeNaG%9E-(qA86eKOs7-4^UfQ{^9726lA!$pZHV1a zxjdz>LtuP~lB!6y*89@0fi@EIJZnf$d-SSe>Ll%~wzlaO zH}xatW(SOS++Owrmo_g@6gl#Ifup0}dVvRengC-AXV1Ql`TQ7pzJL%pQ9?f=e5AC4 zq;{==EAZw9sg!-5XPC{7aq;4xdx7so0F4dKoOuoN`3!lUL5LhexN1<1qK(wQK2T=Q zy1%6XT-B$J%E)#|@bmdGHaGv+8+<1L_RCvaTX_2P0Q30_S+;->S*-@qWKD)_C?&z} zL0ihMv}rF>;3oJilZU1b4t^a3zLkK`@Ob<7=XmnuF&2wsWZ43Fo;Pan5ut`ps*HZu zCg`%H<>xi|8M17S`TQ79o;=3;@4qn!e2{>)*Z=@--TD-VhmSFv9U;qR$g-?agO3O` zdYFEr{oedmKnPRr@@&u?v)K_25C4se7ymLCJTPcBXr`T=tGIM&n=E&^t3+qU+TRYlhU)qD0aIc@U?2fr@W^UdG)_xD>*igqQ&7%pG_5-+{<2du4aU_4%{kFSl5 z0~7S93|&R`9g{ORLTH31n$x1Q*>H!~Nx(ATRodSE45v=Lg7x(cjK}K@36g*j*+f4q6EJRd~1O!>0>Z5 zwqGocdq;S^aqRE!5B|5gKJQ<@{tY%ZUT#dnCV_6G(4}yd6nGie&wEX5`nJt@|IwpI z{Z14uS;3VnU*YuWS23BaBTXmG86vt%tZiR!YzmR%*|WpW`TR-R2D|_QeBa!-@h!&V zwdU9z00@yAtG6euqwhC^2zU_{~ vItI-Km#t*g->kBZ!Lz|-Dp}<>tFGfe=u)thvF4_M00000NkvXXu0mjf7w7Zo literal 0 HcmV?d00001 diff --git a/addons/material_maker/library/base/3d_sdf_shapes_torus.png b/addons/material_maker/library/base/3d_sdf_shapes_torus.png new file mode 100644 index 0000000000000000000000000000000000000000..958cc701105e4a5f833b5ed6357a790b3c690eae GIT binary patch literal 3876 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 m0 zv2NQi5PdW^inQCo^Q5T*bM( z94e1BH6bZ4KuvDqEEcoM_j(gzoSZ0bP{$Esw*k8*#G0AG-5`ZiG-5o~UlTaA3RpLQ zqj=T&&-2;dJ^;wFTQ4nJ1apHljwo$A*ft@U8FEcd<>dKenT>KIvh2385w7P zfSC98icF|Cf=j2&ZG0lcU3}B;zeQG(jxn3b47m#Up84uBP$SDGti=ONZjf)4IDmmoXf=PJbR4&5$X`C2<+AuXg!tmceMmdw+0Z6XcTE6-8Ppee+nFp_GaTfcg9p zfY|d06eMMa{C@t#Kh0_*bjyG`KI=C_F3EYY)7;88uZ`r*kS*r(2VGVGg6-KsB4)@B z$(o^yi_i2?Z8MOy$O@^Oq4hd9#+V+aHlYY{mK-)HWFvyfg z&dxqozEc{~G(NFft)xvLHM#5h9}LE%_-^-?F~-UZxPo)q$1Wc5bc1ibc)-IA9zyYe zf%!?9stC8 zy>5KO;wx}|{^|ec6pII#|0r4K+}wNtKrf!EmBb$p literal 0 HcmV?d00001 diff --git a/addons/material_maker/library/base/3d_sdf_transforms_scale.png b/addons/material_maker/library/base/3d_sdf_transforms_scale.png new file mode 100644 index 0000000000000000000000000000000000000000..a72817c492f58ae8868d02fc31e5291990b60a3a GIT binary patch literal 745 zcmV% zJ96VN42C~ua=u(7qdVjh8MisZ9w6<`)~Ve1Do(NS4rTKJfDe&emJxn{-!F+2WW}A& z=j-WoVy5Ao6UT1bmOTEPO7{8rhqt$n*ff%f!)fIc-{;ZmZkqS^U%bA)M5CS!nX?nB z2X6t_)iM~+9^QV|_d1DxPuAqYqm#jd>I#?xUVGOFuYfh-opTZc)`bW2E|4nN3to1= zhmQHXi*gan6&wpbTyrl_8?X{QC=Hks{lvF>Cfd^wR zkV~pmd3u{}KL>%*3o>_usiX>(r?=^}`ullSF`ys3{jC3uD{O|ONd+oTuh;DB3)Q8~ zkS1wH<>~dBeSMiOHBYkvwr##Yd~OuH5z;y^9y|!T!Eo_W;T!h?tHFc%jnG=~AT(fA zcn}z{GJKO}Xe9Xb4<-$oq1oV}VlyNyeiv!b+u@t^0$%!L@mT!BUpvA>H3Q~^hlByn zIj+}iO~!_IS#8h&`Q!2E@cB`23(OA>0Rv=be;)YU9G`sP)!-%L-xcsb!o!aN8u-#N z61=b%*cT`{`=h~wXct%)9;$pI^AM@j9tRJq7b2oarS@2O5Wf%+rB`a(!~6O!%}}hk zBwnVk3lCKc&|Z!`;q#h811t|ZnT#Fbp+YkhpMYGG*0zI(>K{lXj~cXX;lXS`-9_&x zc)05Zh2;_xkj3Y2*4nq4nuG!00000NkvXXu0mjfr#M=k literal 0 HcmV?d00001 diff --git a/addons/material_maker/library/base/3d_sdf_transforms_translate.png b/addons/material_maker/library/base/3d_sdf_transforms_translate.png new file mode 100644 index 0000000000000000000000000000000000000000..1ecf68def74142b89fc2db8187e344a21306e75c GIT binary patch literal 643 zcmV-}0(||6P)$ z&3VEw5JaE+rONaGJx~KwkP=dW58QI)#(`Es4#bJEElaE4mDyW@Mx(bVB7pk?@>Y)zPY%o?x-_@SmvSn}vx1AIy&{7^#^Y#x6N z*dqK;YiB|ivxpYpT@@6DU>ood5Qbno@K7)frqZXb>}hbU(FPBK25b=?JmYX__`d(* zaQN_b8u{2qT`u1<-TC~PCk>W+xBcL48gT4@7T{%ej(>%phQ0tiBus-X!b74o*dqKe zM|2u&86G0jVC(Sk`zi1W@HTzXt1)@yg$KdK$p2(o;r+J!^tGa4NUrrB8LZEGHKrHd z@wNDTGOg!C96UH~h8~k`75-7luf|$}hbF^NI(TR<45fvKrovEqcnJJj{CNTG!b4;l z^c^pGXko#{;w{%K>4VdtbbMG7^1?&l-C*cBvET0{3d=ll&6-}E24fFNSrex7tiBqg zk3Iz5rgPVjCZvad{32@_TpKTGLN0j7megHyfE13oI-A4cb002ovPDHLkV1idHC5`|9 literal 0 HcmV?d00001 diff --git a/addons/material_maker/library/base/pattern_beehive.png b/addons/material_maker/library/base/pattern_beehive.png new file mode 100644 index 0000000000000000000000000000000000000000..854dba49bdf0cd68c64950f204d0e8287e712359 GIT binary patch literal 1171 zcmV;E1Z?|>P)6ozkNi9<)g>82Yb?nn6le+y5-G~1k(v5g54o)7QarUlBt=ZmMwNl50^HiyGJ zcW-8`*X!!_^%YSRA&MgW`SV9!M^OX-ST2_`o}ZuP^4`003;aTNFhhArZ&pQM&^adF>GpA+qWFJ^)~~T4`BRqiq9}_|^&- zjYbH=P);x&kHI;Y6RFX*0ZP190RZsu@BrWUWrzvHB%E{O9iYgwIF6BJnFiG-xV^pA zf^&}Tb}KhPnP*p5SF&786Nn7fLu8#Y&n(Nr-Q696Adryfd94{#Vau|RBnbeJ<{ADU zwryiNonkhdb!O1EZTaP+4yrt>Pvkfb=JPr3@9(t<9LK@e*H>d<>U<*sVz{o0AP4{e z-{0TZ?RFOzr^p)<008IndC;O1`PKv!MIqZq09sqwXHep`1e9edWumFoEX&fkFhyP_ zAWc)PRqRq*ZL*Up&s3Q>RBZ{_NttJ^>teUt4OUy{^I86zq0F-|3-VKM%N{Vlva7H@M?Ohav-0g&b!#z>y$MljFwhRY&0K$T~49BWERgzC1cZmQa5 ziVaZaJH0_68`ajbkJzBZ8@)jQm`K|I~K3Y#762IGOKOV(-|7z6T^7?zh;3?% z8n0D=<2aqi$~QMR+DnM_J3x_VK@c?D)JsFiPE~DD<=JF1`H{tBSr#Uf34otjRKJC1 zo6V-PY)m81b8I#nc}Y@@_O9--03gjbjFGN#+VA%bmqpzGMc!zQscviiH+Oy1 z78SnL8WSO&t)F^x6nHHGs)OSDzUHm9y@y-h07c$ldU~pa lOf;#jdUn;n7oSt*{{kXTZ6CiD0z?1+002ovPDHLkV1jQEAW{GT literal 0 HcmV?d00001 diff --git a/addons/material_maker/library/base/pattern_fibers.png b/addons/material_maker/library/base/pattern_fibers.png index fab5f5045642f7ecfdccbe42e1261a9c851d1b98..94d73f831472ca394e0756cfbec255cccbe518e3 100644 GIT binary patch literal 5017 zcmW+)3p|s1AAe?;TSl&FM#xL;2rWkpb6F^4Wv6zEsKj~`l9?h4p;bg~5!N_pouiTv zg-}Ext0OJfl}nmS>q2htulMuW9zOGU{=fhC_r3i7yXfuZx<)}q0YQ*8?rtu7;3xUl zTTT|Pd`9>nf~fhsyEyu=Ze-=xq)FatJjF)r;Y$6b8pOY#^|tHoNXKmBbjR{xU+n`i z2i6sx(l@nm)w*=nb5FoA8rJo7^vu9){kS~O#7Z=$eeJn)@hiFe{YnnYU)5IT(&C0^ z;#O@B_B}mW)6%%|ZOf9RXti}q<5K*~V+m8=I7aRWQXL{{(~D~@T3rfSnr*>)(=-}p zL}wm5(P)I6U2m(e2*pW<;+8cWR+qLm#4aZ3%grx1EKly9pE|V4DLVI4K0ENqk62uq zYi6LlusT3!RY_UmMUtB^eyLepdmaHo9=6D zo(Ye?>ENAxi2*6_StY^Zy2tGI?@54?XbymaiXFC~$pT_O88$s?~cN~*X1DE*m~CgnUV`1J7kH^*h@+2IclPD`s#wkgIVzI{-S`E?Jj ziNeX6^;Y?7s)fJ7FVc=|D2?{b3(8kX+5n$)RJQt?HywWvKUJrl)&>|-)i-bq)G1Gd zIrf2c10`qp7oz7)hE8_pMySm^|0STFVdSVzX_qWbFVt12wpoz6omHe^pTN@PWnCx{ z@S@Q+xM!pykI+ZyNrCjcA?r&SJi;zkVe-sSqliV~nJ5J3J=^?76T0u`>!@OmPmBJh zbx9`f-pnHKC6MlQeWX~#BH`hp>&yNq#CU8T9 zP;cKT$ zt*_)v^hCR7=)3n8up@n)`y#DV6KZOH2hXUh0KSA-Fz zIGHS%l=?SZZsk)v>-EdqnVONEY z(9tc!D7W;Nf6_HKH~QTPC*jir*R@?gr^(2Z<(V{_D*>o;EG4SCsx%5#WY+8M%ZAQ& zR+dS58LPb*kJz96^xld3fo2KGhbBX#*-CY&d;h#3mvvSBa_}X)+aCbqK)SY)ETA5s zeYkPx$YVc4IjIz0$`gOYJtM4spl7A0x|*N}8B$ka*lFq2GA_BEupY5jh($3_;2)sX z@#y_``oIm{GNdz%o|r3@Fy3h(^LA@psfl$J;5XpDnwMk-hlWP1mA%T;DhbZGwx|m! z`f`vdAe+8OC_*s#`ql=Ml-}?uMRNCnY#C%WR&VN?j!>)_j*GaQVRSKVv{(k>qK9~8 zYulN}N#oJwQ+Y!hIJ}dZNK`vd7asOmr-xp)M)8R>hUOQVHfp6vT_+G?r}2osYCCLf^v zzH5)-N-zr4YUG|G%I#!zOKNR2D5{aZQKP$E*@R9Yi-pdWyMO)zE-u?y8TQx@L0Cs$0dT+LJW_LKV}f$1$H?3R()WEO%{OhAt26#3k< zJ02t?vH$1_$Nl}s=5l@qc`ThBf(O3TPTVX_VUg=UebAk~jDegHOeVfO*7Er4Ry=t? z`>ztF>x8v(%+Soybg&OaQ(4q-)J>+9=U%Tjv4yiKn9RWE#OIN|pbg1F%zyloG2R=4 zgjSF{urp@8cotITCgYtmUWKB%*#W0KQfCIdvLy{uH5rO-B(_bnJ(iW3B$PT+*hU*a zYWZYw(e}s2K>DCOs|{T)+RTaHD<280j4(R)`m*=A0uSRG6kMAlJsbLi78&BnQvXK2 z)X;r!pU*ewj(FzllWF%S8%B*Oo6zMSKcYO0)r{Pm$sa3pr}v#|MgKdsO@h#~uWOM; zQJIt!Oi#a_arU(PW)i^q=aE;bGzkN|h|UaQQ`+)DdQ_T`rebYPXTco6x}O z^F2u10oAeSE}w@3sl5_0Gy4e5;)K(iQa!@R>HuWtvtK>Q2u4$Z(U zag=_p3tg^qYf6X11AhjW4s&IZ@DDx3S_Wc*lhP`S#ALAp>5l~V{|(A79m)9*p8Qf- zd^t!eb%!C$XGZQ}HU+sDqNgMeQ>CbS{Lm0sU7eXy%kc5pSN`$RJ&^_L&Se-aDLvpP z4iwHIE#~^2mN3s~CoO$JY)ITg7pi55N(oyrx_W#qegtj>VT3!905AIod<;ftfv)md1*&n0kSZ*KY!6oLM|Hj`As~!l;!p zPVFpt(h95==Iz++bK0BsJ3cM^vEK$cDOYijDCF?Gqe_@x*(qk@P}IBrYNQoiu4j!? zhQv*H!cKmSjYeL6UR+^6KPol6N@6Rd?;~+Nv-IZJK`Y4r)&D{@Q?R>CjonAmPd!p$ z6Iyd18PlWOC_;&!NH3sqZRblFk2D&a(ZR^hzl^VxUc``!JJR0K|9trLFsd)|rilWn zyIv#@?eOh;lnYBTdUdhfoZ?%AHO3}6@U$_MPs&%r=zI(Wi?G_3#P(acO(OSw>tf}9 zTDtQS9sC2t0rmrCA((8H+M{dOyZuZnI@syaz)97lk+K!!(~pZ7Z%sx~V~`|v?d+My zr(TyP9kVGo6~p?7g^cTVU@K!`9Ec__E`WS~&e&s-rj3D%okE}MEaauS+l?T4$qZH> zPhLUt=)J5(4JtLQJM(J;Wt-v>F>vI7i~>vr z#B`(Q&iEd!;a9BuB-5PE3j*`N+vjX=j7KM9YAY1m!fQAGrRmTe(G$9oiSb_dZVXjr z2+Eb-`qOMH|0iUFI%VPXqcux@ZCBYx|1nhe%9_lHZW1#^doqkEa556j)gJL#dZ9<| zaNuI5-{As>;dNMU@TWR6qURCCgSKhCX~7c2 zsmD>}Gz*EmT(p2LpPP#e*3lk|DG9>s1&TfL+_FVZN>9gXJi>W=z3*0pxytQkA$E666eNgF=ru+j3r>~D zbTlGw!ZFxa5OTIFXBp*^(5~m7XH4pznnm_J?nY0@FchvC$$JQn3UODu97L$N*6Bg5 zyD!lu^VQMFT)QoveCvvV!yIChmgy?bh`oSOIbihn4&8yRc<=1MvVvvKKtV%M^)|8h zI|>{L?TcEfLySAcGQ+xLwHzxr)MwQg3}{V6ME+ED$ub@AcHc!}<8ME9T%R&}VipW_ z8Ydz~l^tA#pf#)#TV6AogpHhG+So78eK)K>d!VVhrk&{d_aC>tc6n-96%J|z0|lrS z90L>1m&sUE-XqYiX3qF_3ES1@;Y;*SW|Tr}_vh&l6!^!OKAy{X*T-Tr^58JY$b%`& z%sIa_0FS(1uVEVe;8x{ST}(fiDo#0h%N(0&E7S{hsI31Xb3%gDRS3pV?ir+U6rayy z=tw&@UGx3&OR-2JCeI!_F=P{g!=#F4|GCf9jCRQ?nq#l9@|RrGSWboGxDwOFs;&LI z;*d9e8Af)*O}$S$2%T?_|C`#JcJNp?tI05@e=EMHy53=Zs6gt`D5^|wQKrP=%&(cr zH9>w9bviu#4^jWqrwtCnY42?oi%DFEL1UEO970vMU14vLAn*26={_%?pBOb*PGM@^ zBV5|DQ*~cVW2Zx73Upr-&?p+m;OEhU%4Uf6fc(wC;#~W0sl-z`Tzg` literal 5429 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 diff --git a/addons/material_maker/library/base/simple_sdf_operators_sdannularshape.png b/addons/material_maker/library/base/simple_sdf_operators_sdannularshape.png index f86793b8c84906fae5dc454474557aa501ec689e..a5b7bfd148240c05495b94ac9f1d7cd85c69fc1d 100644 GIT binary patch delta 963 zcmV;!13dh$2G|FXBYy**Nkl3lK0y-$QI*15@Sc*aw zHxYHSnRO6#(ow1S2L~s%Y@n(%O?89;1Na4e2i^j+z~j1yy9D+D*MOtI7GMeZ2rK}L zz>l@eIzTo931A4=0}KLX;1zHacn@$^U|zr$_$*FQ+|>m|Drno~&h4{1*LiW~&Q}3b z;EBL+7bL3MhJW3;n&Qlzp8}Izkl0$=q`*%J!L-0Qt=S9g2ckITqL&b01$YO1_>0dp zK(vKAW0J{aq*yG9Wm!_KR(sMc%aUTTD49$~V64SFqpfa)F7xf%B?bov$>;MdEG)3R zyo`v)t;-38LJSNHFf=qoGMQv)X^HLI?*sRmd>a%Qmw!^JB;|5h(&@D9==eJIZ#zKJ z>9mx~Whs?P0^?qv+K;W0%jKj}smQG^NIYn}1yZS0B$vwxY;7gLMX@YPve|6MlT~He zY*sAG61Z3&tKSOG%pAfn44#jS;AJnpc@6N^{^uhj9JXy{W)5-g+ykKDSs)&dW11%O zo`bHs)_;rKajnKYV45cJc)UIquKh3!0};XU1c~9?1@szGoZK6+01?43jQZGL9*3KG z16&UzHTB#8j<3>p)dGO~?6l4Z|J!AKqrCwCwFDZ80(YmT0!*cSuB1||w0UgX0sxGT zj*>_u{Dkn$;^LyO<9!KGOCXti=r>GT=EBiUfG1CaeOqFM`?&5YQ4x1rw$N_!c0MNKmcb z4u2w-w&>_9vAMZ9Uw_^Wv@O62kV^ILsb53;BB;Fp|Fs16smh{*tXhDBI4`Bv8}%h% z+cu$4h)o`c@2veB{~%bw$-R+HINf8mZP&-@XF#D)AQFi%%%5-a?f@@XA1yM&KqL~O zP$)F{YTG2$Ab|F5a)^$NlKocMezSDHT|8dz4HNXY%xJ!8O8aedp39)N8z;T!vvpSc l&C_9+pt-SJ2V%ekzX95`9He5sb*lgX002ovPDHLkV1hty$N&HU delta 792 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 O0000wmg7$J@5G0N9b9;~Ie3 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 diff --git a/addons/material_maker/library/base/simple_sdf_operators_sdshow.png b/addons/material_maker/library/base/simple_sdf_operators_sdshow.png index eaf638b10ce5ed6d971136b4d0a92d3e5f07893e..43e8b2bdc646e96b5f038afd7a21ae329807d9e7 100644 GIT binary patch delta 1487 zcmV;=1u*)B3*ifpB!8$$L_t(|ob8+GZreH#g^zZL5+!f(BD+Q2|EZFqKoc}-Ek&}d z{r>1BK_@9{TXa<0q#WPgIuXaq_rT-Sx;I4}$Y znx+8&nx;WjRmk%kS(f4X`5D{o7C(OcKvh*2weO+;rqd~IZf-E0PB9*j;rl*3&x7MQ zFirCSKv|Z^^BifKB1sbb{P`166yf{#?}(!4Vm4j`fTn3!tyWkrmzdAzn9XK93OvsP zAq1vrLf3ySUw_v%%Cf|6w?mqyeD{MO;K06p`-Y}zq}wVTfUfJR-!hbNtYPG_AKF4%A#b`9*r~gZ} zZHw)8iztdfDTQs@Fbo5#s-o*U4(j3IL7L6d08mP?SS&b%FbsJlgkgx~a>;l6cT!aq zlgR|W@AFKdsw&#HMO9TOisB$s$dEJu)9Dnm*$g)~H&`qd2N1$AJk6;8&k@o2{eI6K zkK_2?0)Id$#dti%WHR9p=JPq0%jL<=iweW=ReEF@B8nm@5TumCzV9Ol0*pqZ0}%81 zy!YH<8Xb?v7>z~Qs`8;I3KT{8ZK2b59dUj(de7T;0#>57ZOeaNqL*j$ifbu~(tBPh z5zuuV@9C?mLRpqln-=K08=7O@nEgAcTNY ziXaHi&Il(}61uL#wrvnX;CUV>rLQhI*?}lN3Wi}I2!fLgi{tnp^x473oOc`tp68)y z8mOuY%d)WB?G8Xm1@QUvXXv`l%U)LQG7xWFbg~}aG)*Xqa&&)?Bnjd;MwVp<4u7%r z2_gKtT-S9tjsr?5ilX3I;>(vWasgPDh1=U(Xqv_iv27c+ZNqh4KE#8Oec+MjIR`@s z`E3bX*EP=~d7h&zOSEl!aNxPF%Ok-cV;T1u(P$L#y|9Ok{s~`ERQi zfQN?%so&cjLT3Yb56%N;0!Vl-&I4xvczk@s zwZ^S$T4Gu;l_@E?u4s{=qn56-5<0FGYbr+V-T$3G-o%79i&YW4ZQZu0=FFZ6P zFgCw_sWyu)VOo_PqbC308dH0q>dV(_vD=0;!Sphd?Z<2t<%gCKoxV|(g^Gd)hq0ac z4^>?%CMg_6{jDb+%0x=Wkisl#_enrv{``O?wHq<9fOzhSPuK%Y7^P+4=b9m?4~#$? zEnjgR+QJYuK~QI*&rU$a;mvMPaB@WIZ4^F&{w(+0@S$R&Kryc&0chFNOix*wTW^0q zDp6I+W{h&|fc;jePaAuhi9r~{d@i?Nt9AeAzdV(o2Fhd(^ID(m>}+yFWNtx0<%{%^ z*_?3$p`&RZ`Pt;8ZK4X5ijInk+I!&!o!4MMMkBTBxU>BRJQ!3e)dQ)t51x}bS;oQw zeE*S-$t8>-A}J{;nIR%pmzS4Ex;N2*&Iz=amzRqPjB_8bVs$SV0Z>Kk@$CEYcT{(? z64H!T%Epe4)yNe*`Vxlb=_@Woy*~rE-q&L&v}@b;#PC-69@P6lnsCNLZcYg^m=iHXU1n? zb8yD(iz(puy{p`F^3+`CweX9Bh76H|VEd!Tk6Cb?bI`jADI@!8Pz~Wlve~;`K2^vO z?aaoP`*PhAOE~jZlxvUknj!)6z*B573k!SFas=K|wD#9Q38^E%E=s)^)BrT@{zVDi zT-b23qOGgs$|n#Mqy*7M$QQV%wu?xZByA5?fk?AJLA_rotHLovEuWiWXh}r#2KZ-fcc`^&MhZ_jc)oi40TQ(nJaiiT-z%fky|Iuqvi` z*{TKPDs^)lEcdg6zOGkYV4+wa zq`0qn00URCCrk{chm4C6RV9D=Lv;0Z=HyoTRL5y5-dpX$18C8WM8S1V0M4S<=Q}FV7QSz|fmjWnlp2*>OW1n0 zlzgO?04pT5qHfff!=lp9P)1)if@y3EJ_BGcEl)S3x7B*AkLPZwuKrg66fc zxsTO|90jYEAR2NqDn5gaCGJc=#XeWL3OaHkUbDwr!6f$OW)6QRCQ*Zcm-v<&e0z__hOo>0*G<(m_M++AZQH*r`CzCh+Yx3eLj; zQ^A|xnC}vc#mrv%M7mk@aH9cK9qv^8o)`tr%GI}QPmVr34Popvh0<@-W{%3g^ zF_UhDOVHl|PKi*%g!Q_{I-LjKyNdQ6sA>raO#iafx}~utKi;4xVl`D~4eTq7$y?EQ zoClyZ#_SqamwMF$~5CEp8+^RX^|oALCHn`0bS0ArvLx| diff --git a/addons/material_maker/library/base/simple_sdf_operators_sdsmoothboolean.png b/addons/material_maker/library/base/simple_sdf_operators_sdsmoothboolean.png index 45e2a999fb28474b4fd7decd7bf71e8d9d4abbd7..f559db0c4c6f4c1cdeffe5023c4d9f9cc0246fda 100644 GIT binary patch delta 3387 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 R$7=up002ovPDHLkV1m8cg3tf} delta 1050 zcmV+#1m*j^8m%V-T!|C&O`_%))Mb~pS9Lb`>nOqdq1_ZrIb$Xwr!_Ywte4Et!z2x(>}J* zXF2CoJo2+b@Ft{je@1|P-&1StKpe&Fy{DY>sXv7F8KN+`SARG`NNX;b6+l|)N22HT z7kzdRV1)dL0GboDR2UUNqK_>)K#P1t)^xx#af09y2;if=(` z3m+#Xr3j8h+JF1aXexLDAo=JV!Xr9@qSisR4c7R9RD~wSc!08V~h=@NU#K8epK3l}S`Q9sxJR4Yp z=jxx5?iOns6+%8c%>of|>%=EYg<5MEJ-l{^D!xUW$$xqdsI}@T;1xehl<4=fsI?x5 zGvQim7Z)nE!>0fkr%Bq#R}W-l|{$k_1J7|jj%cVY6lMvtGl;ls!)0>^J{EJD%V$dFcBmy4-zHE`;p6Eq?AeSZkx z5toiXwFclXU;$7BONfF|)t0Ao$KN0TyMMq-hr%x+X&rL(ze#||2?bv~vKAO%p_K1l z5i-T`G^o{s-xnu2@9{CStgOO9nbP$Iz$%Yv!0o{SS|@0KZ~6LFz+>0afYYI9i;K9E zZ^(avcEV!`U^)OJuPrsXGOW{i%LxT@AM@Ud{x=F>O^d1kQS`q}0PplT=bZilcN0D! UeF^Lsj{pDw07*qoM6N<$g2dSLQUCw| diff --git a/addons/material_maker/library/base/simple_sdf_shapes_sdbox.png b/addons/material_maker/library/base/simple_sdf_shapes_sdbox.png index 3e65d3da679b508d350e258ed8a69dbc5fb3f0e3..94416613644187cd51772e9e07d21368d2514327 100644 GIT binary patch delta 1192 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 delta 1281 zcmV+c1^)V-7L*E*BYyJtWjJE2>pC1|wAP06)|xwBuNOVa=oWa7 z03<`eMkL%JptZK_`+hlZt(|iq=*pZS0Ur2B1=h$Cpof5G*?-45GzqWQYnW4?cLW%z z!6L&`!8-^*C0N@)d$bM^@QI}Gt11bDz%=GiA^aXRo_$+f@Oc3aXtU+YK@cW$r)Y z_|`n#0>JuxwKGKBAVWZ=?OC9`jlp#!#u#-De7x^DyS?Nvu|y9ysV4V@!CSd z&;~s+X8a)A3A_$~*~hl$5x_Dp{xWy~0%*Rsd+t_{W`BI6IA0&kJvWgc&zt@CqFp-TWu!2)j)p?80u4w>J( z3&q5-E&0ChOY?r{DZ?7y3U3Y87Tm+v*xeet5F_H-kp*sn*TW^iBgWd@eKRr=&y1!o zI7`A)aR;kXOg`fZra|9xyw>({Xn_Wdi=S_)oyo z3wS!p1mG>`({Xn_jlGOu_8OdH3TrLZ zQZ9P{PAKP3fVb9B#u5R=N!T}f-wvEVTCYoh^-EdcPmtiPff2#*wG8-(1o;B<8>Jxg z%YU36_zVf%lDs@QWgjPr&Sso-93+7KJbzMwjIM!OGH2i9L<&H26$13bO7^!XQ$~QL zge)0n30U%H4xa_iURuaCBLXZJkCfn*gf}h(utR%YpfPrQXZaF@dfRK=Vyv`JqQ33OVh>WufSbq+W zrQl^uli+2)N&wr$ShCKxL;e3Xo zT!Z)8A}fW+94{phg$9h@MfpnwQCJF@I!@1G?gqkINkl8e;}*NyrD$)Hbb(nly|t zRbm`JgUg4tXL{$%xmw@mp0i=YJ!`N1_1}B1bM857O<{WQAAb|md|ZzU@lBk7<0VhQ z*Dw_y;5BT)qjuO~oxX%)IN$$(ZmH<( zmSBHa@;7SQ*?)->aUKTbV!T|@*@e?E6K9rw4|J6W_F)>nJtisnl3-gf66_Ct6AZ+7 zow~d**ccoM4hL&`=q(BM25$r_d+00;wg)?dTYKm%3pNMO1lRS@xhYs1tPbYYlur$Q z9vuuOnM?3sp}P%t;Bg%BWyo6zCcgK6#8$}``c7GafK$s=-yY{p)Eg0pdH zS;@Z`zkeJ4rB8Okzaw+i+Rq988GID1t0@;O4)&BCu_-vUA9uph$Xi%daebNCx*iRU z=8J+|eGI`!aBoFnR^*v~wa3ag34)`gt$ z5695ZP%yJ05WExlDBCT(r%d9JihNoO4Gl#^G=B-gvEb&4a8aaf*jiIzX44>y1gk2- zQz9R7-i^G~H5$U(!Sgj0RzyAn>?xCJEQIaBTQSiN2%av3-_>LYD}(o={$c3UGUz5l za7M5@@@2;I7DAvX9gh4*Sa%ef3}NhIP2^MIi)9dPfiUjkvC?U)AXEjdgHTtYRS>HG z1bOfj9s)9!nli8LZ}K_2cd58O@?qZDt?U1dJMja5Ee$h`ac|9Z-h2SyC5u& z{0Ou=@}rPvqJ0oHMt%-l8S(>RlOa4^Q-8iN@`Lc$8=R z3=a?2ls{DJR_(wwkuHMiEZ6`D(|X7^L^^%mQjsr-d@8gynggMl2O`~l4@J8Fc7K=M z8^s8&j^;vGS9I6clx+--Mu{3bQ~J@LCjIKW)63HTen9%;pD6wFyVDNo$3N=RKSlca zcc(2f9^gV5A8<^@3v{PVGOl1=(K#sN4o1_5GG5{PGD@viI|EpapUIHEUzN7H%Wubs z4hIIak$!_P6Fo%~$fh0k!GuCTd&g8*Ccd;GoB9}V!lAHOwz+rvrnXq<R{@OrpdY!=E^hQk@1ONCC!y9e--{AkAFb+(_zVA z#?nr92s3a2E|X{dV;Q6PMQK19yt~R6ca`5mV;UV64Q3$mWQXuad{o9WTU!44GUV@c z3FxfS#pU`fHa|Sbtx*s6ykkn01E&B07*qoM6N<$g4WljApigX delta 700 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 Vu&-^**x3-@_`5AWQ2?){y6&i5?$+#kSL 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 al>Y)Y2>p=D`Aa3sX literal 0 HcmV?d00001 From d80e3caeb99a6f48c8ab01b89fee1f3f47ed839f Mon Sep 17 00:00:00 2001 From: RodZill4 Date: Sat, 21 Dec 2019 21:49:16 +0100 Subject: [PATCH 08/15] Added 2d arc node (also useful to create torus arcs) --- addons/material_maker/nodes/sdarc.mmg | 70 +++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 addons/material_maker/nodes/sdarc.mmg diff --git a/addons/material_maker/nodes/sdarc.mmg b/addons/material_maker/nodes/sdarc.mmg new file mode 100644 index 0000000..6bb49ba --- /dev/null +++ b/addons/material_maker/nodes/sdarc.mmg @@ -0,0 +1,70 @@ +{ + "name": "sdarc", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "a1": 0, + "a2": 0, + "cx": 0, + "cy": 0, + "r": 0.4, + "r1": 0.3, + "r2": 0.1 + }, + "shader_model": { + "code": "", + "global": "float sdArc(vec2 p, vec2 sca, vec2 scb, float ra, float rb) {\n p *= mat2(vec2(sca.x,sca.y),vec2(-sca.y,sca.x));\n p.x = abs(p.x);\n float k = (scb.y*p.x>scb.x*p.y) ? dot(p.xy,scb) : length(p.xy);\n return sqrt( dot(p,p) + ra*ra - 2.0*ra*k ) - rb;\n}", + "inputs": [ + + ], + "instance": "", + "name": "sdArc", + "outputs": [ + { + "sdf2d": "sdArc($uv-vec2(0.5), vec2(cos($a1*0.01745329251), sin($a1*0.01745329251)), vec2(cos($a2*0.01745329251), sin($a2*0.01745329251)), $r1, $r2)", + "type": "sdf2d" + } + ], + "parameters": [ + { + "default": 0, + "label": "Angle 1", + "max": 180, + "min": -180, + "name": "a1", + "step": 1, + "type": "float" + }, + { + "default": 0, + "label": "Angle 2", + "max": 180, + "min": -180, + "name": "a2", + "step": 1, + "type": "float" + }, + { + "default": 0.5, + "label": "Radius 1", + "max": 1, + "min": 0, + "name": "r1", + "step": 0.01, + "type": "float" + }, + { + "default": 0.1, + "label": "Radius 2", + "max": 1, + "min": 0, + "name": "r2", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file From f0a22b593f68595e13344cf67fdc73480da6102d Mon Sep 17 00:00:00 2001 From: Rodolphe Suescun Date: Sun, 22 Dec 2019 23:25:25 +0100 Subject: [PATCH 09/15] Added new example with 3D SDF --- .../examples/pile_of_bricks.ptex | 625 ++++++++++++++++++ 1 file changed, 625 insertions(+) create mode 100644 addons/material_maker/examples/pile_of_bricks.ptex diff --git a/addons/material_maker/examples/pile_of_bricks.ptex b/addons/material_maker/examples/pile_of_bricks.ptex new file mode 100644 index 0000000..d28e5eb --- /dev/null +++ b/addons/material_maker/examples/pile_of_bricks.ptex @@ -0,0 +1,625 @@ +{ + "connections": [ + { + "from": "uniform", + "from_port": 0, + "to": "Material", + "to_port": 0 + }, + { + "from": "graph", + "from_port": 0, + "to": "sdf3d_scale_2", + "to_port": 0 + }, + { + "from": "sdf3d_scale_2", + "from_port": 0, + "to": "sdf3d_repeat", + "to_port": 0 + }, + { + "from": "sdf3d_repeat", + "from_port": 0, + "to": "sdf3d_boolean_3", + "to_port": 0 + }, + { + "from": "sdf3d_scale_2", + "from_port": 0, + "to": "sdf3d_repeat_2", + "to_port": 0 + }, + { + "from": "sdf3d_repeat_2", + "from_port": 0, + "to": "sdf3d_translate_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_3_2", + "from_port": 0, + "to": "sdf3d_boolean_3", + "to_port": 1 + }, + { + "from": "sdf3d_repeat_3", + "from_port": 0, + "to": "sdf3d_boolean_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_repeat_2_2", + "from_port": 0, + "to": "sdf3d_translate_3_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_3_2_2", + "from_port": 0, + "to": "sdf3d_boolean_3_2", + "to_port": 1 + }, + { + "from": "sdf3d_scale_2", + "from_port": 0, + "to": "sdf3d_repeat_3", + "to_port": 0 + }, + { + "from": "sdf3d_scale_2", + "from_port": 0, + "to": "sdf3d_repeat_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_boolean_3_2", + "from_port": 0, + "to": "sdf3d_boolean_3_3", + "to_port": 1 + }, + { + "from": "sdf3d_boolean_3_3", + "from_port": 0, + "to": "sdf3d_translate_3_2_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_boolean_3", + "from_port": 0, + "to": "sdf3d_translate_3_2_3", + "to_port": 0 + }, + { + "from": "sdf3d_translate_3_2_3", + "from_port": 0, + "to": "sdf3d_boolean_3_3", + "to_port": 0 + }, + { + "from": "sdf3d_translate_3_2_2_2", + "from_port": 0, + "to": "raymarching", + "to_port": 0 + }, + { + "from": "raymarching", + "from_port": 1, + "to": "Material", + "to_port": 4 + }, + { + "from": "occlusion", + "from_port": 0, + "to": "Material", + "to_port": 5 + }, + { + "from": "raymarching", + "from_port": 0, + "to": "occlusion", + "to_port": 0 + }, + { + "from": "raymarching", + "from_port": 0, + "to": "colorize", + "to_port": 0 + }, + { + "from": "colorize", + "from_port": 0, + "to": "Material", + "to_port": 6 + } + ], + "label": "Graph", + "name": "49", + "node_position": { + "x": 0, + "y": 0 + }, + "nodes": [ + { + "name": "Material", + "node_position": { + "x": 701, + "y": 78 + }, + "parameters": { + "albedo_color": { + "a": 1, + "b": 1, + "g": 1, + "r": 1, + "type": "Color" + }, + "ao_light_affect": 1, + "depth_scale": 0.5, + "emission_energy": 1, + "metallic": 1, + "normal_scale": 1, + "roughness": 1, + "size": 11, + "subsurf_scatter_strength": 0 + }, + "type": "material" + }, + { + "name": "uniform", + "node_position": { + "x": 467.5, + "y": 84 + }, + "parameters": { + "color": { + "a": 1, + "b": 0.180392, + "g": 0.372549, + "r": 0.768627, + "type": "Color" + } + }, + "type": "uniform" + }, + { + "name": "sdf3d_repeat", + "node_position": { + "x": -224.214783, + "y": -156 + }, + "parameters": { + "a": 0, + "r": 0.3, + "rx": 6, + "ry": 6, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_repeat" + }, + { + "name": "sdf3d_scale_2", + "node_position": { + "x": -422.214783, + "y": 72 + }, + "parameters": { + "a": 0, + "s": 0.25, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_scale" + }, + { + "name": "sdf3d_boolean_3", + "node_position": { + "x": -16.214783, + "y": -56 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "connections": [ + { + "from": "sdf3d_box", + "from_port": 0, + "to": "sdf3d_boolean", + "to_port": 1 + }, + { + "from": "sdf3d_box_2", + "from_port": 0, + "to": "sdf3d_translate_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_3_2", + "from_port": 0, + "to": "sdf3d_boolean", + "to_port": 0 + }, + { + "from": "sdf3d_translate_3_2_2", + "from_port": 0, + "to": "sdf3d_boolean_2", + "to_port": 0 + }, + { + "from": "sdf3d_boolean", + "from_port": 0, + "to": "sdf3d_boolean_2", + "to_port": 1 + }, + { + "from": "sdf3d_box_2", + "from_port": 0, + "to": "sdf3d_translate_3_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_boolean_2", + "from_port": 0, + "to": "gen_outputs", + "to_port": 0 + } + ], + "label": "Brick", + "name": "graph", + "node_position": { + "x": -427.111115, + "y": 2.638885 + }, + "nodes": [ + { + "name": "sdf3d_box", + "node_position": { + "x": -564.5, + "y": -63 + }, + "parameters": { + "r": 0.01, + "sx": 0.26, + "sy": 0.15, + "sz": 0.1 + }, + "type": "sdf3d_box" + }, + { + "name": "sdf3d_translate_3_2", + "node_position": { + "x": -554.5, + "y": -166 + }, + "parameters": { + "x": 0, + "y": 0, + "z": 0.45 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_box_2", + "node_position": { + "x": -570.5, + "y": -294.5 + }, + "parameters": { + "r": 0, + "sx": 0.21, + "sy": 0.1, + "sz": 0.36 + }, + "type": "sdf3d_box" + }, + { + "name": "sdf3d_boolean", + "node_position": { + "x": -358.5, + "y": -118 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "sdf3d_translate_3_2_2", + "node_position": { + "x": -343.333344, + "y": -224.333344 + }, + "parameters": { + "x": 0, + "y": 0, + "z": -0.45 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_boolean_2", + "node_position": { + "x": -147.333344, + "y": -168.333344 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "gen_inputs", + "node_position": { + "x": -748.5, + "y": -159.361115 + }, + "parameters": { + + }, + "ports": [ + + ], + "type": "ios" + }, + { + "name": "gen_outputs", + "node_position": { + "x": 60.666656, + "y": -165.361115 + }, + "parameters": { + + }, + "ports": [ + { + "name": "port0", + "type": "sdf3d" + } + ], + "type": "ios" + }, + { + "name": "gen_parameters", + "node_position": { + "x": -488.111115, + "y": -466.5 + }, + "parameters": { + + }, + "type": "remote", + "widgets": [ + + ] + } + ], + "parameters": { + + }, + "type": "graph" + }, + { + "name": "sdf3d_repeat_2", + "node_position": { + "x": -225.542572, + "y": -52.060181 + }, + "parameters": { + "a": 0, + "r": 0.3, + "rx": 6, + "ry": 6, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_repeat" + }, + { + "name": "sdf3d_translate_3_2", + "node_position": { + "x": -224.542572, + "y": 49.939819 + }, + "parameters": { + "x": 0.09, + "y": 0.09, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_repeat_2_2", + "node_position": { + "x": -220.331467, + "y": 259.034729 + }, + "parameters": { + "a": 0, + "r": 0.3, + "rx": 6, + "ry": 6, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_repeat" + }, + { + "name": "sdf3d_repeat_3", + "node_position": { + "x": -219.003677, + "y": 155.09491 + }, + "parameters": { + "a": 0, + "r": 0.3, + "rx": 6, + "ry": 6, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_repeat" + }, + { + "name": "sdf3d_translate_3_2_2", + "node_position": { + "x": -219.331467, + "y": 361.034729 + }, + "parameters": { + "x": 0.09, + "y": 0.09, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_boolean_3_2", + "node_position": { + "x": -19.003677, + "y": 251.09491 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "sdf3d_boolean_3_3", + "node_position": { + "x": 183.957428, + "y": 120.689819 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "sdf3d_translate_3_2_2_2", + "node_position": { + "x": 179.457428, + "y": 193.189819 + }, + "parameters": { + "x": 0, + "y": 0, + "z": 0.3 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_translate_3_2_3", + "node_position": { + "x": -19.542572, + "y": 10.189819 + }, + "parameters": { + "x": 0.04, + "y": 0.04, + "z": 0.15 + }, + "type": "sdf3d_translate" + }, + { + "name": "raymarching", + "node_position": { + "x": 187.457397, + "y": 303.189819 + }, + "parameters": { + + }, + "type": "raymarching" + }, + { + "name": "occlusion", + "node_position": { + "x": 410.234558, + "y": 303.189819 + }, + "parameters": { + "param0": 9, + "param1": 50, + "param2": 5.2 + }, + "type": "occlusion" + }, + { + "name": "colorize", + "node_position": { + "x": 430.387573, + "y": 218.189819 + }, + "parameters": { + "gradient": { + "interpolation": 1, + "points": [ + { + "a": 1, + "b": 1, + "g": 1, + "pos": 0, + "r": 1 + }, + { + "a": 1, + "b": 0, + "g": 0, + "pos": 0.563636, + "r": 0 + } + ], + "type": "Gradient" + } + }, + "type": "colorize" + } + ], + "parameters": { + + }, + "type": "graph" +} \ No newline at end of file From 97e923e781e068b5961c0c7fd732307001ec6e73 Mon Sep 17 00:00:00 2001 From: Rodolphe Suescun Date: Sun, 22 Dec 2019 23:27:02 +0100 Subject: [PATCH 10/15] Added types to ios nodes --- addons/material_maker/engine/gen_base.gd | 12 +++++++----- addons/material_maker/engine/gen_graph.gd | 7 ++++--- addons/material_maker/engine/gen_ios.gd | 7 ++++++- addons/material_maker/nodes/generic.gd | 24 ++++++++++------------- addons/material_maker/nodes/ios.gd | 2 ++ addons/material_maker/nodes/ios/port.gd | 6 ++++++ addons/material_maker/nodes/ios/port.tscn | 11 +++++++++++ 7 files changed, 46 insertions(+), 23 deletions(-) diff --git a/addons/material_maker/engine/gen_base.gd b/addons/material_maker/engine/gen_base.gd index 8f053f8..1905451 100644 --- a/addons/material_maker/engine/gen_base.gd +++ b/addons/material_maker/engine/gen_base.gd @@ -37,12 +37,14 @@ var parameters = {} var seed_locked : bool = false var seed_value : int = 0 +const PORT_TYPE_NAMES : Array = [ "f", "rgb", "rgba", "sdf2d", "sdf3d" ] + const PORT_TYPES : Dictionary = { - rgba = { type="vec4", paramdefs="vec2 uv", params="uv" }, - rgb = { type="vec3", paramdefs="vec2 uv", params="uv" }, - f = { type="float", paramdefs="vec2 uv", params="uv" }, - sdf2d = { type="float", paramdefs="vec2 uv", params="uv" }, - sdf3d = { type="float", paramdefs="vec3 p", params="p" } + f = { type="float", paramdefs="vec2 uv", params="uv", slot_type=0, color=Color(0.5, 0.5, 0.5) }, + rgb = { type="vec3", paramdefs="vec2 uv", params="uv", slot_type=0, color=Color(0.5, 0.5, 1.0) }, + rgba = { type="vec4", paramdefs="vec2 uv", params="uv", slot_type=0, color=Color(0.0, 0.5, 0.0, 0.5) }, + sdf2d = { type="float", paramdefs="vec2 uv", params="uv", slot_type=1, color=Color(1.0, 0.5, 0.0) }, + sdf3d = { type="float", paramdefs="vec3 p", params="p", slot_type=2, color=Color(1.0, 0.0, 0.0) } } func _ready() -> void: diff --git a/addons/material_maker/engine/gen_graph.gd b/addons/material_maker/engine/gen_graph.gd index e0be616..078d8eb 100644 --- a/addons/material_maker/engine/gen_graph.gd +++ b/addons/material_maker/engine/gen_graph.gd @@ -284,8 +284,8 @@ func create_subgraph(gens : Array) -> MMGenGraph: if port_index == -1: port_index = outputs.size() outputs.push_back(src_name) - gen_outputs.ports.push_back( { name="port"+str(port_index), type="rgba" } ) - print(gen_outputs.ports) + var type = new_graph.get_node(c.from).get_output_defs()[c.from_port].type + gen_outputs.ports.push_back( { name="port"+str(port_index), type=type } ) my_new_connections.push_back( { from=new_graph.name, from_port=port_index, to=c.to, to_port=c.to_port } ) new_graph_connections.push_back( { from=c.from, from_port=c.from_port, to="gen_outputs", to_port=port_index } ) elif names.find(c.to) != -1: @@ -293,7 +293,8 @@ func create_subgraph(gens : Array) -> MMGenGraph: if port_index == -1: port_index = inputs.size() inputs.push_back(src_name) - gen_inputs.ports.push_back( { name="port"+str(port_index), type="rgba" } ) + var type = get_node(c.from).get_output_defs()[c.from_port].type + gen_inputs.ports.push_back( { name="port"+str(port_index), type=type } ) my_new_connections.push_back( { from=c.from, from_port=c.from_port, to=new_graph.name, to_port=port_index } ) new_graph_connections.push_back( { from="gen_inputs", from_port=port_index, to=c.to, to_port=c.to_port } ) else: diff --git a/addons/material_maker/engine/gen_ios.gd b/addons/material_maker/engine/gen_ios.gd index 4222bff..d7d30fe 100644 --- a/addons/material_maker/engine/gen_ios.gd +++ b/addons/material_maker/engine/gen_ios.gd @@ -27,7 +27,7 @@ func get_type_name() -> String: func get_io_defs() -> Array: var rv : Array = [] for p in ports: - rv.push_back({ name=p.name, type="rgba" }) + rv.push_back({ name=p.name, type=p.type }) return rv func get_input_defs() -> Array: @@ -54,6 +54,11 @@ func add_port() -> void: func set_port_name(i : int, n : String) -> void: ports[i].name = n +func set_port_type(i : int, t : String) -> void: + print(t) + ports[i].type = t + emit_signal("parameter_changed", "__update_all__", null) + func delete_port(i : int) -> void: ports.remove(i) var input_gen = get_parent() if name == "gen_inputs" else self diff --git a/addons/material_maker/nodes/generic.gd b/addons/material_maker/nodes/generic.gd index a358276..5e956a9 100644 --- a/addons/material_maker/nodes/generic.gd +++ b/addons/material_maker/nodes/generic.gd @@ -174,14 +174,12 @@ func update_node() -> void: var input = inputs[i] var enable_left = false var color_left = Color(0.5, 0.5, 0.5) + var type_left = 0 if typeof(input) == TYPE_DICTIONARY: enable_left = true - match input.type: - "rgb": color_left = Color(0.5, 0.5, 1.0) - "rgba": color_left = Color(0.0, 0.5, 0.0, 0.5) - "sdf2d": color_left = Color(1.0, 0.5, 0.0, 1.0) - "sdf3d": color_left = Color(1.0, 0.0, 0.0, 1.0) - set_slot(i, enable_left, 0, color_left, false, 0, Color()) + color_left = MMGenBase.PORT_TYPES[input.type].color + type_left = MMGenBase.PORT_TYPES[input.type].slot_type + set_slot(i, enable_left, type_left, color_left, false, 0, Color()) var hsizer : HBoxContainer = HBoxContainer.new() hsizer.size_flags_horizontal = SIZE_EXPAND | SIZE_FILL if input.has("label") and input.label != "": @@ -247,17 +245,15 @@ func update_node() -> void: output_count = outputs.size() for i in range(output_count): var output = outputs[i] - var enable_right = true - var color_right = Color(0.5, 0.5, 0.5) + var enable_right : bool = true + var color_right : Color = Color(0.5, 0.5, 0.5) + var type_right : int = 0 assert(typeof(output) == TYPE_DICTIONARY) assert(output.has("type")) enable_right = true - match output.type: - "rgb": color_right = Color(0.5, 0.5, 1.0) - "rgba": color_right = Color(0.0, 0.5, 0.0, 0.5) - "sdf2d": color_right = Color(1.0, 0.5, 0.0, 1.0) - "sdf3d": color_right = Color(1.0, 0.0, 0.0, 1.0) - set_slot(i, is_slot_enabled_left(i), get_slot_type_left(i), get_slot_color_left(i), enable_right, 0, color_right) + color_right = MMGenBase.PORT_TYPES[output.type].color + type_right = MMGenBase.PORT_TYPES[output.type].slot_type + set_slot(i, is_slot_enabled_left(i), get_slot_type_left(i), get_slot_color_left(i), enable_right, type_right, color_right) var hsizer : HBoxContainer while i >= get_child_count(): hsizer = HBoxContainer.new() diff --git a/addons/material_maker/nodes/ios.gd b/addons/material_maker/nodes/ios.gd index 99ee5cb..fd86ad7 100644 --- a/addons/material_maker/nodes/ios.gd +++ b/addons/material_maker/nodes/ios.gd @@ -22,12 +22,14 @@ func update_node() -> void: title = generator.get_type_name() var color = Color(0.0, 0.5, 0.0, 0.5) for p in generator.get_io_defs(): + color = MMGenBase.PORT_TYPES[p.type].color set_slot(get_child_count(), generator.name != "gen_inputs", 0, color, generator.name != "gen_outputs", 0, color) var port : Control if generator.is_editable(): port = preload("res://addons/material_maker/nodes/ios/port.tscn").instance() if p.has("name"): port.set_label(p.name) + port.set_type(p.type) else: port = Label.new() port.text = p.name diff --git a/addons/material_maker/nodes/ios/port.gd b/addons/material_maker/nodes/ios/port.gd index 8f2d297..54f8e6a 100644 --- a/addons/material_maker/nodes/ios/port.gd +++ b/addons/material_maker/nodes/ios/port.gd @@ -3,6 +3,9 @@ extends HBoxContainer func set_label(l : String) -> void: $Name.set_text(l) +func set_type(t : String) -> void: + $Type.selected = MMGenBase.PORT_TYPE_NAMES.find(t) + func update_up_down_button() -> void: var parent = get_parent() if parent == null: @@ -13,6 +16,9 @@ func update_up_down_button() -> void: func _on_Name_label_changed(new_label) -> void: get_parent().generator.set_port_name(get_index(), new_label) +func _on_Type_item_selected(ID) -> void: + get_parent().generator.set_port_type(get_index(), MMGenBase.PORT_TYPE_NAMES[ID]) + func _on_Delete_pressed() -> void: get_parent().generator.delete_port(get_index()) diff --git a/addons/material_maker/nodes/ios/port.tscn b/addons/material_maker/nodes/ios/port.tscn index 79529cf..62545f1 100644 --- a/addons/material_maker/nodes/ios/port.tscn +++ b/addons/material_maker/nodes/ios/port.tscn @@ -48,7 +48,18 @@ margin_left = 84.0 margin_right = 114.0 margin_bottom = 20.0 rect_min_size = Vector2( 30, 0 ) + +[node name="Type" type="OptionButton" parent="."] +margin_left = 118.0 +margin_right = 222.0 +margin_bottom = 20.0 +rect_min_size = Vector2( 102, 0 ) +hint_tooltip = "Input flag" +text = "Greyscale" +items = [ "Greyscale", null, false, 0, null, "Color", null, false, 1, null, "RGBA", null, false, 2, null, "SDF2D", null, false, 3, null, "SDF3D", null, false, 4, null ] +selected = 0 [connection signal="pressed" from="Delete" to="." method="_on_Delete_pressed"] [connection signal="pressed" from="Up" to="." method="_on_Up_pressed"] [connection signal="pressed" from="Down" to="." method="_on_Down_pressed"] [connection signal="label_changed" from="Name" to="." method="_on_Name_label_changed"] +[connection signal="item_selected" from="Type" to="." method="_on_Type_item_selected"] From be432c7223db97f7ab9a4736813e219e789ff67c Mon Sep 17 00:00:00 2001 From: Rodolphe Suescun Date: Tue, 24 Dec 2019 15:42:09 +0100 Subject: [PATCH 11/15] Added documentation for all 3D signed distance functions nodes. --- addons/material_maker/doc/base_library.rst | 1 + .../doc/images/node_sdf3d_boolean.png | Bin 0 -> 3923 bytes .../doc/images/node_sdf3d_boolean_sample.png | Bin 0 -> 9626 bytes .../doc/images/node_sdf3d_box.png | Bin 0 -> 4875 bytes .../doc/images/node_sdf3d_box_sample.png | Bin 0 -> 4299 bytes .../doc/images/node_sdf3d_capsule.png | Bin 0 -> 4196 bytes .../doc/images/node_sdf3d_capsule_sample.png | Bin 0 -> 10337 bytes .../doc/images/node_sdf3d_circlerepeat.png | Bin 0 -> 3101 bytes .../images/node_sdf3d_circlerepeat_sample.png | Bin 0 -> 6993 bytes .../doc/images/node_sdf3d_cone.png | Bin 0 -> 3222 bytes .../doc/images/node_sdf3d_cone_sample.png | Bin 0 -> 9933 bytes .../doc/images/node_sdf3d_cylinder.png | Bin 0 -> 4424 bytes .../doc/images/node_sdf3d_cylinder_sample.png | Bin 0 -> 7728 bytes .../doc/images/node_sdf3d_extrusion.png | Bin 0 -> 3144 bytes .../images/node_sdf3d_extrusion_sample.png | Bin 0 -> 4407 bytes .../doc/images/node_sdf3d_render.png | Bin 0 -> 2898 bytes .../doc/images/node_sdf3d_repeat.png | Bin 0 -> 3903 bytes .../doc/images/node_sdf3d_repeat_sample.png | Bin 0 -> 11410 bytes .../doc/images/node_sdf3d_revolution.png | Bin 0 -> 3289 bytes .../images/node_sdf3d_revolution_sample.png | Bin 0 -> 19567 bytes .../doc/images/node_sdf3d_rotate.png | Bin 0 -> 3609 bytes .../doc/images/node_sdf3d_roundedshape.png | Bin 0 -> 2970 bytes .../images/node_sdf3d_roundedshape_sample.png | Bin 0 -> 12869 bytes .../doc/images/node_sdf3d_samples.png | Bin 0 -> 16259 bytes .../doc/images/node_sdf3d_scale.png | Bin 0 -> 2489 bytes .../doc/images/node_sdf3d_smoothboolean.png | Bin 0 -> 5156 bytes .../node_sdf3d_smoothboolean_sample.png | Bin 0 -> 12747 bytes .../doc/images/node_sdf3d_sphere.png | Bin 0 -> 2653 bytes .../doc/images/node_sdf3d_sphere_sample.png | Bin 0 -> 19902 bytes .../doc/images/node_sdf3d_torus.png | Bin 0 -> 3249 bytes .../doc/images/node_sdf3d_torus_sample.png | Bin 0 -> 26989 bytes .../doc/images/node_sdf3d_translate.png | Bin 0 -> 3727 bytes addons/material_maker/doc/node_3d_sdf.rst | 69 + .../doc/node_3d_sdf_operators_boolean.rst | 31 + .../node_3d_sdf_operators_circlerepeat.rst | 30 + .../doc/node_3d_sdf_operators_extrusion.rst | 30 + .../doc/node_3d_sdf_operators_repeat.rst | 34 + .../doc/node_3d_sdf_operators_revolution.rst | 30 + .../doc/node_3d_sdf_operators_rounded.rst | 33 + .../node_3d_sdf_operators_smoothboolean.rst | 33 + .../material_maker/doc/node_3d_sdf_render.rst | 27 + .../doc/node_3d_sdf_shapes_box.rst | 31 + .../doc/node_3d_sdf_shapes_capsule.rst | 28 + .../doc/node_3d_sdf_shapes_cone.rst | 28 + .../doc/node_3d_sdf_shapes_cylinder.rst | 28 + .../doc/node_3d_sdf_shapes_sphere.rst | 28 + .../doc/node_3d_sdf_shapes_torus.rst | 28 + .../doc/node_3d_sdf_transforms_rotate.rst | 24 + .../doc/node_3d_sdf_transforms_scale.rst | 24 + .../doc/node_3d_sdf_transforms_translate.rst | 24 + addons/material_maker/doc/node_simple_sdf.rst | 6 +- addons/material_maker/doc/nodes_3d.rst | 10 + addons/material_maker/doc/subgraph_nodes.rst | 9 +- addons/material_maker/examples/doc_tools.ptex | 1899 ++++++++++++----- addons/material_maker/examples/skulls.ptex | 196 +- addons/material_maker/nodes/sdf3d_scale.mmg | 2 +- addons/material_maker/nodes/sdrotate.mmg | 4 +- 57 files changed, 2114 insertions(+), 573 deletions(-) create mode 100644 addons/material_maker/doc/images/node_sdf3d_boolean.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_boolean_sample.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_box.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_box_sample.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_capsule.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_capsule_sample.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_circlerepeat.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_circlerepeat_sample.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_cone.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_cone_sample.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_cylinder.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_cylinder_sample.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_extrusion.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_extrusion_sample.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_render.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_repeat.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_repeat_sample.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_revolution.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_revolution_sample.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_rotate.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_roundedshape.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_roundedshape_sample.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_samples.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_scale.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_smoothboolean.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_smoothboolean_sample.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_sphere.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_sphere_sample.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_torus.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_torus_sample.png create mode 100644 addons/material_maker/doc/images/node_sdf3d_translate.png create mode 100644 addons/material_maker/doc/node_3d_sdf.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_operators_boolean.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_operators_circlerepeat.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_operators_extrusion.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_operators_repeat.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_operators_revolution.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_operators_rounded.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_operators_smoothboolean.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_render.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_shapes_box.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_shapes_capsule.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_shapes_cone.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_shapes_cylinder.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_shapes_sphere.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_shapes_torus.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_transforms_rotate.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_transforms_scale.rst create mode 100644 addons/material_maker/doc/node_3d_sdf_transforms_translate.rst create mode 100644 addons/material_maker/doc/nodes_3d.rst diff --git a/addons/material_maker/doc/base_library.rst b/addons/material_maker/doc/base_library.rst index 7d2b956..fb8309e 100644 --- a/addons/material_maker/doc/base_library.rst +++ b/addons/material_maker/doc/base_library.rst @@ -8,6 +8,7 @@ to describe procedural materials. :maxdepth: 2 nodes_simple + nodes_3d nodes_pattern nodes_noise nodes_filter diff --git a/addons/material_maker/doc/images/node_sdf3d_boolean.png b/addons/material_maker/doc/images/node_sdf3d_boolean.png new file mode 100644 index 0000000000000000000000000000000000000000..5b8462e35adb2cac47c9771ee08c6578810f0c37 GIT binary patch literal 3923 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 C8k0f* literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_boolean_sample.png b/addons/material_maker/doc/images/node_sdf3d_boolean_sample.png new file mode 100644 index 0000000000000000000000000000000000000000..4d18d43b3a463f17abff3fcb2ff5c3d47472ae5e GIT binary patch literal 9626 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 literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_capsule.png b/addons/material_maker/doc/images/node_sdf3d_capsule.png new file mode 100644 index 0000000000000000000000000000000000000000..96a2fda85afb79dced90ac2d6408725a65b8e875 GIT binary patch literal 4196 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

hwb#Ss z>ahTlw0FCg_E-9YPnwBz6%(#m^i!^5kpoPi-|L$R$jy<}vQ6bLYJJmbD4ahrk3%;b zC9Cgq(}W?=z2Ny&nio}}+D64u1jjjISr9Q{#o3j_ub3(fSYLimM}LFm0m*x}OUZnT zpTFUf;L;cEXK6?yZxB>0fS3aSlzmnvT{B64UB>; z;mlYr_P|SC9KV-NoDSpciYrn~75FEcGQ9x5JpG``QiXBqfxu%)=JMT1gR5YA7V+Sr1|0E{m+yh!T8f2lcmE$ zVfmb|jFe^T$WS^g#YXIuBc^$jOblUXqbHhM-_rLIaMv>hg}4Y$iGV~ zQX0eou7$S+@w@SsHIGPOBdF0tLk(a2P8@R43Ry{G^Yz7Gi#{|eYw`2C;_4pljWkXz zw4F^o8bUDho{!|{xd@iCM~@YfuoJWM`Q6qXxSt5vQ|PfV<>5qBJ0pb+bmppdNT+Gw zC!VHw?m2{-*)Z5OacrjDE$M9@*{D8z1z$07Rc$vCwdQ`3E%SPZMi{6&$T=Mfy0A!w z{JIhXI|ncw17tm)@96_F8t+-htZW zP2Ds{gzOeuuELb(BnjwxD465B>E>{-ZUZ#P^_r?y+Jr$WCX7B!3NSr4=F`;}h=uzt zSBqxTZO!EwTx)z|%$>&W?{jsYjmOUB`rqH5>X+Y3?IoHaqK`sj>*{jq4ouLcmjC8T z`=BB8NL*2+xzS44+U%;Ek^U=`}Mvp{hSmk zSsqIUyj`A?mVD#BblYxh)#ae+uX(0zL)VK-9>E9I$wpCG&jkwenU|HG3&jent~MTp zQ6}NIH?S6t;{4DZdef}Ka_Hk$TaqtY%)n3V6lyuL+Jt3p@ctyy$O)IYCRA9WQj*zF zQIn{)>WwFu91JYR71q5eboC4No?nE|kleLn!8Xpsm(x95XMaaA19&fafrXPkaReHE z()!_BUik)tpy;k)1QCb9RgrzR0zgbQnz0>OZHGIGh>HM4C8hYKCFXw>jkPss|A$}+ zR#HLX^#jQ)(w%f7fi=17;%jihwq2=9lAKY7(0<+16XglL2;6TNht+d`Sof9htG!;U zkZ)mFyU#;-F?K zIdUC;3-Xe|0Bdp*RhX+5poJLQ3$S7d1Bp^$TI?`$;@1fZUTsNXJB0Xd`J!KXHkyeh zZlFS)ch^Myf=?HSQ~G4LAZfIWrWt5oHp(^dd=gR;=sTOuz|aywDpd?rxWAks?)CQL zC~Q8;#gU@VWBk(i=@%xzRp<{ND_y$UxdaJuC-3ROl1dfsI%I*cLKEtj2k{U-uJdW| zd~~bF6y2HbYa&e$W_D;VGWbuKr0Bkj1OPMqqUo;6gTUid_(zH(udq_XA61i-@q|=+ z=VC;_Vx!Q8{v>eIK?R&Vv;ozvul|TArp9aURv>1&GG+jjy>L#-4pH6fL|kT!!lN+^|${#N|S-1G&#ijci0FR$o)!K^i?5ZEAnc}OhL=zS z(ovG(h+}QIMU8yJSCc#8x5)W~1^7u!(aa*o*2vRSh!jOyY63l%;?#U+A~PGGvD$%= zrl3{|w*-Vl4?YVf=evJhSSak+ahbjHR**wn6~qiINEXz*Ta*N$Q?c=l1z@d?--EU zZZEUZu@va!WF3}LQ3#T=!Cy{N6|l7y+VB>TB6Sl-&HKM?Ux91?fBUVsz&|zqqc^;B z!96GGk(ct1Tj-e@gdAyAJWxpKN%(Y)*B6YYwN}3TU#}VpYVRSBJ=x#Rx0B6xk*^KK zrvL-A+RWC$KuZHa*yZO3{5nP;|HF$27iL2?K5>qsrbn`|722s~QlV$0<-Y&ZmwH6K z;K%s literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_circlerepeat.png b/addons/material_maker/doc/images/node_sdf3d_circlerepeat.png new file mode 100644 index 0000000000000000000000000000000000000000..4cb9004d9932cb079cc7210847ce15059f1b3537 GIT binary patch literal 3101 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 Jxq<7Q{{h&=O_u-w literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_cone.png b/addons/material_maker/doc/images/node_sdf3d_cone.png new file mode 100644 index 0000000000000000000000000000000000000000..da6f654ca016f768c6c2e7b6c7a23cd4ba7b1e19 GIT binary patch literal 3222 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¨CO zowKmV!8E-tNdS`Hv19k45$MCBeg+md*?=&41Fr<^M9}vuM79EZ@WdXJRMGvrcIO*o z{(r;S*FOgP7I{{7Za({Oojb_Vsq;DihOb;n8e~x#50M9N+f+^raE4g(fSN>miMjIr z3IBOa1PIgEUurz4;Sy0_?>*|@V`shh?Ee~DA@#s|{(tkWB=z1S|2@{x3;4IZmAzh* zG6BGF$%xBXfYrzM(Q{yU9fbR_APg-e54NcVumN>|)+iYg(Ho=xf+0(knG$7_9@`#Jy@ascSO|yqiWv>sZOOMyBon4pm#8mDuzT?<+WKfxS;Asg$5q% zgxlm#b!8Nm<5(rsFM#cw-W9caVl2?0nStU_0@LDU`PE0K0Qneu6pTxF-yLFMQTo!5 zkO*xdjLRsY0R?8u6x?AH_SLb-Y{CN}kbqX#9vuUUUfZ*SYey^XOC(cl;#pty9dz_- zU<2px;r!tk4{<7}0##f|2y><)eeC6LT(|p`1VLzC(-xGlr1#qjC^scgzC#>J_`~9T@Lip`7 z&=sXa$It)eF!9leH-UhP)8(sde?uGD?RrfU=p>x!{L3%A$T9wEuxDZo;{MAF(DalH zLEv0HaYbXF%q|hxvh2aW=(Hrxz>AoXUHBlRg{2t1U6o!EX zA!i%-I+N022{nuh=yA<+Drq<2qxLCBU&4}9zmJ|x0)!*@BqCMD8%%JQc?s`b#~Wg< tq#TT;$fG)WBm)+kkLtZ@pJ77oAr4&4yt-fszNQ9Ty`-m|uW9A~{{VOT!%+YL literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_cylinder.png b/addons/material_maker/doc/images/node_sdf3d_cylinder.png new file mode 100644 index 0000000000000000000000000000000000000000..584c7c9db18ea46acff7bc606887cfb7a75a7508 GIT binary patch literal 4424 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 literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_cylinder_sample.png b/addons/material_maker/doc/images/node_sdf3d_cylinder_sample.png new file mode 100644 index 0000000000000000000000000000000000000000..e6d2ce3e70dc88f741e808dd41053f17d5ba8b67 GIT binary patch literal 7728 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 bc_iv^YAO4YUyC9D`E^@MU$a`>HuC=gDw)#} literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_extrusion.png b/addons/material_maker/doc/images/node_sdf3d_extrusion.png new file mode 100644 index 0000000000000000000000000000000000000000..4284f5130b6ffe4a681c8fb58b951e419bc5691d GIT binary patch literal 3144 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 a;jIRK6RA0h=I*i32N@e&)34HVi2fJU{qKta literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_extrusion_sample.png b/addons/material_maker/doc/images/node_sdf3d_extrusion_sample.png new file mode 100644 index 0000000000000000000000000000000000000000..ec8009121d563d70ca148ddb500c0a6c437e8106 GIT binary patch literal 4407 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 literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_render.png b/addons/material_maker/doc/images/node_sdf3d_render.png new file mode 100644 index 0000000000000000000000000000000000000000..d439a29f2995efaf1af0fc57555d2a32a1adc8ee GIT binary patch literal 2898 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 literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_repeat.png b/addons/material_maker/doc/images/node_sdf3d_repeat.png new file mode 100644 index 0000000000000000000000000000000000000000..d18797933fc3696a207d49219e00b6f0b63af129 GIT binary patch literal 3903 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 W6frW^WsJARfQg}nL9L$Kz5fF?Gvf#V literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_revolution.png b/addons/material_maker/doc/images/node_sdf3d_revolution.png new file mode 100644 index 0000000000000000000000000000000000000000..2102b51ee996b66b4f626133df910828143328b8 GIT binary patch literal 3289 zcmV;~3?}o5P)BROt00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D01|XXSaefwW^{L9 za%BKVa%E+1b7*gLUR4MM000b7Nkl*t&YY-GK)F_ukkXtauJ0c>B ziYIuYC`R!@BZh#AL=Xfdpr9Z~G+qQjM2=y&hnqnK#Um<6-1m0#PyUX{=GgZV_S;iK zPg66D9UK_oO}~%4U;V1Ox~o1@-95-_frW*QmH~lQ)qp{(YQP{@Woc<^Wo2(`>o~*V zV<*QsGo7?(224H_Km>F^3M)vi3Kb6aGw08Bc3ZMy+0s?+t}Fk!#6u}=E?|Y0cYvN! z7EC)P9||A>Iv|A=Bv)l)<2Y}Q^BRx!?QIW#_|G#f8UzX;0y-dt6(mJq8hvl=s7jv3YDY?I1reAIg7;AMG~mGl6-@$ z?R!pzM7{Ukd*)^zitdzi^P=o>BvFM1+&n$K<;|FO00oRHm$#{^E50w?;Q`rA1(?nF zsKko=n#ⅈZ)pQ+^Gid0y`bZ# z3izoix{uoxL)lxv;S>V?DjDf-EwJSZv!n(rjG94YAuPF4TI!tF6hEZ2~f6Mx9BlSmu?OS%T$3^EC&wi~KBR~;>z3mJHqYcIwjyE(jnMyUQ zD^ciH3fg=XaSn4geE4wd>9*HXGuSF#NIO>nM#_rG&n)H^A&+XToYDtSz)Mvvqly=nLyTUXB*=wCb$gX1HN$Hq8WCM zB;RwSXTqg0s}$E59LQ*jv8jm}0!G`dVyc-8sy8W6z)MxN=w5B{eLmnM@ChxsTa}vd z%~Vr!->thy-p0xrKPw+H?- z$Sj2(91Gi&$wqk@#Z&_o;D|M%d;C-t-m5L*1vwS6eYW>=d=?0}=E$agzQ7pRv zPBtdOOpHwL-V{>JQ~(9MR8aE+?%4*_$&CRGV?3VBVNB| zlPI(N&b0z+7e3u0V7uxGor7Y@OD{4v<%m&CUY8|ly7mkO{8Z)DSLTC;ZXmS`IDFix z1QH($2*pK4c&n5Y1O1OqFq}AK$dK{l4E=X~Mv@@t&~YSB21T$Lab6uRhENN9Hu_fN z)sZ|pPmH-p;vt!-PTRF2-vRF zLTF$(7Wz~Zb9mzBQA83|Xu!>PLjx4>QY9v;WWrQ{!PAI)MqUqqj6MYJ`EepJ{LT#_ zl>|tlib^U0(~iUC@>5lDx2__$wjvil`GfX-0CmuQ4Cb(h)PnN6wY*f7=hSM^IJ{Jq z<<$0T?hI-=hsjIT;`y$oMpLzD5GdfK%G=X-$wGH68UzY>sam&U<7}t-S~Lh0^p+}X z3p-Qe52u=1n44J+VlY4q6N9COuXcJ-m5H(WG;?b!OM5Fzhe3@!hKa#a!&f`KsLIS_ z8irwO<78(ua}a|8Vwe~#HGH+xi>h#Oz=w_+*q{W%#9*o6s~xQ>HK0{BU>Jm|>}@|f z8=vsv#f$HreHR%K&8=ctw`N0jcFxO}FVQAFJ>!!FOGy4`aLB(o+qSK~>@FIoU#QyZ zY+bl>T-y=dX9slhd<^!vT2uS0Kv7k|;V&LPezInj7koT@`fQKi0d6hf`n8*9V&axA zS?=z(vQQ|3HjVW#6;b{CD)+p2aPdX#div?e7`Cck(R-?}o`|O(1%fwH5TN){AXsN)CR3H;J%V`p`M4Zn z3s*v_N2MsLYH$C3tGDbPgW&b+f3a1H%=&14W8=M`z+4A-n7FEbI>scQ>>oJ?i>;b1o_D=RxQ^ERGDNM_z#XWXI|&Uf+NyuG18f?FEfSmP+F+V6Mh z&p-dXdgVGdsmQJLEHvBc<45ILo(vfZD_BfiRX<5pwF?9t0{l~{>Tyq1H8(f!-6OjI z?%#W;si~Q*;sQNazqu|F6?gaSfPG<|N@@^ARi3Li{{H*#fBp4W;Nf6yo=ZsZmmM7) zzy9~vRm;{Fjh1kMk0>l#@E7r1)6(DT6A@#71V&p0ls=Mw`R0Z&`4oUbHj8(j*^Jg$nz^Gc{pVyL#F(_jV=t@cQy7hvUw(Rj>(4th=2~| zuWlqSM1@8yIw!~3xS?s$2$*~*fC%VN{z6m&>ZVTzc3L!wEmsnOR;8uiqE$6Ou(0_* XyJ_4*=k-|H00000NkvXXu0mjfE50BO literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_revolution_sample.png b/addons/material_maker/doc/images/node_sdf3d_revolution_sample.png new file mode 100644 index 0000000000000000000000000000000000000000..7f717d49e1f260ef09ae1437301c922be5de08ac GIT binary patch literal 19567 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 #tQBs< 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 Q>i_@%07*qoM6N<$f(xUF>i_@% literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_roundedshape_sample.png b/addons/material_maker/doc/images/node_sdf3d_roundedshape_sample.png new file mode 100644 index 0000000000000000000000000000000000000000..d1192a4304be04a410eb83387c948aad188f0b24 GIT binary patch literal 12869 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 L6{%kmW?}yW5lNH| literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_scale.png b/addons/material_maker/doc/images/node_sdf3d_scale.png new file mode 100644 index 0000000000000000000000000000000000000000..75cf7c5020e5a4ea1961093bf235f9008ee5ed87 GIT binary patch literal 2489 zcmV;q2}bsbP)BROt00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D01|XXSaefwW^{L9 za%BKVa%E+1b7*gLUR4MM000RvNklB%) zj0T8NNF>1!v7#FiH_<9KxB&#j42F0_V-Sf%LIv|A+q*CSM?T?`crClw3 zT`gBSTdv@fXObB%dmltV2c$59RH|@6!?_YY+8cU1n-#XYnulr99n3blGn~f6LhV#v zwDfm2_qR9pLIiX`3L{8OmG??q%@nE{`=AOd&|A^MxDqxpGCF-cj|xsU%#rJejFimU z@+K;X9o3f0GLkb#?3xXn{W_ca+8Y$33OXQ#5j0{{;pRl4s=l|Qv9Ckc*D33#QEW&> z$+-$YpBK$c%>)Ysp+T=;EvkcdpepCfJSu3=97qz+m@&iAVMR@uOg&yxDnk&9&_O*; zmsi%0vI8hks9HCcs%)D{Oy#EW*W+=&*yc`f{HGhGzu`!OG1kq5a z8fwqAoI8}4a>5mu#0`|H;(B#e6-6~v2Q9SL_CNtQRnpGZny#lJIx@z3@eLFG)Kt zN%5%-Nm1Rty(yBy+LE)9Rek}h{nwCq{EpoME5VV2Ckk^*#3^5p;8N>lv0LLx^D8mD zaNIZ)fX0c>b4WY&lY^EPmg#>NmwYQZb>vLOra#L*u=luggam*r! zMd+X&AB7Gm;H0XVs8R~kLYpSd<3lnI+9#Dtt|TX3Vd=0{U-rxr&AczaGc12?4q2LDp|RlNAGY_)mSc{(v(eWhSTJvDkvbt-ex(E z9)SW*s$wGJg4b-|(IZg6N!6CHt^Pg%JbDBQCQ6l?v&i0d#d3RRM+cW_3=%||NR~=p z=S-j~J6lI5M>kg&4_6n@X^jWcM6y)+I%fh^IoLTN4R@iBNa#C_L4rsV$x`X-oC#Eg zlLNkVRASQ-q={sy^mPueN(b<&42Ef|>aQQ}xqJ8SridsiZn#VdRok50s^<#^%*}4h zoF%cG7w_mst*-@EReL^8=hefu`AiaXn#L?}KKK!nsvu+!0n5u{X=B3N|O$Y@|B zhpcU>4UGn?s)BQc>qEls+_}T6;)r;Oou-Af1q)TGB5mw{9*X|k$msqMXkZqrz02)! zk5v`n-o1OgDlT9=5l@r_sM%uUpj1_EW=?wirUvPU!ANb9l|Q+v(7=sUgca@GDlMNI z%|fY}g;LdZV`I!iqk5?m^^y;mFE58n0jeT?Ho10>y zBHkK7cr=I{1&mo9R;WTTka|)@M%ht(D1Zp)V1FIf&`ajlZVHRMb(4R|oSuOKh=30E zm(01kdU%L@u^2K{?`>SCfPYux1f#4osX2-d1rPxp?5}PlFGPh#3_2fge_YUb^a6?x z1rPxp>@P$mVA%^V01=N~aaWf_pjGiqS$I_jg0t}d!-^v>aL6uz00000NkvXXu0mjf DUHyN+ literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_smoothboolean.png b/addons/material_maker/doc/images/node_sdf3d_smoothboolean.png new file mode 100644 index 0000000000000000000000000000000000000000..58f5df2815850a2dda6dea9b2b60e781fd12e850 GIT binary patch literal 5156 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 Shs#p{0000*|!~;?q3^DVXP3<@?F@~q&&*>m# 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 literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_sphere.png b/addons/material_maker/doc/images/node_sdf3d_sphere.png new file mode 100644 index 0000000000000000000000000000000000000000..56551b0a4920a16dc847368a45aecb0fc1c27033 GIT binary patch literal 2653 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 Gxc>q`7Cxi^ literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_torus.png b/addons/material_maker/doc/images/node_sdf3d_torus.png new file mode 100644 index 0000000000000000000000000000000000000000..b1ee336f51c303a2c78ab1acc53807a2516ac1a8 GIT binary patch literal 3249 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 literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_torus_sample.png b/addons/material_maker/doc/images/node_sdf3d_torus_sample.png new file mode 100644 index 0000000000000000000000000000000000000000..e27eb07f20eb80cc27e9a5da042259e33df5cfa4 GIT binary patch literal 26989 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 literal 0 HcmV?d00001 diff --git a/addons/material_maker/doc/images/node_sdf3d_translate.png b/addons/material_maker/doc/images/node_sdf3d_translate.png new file mode 100644 index 0000000000000000000000000000000000000000..2e3e8f3f68f02181d77bbb02f4eec9a228afd00d GIT binary patch literal 3727 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 0.0) {\n\t\treturn $sdf(p);\n\t} else {\n\t\treturn p.z;\n\t}\n}\n\nfloat raymarch_$name(vec3 ro, vec3 rd) {\n\tfloat dO=0.; \n for (int i=0; i < 25; i++) {\n \tvec3 p = ro + rd*dO;\n float dS = input_$name(p);\n dO += dS;\n if (dO > 1.0 || dS < 0.0001) break;\n }\n \n return dO;\n}\n\nvec3 normal_$name(vec3 p) {\n\tfloat d = input_$name(p);\n float e = .001;\n \n vec3 n = d - vec3(input_$name(p-vec3(e, 0.0, 0.0)), input_$name(p-vec3(0.0, e, 0.0)), input_$name(p-vec3(0.0, 0.0, e)));\n return vec3(-1.0, -1.0, -1.0)*normalize(n);\n}\n\nvec3 render_$name(vec2 uv) {\n\tvec3 p = vec3(uv, 2.0-raymarch(vec3(uv, 2.0), vec3(0.0, 0.0, -1.0)));\n\tvec3 n = normal(p);\n\tvec3 l = vec3(5.0, 5.0, 10.0);\n\tvec3 ld = normalize(l-p);\n\tfloat o = step(p.z, 0.001);\n\tfloat shadow = 1.0-0.75*step(raymarch(l, -ld), length(l-p)-0.01);\n\tfloat light = 0.3+0.7*dot(n, ld)*shadow;\n\treturnvec3(0.8+0.2*o, 0.8+0.2*o, 1.0)*light;\n}\n", + "name": "Render3d", + "outputs": [ + { + "rgb": "render_$name($uv-vec2(0.5));\n", + "type": "rgb" + } + ], + "parameters": [ + + ] + }, + "type": "shader" + }, + { + "name": "raymarching_2", + "node_position": { + "x": 24.010315, + "y": 37.457581 + }, + "parameters": { + + }, + "type": "raymarching" + }, + { + "name": "raymarching_2_2", + "node_position": { + "x": 26.265625, + "y": 127.457581 + }, + "parameters": { + + }, + "type": "raymarching" + }, + { + "connections": [ + { + "from": "sdf3d_sphere_2", + "from_port": 0, + "to": "sdf3d_translate_4", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3", + "to_port": 1 + }, + { + "from": "sdf3d_smoothboolean_3", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2", + "to_port": 1 + }, + { + "from": "sdf3d_translate_4_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_sphere_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_2", + "to_port": 1 + }, + { + "from": "sdf3d_sphere_2_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3", + "to_port": 1 + }, + { + "from": "sdf3d_translate_4_3_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2_3", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3_2", + "to_port": 1 + }, + { + "from": "sdf3d_box_2", + "from_port": 0, + "to": "sdf3d_rotate_2", + "to_port": 0 + }, + { + "from": "sdf3d_rotate_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_2_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_2_2_2", + "from_port": 0, + "to": "sdf3d_repeat", + "to_port": 0 + }, + { + "from": "sdf3d_rotate_2_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_2_2_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_cylinder", + "from_port": 0, + "to": "sdf3d_translate_4_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_3", + "from_port": 0, + "to": "sdf3d_smoothboolean_3", + "to_port": 0 + }, + { + "from": "sdf3d_sphere_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_3", + "to_port": 1 + }, + { + "from": "sdf3d_translate_4", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_3", + "to_port": 0 + }, + { + "from": "sdf3d_box_2_2", + "from_port": 0, + "to": "sdf3d_rotate_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_box_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_2_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2_3_2", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_smoothboolean_3_2_3_2_2", + "from_port": 0, + "to": "sdf3d_translate_4_3_3", + "to_port": 0 + }, + { + "from": "sdf3d_sphere_2_3", + "from_port": 0, + "to": "sdf3d_translate_4_3_2_2_2_3", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_2_2_2_3", + "from_port": 0, + "to": "sdf3d_boolean", + "to_port": 0 + }, + { + "from": "sdf3d_boolean", + "from_port": 0, + "to": "sdf3d_rotate_2_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_3_2_2_2_2", + "from_port": 0, + "to": "sdroundedshape", + "to_port": 0 + }, + { + "from": "sdroundedshape", + "from_port": 0, + "to": "sdf3d_smoothboolean_3_2_3_2_2", + "to_port": 1 + }, + { + "from": "sdf3d_repeat", + "from_port": 0, + "to": "sdf3d_rotate_2_2_3", + "to_port": 0 + }, + { + "from": "sdf3d_rotate_2_2_3", + "from_port": 0, + "to": "sdf3d_boolean", + "to_port": 1 + }, + { + "from": "sdf3d_translate_4_3_3", + "from_port": 0, + "to": "gen_outputs", + "to_port": 0 + }, + { + "from": "sdf3d_scale_2", + "from_port": 0, + "to": "sdf3d_translate_4_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_4_2", + "from_port": 0, + "to": "sdf3d_scale_2", + "to_port": 0 + } + ], + "label": "Skull", + "name": "graph_3_2", + "node_position": { + "x": -184.234314, + "y": 34.957581 + }, + "nodes": [ + { + "name": "sdf3d_smoothboolean_3", + "node_position": { + "x": -841.989258, + "y": 938.422729 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.04, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_translate_4", + "node_position": { + "x": -1309.989258, + "y": 736.422729 + }, + "parameters": { + "x": 0.52, + "y": -0.22, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_smoothboolean_3_2", + "node_position": { + "x": -629.489258, + "y": 873.422729 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.17, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_sphere_2_2", + "node_position": { + "x": -830.318359, + "y": 1023.672852 + }, + "parameters": { + "r": 0.07 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_translate_4_3", + "node_position": { + "x": -834.318359, + "y": 1078.672852 + }, + "parameters": { + "x": 0.13, + "y": -0.04, + "z": 0.18 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_sphere_2_2_2", + "node_position": { + "x": -831.318359, + "y": 1179.672852 + }, + "parameters": { + "r": 0.08 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_sphere_2", + "node_position": { + "x": -1297.989258, + "y": 844.922729 + }, + "parameters": { + "r": 0.28 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_box_2", + "node_position": { + "x": -855.193726, + "y": 1338.172852 + }, + "parameters": { + "r": 0, + "sx": 0.05, + "sy": 0.05, + "sz": 0.05 + }, + "type": "sdf3d_box" + }, + { + "name": "sdf3d_translate_4_3_2", + "node_position": { + "x": -834.318359, + "y": 1232.672852 + }, + "parameters": { + "x": 0.12, + "y": -0.03, + "z": 0.18 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_rotate_2", + "node_position": { + "x": -839.193726, + "y": 1471.172852 + }, + "parameters": { + "a": 0, + "ax": -30, + "ay": 45, + "az": 0, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "vec3 rotate3d(vec3 p, vec3 a) {\n\tvec3 rv;\n\tfloat c;\n\tfloat s;\n\tc = cos(a.x);\n\ts = sin(a.x);\n\trv.x = p.x;\n\trv.y = p.y*c+p.z*s;\n\trv.z = -p.y*s+p.z*c;\n\tc = cos(a.y);\n\ts = sin(a.y);\n\tp.x = rv.x*c+rv.z*s;\n\tp.y = rv.y;\n\tp.z = -rv.x*s+rv.z*c;\n\tc = cos(a.z);\n\ts = sin(a.z);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Rotate", + "outputs": [ + { + "sdf3d": "$in(rotate3d($uv, -vec3($ax, $ay, $az)*0.01745329251))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "X", + "max": 180, + "min": -180, + "name": "ax", + "step": 1, + "type": "float" + }, + { + "default": 0, + "label": "Y", + "max": 180, + "min": -180, + "name": "ay", + "step": 1, + "type": "float" + }, + { + "default": 0, + "label": "Z", + "max": 180, + "min": -180, + "name": "az", + "step": 1, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_translate_4_3_2_2", + "node_position": { + "x": -840.193726, + "y": 1600.172852 + }, + "parameters": { + "x": 0, + "y": 0.11, + "z": 0.19 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_smoothboolean_3_2_3", + "node_position": { + "x": -623.818359, + "y": 1236.172852 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.09, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_smoothboolean_3_2_2", + "node_position": { + "x": -622.818359, + "y": 1073.172852 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.15, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_translate_4_2_2", + "node_position": { + "x": -832.989258, + "y": 826.922729 + }, + "parameters": { + "x": 0, + "y": 0.24, + "z": 0.01 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_smoothboolean_3_2_3_2", + "node_position": { + "x": -602.693726, + "y": 1454.672852 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.03, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_translate_4_2", + "node_position": { + "x": -1141.989258, + "y": 1070.922729 + }, + "parameters": { + "x": 0, + "y": 0.21, + "z": 0.08 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_translate_4_3_3", + "node_position": { + "x": -363.318359, + "y": 1762.672852 + }, + "parameters": { + "x": 0.15, + "y": 0, + "z": 0.18 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Mirror", + "outputs": [ + { + "sdf3d": "$in(vec3(abs($uv.x), $uv.y, $uv.z))", + "type": "sdf3d" + } + ], + "parameters": [ + + ] + }, + "type": "shader" + }, + { + "name": "gen_inputs", + "node_position": { + "x": -1375.989258, + "y": 1121.935181 + }, + "parameters": { + + }, + "ports": [ + + ], + "type": "ios" + }, + { + "name": "gen_outputs", + "node_position": { + "x": -179.318359, + "y": 1763.935181 + }, + "parameters": { + + }, + "ports": [ + { + "name": "port0", + "type": "sdf3d" + } + ], + "type": "ios" + }, + { + "name": "gen_parameters", + "node_position": { + "x": -1028.995361, + "y": 476.422729 + }, + "parameters": { + + }, + "type": "remote", + "widgets": [ + + ] + }, + { + "name": "sdf3d_translate_4_3_2_2_2", + "node_position": { + "x": -1172.482544, + "y": 1931.119385 + }, + "parameters": { + "x": 0, + "y": 0.14, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Translate", + "outputs": [ + { + "sdf3d": "$in($uv-vec3($x, $y, $z))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "X", + "max": 1, + "min": -1, + "name": "x", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Y", + "max": 1, + "min": -1, + "name": "y", + "step": 0.01, + "type": "float" + }, + { + "default": 0, + "label": "Z", + "max": 1, + "min": -1, + "name": "z", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_rotate_2_2", + "node_position": { + "x": -1172.482544, + "y": 1829.119385 + }, + "parameters": { + "a": 0, + "ax": 0, + "ay": 0, + "az": 45, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "vec3 rotate3d(vec3 p, vec3 a) {\n\tvec3 rv;\n\tfloat c;\n\tfloat s;\n\tc = cos(a.x);\n\ts = sin(a.x);\n\trv.x = p.x;\n\trv.y = p.y*c+p.z*s;\n\trv.z = -p.y*s+p.z*c;\n\tc = cos(a.y);\n\ts = sin(a.y);\n\tp.x = rv.x*c+rv.z*s;\n\tp.y = rv.y;\n\tp.z = -rv.x*s+rv.z*c;\n\tc = cos(a.z);\n\ts = sin(a.z);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Rotate", + "outputs": [ + { + "sdf3d": "$in(rotate3d($uv, -vec3($ax, $ay, $az)*0.01745329251))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "X", + "max": 180, + "min": -180, + "name": "ax", + "step": 1, + "type": "float" + }, + { + "default": 0, + "label": "Y", + "max": 180, + "min": -180, + "name": "ay", + "step": 1, + "type": "float" + }, + { + "default": 0, + "label": "Z", + "max": 180, + "min": -180, + "name": "az", + "step": 1, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_repeat", + "node_position": { + "x": -1166.482544, + "y": 2035.119385 + }, + "parameters": { + "a": 0, + "c": 15, + "r": 0.24, + "rx": 4, + "ry": 4, + "s": 0.3, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "vec3 circle_repeat_transform(vec3 p, float count) {\n\tfloat r = 6.28/count;\n\tfloat pa = atan(p.x, p.y);\n\tfloat a = mod(pa+0.5*r, r)-0.5*r;\n\tvec3 rv;\n\tfloat c = cos(a-pa);\n\tfloat s = sin(a-pa);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Circle Repeat", + "outputs": [ + { + "sdf3d": "$in(circle_repeat_transform($uv, $c))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 4, + "label": "", + "max": 32, + "min": 1, + "name": "c", + "step": 1, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_rotate_2_2_2", + "node_position": { + "x": -791.235718, + "y": 1859.869385 + }, + "parameters": { + "a": 0, + "ax": -90, + "ay": 0, + "az": 0, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "vec3 rotate3d(vec3 p, vec3 a) {\n\tvec3 rv;\n\tfloat c;\n\tfloat s;\n\tc = cos(a.x);\n\ts = sin(a.x);\n\trv.x = p.x;\n\trv.y = p.y*c+p.z*s;\n\trv.z = -p.y*s+p.z*c;\n\tc = cos(a.y);\n\ts = sin(a.y);\n\tp.x = rv.x*c+rv.z*s;\n\tp.y = rv.y;\n\tp.z = -rv.x*s+rv.z*c;\n\tc = cos(a.z);\n\ts = sin(a.z);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Rotate", + "outputs": [ + { + "sdf3d": "$in(rotate3d($uv, -vec3($ax, $ay, $az)*0.01745329251))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "X", + "max": 180, + "min": -180, + "name": "ax", + "step": 1, + "type": "float" + }, + { + "default": 0, + "label": "Y", + "max": 180, + "min": -180, + "name": "ay", + "step": 1, + "type": "float" + }, + { + "default": 0, + "label": "Z", + "max": 180, + "min": -180, + "name": "az", + "step": 1, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_translate_4_3_2_2_2_2", + "node_position": { + "x": -788.235718, + "y": 1967.869385 + }, + "parameters": { + "x": 0, + "y": 0.315, + "z": 0.08 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_cylinder", + "node_position": { + "x": -1161, + "y": 994.5 + }, + "parameters": { + "l": 0.06, + "r": 0.15, + "sx": 0.25, + "sy": 0.25, + "sz": 0.5 + }, + "type": "sdf3d_cylinder" + }, + { + "name": "sdf3d_smoothboolean_3_3", + "node_position": { + "x": -1104.305908, + "y": 815.75 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.1, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_box_2_2", + "node_position": { + "x": -1190.880981, + "y": 1701 + }, + "parameters": { + "r": 0, + "sx": 0.01, + "sy": 0.01, + "sz": 0.015 + }, + "type": "sdf3d_box" + }, + { + "name": "sdf3d_smoothboolean_3_2_3_2_2", + "node_position": { + "x": -562.468933, + "y": 1761.75 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.05, + "op": 0, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_smoothboolean" + }, + { + "name": "sdf3d_sphere_2_3", + "node_position": { + "x": -1165.397095, + "y": 2204.25 + }, + "parameters": { + "r": 0.28 + }, + "type": "sdf3d_sphere" + }, + { + "name": "sdf3d_translate_4_3_2_2_2_3", + "node_position": { + "x": -1175.397095, + "y": 2261.5 + }, + "parameters": { + "x": 0, + "y": 0.28, + "z": 0 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_boolean", + "node_position": { + "x": -990.397095, + "y": 2076 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 2, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "sdroundedshape", + "node_position": { + "x": -794.225342, + "y": 2070.75 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "k": 0.15, + "op": 0, + "r": 0.01, + "w": 0.28 + }, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Rounded", + "outputs": [ + { + "sdf3d": "$in($uv)-$r", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "", + "max": 1, + "min": 0, + "name": "r", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_rotate_2_2_3", + "node_position": { + "x": -1172.268311, + "y": 2085.75 + }, + "parameters": { + "a": 0, + "ax": 0, + "ay": 0, + "az": 11, + "x": 0.35, + "y": 0, + "z": 0 + }, + "shader_model": { + "code": "", + "global": "vec3 rotate3d(vec3 p, vec3 a) {\n\tvec3 rv;\n\tfloat c;\n\tfloat s;\n\tc = cos(a.x);\n\ts = sin(a.x);\n\trv.x = p.x;\n\trv.y = p.y*c+p.z*s;\n\trv.z = -p.y*s+p.z*c;\n\tc = cos(a.y);\n\ts = sin(a.y);\n\tp.x = rv.x*c+rv.z*s;\n\tp.y = rv.y;\n\tp.z = -rv.x*s+rv.z*c;\n\tc = cos(a.z);\n\ts = sin(a.z);\n\trv.x = p.x*c+p.y*s;\n\trv.y = -p.x*s+p.y*c;\n\trv.z = p.z;\n\treturn rv;\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in", + "type": "sdf3d" + } + ], + "instance": "", + "name": "Rotate", + "outputs": [ + { + "sdf3d": "$in(rotate3d($uv, -vec3($ax, $ay, $az)*0.01745329251))", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "X", + "max": 180, + "min": -180, + "name": "ax", + "step": 1, + "type": "float" + }, + { + "default": 0, + "label": "Y", + "max": 180, + "min": -180, + "name": "ay", + "step": 1, + "type": "float" + }, + { + "default": 0, + "label": "Z", + "max": 180, + "min": -180, + "name": "az", + "step": 1, + "type": "float" + } + ] + }, + "type": "shader" + }, + { + "name": "sdf3d_scale_2", + "node_position": { + "x": -825.646118, + "y": 772.643799 + }, + "parameters": { + "a": 0, + "s": 0.48, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_scale" + } + ], + "parameters": { + + }, + "type": "graph" + }, + { + "connections": [ + { + "from": "sdf3d_box", + "from_port": 0, + "to": "sdf3d_boolean", + "to_port": 1 + }, + { + "from": "sdf3d_box_2", + "from_port": 0, + "to": "sdf3d_translate_3_2", + "to_port": 0 + }, + { + "from": "sdf3d_translate_3_2", + "from_port": 0, + "to": "sdf3d_boolean", + "to_port": 0 + }, + { + "from": "sdf3d_translate_3_2_2", + "from_port": 0, + "to": "sdf3d_boolean_2", + "to_port": 0 + }, + { + "from": "sdf3d_boolean", + "from_port": 0, + "to": "sdf3d_boolean_2", + "to_port": 1 + }, + { + "from": "sdf3d_box_2", + "from_port": 0, + "to": "sdf3d_translate_3_2_2", + "to_port": 0 + }, + { + "from": "sdf3d_boolean_2", + "from_port": 0, + "to": "gen_outputs", + "to_port": 0 + } + ], + "label": "Brick", + "name": "graph_4", + "node_position": { + "x": -209.947205, + "y": 122.904633 + }, + "nodes": [ + { + "name": "sdf3d_box", + "node_position": { + "x": -564.5, + "y": -63 + }, + "parameters": { + "r": 0.01, + "sx": 0.26, + "sy": 0.15, + "sz": 0.1 + }, + "type": "sdf3d_box" + }, + { + "name": "sdf3d_translate_3_2", + "node_position": { + "x": -554.5, + "y": -166 + }, + "parameters": { + "x": 0, + "y": 0, + "z": 0.45 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_box_2", + "node_position": { + "x": -570.5, + "y": -294.5 + }, + "parameters": { + "r": 0, + "sx": 0.21, + "sy": 0.1, + "sz": 0.36 + }, + "type": "sdf3d_box" + }, + { + "name": "sdf3d_boolean", + "node_position": { + "x": -358.5, + "y": -118 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "sdf3d_translate_3_2_2", + "node_position": { + "x": -343.333344, + "y": -224.333344 + }, + "parameters": { + "x": 0, + "y": 0, + "z": -0.45 + }, + "type": "sdf3d_translate" + }, + { + "name": "sdf3d_boolean_2", + "node_position": { + "x": -147.333344, + "y": -168.333344 + }, + "parameters": { + "bevel": 0, + "cx": 0, + "cy": 0, + "h": 0.08, + "op": 1, + "r": 0.3, + "w": 0.28 + }, + "type": "sdf3d_boolean" + }, + { + "name": "gen_inputs", + "node_position": { + "x": -748.5, + "y": -159.361115 + }, + "parameters": { + + }, + "ports": [ + + ], + "type": "ios" + }, + { + "name": "gen_outputs", + "node_position": { + "x": 60.666656, + "y": -165.361115 + }, + "parameters": { + + }, + "ports": [ + { + "name": "port0", + "type": "sdf3d" + } + ], + "type": "ios" + }, + { + "name": "gen_parameters", + "node_position": { + "x": -488.111115, + "y": -466.5 + }, + "parameters": { + + }, + "type": "remote", + "widgets": [ + + ] + } + ], + "parameters": { + + }, + "type": "graph" + }, + { + "name": "sdf3d_rotate_2", + "node_position": { + "x": -241.447205, + "y": 169.404633 + }, + "parameters": { + "a": 0, + "ax": 25, + "ay": 23, + "az": -8, + "x": 0.35, + "y": 0, + "z": 0 + }, + "type": "sdf3d_rotate" + }, + { + "name": "sdf3d_translate_3_2", + "node_position": { + "x": -233.447205, + "y": 270.404633 + }, + "parameters": { + "x": 0, + "y": 0, + "z": 0.25 + }, + "type": "sdf3d_translate" } ], "parameters": { diff --git a/addons/material_maker/examples/skulls.ptex b/addons/material_maker/examples/skulls.ptex index f24711d..7c2e3b3 100644 --- a/addons/material_maker/examples/skulls.ptex +++ b/addons/material_maker/examples/skulls.ptex @@ -6,12 +6,6 @@ "to": "colorize", "to_port": 0 }, - { - "from": "colorize", - "from_port": 0, - "to": "Material", - "to_port": 2 - }, { "from": "perlin", "from_port": 0, @@ -30,18 +24,6 @@ "to": "Material", "to_port": 6 }, - { - "from": "_3_2", - "from_port": 0, - "to": "colorize_3", - "to_port": 0 - }, - { - "from": "_3_2", - "from_port": 0, - "to": "occlusion", - "to_port": 0 - }, { "from": "occlusion", "from_port": 0, @@ -84,24 +66,12 @@ "to": "colorize_4", "to_port": 0 }, - { - "from": "_3_2", - "from_port": 0, - "to": "colorize_5", - "to_port": 0 - }, { "from": "colorize_2", "from_port": 0, "to": "blend", "to_port": 0 }, - { - "from": "colorize_5", - "from_port": 0, - "to": "blend", - "to_port": 2 - }, { "from": "colorize_4", "from_port": 0, @@ -204,17 +174,65 @@ "to": "blend_2", "to_port": 2 }, + { + "from": "graph_3", + "from_port": 0, + "to": "sdf3d_scale", + "to_port": 0 + }, { "from": "_3_2", "from_port": 0, + "to": "buffer", + "to_port": 0 + }, + { + "from": "buffer", + "from_port": 0, + "to": "colorize_5", + "to_port": 0 + }, + { + "from": "buffer", + "from_port": 0, "to": "colorize_5_2", "to_port": 0 }, { - "from": "graph_3", + "from": "buffer", "from_port": 0, - "to": "sdf3d_scale", + "to": "occlusion", "to_port": 0 + }, + { + "from": "buffer", + "from_port": 0, + "to": "colorize_3", + "to_port": 0 + }, + { + "from": "colorize", + "from_port": 0, + "to": "blend_3", + "to_port": 0 + }, + { + "from": "blend_3", + "from_port": 0, + "to": "Material", + "to_port": 2 + }, + { + "from": "colorize_5", + "from_port": 0, + "to": "blend_3", + "to_port": 1 + }, + { + "from": "colorize_5_2", + "from_port": 0, + "to": "blend", + "to_port": 2 } ], "label": "Graph", @@ -227,8 +245,8 @@ { "name": "Material", "node_position": { - "x": 463, - "y": 1358 + "x": 390, + "y": 1354 }, "parameters": { "albedo_color": { @@ -256,18 +274,18 @@ "y": 1196.349854 }, "parameters": { - "iterations": 7, - "persistence": 0.75, - "scale_x": 4, - "scale_y": 4 + "iterations": 5, + "persistence": 0.7, + "scale_x": 32, + "scale_y": 32 }, "type": "perlin" }, { "name": "colorize", "node_position": { - "x": -367.399658, - "y": 1344.349976 + "x": -347.399658, + "y": 1342.349976 }, "parameters": { "gradient": { @@ -275,16 +293,16 @@ "points": [ { "a": 1, - "b": 0.171875, - "g": 0.171875, - "pos": 0.1, - "r": 0.171875 + "b": 0, + "g": 0, + "pos": 0.118182, + "r": 0 }, { "a": 1, "b": 1, "g": 1, - "pos": 1, + "pos": 0.909091, "r": 1 } ], @@ -365,11 +383,11 @@ { "name": "uniform_greyscale", "node_position": { - "x": 114.446899, - "y": 1316.272949 + "x": 138.446899, + "y": 1239.272949 }, "parameters": { - "color": 0 + "color": 0.31 }, "type": "uniform_greyscale" }, @@ -411,7 +429,7 @@ }, "parameters": { "a": 0, - "s": 0.33, + "s": 0.3, "x": 0.35, "y": 0, "z": 0 @@ -426,7 +444,7 @@ }, "parameters": { "a": 0, - "r": 0.35, + "r": 0.25, "rx": 4, "ry": 4, "s": 0.3, @@ -505,7 +523,7 @@ "y": 1400.797363 }, "parameters": { - "x": 0.35, + "x": 0.4, "y": 0.35, "z": 0 }, @@ -536,7 +554,7 @@ }, "parameters": { "a": 0, - "r": 0.35, + "r": 0.25, "rx": 4, "ry": 4, "s": 0.3, @@ -579,26 +597,26 @@ { "name": "colorize_5", "node_position": { - "x": -131.127869, - "y": 1320.013184 + "x": -147.127869, + "y": 1324.013184 }, "parameters": { "gradient": { - "interpolation": 1, + "interpolation": 0, "points": [ - { - "a": 1, - "b": 0, - "g": 0, - "pos": 0, - "r": 0 - }, { "a": 1, "b": 1, "g": 1, - "pos": 0.063636, + "pos": 0, "r": 1 + }, + { + "a": 1, + "b": 0.520833, + "g": 0.520833, + "pos": 0.036364, + "r": 0.520833 } ], "type": "Gradient" @@ -609,8 +627,8 @@ { "name": "blend", "node_position": { - "x": 78.872131, - "y": 1216.013184 + "x": 126.872131, + "y": 1141.013184 }, "parameters": { "amount": 0.5, @@ -1030,7 +1048,7 @@ }, "parameters": { "amount": 0.5, - "param0": 10, + "param0": 11, "param1": 1.02, "param2": 0, "size": 4 @@ -1147,12 +1165,6 @@ "to": "sdf3d_smoothboolean_3_2_3", "to_port": 0 }, - { - "from": "sdf3d_translate_4_3_3", - "from_port": 0, - "to": "gen_outputs", - "to_port": 0 - }, { "from": "sdf3d_smoothboolean_3_2_3", "from_port": 0, @@ -1284,6 +1296,12 @@ "from_port": 0, "to": "sdf3d_boolean", "to_port": 1 + }, + { + "from": "sdf3d_translate_4_3_3", + "from_port": 0, + "to": "gen_outputs", + "to_port": 0 } ], "label": "Skull", @@ -1304,7 +1322,7 @@ "cx": 0, "cy": 0, "h": 0.08, - "k": 0.1, + "k": 0.04, "op": 0, "r": 0.3, "w": 0.28 @@ -1423,7 +1441,7 @@ }, "parameters": { "a": 0, - "ax": -32, + "ax": -30, "ay": 45, "az": 0, "x": 0.35, @@ -1441,7 +1459,7 @@ "parameters": { "x": 0, "y": 0.11, - "z": 0.21 + "z": 0.19 }, "type": "sdf3d_translate" }, @@ -1593,8 +1611,8 @@ { "name": "gen_outputs", "node_position": { - "x": -238.318359, - "y": 1764.935181 + "x": -194.318359, + "y": 1767.935181 }, "parameters": { @@ -1908,6 +1926,30 @@ }, "type": "graph" + }, + { + "name": "buffer", + "node_position": { + "x": -353.830994, + "y": 1560.222534 + }, + "parameters": { + "lod": 0, + "size": 11 + }, + "type": "buffer" + }, + { + "name": "blend_3", + "node_position": { + "x": 84.334427, + "y": 1296.834595 + }, + "parameters": { + "amount": 1, + "blend_type": 3 + }, + "type": "blend" } ], "parameters": { diff --git a/addons/material_maker/nodes/sdf3d_scale.mmg b/addons/material_maker/nodes/sdf3d_scale.mmg index 304427a..0ee47bf 100644 --- a/addons/material_maker/nodes/sdf3d_scale.mmg +++ b/addons/material_maker/nodes/sdf3d_scale.mmg @@ -13,7 +13,7 @@ }, "shader_model": { "code": "", - "global": "vec2 rotate(vec2 uv, float a) {\n\tvec2 rv;\n\tfloat c = cos(a);\n\tfloat s = sin(a);\n\tuv -= vec2(0.5);\n\trv.x = uv.x*c+uv.y*s;\n\trv.y = -uv.x*s+uv.y*c;\n\treturn rv+vec2(0.5);\n}\n", + "global": "", "inputs": [ { "default": "0.0", diff --git a/addons/material_maker/nodes/sdrotate.mmg b/addons/material_maker/nodes/sdrotate.mmg index c56137f..fefaaab 100644 --- a/addons/material_maker/nodes/sdrotate.mmg +++ b/addons/material_maker/nodes/sdrotate.mmg @@ -12,7 +12,7 @@ }, "shader_model": { "code": "", - "global": "vec2 rotate(vec2 uv, float a) {\n\tvec2 rv;\n\tfloat c = cos(a);\n\tfloat s = sin(a);\n\tuv -= vec2(0.5);\n\trv.x = uv.x*c+uv.y*s;\n\trv.y = -uv.x*s+uv.y*c;\n\treturn rv+vec2(0.5);\n}\n", + "global": "vec2 sdf2d_rotate(vec2 uv, float a) {\n\tvec2 rv;\n\tfloat c = cos(a);\n\tfloat s = sin(a);\n\tuv -= vec2(0.5);\n\trv.x = uv.x*c+uv.y*s;\n\trv.y = -uv.x*s+uv.y*c;\n\treturn rv+vec2(0.5);\n}\n", "inputs": [ { "default": "0.0", @@ -25,7 +25,7 @@ "name": "Rotate", "outputs": [ { - "sdf2d": "$in(rotate($uv, $a*0.01745329251))", + "sdf2d": "$in(sdf2d_rotate($uv, $a*0.01745329251))", "type": "sdf2d" } ], From 509853e743c314570289751985d07ebae299c2bd Mon Sep 17 00:00:00 2001 From: Rodolphe Suescun Date: Tue, 24 Dec 2019 16:04:10 +0100 Subject: [PATCH 12/15] Updated skulls example (fixed type of subgraph ports). --- addons/material_maker/examples/skulls.ptex | 87 ++++++++++++++++++---- 1 file changed, 72 insertions(+), 15 deletions(-) diff --git a/addons/material_maker/examples/skulls.ptex b/addons/material_maker/examples/skulls.ptex index 7c2e3b3..9e92938 100644 --- a/addons/material_maker/examples/skulls.ptex +++ b/addons/material_maker/examples/skulls.ptex @@ -576,17 +576,17 @@ "points": [ { "a": 1, - "b": 0.027452, - "g": 0.047034, + "b": 0, + "g": 0.300774, "pos": 0, - "r": 0.057292 + "r": 0.458333 }, { "a": 1, - "b": 0.003581, - "g": 0.076426, + "b": 0, + "g": 0.046875, "pos": 1, - "r": 0.114583 + "r": 0.1875 } ], "type": "Gradient" @@ -798,8 +798,8 @@ { "name": "sdf3d_smoothboolean_3_2", "node_position": { - "x": -757.380676, - "y": 1593.931152 + "x": -744.380676, + "y": 1604.931152 }, "parameters": { "bevel": 0, @@ -816,8 +816,8 @@ { "name": "sdf3d_smoothboolean_3", "node_position": { - "x": -752.880676, - "y": 1509.931152 + "x": -744.880676, + "y": 1527.931152 }, "parameters": { "bevel": 0, @@ -829,7 +829,64 @@ "r": 0.3, "w": 0.28 }, - "type": "sdf3d_smoothboolean" + "shader_model": { + "code": "", + "global": "float sdf3SmoothUnion(float d1, float d2, float k) {\n float h = clamp(0.5+0.5*(d2-d1)/k, 0.0, 1.0);\n return mix(d2, d1, h)-k*h*(1.0-h);\n}\n\nfloat sdf3SmoothSubtraction( float d1, float d2, float k ) {\n float h = clamp(0.5-0.5*(d2+d1)/k, 0.0, 1.0);\n return mix( d2, -d1, h )+k*h*(1.0-h);\n}\n\nfloat sdf3SmoothIntersection( float d1, float d2, float k ) {\n float h = clamp(0.5-0.5*(d2-d1)/k, 0.0, 1.0);\n return mix(d2, d1, h)+k*h*(1.0-h);\n}\n", + "inputs": [ + { + "default": "0.0", + "label": "", + "name": "in1", + "type": "sdf3d" + }, + { + "default": "0.0", + "label": "", + "name": "in2", + "type": "sdf3d" + } + ], + "instance": "", + "name": "sdSmoothBoolean", + "outputs": [ + { + "sdf3d": "sdf3Smooth$op($in1($uv), $in2($uv), $k)", + "type": "sdf3d" + } + ], + "parameters": [ + { + "default": 0, + "label": "", + "name": "op", + "type": "enum", + "values": [ + { + "name": "Union", + "value": "Union" + }, + { + "name": "Subtraction", + "value": "Subtraction" + }, + { + "name": "Intersection", + "value": "Intersection" + } + ] + }, + { + "default": 0, + "label": "", + "max": 1, + "min": 0, + "name": "k", + "step": 0.01, + "type": "float" + } + ] + }, + "type": "shader" }, { "name": "sdf3d_sphere_2_2", @@ -922,7 +979,7 @@ "ports": [ { "name": "port0", - "type": "rgba" + "type": "sdf3d" } ], "type": "ios" @@ -1307,8 +1364,8 @@ "label": "Skull", "name": "graph_3", "node_position": { - "x": -977.932495, - "y": 1205.712646 + "x": -960.932495, + "y": 1204.712646 }, "nodes": [ { @@ -1620,7 +1677,7 @@ "ports": [ { "name": "port0", - "type": "rgba" + "type": "sdf3d" } ], "type": "ios" From 1799ade2f2de360a07bffecce4d7c49c21f65bff Mon Sep 17 00:00:00 2001 From: Rodolphe Suescun Date: Wed, 25 Dec 2019 10:36:45 +0100 Subject: [PATCH 13/15] Fixed switch node (so it supports all port types) + minor bug fixes --- addons/material_maker/engine/gen_base.gd | 3 ++- addons/material_maker/engine/gen_switch.gd | 4 ++-- addons/material_maker/engine/renderer.gd | 7 ++++++- addons/material_maker/graph_edit.gd | 3 +++ addons/material_maker/library.gd | 6 ++++-- addons/material_maker/nodes/generic.gd | 2 +- addons/material_maker/nodes/switch.gd | 7 ++++--- 7 files changed, 22 insertions(+), 10 deletions(-) diff --git a/addons/material_maker/engine/gen_base.gd b/addons/material_maker/engine/gen_base.gd index 1905451..a85fd13 100644 --- a/addons/material_maker/engine/gen_base.gd +++ b/addons/material_maker/engine/gen_base.gd @@ -44,7 +44,8 @@ const PORT_TYPES : Dictionary = { rgb = { type="vec3", paramdefs="vec2 uv", params="uv", slot_type=0, color=Color(0.5, 0.5, 1.0) }, rgba = { type="vec4", paramdefs="vec2 uv", params="uv", slot_type=0, color=Color(0.0, 0.5, 0.0, 0.5) }, sdf2d = { type="float", paramdefs="vec2 uv", params="uv", slot_type=1, color=Color(1.0, 0.5, 0.0) }, - sdf3d = { type="float", paramdefs="vec3 p", params="p", slot_type=2, color=Color(1.0, 0.0, 0.0) } + sdf3d = { type="float", paramdefs="vec3 p", params="p", slot_type=2, color=Color(1.0, 0.0, 0.0) }, + any = { slot_type=42, color=Color(1.0, 1.0, 1.0) } } func _ready() -> void: diff --git a/addons/material_maker/engine/gen_switch.gd b/addons/material_maker/engine/gen_switch.gd index 5a48ab5..d17e246 100644 --- a/addons/material_maker/engine/gen_switch.gd +++ b/addons/material_maker/engine/gen_switch.gd @@ -34,14 +34,14 @@ func get_input_defs() -> Array: for c in range(parameters.choices): for o in range(parameters.outputs): var n = PoolByteArray([65+o]).get_string_from_ascii()+str(c) - rv.push_back({ name=n, label=n, type="rgba" }) + rv.push_back({ name=n, label=n, type="any" }) return rv func get_output_defs() -> Array: var rv : Array = [] for o in range(parameters.outputs): var n = PoolByteArray([65+o]).get_string_from_ascii() - rv.push_back({ name=n, type="rgba" }) + rv.push_back({ name=n, type="any" }) return rv func set_parameter(p, v) -> void: diff --git a/addons/material_maker/engine/renderer.gd b/addons/material_maker/engine/renderer.gd index 6041e6f..94e0fd6 100644 --- a/addons/material_maker/engine/renderer.gd +++ b/addons/material_maker/engine/renderer.gd @@ -117,6 +117,7 @@ static func generate_combined_shader(red_code, green_code, blue_code) -> String: code += "\n" var globals = [] var textures = {} + var output = [] for c in [ red_code, green_code, blue_code ]: if c.has("textures"): for t in c.textures.keys(): @@ -125,6 +126,10 @@ static func generate_combined_shader(red_code, green_code, blue_code) -> String: for g in c.globals: if globals.find(g) == -1: globals.push_back(g) + if c.has("f"): + output.push_back(c.f) + else: + output.push_back("1.0") for t in textures.keys(): code += "uniform sampler2D "+t+";\n" for g in globals: @@ -137,7 +142,7 @@ static func generate_combined_shader(red_code, green_code, blue_code) -> String: shader_code += red_code.code shader_code += green_code.code shader_code += blue_code.code - shader_code += "COLOR = vec4("+red_code.f+", "+green_code.f+", "+blue_code.f+", 1.0);\n" + shader_code += "COLOR = vec4("+output[0]+", "+output[1]+", "+output[2]+", 1.0);\n" shader_code += "}\n" #print("GENERATED COMBINED SHADER:\n"+shader_code) code += shader_code diff --git a/addons/material_maker/graph_edit.gd b/addons/material_maker/graph_edit.gd index 5dbcec3..707c92e 100644 --- a/addons/material_maker/graph_edit.gd +++ b/addons/material_maker/graph_edit.gd @@ -22,6 +22,9 @@ signal graph_changed func _ready() -> void: OS.low_processor_usage_mode = true center_view() + for t in range(5): + add_valid_connection_type(t, 42) + add_valid_connection_type(42, t) func _gui_input(event) -> void: if event is InputEventKey and event.pressed: diff --git a/addons/material_maker/library.gd b/addons/material_maker/library.gd index 353f022..0980dac 100644 --- a/addons/material_maker/library.gd +++ b/addons/material_maker/library.gd @@ -64,8 +64,10 @@ func get_preview_texture(data : Dictionary) -> ImageTexture: image_path = ProjectSettings.globalize_path(image_path) t = ImageTexture.new() var image : Image = Image.new() - image.load(image_path) - t.create_from_image(image) + if image.load(image_path) == OK: + t.create_from_image(image) + else: + print("Cannot load image "+image_path) return t return null diff --git a/addons/material_maker/nodes/generic.gd b/addons/material_maker/nodes/generic.gd index 5e956a9..10fe434 100644 --- a/addons/material_maker/nodes/generic.gd +++ b/addons/material_maker/nodes/generic.gd @@ -134,7 +134,7 @@ func create_parameter_control(p : Dictionary) -> Control: return control func save_preview_widget() -> void: - if preview != null: + if preview != null and preview.get_parent() == self: remove_child(preview) if preview_timer != null: preview_timer.stop() diff --git a/addons/material_maker/nodes/switch.gd b/addons/material_maker/nodes/switch.gd index 20626a6..ce1561e 100644 --- a/addons/material_maker/nodes/switch.gd +++ b/addons/material_maker/nodes/switch.gd @@ -69,7 +69,9 @@ func update_node() -> void: var space = Control.new() space.size_flags_horizontal = SIZE_EXPAND | SIZE_FILL sizer.add_child(space) - sizer.add_child(preload("res://addons/material_maker/widgets/preview_button.tscn").instance()) + var button = preload("res://addons/material_maker/widgets/preview_button.tscn").instance() + sizer.add_child(button) + button.connect("toggled", self, "on_preview_button", [ get_child_count()-1 ]) add_child(sizer) rect_size = Vector2(0, 0) for i in range(get_child_count()): @@ -79,13 +81,12 @@ func update_node() -> void: if i < 5: has_output = i < output_count sizer.get_child(sizer.get_child_count()-1).visible = has_output - sizer.get_child(sizer.get_child_count()-1).connect("toggled", self, "on_preview_button", [ i ]) if i >= input_count: sizer.get_child(0).text = "" has_input = false else: sizer.get_child(0).text = PoolByteArray([65+i%int(output_count)]).get_string_from_ascii()+str(1+i/int(output_count)) sizer.get_child(0).add_color_override("font_color", Color(1.0, 1.0, 1.0) if i/int(output_count) == generator.parameters.source else Color(0.5, 0.5, 0.5)) - set_slot(i, has_input, 0, Color(0.0, 0.5, 0.0, 0.5), has_output, 0, Color(0.0, 0.5, 0.0, 0.5)) + set_slot(i, has_input, 42, Color(1.0, 1.0, 1.0, 1.0), has_output, 42, Color(1.0, 1.0, 1.0, 1.0)) # Preview restore_preview_widget() From f5fe47a903c129bd700109cda60d8833420e0674 Mon Sep 17 00:00:00 2001 From: Rodolphe Suescun Date: Wed, 25 Dec 2019 12:35:00 +0100 Subject: [PATCH 14/15] Updated base library --- addons/material_maker/library/base.json | 374 ++++++++++-------- .../library/base/simple_sdf_sdshow.png | Bin 0 -> 1505 bytes .../base/simple_sdf_transforms_rotate.png | Bin 0 -> 4693 bytes .../base/simple_sdf_transforms_scale.png | Bin 0 -> 679 bytes addons/material_maker/nodes/sdscale.mmg | 8 +- 5 files changed, 215 insertions(+), 167 deletions(-) create mode 100644 addons/material_maker/library/base/simple_sdf_sdshow.png create mode 100644 addons/material_maker/library/base/simple_sdf_transforms_rotate.png create mode 100644 addons/material_maker/library/base/simple_sdf_transforms_scale.png diff --git a/addons/material_maker/library/base.json b/addons/material_maker/library/base.json index 8c75de0..0df2ef2 100644 --- a/addons/material_maker/library/base.json +++ b/addons/material_maker/library/base.json @@ -587,30 +587,7 @@ "parameters": { }, - "shader_model": { - "code": "", - "global": "", - "inputs": [ - { - "default": "vec4($uv, 0.0, 1.0)", - "label": "", - "name": "in", - "type": "rgba" - } - ], - "instance": "", - "name": "CircleMap", - "outputs": [ - { - "rgba": "$in(vec2(fract(atan($uv.y-0.5, $uv.x-0.5)*0.15915494309), 2.0*length($uv-vec2(0.5))))", - "type": "rgba" - } - ], - "parameters": [ - - ] - }, - "type": "shader" + "type": "circle_map" }, { "name": "gen_parameters", @@ -723,6 +700,25 @@ "tree_item": "Simple/Gradient/Circular", "type": "graph" }, + { + "collapsed": true, + "icon": "simple_sdf_sdshow", + "name": "sdshow", + "parameters": { + "bevel": 0.1, + "cx": 0, + "cy": 0, + "h": 0.08, + "r": 0.3, + "w": 0.28 + }, + "tree_item": "Simple/SDF/sdShow", + "type": "sdshow" + }, + { + "collapsed": false, + "tree_item": "Simple/SDF/Shapes" + }, { "collapsed": true, "icon": "simple_sdf_shapes_sdcircle", @@ -746,61 +742,8 @@ "r": 0.3, "w": 0.3 }, - "shader_model": { - "code": "vec2 $(name_uv)_d = abs($uv-0.5*vec2($cx+1.0, $cy+1.0))-vec2($w, $h);\n", - "global": "", - "inputs": [ - - ], - "instance": "", - "name": "sdBox", - "outputs": [ - { - "sdf2d": "length(max($(name_uv)_d,vec2(0)))+min(max($(name_uv)_d.x,$(name_uv)_d.y),0.0)", - "type": "sdf2d" - } - ], - "parameters": [ - { - "default": 0.5, - "label": "Width", - "max": 1, - "min": 0, - "name": "w", - "step": 0.01, - "type": "float" - }, - { - "default": 1, - "label": "Height", - "max": 1, - "min": 0, - "name": "h", - "step": 0.01, - "type": "float" - }, - { - "default": 0, - "label": "Center X", - "max": 1, - "min": -1, - "name": "cx", - "step": 0.01, - "type": "float" - }, - { - "default": 0, - "label": "Center Y", - "max": 1, - "min": -1, - "name": "cy", - "step": 0.01, - "type": "float" - } - ] - }, "tree_item": "Simple/SDF/Shapes/sdBox", - "type": "shader" + "type": "sdbox" }, { "collapsed": true, @@ -834,6 +777,10 @@ "tree_item": "Simple/SDF/Shapes/sdRhombus", "type": "sdrhombus" }, + { + "collapsed": false, + "tree_item": "Simple/SDF/Operators" + }, { "collapsed": true, "icon": "simple_sdf_operators_sdboolean", @@ -864,65 +811,8 @@ "r": 0.3, "w": 0.28 }, - "shader_model": { - "code": "", - "global": "float sdSmoothUnion( float d1, float d2, float k ) {\n float h = clamp( 0.5 + 0.5*(d2-d1)/k, 0.0, 1.0 );\n return mix( d2, d1, h ) - k*h*(1.0-h); }\n\nfloat sdSmoothSubtraction( float d1, float d2, float k ) {\n float h = clamp( 0.5 - 0.5*(d2+d1)/k, 0.0, 1.0 );\n return mix( d2, -d1, h ) + k*h*(1.0-h); }\n\nfloat sdSmoothIntersection( float d1, float d2, float k ) {\n float h = clamp( 0.5 - 0.5*(d2-d1)/k, 0.0, 1.0 );\n return mix( d2, d1, h ) + k*h*(1.0-h); }\n", - "inputs": [ - { - "default": "0.0", - "label": "", - "name": "in1", - "type": "sdf2d" - }, - { - "default": "0.0", - "label": "", - "name": "in2", - "type": "sdf2d" - } - ], - "instance": "", - "name": "sdSmoothBoolean", - "outputs": [ - { - "sdf2d": "sdSmooth$op($in1($uv), $in2($uv), $k)", - "type": "sdf2d" - } - ], - "parameters": [ - { - "default": 0, - "label": "", - "name": "op", - "type": "enum", - "values": [ - { - "name": "Union", - "value": "Union" - }, - { - "name": "Subtraction", - "value": "Subtraction" - }, - { - "name": "Intersection", - "value": "Intersection" - } - ] - }, - { - "default": 0, - "label": "", - "max": 1, - "min": 0, - "name": "k", - "step": 0.01, - "type": "float" - } - ] - }, "tree_item": "Simple/SDF/Operators/sdSmoothBoolean", - "type": "shader" + "type": "sdsmoothboolean" }, { "collapsed": true, @@ -958,21 +848,6 @@ "tree_item": "Simple/SDF/Operators/sdAnnularShape", "type": "sdannularshape" }, - { - "collapsed": true, - "icon": "simple_sdf_operators_sdshow", - "name": "sdshow_2", - "parameters": { - "bevel": 0.1, - "cx": 0, - "cy": 0, - "h": 0.08, - "r": 0.3, - "w": 0.28 - }, - "tree_item": "Simple/SDF/Operators/sdShow", - "type": "sdshow" - }, { "collapsed": false, "tree_item": "Simple/SDF/Transforms" @@ -989,10 +864,51 @@ "tree_item": "Simple/SDF/Transforms/Translate", "type": "sdtranslate" }, + { + "collapsed": true, + "icon": "simple_sdf_transforms_rotate", + "name": "sdrotate", + "parameters": { + "a": 0, + "x": 0.35, + "y": 0, + "z": 0 + }, + "tree_item": "Simple/SDF/Transforms/Rotate", + "type": "sdrotate" + }, + { + "collapsed": true, + "icon": "simple_sdf_transforms_scale", + "name": "sdscale_2", + "parameters": { + "a": 0, + "s": 1, + "x": 0.35, + "y": 0, + "z": 0 + }, + "tree_item": "Simple/SDF/Transforms/Scale", + "type": "sdscale" + }, { "collapsed": false, "tree_item": "3D" }, + { + "collapsed": true, + "icon": "3d_sdf_render", + "name": "raymarching", + "parameters": { + + }, + "tree_item": "3D/SDF/Render", + "type": "raymarching" + }, + { + "collapsed": false, + "tree_item": "3D/SDF/Shapes" + }, { "collapsed": true, "icon": "3d_sdf_shapes_sphere", @@ -1072,6 +988,10 @@ "tree_item": "3D/SDF/Shapes/Torus", "type": "sdf3d_torus" }, + { + "collapsed": false, + "tree_item": "3D/SDF/Operators" + }, { "collapsed": true, "icon": "3d_sdf_operators_boolean", @@ -1187,6 +1107,10 @@ "tree_item": "3D/SDF/Operators/Revolution", "type": "sdf3d_revolution" }, + { + "collapsed": false, + "tree_item": "3D/SDF/Transforms" + }, { "collapsed": true, "icon": "3d_sdf_transforms_translate", @@ -1229,16 +1153,6 @@ "tree_item": "3D/SDF/Transforms/Rotate", "type": "sdf3d_rotate" }, - { - "collapsed": true, - "icon": "3d_sdf_render", - "name": "raymarching", - "parameters": { - - }, - "tree_item": "3D/SDF/Render", - "type": "raymarching" - }, { "collapsed": false, "tree_item": "Pattern" @@ -1630,7 +1544,7 @@ "name": "noise", "parameters": { "density": 0.5, - "size": 4 + "size": 6 }, "tree_item": "Noise", "type": "noise" @@ -2095,7 +2009,7 @@ "name": "color_noise", "parameters": { "density": 0.5, - "size": 9 + "size": 6 }, "tree_item": "Noise/Color", "type": "color_noise" @@ -2428,6 +2342,140 @@ "icon": "miscellaneous_debug", "tree_item": "Miscellaneous/Debug", "type": "debug" + }, + { + "collapsed": true, + "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 + } + ], + "icon": "test", + "nodes": [ + { + "name": "transform_1", + "node_position": { + "x": 6.333313, + "y": 30.75 + }, + "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": 20.333313, + "y": -73.25 + }, + "type": "blend" + }, + { + "amount": 1, + "blend_type": 2, + "name": "blend_1", + "node_position": { + "x": 21.333313, + "y": -177.25 + }, + "type": "blend" + }, + { + "gradient": [ + { + "b": 0, + "g": 0, + "pos": 0, + "r": 0 + }, + { + "b": 1, + "g": 1, + "pos": 0.045455, + "r": 1 + } + ], + "name": "colorize_0", + "node_position": { + "x": -174.666687, + "y": -36.25 + }, + "type": "colorize" + }, + { + "name": "transform_0", + "node_position": { + "x": -190.666687, + "y": 24.75 + }, + "repeat": true, + "rotate": 0, + "scale_x": 1, + "scale_y": 1, + "translate_x": 0.06, + "translate_y": 0.06, + "type": "transform" + }, + { + "mix": 5, + "name": "pattern_0", + "node_position": { + "x": -205.666687, + "y": -134.25 + }, + "type": "pattern", + "x_scale": 8, + "x_wave": 0, + "y_scale": 8, + "y_wave": 0 + } + ], + "tree_item": "test" } ] } \ No newline at end of file diff --git a/addons/material_maker/library/base/simple_sdf_sdshow.png b/addons/material_maker/library/base/simple_sdf_sdshow.png new file mode 100644 index 0000000000000000000000000000000000000000..43e8b2bdc646e96b5f038afd7a21ae329807d9e7 GIT binary patch literal 1505 zcmV<71s?i|P)2BLP5QUF+i4rAm@gloL-v6nRqCgWgYAr>wto{DzB|#@CYFl(wBt8HU7;(s%k0Z_u z?I-{`d|;_V8!)u40ERYTXnlA9`rleeRaJPN2iJ9BSr$ywgsT4H-?lBvvP4l7$g&J+ znxbvnzhc+L0T_mX$z+1jXaq_rT-Sx;I4}$Ynx+8&nx;WjRmk%kS(f4X`5D{o7C(Oc zKvh*2weO+;rqd~IZf-E0PB9*j;rl*3&x7MQFirCSKv|Z^^BifKB1sbb{P`166yf{# z?}(!4Vm4j`fTn3!tyWkrmzdAzn9XK93OvsPAq1vrLf3ySU)MFtvczt;Lz@lz`>i__I{-2+p`R@C^4?+lk@7J$iQP;Ix zd!^0>V7*>rv)LR#SS%Ji3fQi`1t3jR#Bt1bUj(Hn3c9Yt{r$aEd!+(cE|*xXR#>ms z`1I)$Hk%E?FvM!L!hAl*bUMXoG~%cKOSNr_?RJYOia;raZQC#m1FEW`>pBkV;o(7= z&C&o+O0ifhID{|^c_f5kh~;w0cl>u!RTY!T1itU{OrfeO+O|biRVa$$AXCVYGyv1- z6tme3H#av}EEWe4!Z19|sQ=Fq(fR#;&mE8B_}>CRDaCj^#$+<#5a#namdoYI&Wj4e z@Kt(b86t`zDG;QT!oKe#2m*{oqXQ80`MmesVj3Nf#~6)92!a5;5&+kAK`DI& zf)LVsZbHZ_$5|?sq22%-#{nUP4-tkeiB5}aIgZnN?%n`Q(}Zc7uq+Fxj zvyS7ywr$=_nWou$?%n`&UFX9v3_kvp@=jgj<=kxaRc`>Qs`8;I3KT{8ZK2b59dUj( zde7T;0#>57ZOeaNqL*j$ifbu~(tBPh5zuuV@9C?mLRpqln-{*zI;G ziULj3Kv5KEn${aaufKlTsl=AB>cE4BGHIITgj`8&L zbhdF%Pfv*BnD0J2ST#+9X__E}fKrMe2+qz3Csh)nr=FLD7`mWA8fTWFfb z4Y6$-wr#_8T|UHvk$vEi=Q#&M2>ERZTh}$uB6*&pEK9U)dvM^nuFE6AvMhL>caR>N zror9a-LY;R51{Kh4uPe=mk}X$hL&aV6e-^70KXb2cHISl|DM$mRaJ4vnWKb|1IGy= z@O}Tl@wRPocXx-bJN^^@le-B9fz{+92(c?-cV;2QNtW$&a&6yZi_nCd7$T|sBPPr&1QY3cvB48 zF;!llIs>?VKi~@B3SejhhSn9p&;|^xD}bR57+O~VLmM!(t^kHMU}#+d3~j*Bx&j#5 zfT48-Fthtx8hldBL-`gERX9IW-&I4xxcrVTaX8?G7e8l79<0Whv zL?;1wPdm?~;K=_S_B`*xrpQ&ArboT+XaMh3AHER!@Bsb;$k-7mxybE>00000NkvXX Hu0mjfa}mpE literal 0 HcmV?d00001 diff --git a/addons/material_maker/library/base/simple_sdf_transforms_rotate.png b/addons/material_maker/library/base/simple_sdf_transforms_rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..1f0a166a7b8c5e98319aa5f98b121197f9f710b6 GIT binary patch literal 4693 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 Date: Wed, 25 Dec 2019 13:45:45 +0100 Subject: [PATCH 15/15] Updated base library --- addons/material_maker/library/base.json | 154 ++---------------- .../base/simple_sdf_operators_sdshow.png | Bin 1505 -> 0 bytes .../library/base/simple_sdf_shapes_sdarc.png | Bin 0 -> 4807 bytes 3 files changed, 18 insertions(+), 136 deletions(-) delete mode 100644 addons/material_maker/library/base/simple_sdf_operators_sdshow.png create mode 100644 addons/material_maker/library/base/simple_sdf_shapes_sdarc.png diff --git a/addons/material_maker/library/base.json b/addons/material_maker/library/base.json index 0df2ef2..adf3eb7 100644 --- a/addons/material_maker/library/base.json +++ b/addons/material_maker/library/base.json @@ -777,6 +777,22 @@ "tree_item": "Simple/SDF/Shapes/sdRhombus", "type": "sdrhombus" }, + { + "collapsed": true, + "icon": "simple_sdf_shapes_sdarc", + "name": "sdarc", + "parameters": { + "a1": 0, + "a2": 0, + "cx": 0, + "cy": 0, + "r": 0.4, + "r1": 0.3, + "r2": 0.1 + }, + "tree_item": "Simple/SDF/Shapes/sdArc", + "type": "sdarc" + }, { "collapsed": false, "tree_item": "Simple/SDF/Operators" @@ -1544,7 +1560,7 @@ "name": "noise", "parameters": { "density": 0.5, - "size": 6 + "size": 4 }, "tree_item": "Noise", "type": "noise" @@ -2009,7 +2025,7 @@ "name": "color_noise", "parameters": { "density": 0.5, - "size": 6 + "size": 9 }, "tree_item": "Noise/Color", "type": "color_noise" @@ -2342,140 +2358,6 @@ "icon": "miscellaneous_debug", "tree_item": "Miscellaneous/Debug", "type": "debug" - }, - { - "collapsed": true, - "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 - } - ], - "icon": "test", - "nodes": [ - { - "name": "transform_1", - "node_position": { - "x": 6.333313, - "y": 30.75 - }, - "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": 20.333313, - "y": -73.25 - }, - "type": "blend" - }, - { - "amount": 1, - "blend_type": 2, - "name": "blend_1", - "node_position": { - "x": 21.333313, - "y": -177.25 - }, - "type": "blend" - }, - { - "gradient": [ - { - "b": 0, - "g": 0, - "pos": 0, - "r": 0 - }, - { - "b": 1, - "g": 1, - "pos": 0.045455, - "r": 1 - } - ], - "name": "colorize_0", - "node_position": { - "x": -174.666687, - "y": -36.25 - }, - "type": "colorize" - }, - { - "name": "transform_0", - "node_position": { - "x": -190.666687, - "y": 24.75 - }, - "repeat": true, - "rotate": 0, - "scale_x": 1, - "scale_y": 1, - "translate_x": 0.06, - "translate_y": 0.06, - "type": "transform" - }, - { - "mix": 5, - "name": "pattern_0", - "node_position": { - "x": -205.666687, - "y": -134.25 - }, - "type": "pattern", - "x_scale": 8, - "x_wave": 0, - "y_scale": 8, - "y_wave": 0 - } - ], - "tree_item": "test" } ] } \ No newline at end of file diff --git a/addons/material_maker/library/base/simple_sdf_operators_sdshow.png b/addons/material_maker/library/base/simple_sdf_operators_sdshow.png deleted file mode 100644 index 43e8b2bdc646e96b5f038afd7a21ae329807d9e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1505 zcmV<71s?i|P)2BLP5QUF+i4rAm@gloL-v6nRqCgWgYAr>wto{DzB|#@CYFl(wBt8HU7;(s%k0Z_u z?I-{`d|;_V8!)u40ERYTXnlA9`rleeRaJPN2iJ9BSr$ywgsT4H-?lBvvP4l7$g&J+ znxbvnzhc+L0T_mX$z+1jXaq_rT-Sx;I4}$Ynx+8&nx;WjRmk%kS(f4X`5D{o7C(Oc zKvh*2weO+;rqd~IZf-E0PB9*j;rl*3&x7MQFirCSKv|Z^^BifKB1sbb{P`166yf{# z?}(!4Vm4j`fTn3!tyWkrmzdAzn9XK93OvsPAq1vrLf3ySU)MFtvczt;Lz@lz`>i__I{-2+p`R@C^4?+lk@7J$iQP;Ix zd!^0>V7*>rv)LR#SS%Ji3fQi`1t3jR#Bt1bUj(Hn3c9Yt{r$aEd!+(cE|*xXR#>ms z`1I)$Hk%E?FvM!L!hAl*bUMXoG~%cKOSNr_?RJYOia;raZQC#m1FEW`>pBkV;o(7= z&C&o+O0ifhID{|^c_f5kh~;w0cl>u!RTY!T1itU{OrfeO+O|biRVa$$AXCVYGyv1- z6tme3H#av}EEWe4!Z19|sQ=Fq(fR#;&mE8B_}>CRDaCj^#$+<#5a#namdoYI&Wj4e z@Kt(b86t`zDG;QT!oKe#2m*{oqXQ80`MmesVj3Nf#~6)92!a5;5&+kAK`DI& zf)LVsZbHZ_$5|?sq22%-#{nUP4-tkeiB5}aIgZnN?%n`Q(}Zc7uq+Fxj zvyS7ywr$=_nWou$?%n`&UFX9v3_kvp@=jgj<=kxaRc`>Qs`8;I3KT{8ZK2b59dUj( zde7T;0#>57ZOeaNqL*j$ifbu~(tBPh5zuuV@9C?mLRpqln-{*zI;G ziULj3Kv5KEn${aaufKlTsl=AB>cE4BGHIITgj`8&L zbhdF%Pfv*BnD0J2ST#+9X__E}fKrMe2+qz3Csh)nr=FLD7`mWA8fTWFfb z4Y6$-wr#_8T|UHvk$vEi=Q#&M2>ERZTh}$uB6*&pEK9U)dvM^nuFE6AvMhL>caR>N zror9a-LY;R51{Kh4uPe=mk}X$hL&aV6e-^70KXb2cHISl|DM$mRaJ4vnWKb|1IGy= z@O}Tl@wRPocXx-bJN^^@le-B9fz{+92(c?-cV;2QNtW$&a&6yZi_nCd7$T|sBPPr&1QY3cvB48 zF;!llIs>?VKi~@B3SejhhSn9p&;|^xD}bR57+O~VLmM!(t^kHMU}#+d3~j*Bx&j#5 zfT48-Fthtx8hldBL-`gERX9IW-&I4xxcrVTaX8?G7e8l79<0Whv zL?;1wPdm?~;K=_S_B`*xrpQ&ArboT+XaMh3AHER!@Bsb;$k-7mxybE>00000NkvXX Hu0mjfa}mpE diff --git a/addons/material_maker/library/base/simple_sdf_shapes_sdarc.png b/addons/material_maker/library/base/simple_sdf_shapes_sdarc.png new file mode 100644 index 0000000000000000000000000000000000000000..dca4d064bcbfed01d21cb4daeeae3becb3cb8035 GIT binary patch literal 4807 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 literal 0 HcmV?d00001