mirror of
https://github.com/Relintai/material-maker.git
synced 2024-12-23 21:16:54 +01:00
c121f7c00a
Loader is not a lot more generic and deserialization code moved to generators. There is now a small dice button on nodes that create random patterns that can be used to freeze the seed. Frozen nodes can thus be moved without affecting the seed. Graph nodes can also transmit their seed to their children (this behavior can be enabled/disabled using the dice button at the top right of the graph pane).
107 lines
3.1 KiB
GDScript
107 lines
3.1 KiB
GDScript
tool
|
|
extends Object
|
|
class_name MMGenLoader
|
|
|
|
const STD_GENDEF_PATH = "res://addons/material_maker/nodes"
|
|
|
|
static func generator_name_from_path(path : String) -> String:
|
|
for p in [ STD_GENDEF_PATH, OS.get_executable_path().get_base_dir()+"/generators" ]:
|
|
print(p)
|
|
print(path.get_base_dir())
|
|
return path.get_basename().get_file()
|
|
|
|
static func load_gen(filename: String) -> MMGenBase:
|
|
var file = File.new()
|
|
if file.open(filename, File.READ) == OK:
|
|
var data = parse_json(file.get_as_text())
|
|
return create_gen(data)
|
|
return null
|
|
|
|
static func add_to_gen_graph(gen_graph, generators, connections) -> Dictionary:
|
|
var rv = { generators=[], connections=[] }
|
|
var gennames = {}
|
|
for n in generators:
|
|
var g = create_gen(n)
|
|
if g != null:
|
|
var orig_name = g.name
|
|
gen_graph.add_generator(g)
|
|
rv.generators.append(g)
|
|
gennames[orig_name] = g.name
|
|
for c in connections:
|
|
if gennames.has(c.from) and gennames.has(c.to):
|
|
c.from = gennames[c.from]
|
|
c.to = gennames[c.to]
|
|
if gen_graph.connect_children(gen_graph.get_node(c.from), c.from_port, gen_graph.get_node(c.to), c.to_port):
|
|
rv.connections.append(c)
|
|
return rv
|
|
|
|
static func create_gen(data) -> MMGenBase:
|
|
var guess = [
|
|
{ keyword="connections", type=MMGenGraph },
|
|
{ keyword="nodes", type=MMGenGraph },
|
|
{ keyword="shader_model", type=MMGenShader },
|
|
{ keyword="convolution_params", type=MMGenConvolution },
|
|
{ keyword="model_data", type=MMGenShader },
|
|
{ keyword="convolution_params", type=MMGenConvolution },
|
|
{ keyword="widgets", type=MMGenRemote }
|
|
]
|
|
var types = {
|
|
material = MMGenMaterial,
|
|
buffer = MMGenBuffer,
|
|
image = MMGenImage,
|
|
ios = MMGenIOs,
|
|
switch = MMGenSwitch,
|
|
export = MMGenExport,
|
|
comment = MMGenComment,
|
|
debug = MMGenDebug
|
|
}
|
|
var generator = null
|
|
for g in guess:
|
|
if data.has(g.keyword):
|
|
generator = g.type.new()
|
|
break
|
|
if generator == null and data.has("type"):
|
|
if types.has(data.type):
|
|
generator = types[data.type].new()
|
|
else:
|
|
var file = File.new()
|
|
var gen_paths = [ STD_GENDEF_PATH, OS.get_executable_path().get_base_dir()+"/generators" ]
|
|
for p in gen_paths:
|
|
if file.open(p+"/"+data.type+".mmg", File.READ) == OK:
|
|
generator = create_gen(parse_json(file.get_as_text()))
|
|
generator.model = data.type
|
|
file.close()
|
|
break
|
|
elif file.open(p+"/"+data.type+".mmn", File.READ) == OK:
|
|
generator = MMGenShader.new()
|
|
generator.model = data.type
|
|
generator.set_shader_model(parse_json(file.get_as_text()))
|
|
file.close()
|
|
break
|
|
if generator == null:
|
|
print("Cannot find description for "+data.type)
|
|
if generator != null:
|
|
generator.name = data.type
|
|
if generator == null:
|
|
print("LOADER: data not supported:"+str(data))
|
|
if generator != null:
|
|
generator.deserialize(data)
|
|
return generator
|
|
|
|
static 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" ]:
|
|
dir.open(p)
|
|
dir.list_dir_begin(true)
|
|
while true:
|
|
var f = dir.get_next()
|
|
if f == "":
|
|
break
|
|
if f.right(f.length()-4) == ".mmg":
|
|
var n = f.left(f.length()-4)
|
|
if rv.find(n) == -1:
|
|
rv.push_back(n)
|
|
rv.sort()
|
|
return rv
|