diff --git a/addons/material_maker/engine/gen_material.gd b/addons/material_maker/engine/gen_material.gd index 39e82f6..046f79c 100644 --- a/addons/material_maker/engine/gen_material.gd +++ b/addons/material_maker/engine/gen_material.gd @@ -70,7 +70,6 @@ func set_parameter(p, v) -> void: update_preview() func source_changed(input_index : int) -> void: - print("source_changed "+str(input_index)) for t in TEXTURE_LIST: if t.has("sources") and t.sources.find(input_index) != -1: generated_textures[t.texture] = null @@ -163,7 +162,7 @@ func update_material(m, file_prefix = null) -> void: else: m.normal_enabled = false # Depth - if get_source(INPUT_DEPTH) != null and parameters.depth > 0: + if get_source(INPUT_DEPTH) != null and parameters.depth_scale > 0: m.depth_enabled = true m.depth_deep_parallax = true m.depth_scale = parameters.depth_scale * 0.2 @@ -203,11 +202,28 @@ func get_export_extension(profile : String) -> String: func subst_string(s : String, export_context : Dictionary) -> String: for k in export_context.keys(): - s = s.replace("$("+k+")", export_context[k]) - for input_index in range(shader_model.inputs.size()): - var input = shader_model.inputs[input_index] - var is_input_connected = "true" if get_source(input_index) != null else "false" - s = s.replace("$(connected:"+input.name+")", is_input_connected) + s = s.replace(k, export_context[k]) + while (true): + var search_string = "$(expr:" + var position = s.find(search_string) + if position == -1: + break + var parenthesis_level = 0 + var expr_begin = position+search_string.length() + for i in range(expr_begin, s.length()): + if s[i] == '(': + parenthesis_level += 1 + elif s[i] == ')': + if parenthesis_level == 0: + var expression = s.substr(expr_begin, i-expr_begin) + var expr = Expression.new() + var error = expr.parse(expression, []) + if error == OK: + s = s.replace(s.substr(position, i+1-position), str(expr.execute())) + else: + s = s.replace(s.substr(position, i+1-position), "EXPRESSION ERROR ("+expression+")") + break + parenthesis_level -= 1 return s func create_file_from_template(template : String, file_name : String, export_context : Dictionary) -> bool: @@ -228,7 +244,7 @@ func create_file_from_template(template : String, file_name : String, export_con var expr = Expression.new() var error = expr.parse(condition, []) if error != OK: - print("Error in expression: "+expr.get_error_text()) + print("Error in expression "+condition+": "+expr.get_error_text()) continue skip_state.push_back(!expr.execute()) elif l.left(3) == "$fi": @@ -241,9 +257,26 @@ func create_file_from_template(template : String, file_name : String, export_con func export_material(prefix, profile) -> void: var export_context : Dictionary = { - path_prefix=prefix, - file_prefix=prefix.get_file() + "$(path_prefix)":prefix, + "$(file_prefix)":prefix.get_file() } + for i in range(shader_model.inputs.size()): + var input = shader_model.inputs[i] + export_context["$(connected:"+input.name+")"] = "true" if get_source(i) != null else "false" + for p in shader_model.parameters: + var value = p.default + if parameters.has(p.name): + value = parameters[p.name] + match p.type: + "float", "size": + export_context["$(param:"+p.name+")"] = str(value) + "color": + export_context["$(param:"+p.name+".r)"] = str(value.r) + export_context["$(param:"+p.name+".g)"] = str(value.g) + export_context["$(param:"+p.name+".b)"] = str(value.b) + export_context["$(param:"+p.name+".a)"] = str(value.a) + _: + print(p.type+" not supported in material") for f in shader_model.exports[profile].files: match f.type: "texture": diff --git a/addons/material_maker/engine/io_types.gd b/addons/material_maker/engine/io_types.gd index 5bf862f..c16e324 100644 --- a/addons/material_maker/engine/io_types.gd +++ b/addons/material_maker/engine/io_types.gd @@ -6,17 +6,17 @@ var types : Dictionary = {} func _ready(): var file = File.new() - if file.open("res://addons/material_maker/nodes/io_types.mmt", File.READ) != OK: - print("Cannot read types") - return false - var type_list = parse_json(file.get_as_text()) - file.close() - for t in type_list: - if t.has("label"): - type_names.push_back(t.name) - var c = t.color - t.color = Color(c.r, c.g, c.b, c.a) - if file.open("res://addons/material_maker/nodes/preview_"+t.name+".shader", File.READ) == OK: - t.preview = file.get_as_text() + for p in mm_loader.get_nodes_paths(): + if file.open(p+"/io_types.mmt", File.READ) == OK: + var type_list = parse_json(file.get_as_text()) file.close() - types[t.name] = t + for t in type_list: + if t.has("label"): + type_names.push_back(t.name) + var c = t.color + t.color = Color(c.r, c.g, c.b, c.a) + if file.open(p+"/preview_"+t.name+".shader", File.READ) == OK: + t.preview = file.get_as_text() + file.close() + types[t.name] = t + break diff --git a/addons/material_maker/engine/loader.gd b/addons/material_maker/engine/loader.gd index 52281f4..97db0e4 100644 --- a/addons/material_maker/engine/loader.gd +++ b/addons/material_maker/engine/loader.gd @@ -8,9 +8,12 @@ var predefined_generators = {} func _ready()-> void: update_predefined_generators() +func get_nodes_paths() -> Array: + return [ STD_GENDEF_PATH, OS.get_executable_path().get_base_dir()+"/nodes" ] + func update_predefined_generators()-> void: predefined_generators = {} - for path in [ STD_GENDEF_PATH, OS.get_executable_path().get_base_dir()+"/generators" ]: + for path in get_nodes_paths(): var dir = Directory.new() if dir.open(path) == OK: dir.list_dir_begin() @@ -24,7 +27,7 @@ func update_predefined_generators()-> void: file_name = dir.get_next() func generator_name_from_path(path : String) -> String: - for p in [ STD_GENDEF_PATH, OS.get_executable_path().get_base_dir()+"/generators" ]: + for p in get_nodes_paths(): print(p) print(path.get_base_dir()) return path.get_basename().get_file() @@ -101,7 +104,7 @@ func create_gen(data) -> MMGenBase: func get_generator_list() -> Array: var rv = [] var dir : Directory = Directory.new() - for p in [ STD_GENDEF_PATH, OS.get_executable_path().get_base_dir()+"/generators" ]: + for p in get_nodes_paths(): dir.open(p) dir.list_dir_begin(true) while true: diff --git a/addons/material_maker/nodes/godot.tres.tmpl b/addons/material_maker/nodes/godot.tres.tmpl index 7238237..fd6d6bd 100644 --- a/addons/material_maker/nodes/godot.tres.tmpl +++ b/addons/material_maker/nodes/godot.tres.tmpl @@ -14,34 +14,38 @@ $if $(connected:depth_tex) $fi [resource] +albedo_color = Color($(param:albedo_color.r), $(param:albedo_color.g), $(param:albedo_color.b), $(param:albedo_color.a)) $if $(connected:albedo_tex) albedo_texture = ExtResource( 1 ) $fi -metallic = 1.0 +metallic = $(param:metallic) $if $(connected:metallic_tex) metallic_texture = ExtResource( 2 ) metallic_texture_channel = 2 $fi +roughness = $(param:roughness) $if $(connected:ao_tex) or $(connected:roughness_tex) or $(connected:metallic_tex) roughness_texture = ExtResource( 2 ) roughness_texture_channel = 1 $fi $if $(connected:normal_tex) normal_enabled = true -normal_scale = 1.0 +normal_scale = $(param:normal) normal_texture = ExtResource( 3 ) $fi $if $(connected:ao_tex) ao_enabled = true -ao_light_affect = 0.0 +ao_light_affect = $(param:ao) ao_texture = ExtResource( 2 ) ao_on_uv2 = false ao_texture_channel = 0 $fi $if $(connected:depth_tex) depth_enabled = true -depth_scale = 0.05 -depth_deep_parallax = false +depth_scale = $(expr:0.2*$(param:depth_scale)) +depth_deep_parallax = true +depth_min_layers = 8 +depth_max_layers = 32 depth_flip_tangent = false depth_flip_binormal = false depth_texture = ExtResource( 4 ) diff --git a/addons/material_maker/nodes/material.mmg b/addons/material_maker/nodes/material.mmg index b7203d8..cf49226 100644 --- a/addons/material_maker/nodes/material.mmg +++ b/addons/material_maker/nodes/material.mmg @@ -5,7 +5,7 @@ "y": 0 }, "parameters": { - "albedo": { + "albedo_color": { "a": 1, "b": 1, "g": 1, @@ -13,7 +13,7 @@ "type": "Color" }, "ao": 1, - "depth": 0.5, + "depth_scale": 0.5, "emission": 1, "metallic": 1, "normal": 1, @@ -294,7 +294,7 @@ "label": "Depth", "max": 1, "min": 0, - "name": "depth", + "name": "depth_scale", "step": 0.01, "type": "float" },