Updated custom file generation in export and Godot export

This commit is contained in:
RodZill4 2020-02-19 08:33:52 +01:00
parent 6883561beb
commit 4d73ff1a2b
5 changed files with 74 additions and 34 deletions

View File

@ -70,7 +70,6 @@ func set_parameter(p, v) -> void:
update_preview() update_preview()
func source_changed(input_index : int) -> void: func source_changed(input_index : int) -> void:
print("source_changed "+str(input_index))
for t in TEXTURE_LIST: for t in TEXTURE_LIST:
if t.has("sources") and t.sources.find(input_index) != -1: if t.has("sources") and t.sources.find(input_index) != -1:
generated_textures[t.texture] = null generated_textures[t.texture] = null
@ -163,7 +162,7 @@ func update_material(m, file_prefix = null) -> void:
else: else:
m.normal_enabled = false m.normal_enabled = false
# Depth # 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_enabled = true
m.depth_deep_parallax = true m.depth_deep_parallax = true
m.depth_scale = parameters.depth_scale * 0.2 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: func subst_string(s : String, export_context : Dictionary) -> String:
for k in export_context.keys(): for k in export_context.keys():
s = s.replace("$("+k+")", export_context[k]) s = s.replace(k, export_context[k])
for input_index in range(shader_model.inputs.size()): while (true):
var input = shader_model.inputs[input_index] var search_string = "$(expr:"
var is_input_connected = "true" if get_source(input_index) != null else "false" var position = s.find(search_string)
s = s.replace("$(connected:"+input.name+")", is_input_connected) 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 return s
func create_file_from_template(template : String, file_name : String, export_context : Dictionary) -> bool: 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 expr = Expression.new()
var error = expr.parse(condition, []) var error = expr.parse(condition, [])
if error != OK: if error != OK:
print("Error in expression: "+expr.get_error_text()) print("Error in expression "+condition+": "+expr.get_error_text())
continue continue
skip_state.push_back(!expr.execute()) skip_state.push_back(!expr.execute())
elif l.left(3) == "$fi": 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: func export_material(prefix, profile) -> void:
var export_context : Dictionary = { var export_context : Dictionary = {
path_prefix=prefix, "$(path_prefix)":prefix,
file_prefix=prefix.get_file() "$(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: for f in shader_model.exports[profile].files:
match f.type: match f.type:
"texture": "texture":

View File

@ -6,17 +6,17 @@ var types : Dictionary = {}
func _ready(): func _ready():
var file = File.new() var file = File.new()
if file.open("res://addons/material_maker/nodes/io_types.mmt", File.READ) != OK: for p in mm_loader.get_nodes_paths():
print("Cannot read types") if file.open(p+"/io_types.mmt", File.READ) == OK:
return false var type_list = parse_json(file.get_as_text())
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()
file.close() 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

View File

@ -8,9 +8,12 @@ var predefined_generators = {}
func _ready()-> void: func _ready()-> void:
update_predefined_generators() 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: func update_predefined_generators()-> void:
predefined_generators = {} 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() var dir = Directory.new()
if dir.open(path) == OK: if dir.open(path) == OK:
dir.list_dir_begin() dir.list_dir_begin()
@ -24,7 +27,7 @@ func update_predefined_generators()-> void:
file_name = dir.get_next() file_name = dir.get_next()
func generator_name_from_path(path : String) -> String: 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(p)
print(path.get_base_dir()) print(path.get_base_dir())
return path.get_basename().get_file() return path.get_basename().get_file()
@ -101,7 +104,7 @@ func create_gen(data) -> MMGenBase:
func get_generator_list() -> Array: func get_generator_list() -> Array:
var rv = [] var rv = []
var dir : Directory = Directory.new() 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.open(p)
dir.list_dir_begin(true) dir.list_dir_begin(true)
while true: while true:

View File

@ -14,34 +14,38 @@ $if $(connected:depth_tex)
$fi $fi
[resource] [resource]
albedo_color = Color($(param:albedo_color.r), $(param:albedo_color.g), $(param:albedo_color.b), $(param:albedo_color.a))
$if $(connected:albedo_tex) $if $(connected:albedo_tex)
albedo_texture = ExtResource( 1 ) albedo_texture = ExtResource( 1 )
$fi $fi
metallic = 1.0 metallic = $(param:metallic)
$if $(connected:metallic_tex) $if $(connected:metallic_tex)
metallic_texture = ExtResource( 2 ) metallic_texture = ExtResource( 2 )
metallic_texture_channel = 2 metallic_texture_channel = 2
$fi $fi
roughness = $(param:roughness)
$if $(connected:ao_tex) or $(connected:roughness_tex) or $(connected:metallic_tex) $if $(connected:ao_tex) or $(connected:roughness_tex) or $(connected:metallic_tex)
roughness_texture = ExtResource( 2 ) roughness_texture = ExtResource( 2 )
roughness_texture_channel = 1 roughness_texture_channel = 1
$fi $fi
$if $(connected:normal_tex) $if $(connected:normal_tex)
normal_enabled = true normal_enabled = true
normal_scale = 1.0 normal_scale = $(param:normal)
normal_texture = ExtResource( 3 ) normal_texture = ExtResource( 3 )
$fi $fi
$if $(connected:ao_tex) $if $(connected:ao_tex)
ao_enabled = true ao_enabled = true
ao_light_affect = 0.0 ao_light_affect = $(param:ao)
ao_texture = ExtResource( 2 ) ao_texture = ExtResource( 2 )
ao_on_uv2 = false ao_on_uv2 = false
ao_texture_channel = 0 ao_texture_channel = 0
$fi $fi
$if $(connected:depth_tex) $if $(connected:depth_tex)
depth_enabled = true depth_enabled = true
depth_scale = 0.05 depth_scale = $(expr:0.2*$(param:depth_scale))
depth_deep_parallax = false depth_deep_parallax = true
depth_min_layers = 8
depth_max_layers = 32
depth_flip_tangent = false depth_flip_tangent = false
depth_flip_binormal = false depth_flip_binormal = false
depth_texture = ExtResource( 4 ) depth_texture = ExtResource( 4 )

View File

@ -5,7 +5,7 @@
"y": 0 "y": 0
}, },
"parameters": { "parameters": {
"albedo": { "albedo_color": {
"a": 1, "a": 1,
"b": 1, "b": 1,
"g": 1, "g": 1,
@ -13,7 +13,7 @@
"type": "Color" "type": "Color"
}, },
"ao": 1, "ao": 1,
"depth": 0.5, "depth_scale": 0.5,
"emission": 1, "emission": 1,
"metallic": 1, "metallic": 1,
"normal": 1, "normal": 1,
@ -294,7 +294,7 @@
"label": "Depth", "label": "Depth",
"max": 1, "max": 1,
"min": 0, "min": 0,
"name": "depth", "name": "depth_scale",
"step": 0.01, "step": 0.01,
"type": "float" "type": "float"
}, },