mirror of
https://github.com/Relintai/material-maker.git
synced 2024-11-13 06:27:18 +01:00
Updated normal map generator and fixed bugs
This commit is contained in:
parent
b60085edd1
commit
e41c509e9f
@ -7,6 +7,8 @@ var connections = []
|
||||
|
||||
var editable = false
|
||||
|
||||
signal connections_changed(removed_connections, added_connections)
|
||||
|
||||
func fix_remotes() -> void:
|
||||
for c in get_children():
|
||||
if c is MMGenRemote:
|
||||
@ -79,7 +81,7 @@ func get_port_targets(gen_name: String, output_index: int) -> Array:
|
||||
rv.push_back(InputPort.new(tgt_gen, c.to_port))
|
||||
return rv
|
||||
|
||||
func add_generator(generator : MMGenBase) -> void:
|
||||
func add_generator(generator : MMGenBase) -> bool:
|
||||
var name = generator.name
|
||||
var index = 1
|
||||
while has_node(name):
|
||||
@ -87,8 +89,11 @@ func add_generator(generator : MMGenBase) -> void:
|
||||
name = generator.name + "_" + str(index)
|
||||
generator.name = name
|
||||
add_child(generator)
|
||||
return true
|
||||
|
||||
func remove_generator(generator : MMGenBase) -> void:
|
||||
func remove_generator(generator : MMGenBase) -> bool:
|
||||
if !generator.can_be_deleted():
|
||||
return false
|
||||
var new_connections = []
|
||||
for c in connections:
|
||||
if c.from != generator.name and c.to != generator.name:
|
||||
@ -96,8 +101,8 @@ func remove_generator(generator : MMGenBase) -> void:
|
||||
connections = new_connections
|
||||
remove_child(generator)
|
||||
fix_remotes()
|
||||
add_child(generator)
|
||||
generator.queue_free()
|
||||
return true
|
||||
|
||||
func replace_generator(old : MMGenBase, new : MMGenBase) -> void:
|
||||
new.name = old.name
|
||||
@ -106,6 +111,20 @@ func replace_generator(old : MMGenBase, new : MMGenBase) -> void:
|
||||
old.free()
|
||||
add_child(new)
|
||||
|
||||
func get_connected_inputs(generator) -> Array:
|
||||
var rv : Array = []
|
||||
for c in connections:
|
||||
if c.to == generator.name:
|
||||
rv.push_back(c.to_port)
|
||||
return rv
|
||||
|
||||
func get_connected_outputs(generator) -> Array:
|
||||
var rv : Array = []
|
||||
for c in connections:
|
||||
if c.from == generator.name:
|
||||
rv.push_back(c.from_port)
|
||||
return rv
|
||||
|
||||
func connect_children(from, from_port : int, to, to_port : int) -> bool:
|
||||
# check the new connection does not create a loop
|
||||
var spreadlist = [ InputPort.new(to, to_port) ]
|
||||
@ -128,18 +147,51 @@ func connect_children(from, from_port : int, to, to_port : int) -> bool:
|
||||
connections.remove(remove)
|
||||
# create new connection
|
||||
connections.append({from=from.name, from_port=from_port, to=to.name, to_port=to_port})
|
||||
to.source_changed(to_port)
|
||||
return true
|
||||
|
||||
func disconnect_children(from, from_port : int, to, to_port : int) -> bool:
|
||||
while true:
|
||||
var remove = -1
|
||||
for i in connections.size():
|
||||
if connections[i].from == from.name and connections[i].from_port == from_port and connections[i].to == to.name and connections[i].to_port == to_port:
|
||||
remove = i
|
||||
break
|
||||
if remove == -1:
|
||||
break
|
||||
connections.remove(remove)
|
||||
var new_connections : Array = []
|
||||
for c in connections:
|
||||
if c.from != from.name or c.from_port != from_port or c.to != to.name or c.to_port != to_port:
|
||||
new_connections.push_back(c)
|
||||
else:
|
||||
to.source_changed(to_port)
|
||||
connections = new_connections
|
||||
return true
|
||||
|
||||
func reconnect_inputs(generator, reconnects : Dictionary) -> bool:
|
||||
var new_connections : Array = []
|
||||
var added_connections : Array = []
|
||||
var removed_connections : Array = []
|
||||
for c in connections:
|
||||
if c.to == generator.name and reconnects.has(c.to_port):
|
||||
removed_connections.push_back(c.duplicate(true))
|
||||
if reconnects[c.to_port] < 0:
|
||||
continue
|
||||
c.to_port = reconnects[c.to_port]
|
||||
added_connections.push_back(c.duplicate(true))
|
||||
new_connections.push_back(c)
|
||||
connections = new_connections
|
||||
if !removed_connections.empty():
|
||||
emit_signal("connections_changed", removed_connections, added_connections)
|
||||
return true
|
||||
|
||||
func reconnect_outputs(generator, reconnects : Dictionary) -> bool:
|
||||
var new_connections : Array = []
|
||||
var added_connections : Array = []
|
||||
var removed_connections : Array = []
|
||||
for c in connections:
|
||||
if c.from == generator.name and reconnects.has(c.from_port):
|
||||
removed_connections.push_back(c.duplicate(true))
|
||||
if reconnects[c.from_port] < 0:
|
||||
continue
|
||||
c.from_port = reconnects[c.from_port]
|
||||
added_connections.push_back(c.duplicate(true))
|
||||
new_connections.push_back(c)
|
||||
connections = new_connections
|
||||
if !removed_connections.empty():
|
||||
emit_signal("connections_changed", removed_connections, added_connections)
|
||||
return true
|
||||
|
||||
func _get_shader_code(uv : String, output_index : int, context : MMGenContext) -> Dictionary:
|
||||
|
@ -106,13 +106,18 @@ func replace_input(string, context, input, type, src, default) -> Dictionary:
|
||||
src_code = yield(src_code, "completed")
|
||||
src_code.string = src_code[type]
|
||||
# Add global definitions
|
||||
if src_code.has("globals"):
|
||||
for d in src_code.globals:
|
||||
if required_globals.find(d) == -1:
|
||||
required_globals.push_back(d)
|
||||
# Add generated definitions
|
||||
if src_code.has("defs"):
|
||||
required_defs += src_code.defs
|
||||
# Add generated code
|
||||
if src_code.has("code"):
|
||||
required_code += src_code.code
|
||||
# Add textures
|
||||
if src_code.has("textures"):
|
||||
required_textures = src_code.textures
|
||||
string = string.replace("$%s(%s)" % [ input, uv ], src_code.string)
|
||||
return { string=string, globals=required_globals, defs=required_defs, code=required_code, textures=required_textures, new_pass_required=new_pass_required }
|
||||
@ -165,6 +170,8 @@ func subst(string, context, uv = "") -> Dictionary:
|
||||
elif p.type == "size":
|
||||
value_string = "%.9f" % pow(2, value)
|
||||
elif p.type == "enum":
|
||||
if value >= p.values.size():
|
||||
value = 0
|
||||
value_string = p.values[value].value
|
||||
elif p.type == "color":
|
||||
value_string = "vec4(%.9f, %.9f, %.9f, %.9f)" % [ value.r, value.g, value.b, value.a ]
|
||||
|
@ -54,10 +54,17 @@ func connect_node(from, from_slot, to, to_slot):
|
||||
func disconnect_node(from, from_slot, to, to_slot) -> void:
|
||||
if generator.disconnect_children(get_node(from).generator, from_slot, get_node(to).generator, to_slot):
|
||||
.disconnect_node(from, from_slot, to, to_slot)
|
||||
send_changed_signal();
|
||||
send_changed_signal()
|
||||
|
||||
func on_connections_changed(removed_connections : Array, added_connections : Array) -> void:
|
||||
print("connections_changed")
|
||||
for c in removed_connections:
|
||||
.disconnect_node("node_"+c.from, c.from_port, "node_"+c.to, c.to_port)
|
||||
for c in added_connections:
|
||||
.connect_node("node_"+c.from, c.from_port, "node_"+c.to, c.to_port)
|
||||
|
||||
func remove_node(node) -> void:
|
||||
generator.remove_generator(node.generator)
|
||||
if generator.remove_generator(node.generator):
|
||||
var node_name = node.name
|
||||
for c in get_connection_list():
|
||||
if c.from == node_name or c.to == node_name:
|
||||
@ -111,8 +118,12 @@ func center_view() -> void:
|
||||
scroll_offset = center - 0.5*rect_size
|
||||
|
||||
func update_view(g) -> void:
|
||||
if generator != null:
|
||||
generator.disconnect("connections_changed", self, "on_connections_changed")
|
||||
clear_view()
|
||||
generator = g
|
||||
if generator != null:
|
||||
generator.connect("connections_changed", self, "on_connections_changed")
|
||||
update_graph(generator.get_children(), generator.connections)
|
||||
subgraph_ui.visible = generator != top_generator
|
||||
subgraph_ui.get_node("Label").text = generator.label
|
||||
|
@ -59,9 +59,8 @@ func get_preview_texture(data : Dictionary) -> ImageTexture:
|
||||
if data.has("icon") and data.has("library"):
|
||||
var image_path = data.library.left(data.library.rfind("."))+"/"+data.icon+".png"
|
||||
var t : ImageTexture
|
||||
if false && image_path.left(6) == "res://":
|
||||
t = load(image_path) as ImageTexture
|
||||
else:
|
||||
if image_path.left(6) == "res://":
|
||||
image_path = ProjectSettings.globalize_path(image_path)
|
||||
t = ImageTexture.new()
|
||||
var image : Image = Image.new()
|
||||
image.load(image_path)
|
||||
|
@ -1 +1 @@
|
||||
{"connections":[{"from":"nm_convolution","from_port":0,"to":"nm_postprocess","to_port":0},{"from":"nm_postprocess","from_port":0,"to":"gen_outputs","to_port":0},{"from":"gen_inputs","from_port":0,"to":"buffer","to_port":0},{"from":"buffer","from_port":0,"to":"nm_convolution","to_port":0}],"label":"Normal Map","name":"normal_map","node_position":{"x":0,"y":0},"nodes":[{"name":"buffer","node_position":{"x":-687.663818,"y":125.60614},"parameters":{"size":10},"type":"buffer"},{"convolution_params":{"input_type":"f","matrix":[[[-1,-1,0],[0,-2,0],[1,-1,0]],[[-2,0,0],0,[2,0,0]],[[-1,1,0],[0,2,0],[1,1,0]]],"output_type":"rgb","x":1,"y":1},"name":"nm_convolution","node_position":{"x":-690.25,"y":174.25},"parameters":{"size":10},"type":"convolution"},{"name":"nm_postprocess","node_position":{"x":-690.25,"y":222.25},"parameters":{"amount":0.995,"size":10},"shader_model":{"code":"","global":"","inputs":[{"default":"vec3(0.0)","label":"","name":"in","type":"rgb"}],"instance":"","name":"NormalMapPostProcess","outputs":[{"rgb":"0.5*normalize($in($uv)*$amount*vec3(-1.0, 1.0, 1.0)*$size/128.0-vec3(0.0, 0.0, 1.0))+vec3(0.5)","type":"rgb"}],"parameters":[{"default":9,"first":4,"label":"","last":11,"name":"size","type":"size"},{"default":1,"label":"","max":2,"min":0,"name":"amount","step":0.005,"type":"float"}]},"type":"shader"},{"name":"gen_parameters","node_position":{"x":-718.910156,"y":26.083313},"parameters":{"param0":10,"param1":0.995},"type":"remote","widgets":[{"label":"Size","linked_widgets":[{"node":"buffer","widget":"size"},{"node":"nm_convolution","widget":"size"},{"node":"nm_postprocess","widget":"size"}],"type":"linked_control"},{"label":"Amount","linked_widgets":[{"node":"nm_postprocess","widget":"amount"}],"type":"linked_control"}]},{"name":"gen_outputs","node_position":{"x":-407.663818,"y":151.047363},"parameters":{},"ports":[{"name":"port0","type":"rgba"}],"type":"ios"},{"name":"gen_inputs","node_position":{"x":-870.910156,"y":157.047363},"parameters":{},"ports":[{"name":"port0","type":"rgba"}],"type":"ios"}],"parameters":{"param0":10,"param1":0.995},"type":"graph"}
|
||||
{"connections":[{"from":"nm_convolution","from_port":0,"to":"nm_postprocess","to_port":0},{"from":"nm_postprocess","from_port":0,"to":"gen_outputs","to_port":0},{"from":"gen_inputs","from_port":0,"to":"buffer","to_port":0},{"from":"buffer","from_port":0,"to":"nm_convolution","to_port":0}],"label":"Normal Map","name":"normal_map","node_position":{"x":0,"y":0},"nodes":[{"name":"buffer","node_position":{"x":-687.663818,"y":125.60614},"parameters":{"size":10},"type":"buffer"},{"convolution_params":{"input_type":"f","matrix":[[[-1,-1,0],[0,-2,0],[1,-1,0]],[[-2,0,0],0,[2,0,0]],[[-1,1,0],[0,2,0],[1,1,0]]],"output_type":"rgb","x":1,"y":1},"name":"nm_convolution","node_position":{"x":-690.25,"y":174.25},"parameters":{"size":10},"type":"convolution"},{"name":"nm_postprocess","node_position":{"x":-690.25,"y":222.25},"parameters":{"amount":1,"format":0,"size":10,"type":0},"shader_model":{"code":"","global":"vec3 process_normal_default(vec3 v, float multiplier) {\n\treturn 0.5*normalize(v.xyz*multiplier+vec3(0.0, 0.0, -1.0))+vec3(0.5);\n}\n\nvec3 process_normal_opengl(vec3 v, float multiplier) {\n\treturn 0.5*normalize(v.xyz*multiplier+vec3(0.0, 0.0, 1.0))+vec3(0.5);\n}\n\nvec3 process_normal_directx(vec3 v, float multiplier) {\n\treturn 0.5*normalize(v.xyz*vec3(1.0, -1.0, 1.0)*multiplier+vec3(0.0, 0.0, 1.0))+vec3(0.5);\n}\n","inputs":[{"default":"vec3(0.0)","label":"","name":"in","type":"rgb"}],"instance":"","name":"NormalMapPostProcess","outputs":[{"rgb":"process_normal_$format($in($uv).xyz, $amount*$size/128.0)","type":"rgb"}],"parameters":[{"default":0,"label":"","name":"format","type":"enum","values":[{"name":"Default","value":"default"},{"name":"OpenGL","value":"opengl"},{"name":"DirectX","value":"directx"}]},{"default":9,"first":4,"label":"","last":11,"name":"size","type":"size"},{"default":1,"label":"","max":2,"min":0,"name":"amount","step":0.005,"type":"float"}]},"type":"shader"},{"name":"gen_parameters","node_position":{"x":-692.910156,"y":-4.916687},"parameters":{"amount":0.3,"param0":0,"param1":10,"param2":1,"param3":11,"size":4},"type":"remote","widgets":[{"label":"","linked_widgets":[{"node":"nm_postprocess","widget":"format"}],"name":"param0","type":"linked_control"},{"label":"","linked_widgets":[{"node":"buffer","widget":"size"},{"node":"nm_convolution","widget":"size"},{"node":"nm_postprocess","widget":"size"}],"name":"param1","type":"linked_control"},{"label":"","linked_widgets":[{"node":"nm_postprocess","widget":"amount"}],"name":"param2","type":"linked_control"}]},{"name":"gen_outputs","node_position":{"x":-407.663818,"y":151.047363},"parameters":{},"ports":[{"name":"port0","type":"rgba"}],"type":"ios"},{"name":"gen_inputs","node_position":{"x":-870.910156,"y":157.047363},"parameters":{},"ports":[{"name":"port0","type":"rgba"}],"type":"ios"}],"parameters":{"amount":0.3,"param0":0,"param1":10,"param2":1,"size":4},"type":"graph"}
|
Loading…
Reference in New Issue
Block a user