mirror of
https://github.com/Relintai/material-maker.git
synced 2024-11-13 06:27:18 +01:00
fixed rotation in transform, started implementing hierrachy
This commit is contained in:
parent
caf682de88
commit
07273fdd04
@ -2,22 +2,48 @@ tool
|
|||||||
extends MMGenBase
|
extends MMGenBase
|
||||||
class_name MMGenGraph
|
class_name MMGenGraph
|
||||||
|
|
||||||
|
var label : String = "Graph"
|
||||||
var connections = []
|
var connections = []
|
||||||
|
|
||||||
func get_type():
|
func get_type():
|
||||||
return "graph"
|
return "graph"
|
||||||
|
|
||||||
|
func get_type_name():
|
||||||
|
return label
|
||||||
|
|
||||||
|
func get_parameter_defs():
|
||||||
|
return []
|
||||||
|
|
||||||
|
func get_input_defs():
|
||||||
|
var inputs = get_node("gen_inputs")
|
||||||
|
if inputs != null:
|
||||||
|
return inputs.get_input_defs()
|
||||||
|
return []
|
||||||
|
|
||||||
|
func get_output_defs():
|
||||||
|
var outputs = get_node("gen_outputs")
|
||||||
|
if outputs != null:
|
||||||
|
return outputs.get_output_defs()
|
||||||
|
return []
|
||||||
|
|
||||||
func get_port_source(gen_name: String, input_index: int) -> OutputPort:
|
func get_port_source(gen_name: String, input_index: int) -> OutputPort:
|
||||||
for c in connections:
|
if gen_name == "gen_inputs":
|
||||||
if c.to == gen_name and c.to_port == input_index:
|
var parent = get_parent()
|
||||||
var src_gen = get_node(c.from)
|
if parent != null and parent.get_type() == "graph":
|
||||||
if src_gen != null:
|
return parent.get_port_source(name, input_index)
|
||||||
return OutputPort.new(src_gen, c.from_port)
|
else:
|
||||||
|
for c in connections:
|
||||||
|
if c.to == gen_name and c.to_port == input_index:
|
||||||
|
var src_gen = get_node(c.from)
|
||||||
|
if src_gen != null:
|
||||||
|
if src_gen.get_type() == "graph":
|
||||||
|
return src_gen.get_port_source("gen_outputs", c.from_port)
|
||||||
|
return OutputPort.new(src_gen, c.from_port)
|
||||||
return null
|
return null
|
||||||
|
|
||||||
func get_port_target(gen_name: String, input_index: int) -> InputPort:
|
func get_port_target(gen_name: String, output_index: int) -> InputPort:
|
||||||
for c in connections:
|
for c in connections:
|
||||||
if c.from == gen_name and c.from_port == input_index:
|
if c.from == gen_name and c.from_port == output_index:
|
||||||
var tgt_gen = get_node(c.to)
|
var tgt_gen = get_node(c.to)
|
||||||
if tgt_gen != null:
|
if tgt_gen != null:
|
||||||
return InputPort.new(tgt_gen, c.to_port)
|
return InputPort.new(tgt_gen, c.to_port)
|
||||||
@ -65,7 +91,15 @@ func disconnect_children(from, from_port : int, to, to_port : int):
|
|||||||
connections.remove(remove)
|
connections.remove(remove)
|
||||||
return true
|
return true
|
||||||
|
|
||||||
|
func _get_shader_code(uv : String, output_index : int, context : MMGenContext):
|
||||||
|
print("Getting shader code from graph")
|
||||||
|
var outputs = get_node("gen_outputs")
|
||||||
|
if outputs != null:
|
||||||
|
outputs._get_shader_code(uv, output_index, context)
|
||||||
|
return { defs="", code="", textures={} }
|
||||||
|
|
||||||
func _serialize(data):
|
func _serialize(data):
|
||||||
|
data.label = label
|
||||||
data.nodes = []
|
data.nodes = []
|
||||||
for c in get_children():
|
for c in get_children():
|
||||||
data.nodes.append(c.serialize())
|
data.nodes.append(c.serialize())
|
||||||
|
50
addons/material_maker/engine/gen_ios.gd
Normal file
50
addons/material_maker/engine/gen_ios.gd
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
tool
|
||||||
|
extends MMGenBase
|
||||||
|
class_name MMGenIOs
|
||||||
|
|
||||||
|
"""
|
||||||
|
IOs just forward their inputs to their outputs and are used to specify graph interfaces
|
||||||
|
"""
|
||||||
|
|
||||||
|
var mask : int = 3
|
||||||
|
var ports : Array = []
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
if !parameters.has("size"):
|
||||||
|
parameters.size = 4
|
||||||
|
|
||||||
|
func get_type():
|
||||||
|
return "buffer"
|
||||||
|
|
||||||
|
func get_type_name():
|
||||||
|
match mask:
|
||||||
|
1: return "Inputs"
|
||||||
|
2: return "Output"
|
||||||
|
_: return "IOs"
|
||||||
|
return "Buffer"
|
||||||
|
|
||||||
|
func get_input_defs():
|
||||||
|
var rv : Array = []
|
||||||
|
if mask != 2:
|
||||||
|
for p in ports:
|
||||||
|
rv.push_back({ name=p.name, type="rgba" })
|
||||||
|
return rv
|
||||||
|
|
||||||
|
func get_output_defs():
|
||||||
|
var rv : Array = []
|
||||||
|
if mask != 2:
|
||||||
|
for p in ports:
|
||||||
|
rv.push_back({ name=p.name, type="rgba" })
|
||||||
|
return rv
|
||||||
|
|
||||||
|
func _get_shader_code(uv : String, output_index : int, context : MMGenContext):
|
||||||
|
print("Getting shader code from ios")
|
||||||
|
if mask != 2:
|
||||||
|
var source = get_source(output_index)
|
||||||
|
if source != null:
|
||||||
|
return source.generator._get_shader_code(uv, source.output_index, context)
|
||||||
|
return { defs="", code="", textures={} }
|
||||||
|
|
||||||
|
func _serialize(data):
|
||||||
|
data.type = "buffer"
|
||||||
|
return data
|
@ -11,9 +11,11 @@ static func load_gen(filename: String) -> MMGenBase:
|
|||||||
|
|
||||||
static func add_to_gen_graph(gen_graph, generators, connections):
|
static func add_to_gen_graph(gen_graph, generators, connections):
|
||||||
var rv = { generators=[], connections=[] }
|
var rv = { generators=[], connections=[] }
|
||||||
|
var gennames = {}
|
||||||
for n in generators:
|
for n in generators:
|
||||||
var g = create_gen(n)
|
var g = create_gen(n)
|
||||||
if g != null:
|
if g != null:
|
||||||
|
var orig_name = g.name
|
||||||
var name = g.name
|
var name = g.name
|
||||||
var index = 1
|
var index = 1
|
||||||
while gen_graph.has_node(name):
|
while gen_graph.has_node(name):
|
||||||
@ -22,15 +24,21 @@ static func add_to_gen_graph(gen_graph, generators, connections):
|
|||||||
g.name = name
|
g.name = name
|
||||||
gen_graph.add_child(g)
|
gen_graph.add_child(g)
|
||||||
rv.generators.append(g)
|
rv.generators.append(g)
|
||||||
|
gennames[orig_name] = name
|
||||||
for c in connections:
|
for c in connections:
|
||||||
gen_graph.connections.append(c)
|
if gennames.has(c.from) and gennames.has(c.to):
|
||||||
rv.connections.append(c)
|
c.from = gennames[c.from]
|
||||||
|
c.to = gennames[c.to]
|
||||||
|
gen_graph.connections.append(c)
|
||||||
|
rv.connections.append(c)
|
||||||
return rv
|
return rv
|
||||||
|
|
||||||
static func create_gen(data) -> MMGenBase:
|
static func create_gen(data) -> MMGenBase:
|
||||||
var generator = null
|
var generator = null
|
||||||
if data.has("connections") and data.has("nodes"):
|
if data.has("connections") and data.has("nodes"):
|
||||||
generator = MMGenGraph.new()
|
generator = MMGenGraph.new()
|
||||||
|
if data.has("label"):
|
||||||
|
generator.label = data.label
|
||||||
add_to_gen_graph(generator, data.nodes, data.connections)
|
add_to_gen_graph(generator, data.nodes, data.connections)
|
||||||
elif data.has("shader_model"):
|
elif data.has("shader_model"):
|
||||||
generator = MMGenShader.new()
|
generator = MMGenShader.new()
|
||||||
@ -48,6 +56,9 @@ static func create_gen(data) -> MMGenBase:
|
|||||||
generator = MMGenBuffer.new()
|
generator = MMGenBuffer.new()
|
||||||
elif data.type == "image":
|
elif data.type == "image":
|
||||||
generator = MMGenImage.new()
|
generator = MMGenImage.new()
|
||||||
|
elif data.type == "ios":
|
||||||
|
generator = MMGenIOs.new()
|
||||||
|
generator.ports = data.ports
|
||||||
else:
|
else:
|
||||||
var file = File.new()
|
var file = File.new()
|
||||||
if file.open("res://addons/material_maker/nodes/"+data.type+".mmg", File.READ) == OK:
|
if file.open("res://addons/material_maker/nodes/"+data.type+".mmg", File.READ) == OK:
|
||||||
|
@ -99,6 +99,7 @@ func clear_material():
|
|||||||
send_changed_signal()
|
send_changed_signal()
|
||||||
|
|
||||||
func update_graph(generators, connections):
|
func update_graph(generators, connections):
|
||||||
|
var rv = []
|
||||||
for g in generators:
|
for g in generators:
|
||||||
var node = node_factory.create_node(g.get_type())
|
var node = node_factory.create_node(g.get_type())
|
||||||
if node != null:
|
if node != null:
|
||||||
@ -106,8 +107,10 @@ func update_graph(generators, connections):
|
|||||||
add_node(node)
|
add_node(node)
|
||||||
node.generator = g
|
node.generator = g
|
||||||
node.offset = g.position
|
node.offset = g.position
|
||||||
|
rv.push_back(node)
|
||||||
for c in connections:
|
for c in connections:
|
||||||
.connect_node("node_"+c.from, c.from_port, "node_"+c.to, c.to_port)
|
.connect_node("node_"+c.from, c.from_port, "node_"+c.to, c.to_port)
|
||||||
|
return rv
|
||||||
|
|
||||||
func new_material():
|
func new_material():
|
||||||
clear_material()
|
clear_material()
|
||||||
@ -137,7 +140,8 @@ func create_nodes(data, position : Vector2 = Vector2(0, 0)):
|
|||||||
var new_stuff = MMGenLoader.add_to_gen_graph(generator, data.nodes, data.connections)
|
var new_stuff = MMGenLoader.add_to_gen_graph(generator, data.nodes, data.connections)
|
||||||
for g in new_stuff.generators:
|
for g in new_stuff.generators:
|
||||||
g.position += position
|
g.position += position
|
||||||
update_graph(new_stuff.generators, new_stuff.connections)
|
return update_graph(new_stuff.generators, new_stuff.connections)
|
||||||
|
return []
|
||||||
|
|
||||||
func load_file(filename):
|
func load_file(filename):
|
||||||
clear_material()
|
clear_material()
|
||||||
@ -172,6 +176,7 @@ func remove_selection():
|
|||||||
if c is GraphNode and c.selected and c.name != "Material":
|
if c is GraphNode and c.selected and c.name != "Material":
|
||||||
remove_node(c)
|
remove_node(c)
|
||||||
|
|
||||||
|
# Maybe move this to gen_graph...
|
||||||
func serialize_selection():
|
func serialize_selection():
|
||||||
var data = { nodes = [], connections = [] }
|
var data = { nodes = [], connections = [] }
|
||||||
var nodes = []
|
var nodes = []
|
||||||
@ -193,7 +198,10 @@ func serialize_selection():
|
|||||||
var from = get_node(c.from)
|
var from = get_node(c.from)
|
||||||
var to = get_node(c.to)
|
var to = get_node(c.to)
|
||||||
if from != null and from.selected and to != null and to.selected:
|
if from != null and from.selected and to != null and to.selected:
|
||||||
data.connections.append(c)
|
var connection = c.duplicate(true)
|
||||||
|
connection.from = from.generator.name
|
||||||
|
connection.to = to.generator.name
|
||||||
|
data.connections.append(connection)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
func can_copy():
|
func can_copy():
|
||||||
@ -214,7 +222,8 @@ func paste(pos = Vector2(0, 0)):
|
|||||||
if c is GraphNode:
|
if c is GraphNode:
|
||||||
c.selected = false
|
c.selected = false
|
||||||
var data = parse_json(OS.clipboard)
|
var data = parse_json(OS.clipboard)
|
||||||
create_nodes(data, scroll_offset+0.5*rect_size)
|
for c in create_nodes(data, scroll_offset+0.5*rect_size):
|
||||||
|
c.selected = true
|
||||||
|
|
||||||
# Center view
|
# Center view
|
||||||
|
|
||||||
|
1
addons/material_maker/nodes/normal_map.mmg
Normal file
1
addons/material_maker/nodes/normal_map.mmg
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"label":"Normal Map","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":"nm_convolution","to_port":0}],"nodes":[{"name":"gen_inputs","type":"ios","ports":[{"name":""}],"node_position":{"x":-89.25,"y":-73.75}},{"name":"gen_outputs","type":"ios","ports":[{"name":""}],"node_position":{"x":-89.25,"y":-73.75}},{"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":-89.25,"y":-73.75},"parameters":{"size":7},"type":"shader"},{"name":"nm_postprocess","node_position":{"x":-98.25,"y":-6.75},"parameters":{"amount":0.995,"size":7},"shader_model":{"global":"","inputs":[{"default":"vec3(0.0)","label":"","name":"in","type":"rgb"}],"instance":"","name":"NormalMapPostProcess","outputs":[{"rgb":"0.5*normalize($in($uv)*$amount*$size/128.0-vec3(0.0, 0.0, 1.0))+vec3(0.5)","type":"rgb"}],"parameters":[{"default":8,"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"}]}
|
@ -1 +1 @@
|
|||||||
{"name":"transform","node_position":{"x":0,"y":0},"parameters":{"repeat":false,"rotate":0,"scale_x":1,"scale_y":1,"translate_x":0.33,"translate_y":0.095},"shader_model":{"global":"vec2 transform(vec2 uv, vec2 translate, float rotate, vec2 scale, bool repeat) {\n \tvec2 rv;\n\tuv -= vec2(0.5);\n\trv.x = cos(rotate)*uv.x + sin(rotate)*uv.y;\n\trv.y = -sin(rotate)*uv.x + cos(rotate)*uv.y;\n\trv /= scale;\n\trv += vec2(0.5);\n\trv -= translate;\n if (repeat) {\n\t\treturn fract(rv);\n\t} else {\n\t\treturn clamp(rv, vec2(0.0), vec2(1.0));\n\t}\t\n}","inputs":[{"default":"vec4($uv, 0.0, 1.0)","label":"","name":"i","type":"rgba"},{"default":"1.0","label":"","name":"tx","type":"f"},{"default":"1.0","label":"","name":"ty","type":"f"},{"default":"1.0","label":"","name":"r","type":"f"},{"default":"1.0","label":"","name":"sx","type":"f"},{"default":"1.0","label":"","name":"sy","type":"f"}],"instance":"","name":"Transform","outputs":[{"rgba":"$i(transform($uv, vec2($translate_x*(2.0*$tx($uv)-1.0), $translate_y*(2.0*$ty($uv)-1.0)), $rotate*(2.0*$r($uv)-1.0), vec2($scale_x*(2.0*$sx($uv)-1.0), $scale_y*(2.0*$sy($uv)-1.0)), $repeat))","type":"rgba"}],"parameters":[{"default":0,"label":"2:Translate X:","max":1,"min":-1,"name":"translate_x","step":0.005,"type":"float","widget":"spinbox"},{"default":0,"label":"Translate Y:","max":1,"min":-1,"name":"translate_y","step":0.005,"type":"float","widget":"spinbox"},{"default":0,"label":"Rotate:","max":720,"min":-720,"name":"rotate","step":0.005,"type":"float","widget":"spinbox"},{"default":1,"label":"Scale X:","max":50,"min":0,"name":"scale_x","step":0.005,"type":"float","widget":"spinbox"},{"default":1,"label":"Scale Y:","max":50,"min":0,"name":"scale_y","step":0.005,"type":"float","widget":"spinbox"},{"default":false,"label":"Repeat:","name":"repeat","type":"boolean"}]}}
|
{"name":"transform","node_position":{"x":0,"y":0},"parameters":{"repeat":false,"rotate":120,"scale_x":1,"scale_y":1,"translate_x":0,"translate_y":0},"shader_model":{"global":"vec2 transform(vec2 uv, vec2 translate, float rotate, vec2 scale, bool repeat) {\n \tvec2 rv;\n\tuv -= vec2(0.5);\n\trv.x = cos(rotate)*uv.x + sin(rotate)*uv.y;\n\trv.y = -sin(rotate)*uv.x + cos(rotate)*uv.y;\n\trv /= scale;\n\trv += vec2(0.5);\n\trv -= translate;\n if (repeat) {\n\t\treturn fract(rv);\n\t} else {\n\t\treturn clamp(rv, vec2(0.0), vec2(1.0));\n\t}\t\n}","inputs":[{"default":"vec4($uv, 0.0, 1.0)","label":"","name":"i","type":"rgba"},{"default":"1.0","label":"","name":"tx","type":"f"},{"default":"1.0","label":"","name":"ty","type":"f"},{"default":"1.0","label":"","name":"r","type":"f"},{"default":"1.0","label":"","name":"sx","type":"f"},{"default":"1.0","label":"","name":"sy","type":"f"}],"instance":"","name":"Transform","outputs":[{"rgba":"$i(transform($uv, vec2($translate_x*(2.0*$tx($uv)-1.0), $translate_y*(2.0*$ty($uv)-1.0)), $rotate*0.01745329251*(2.0*$r($uv)-1.0), vec2($scale_x*(2.0*$sx($uv)-1.0), $scale_y*(2.0*$sy($uv)-1.0)), $repeat))","type":"rgba"}],"parameters":[{"default":0,"label":"2:Translate X:","max":1,"min":-1,"name":"translate_x","step":0.005,"type":"float","widget":"spinbox"},{"default":0,"label":"Translate Y:","max":1,"min":-1,"name":"translate_y","step":0.005,"type":"float","widget":"spinbox"},{"default":0,"label":"Rotate:","max":720,"min":-720,"name":"rotate","step":0.005,"type":"float","widget":"spinbox"},{"default":1,"label":"Scale X:","max":50,"min":0,"name":"scale_x","step":0.005,"type":"float","widget":"spinbox"},{"default":1,"label":"Scale Y:","max":50,"min":0,"name":"scale_y","step":0.005,"type":"float","widget":"spinbox"},{"default":false,"label":"Repeat:","name":"repeat","type":"boolean"}]},"type":"shader"}
|
Loading…
Reference in New Issue
Block a user