Skip to content

Commit

Permalink
Merge pull request #579 from RodZill4/website_connect
Browse files Browse the repository at this point in the history
Updated website connect and added custyom nodes sharing
  • Loading branch information
RodZill4 committed Mar 12, 2023
2 parents 8157a28 + 7534ae8 commit caf98aa
Show file tree
Hide file tree
Showing 37 changed files with 1,117 additions and 439 deletions.
8 changes: 4 additions & 4 deletions addons/material_maker/engine/gen_base.gd
Original file line number Diff line number Diff line change
Expand Up @@ -305,9 +305,7 @@ static func generate_preview_shader(src_code, type, main_fct = "void fragment()
func generate_output_shader(output_index : int, preview : bool = false):
var context : MMGenContext = MMGenContext.new()
var source = get_shader_code("uv", output_index, context)
while source is GDScriptFunctionState:
assert(false)
source = yield(source, "completed")
assert(! source is GDScriptFunctionState)
if source.empty():
source = DEFAULT_GENERATED_SHADER
var shader : String
Expand Down Expand Up @@ -417,7 +415,9 @@ func _deserialize(_data : Dictionary) -> void:
pass

func deserialize(data : Dictionary) -> void:
_deserialize(data)
var status = _deserialize(data)
while status is GDScriptFunctionState:
status = yield(status, "completed")
if data.has("name"):
name = data.name
if data.has("node_position"):
Expand Down
19 changes: 13 additions & 6 deletions addons/material_maker/engine/gen_graph.gd
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,9 @@ func is_editable() -> bool:

func get_description() -> String:
var desc_list : PoolStringArray = PoolStringArray()
if shortdesc == "":
if shortdesc != "":
desc_list.push_back(TranslationServer.translate(shortdesc))
if longdesc == "":
if longdesc != "":
desc_list.push_back(TranslationServer.translate(longdesc))
return desc_list.join("\n")

Expand Down Expand Up @@ -521,8 +521,9 @@ func _deserialize(data : Dictionary) -> void:
connection_array = data.connections
elif data.connections is Dictionary:
connection_array = connections_from_compact(data.connections)
mm_loader.add_to_gen_graph(self, nodes, connection_array)

var new_stuff = mm_loader.add_to_gen_graph(self, nodes, connection_array)
while new_stuff is GDScriptFunctionState:
new_stuff = yield(new_stuff, "completed")

func apply_diff_from(graph : MMGenGraph) -> void:
shortdesc = graph.shortdesc
Expand Down Expand Up @@ -557,7 +558,10 @@ func apply_diff_from(graph : MMGenGraph) -> void:
idx1 += 1
else:
var gen = graph.get_node(other_child_names[idx2][0]).serialize()
add_generator(mm_loader.create_gen(gen))
var generator = mm_loader.create_gen(gen)
while generator is GDScriptFunctionState:
generator = yield(generator, "completed")
add_generator(generator)
idx2 += 1

while idx1 < child_names.size():
Expand All @@ -566,7 +570,10 @@ func apply_diff_from(graph : MMGenGraph) -> void:

while idx2 < other_child_names.size():
var gen = graph.get_node(other_child_names[idx2][0]).serialize()
add_generator(mm_loader.create_gen(gen))
var generator = mm_loader.create_gen(gen)
while generator is GDScriptFunctionState:
generator = yield(generator, "completed")
add_generator(generator)
idx2 += 1

for child in maybe_changed:
Expand Down
119 changes: 81 additions & 38 deletions addons/material_maker/engine/loader.gd
Original file line number Diff line number Diff line change
Expand Up @@ -12,55 +12,85 @@ var current_project_path : String = ""
const CHECK_PREDEFINED : bool = false

const USER_EXPORT_DIR : String = "user://export_targets"
const SHARED_NODES_DIR : String = "user://shared_nodes"


func _ready()-> void:
update_predefined_generators()
load_external_export_targets()

func update_predefined_generators()-> void:
func get_predefined_generators_from_dir(path : String) -> void:
var parser
if CHECK_PREDEFINED:
parser = load("res://addons/material_maker/parser/glsl_parser.gd").new()
var dir = Directory.new()
if dir.open(path) == OK:
dir.list_dir_begin()
var file_name = dir.get_next()
while file_name != "":
if !dir.current_is_dir() and file_name.get_extension() == "mmg":
var file : File = File.new()
if file.open(path+"/"+file_name, File.READ) == OK:
var generator = string_to_dict_tree(file.get_as_text())
if CHECK_PREDEFINED:
if generator.has("shader_model") and generator.shader_model.has("global") and generator.shader_model.global != "":
var parse_result = parser.parse(generator.shader_model.global)
if parse_result.status != "OK":
print(file_name+" has errors in global")
elif parse_result.value.type == "translation_unit":
for definition in parse_result.value.value:
if definition.type == "function_definition":
var function_name = definition.value[0].value[0].value.name
if function_name.type == "IDENTIFIER":
if predefined_functions.has(function_name.value):
print(str(function_name.value)+" is defined in "+file_name.get_basename()+" and "+predefined_functions[function_name.value])
else:
predefined_functions[function_name.value] = file_name.get_basename()
else:
print(definition)
else:
print(definition.type)
var node_name : String = file_name.get_basename()
if node_name.left(8) == "website_":
print(node_name.right(8))
node_name[7] = ":"
predefined_generators[node_name] = generator
file.close()
file_name = dir.get_next()

func update_predefined_generators() -> void:
predefined_generators = {}
predefined_functions = {}
for path in MMPaths.get_nodes_paths():
var dir = Directory.new()
if dir.open(path) == OK:
dir.list_dir_begin()
var file_name = dir.get_next()
while file_name != "":
if !dir.current_is_dir() and file_name.get_extension() == "mmg":
var file : File = File.new()
if file.open(path+"/"+file_name, File.READ) == OK:
var generator = string_to_dict_tree(file.get_as_text())
if CHECK_PREDEFINED:
if generator.has("shader_model") and generator.shader_model.has("global") and generator.shader_model.global != "":
var parse_result = parser.parse(generator.shader_model.global)
if parse_result.status != "OK":
print(file_name+" has errors in global")
elif parse_result.value.type == "translation_unit":
for definition in parse_result.value.value:
if definition.type == "function_definition":
var function_name = definition.value[0].value[0].value.name
if function_name.type == "IDENTIFIER":
if predefined_functions.has(function_name.value):
print(str(function_name.value)+" is defined in "+file_name.get_basename()+" and "+predefined_functions[function_name.value])
else:
predefined_functions[function_name.value] = file_name.get_basename()
else:
print(definition)
else:
print(definition.type)
predefined_generators[file_name.get_basename()] = generator
file.close()
file_name = dir.get_next()
get_predefined_generators_from_dir(path)
if false:
var file : File = File.new()
if file.open("predefined_nodes.json", File.WRITE) == OK:
file.store_string(to_json(predefined_generators))
file.close()

func get_node_from_website(node_name : String) -> bool:
var node_id : String = node_name.right(8)
var http_request = HTTPRequest.new()
add_child(http_request)
var error = http_request.request(MMPaths.WEBSITE_ADDRESS+"/api/getMaterial?id="+node_id)
if error != OK:
return false
var result = yield(http_request, "request_completed")
if ! result is Array or result[0] != 0 or result[1] != 200:
return false
var json : JSONParseResult = JSON.parse(result[3].get_string_from_ascii())
if json.error != OK or ! json.result is Dictionary:
return false
predefined_generators[node_name] = string_to_dict_tree(json.result.json)
var dir : Directory = Directory.new()
dir.make_dir_recursive(SHARED_NODES_DIR)
var file : File = File.new()
if file.open(SHARED_NODES_DIR+"/website_"+node_id+".mmg", File.WRITE) == OK:
file.store_string(dict_tree_to_string(predefined_generators[node_name].duplicate(true)))
file.close()
return true

func get_material_nodes() -> Array:
var rv : Array = Array()
for g in predefined_generators.keys():
Expand Down Expand Up @@ -137,6 +167,8 @@ func load_gen(filename: String) -> MMGenBase:
if data != null:
current_project_path = filename.get_base_dir()
var generator = create_gen(data)
while generator is GDScriptFunctionState:
generator = yield(generator, "completed")
current_project_path = ""
return generator
return null
Expand All @@ -160,6 +192,8 @@ func add_to_gen_graph(gen_graph, generators, connections, position : Vector2 = V
var gennames = {}
for n in generators:
var g = create_gen(n)
while g is GDScriptFunctionState:
g = yield(g, "completed")
if g != null:
g.orig_name = g.name
var orig_name = g.name
Expand Down Expand Up @@ -220,18 +254,27 @@ func create_gen(data) -> MMGenBase:
if generator == null and data.has("type"):
if types.has(data.type):
generator = types[data.type].new()
elif predefined_generators.has(data.type):
generator = create_gen(predefined_generators[data.type])
if generator == null:
print("Cannot find description for "+data.type)
else:
generator.model = data.type
else:
if !predefined_generators.has(data.type) and data.type.left(8) == "website:":
var status = get_node_from_website(data.type)
while status is GDScriptFunctionState:
status = yield(status, "completed")
if predefined_generators.has(data.type):
generator = create_gen(predefined_generators[data.type])
while generator is GDScriptFunctionState:
generator = yield(generator, "completed")
if generator == null:
print("Cannot find description for "+data.type)
else:
generator.model = 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)
var status = generator.deserialize(data)
while status is GDScriptFunctionState:
status = yield(status, "completed")
return generator

func get_generator_list() -> Array:
Expand Down
5 changes: 4 additions & 1 deletion addons/material_maker/engine/paths.gd
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
tool
class_name MMPaths

const WEBSITE_ADDRESS : String = "https://www.materialmaker.org"
#const WEBSITE_ADDRESS : String = "http://localhost:3000"

const STD_GENDEF_PATH = "res://addons/material_maker/nodes"

static func get_resource_dir() -> String:
return OS.get_executable_path().get_base_dir()

static func get_nodes_paths() -> Array:
return [ STD_GENDEF_PATH, get_resource_dir()+"/nodes" ]
return [ STD_GENDEF_PATH, get_resource_dir()+"/nodes", "user://shared_nodes" ]
2 changes: 2 additions & 0 deletions addons/material_maker/import_plugin/ptex_spatial_material.gd
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ func set_ptex(s : String) -> void :

func update_texture() -> void:
var mm_graph = mm_loader.create_gen(parse_json(ptex))
while mm_graph is GDScriptFunctionState:
mm_graph = yield(mm_graph, "completed")
if mm_graph == null:
return
var mm_material : MMGenMaterial = mm_graph.get_node("Material")
Expand Down
6 changes: 3 additions & 3 deletions export_presets.cfg

Large diffs are not rendered by default.

11 changes: 11 additions & 0 deletions material_maker/darken.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
extends ColorRect

func _ready():
var current_theme : Theme = mm_globals.main_window.theme
color = current_theme.get_stylebox("panel", "Panel").bg_color
color.a = 0.80
_on_resized()

func _on_resized():
pass
#material.set_shader_param("widget_size", rect_size)
10 changes: 10 additions & 0 deletions material_maker/darken.tscn
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[gd_scene load_steps=2 format=2]

[ext_resource path="res://material_maker/darken.gd" type="Script" id=1]

[node name="Darken" type="ColorRect"]
anchor_right = 1.0
anchor_bottom = 1.0
script = ExtResource( 1 )

[connection signal="resized" from="." to="." method="_on_resized"]
5 changes: 4 additions & 1 deletion material_maker/globals.gd
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,10 @@ func has_config(key : String) -> bool:

func get_config(key : String):
if ! config.has_section_key("config", key):
return DEFAULT_CONFIG[key]
if DEFAULT_CONFIG.has(key):
return DEFAULT_CONFIG[key]
else:
return ""
return config.get_value("config", key)

func set_config(key : String, value):
Expand Down
43 changes: 22 additions & 21 deletions material_maker/icons/icons.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions material_maker/icons/ok.tres
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[gd_resource type="AtlasTexture" load_steps=2 format=2]

[ext_resource path="res://material_maker/icons/icons.tres" type="Texture" id=1]

[resource]
flags = 4
atlas = ExtResource( 1 )
region = Rect2( 176, 128, 16, 16 )
Loading

0 comments on commit caf98aa

Please sign in to comment.