Added export and debug nodes

This commit is contained in:
Rodolphe Suescun 2019-11-02 08:43:54 +01:00
parent 9e0d384730
commit bfa1306b0e
13 changed files with 189 additions and 17 deletions

View File

@ -0,0 +1,16 @@
tool
extends MMGenBase
class_name MMGenDebug
"""
Can be used to get generated shader
"""
func get_type() -> String:
return "debug"
func get_type_name() -> String:
return "Debug"
func get_input_defs() -> Array:
return [ { name="in", type="rgba" } ]

View File

@ -0,0 +1,54 @@
tool
extends MMGenBase
class_name MMGenExport
"""
Can be used to export an additional texture
"""
var texture = null
# The default texture size as a power-of-two exponent
const TEXTURE_SIZE_DEFAULT = 10 # 1024x1024
func get_image_size() -> int:
var rv : int
if parameters.has("size"):
rv = int(pow(2, parameters.size))
else:
rv = int(pow(2, TEXTURE_SIZE_DEFAULT))
return rv
func get_type() -> String:
return "export"
func get_type_name() -> String:
return "Export"
func get_parameter_defs() -> Array:
return [
{ name="size", type="size", first=4, last=12, default=10 },
{ name="suffix", type="string", default="suffix" }
]
func get_input_defs() -> Array:
return [ { name="in", type="rgba" } ]
func render_textures(renderer : MMGenRenderer) -> void:
print("rendering texture...")
var source = get_source(0)
if source != null:
var result = source.generator.render(source.output_index, renderer, get_image_size())
while result is GDScriptFunctionState:
result = yield(result, "completed")
texture = ImageTexture.new()
result.copy_to_texture(texture)
result.release()
else:
texture = null
func export_textures(prefix, __ = null) -> void:
print("exporting texture")
if texture != null:
var image = texture.get_data()
image.save_png("%s_%s.png" % [ prefix, parameters.suffix])

View File

@ -176,7 +176,7 @@ func subst(string, context, uv = "") -> Dictionary:
elif p.type == "color":
value_string = "vec4(%.9f, %.9f, %.9f, %.9f)" % [ value.r, value.g, value.b, value.a ]
elif p.type == "gradient":
value_string = genname+"__"+p.name+"_gradient_fct"
value_string = genname+"_p_"+p.name+"_gradient_fct"
elif p.type == "boolean":
value_string = "true" if value else "false"
else:
@ -232,7 +232,7 @@ func _get_shader_code(uv : String, output_index : int, context : MMGenContext) -
if !(g is MMGradient):
g = MMGradient.new()
g.deserialize(parameters[p.name])
rv.defs += g.get_shader(genname+"__"+p.name+"_gradient_fct")
rv.defs += g.get_shader(genname+"_p_"+p.name+"_gradient_fct")
# Add inline code
if shader_model.has("code"):
var variant_index = context.get_variant(self, uv)

View File

@ -48,7 +48,9 @@ static func create_gen(data) -> MMGenBase:
material = MMGenMaterial,
buffer = MMGenBuffer,
image = MMGenImage,
switch = MMGenSwitch
switch = MMGenSwitch,
export = MMGenExport,
debug = MMGenDebug
}
var generator = null
if data.has("connections") and data.has("nodes"):
@ -69,23 +71,17 @@ static func create_gen(data) -> MMGenBase:
generator = MMGenRemote.new()
generator.set_widgets(data.widgets.duplicate(true))
elif data.has("type"):
if data.type == "material":
generator = MMGenMaterial.new()
elif data.type == "buffer":
generator = MMGenBuffer.new()
if types.has(data.type):
generator = types[data.type].new()
elif data.type == "comment":
generator = MMGenComment.new()
if data.has("text"):
generator.text = data.text
if data.has("size"):
generator.size = Vector2(data.size.x, data.size.y)
elif data.type == "image":
generator = MMGenImage.new()
elif data.type == "ios":
generator = MMGenIOs.new()
generator.ports = data.ports
elif data.type == "switch":
generator = MMGenSwitch.new()
else:
var file = File.new()
var gen_paths = [ STD_GENDEF_PATH, OS.get_executable_path().get_base_dir()+"/generators" ]

View File

@ -207,7 +207,10 @@ func export_textures() -> void:
if save_path != null:
var prefix = save_path.left(save_path.rfind("."))
for c in get_children():
if c is GraphNode and c.generator.has_method("export_textures"):
if c is GraphNode:
if c.generator.has_method("render_textures"):
c.generator.render_textures(renderer)
if c.generator.has_method("export_textures"):
c.generator.export_textures(prefix, editor_interface)
# Cut / copy / paste
@ -270,7 +273,9 @@ func paste(pos = Vector2(0, 0)) -> void:
if c is GraphNode:
c.selected = false
var data = parse_json(OS.clipboard)
for c in create_nodes(data, scroll_offset+0.5*rect_size):
var new_nodes = create_nodes(data, scroll_offset+0.5*rect_size)
if new_nodes != null:
for c in new_nodes:
c.selected = true
# Delay after graph update

View File

@ -406,5 +406,15 @@
{
"tree_item":"Miscellaneous/Comment",
"type":"comment"
},
{
"tree_item":"Miscellaneous/Export",
"type":"export",
"parameters":{"size":10}
},
{
"tree_item":"Miscellaneous/Debug",
"icon":"debug",
"type":"debug"
}
]}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,32 @@
extends MMGraphNodeBase
static func generate_shader(src_code) -> String:
var code
code = ""
var file = File.new()
file.open("res://addons/material_maker/common.shader", File.READ)
code += file.get_as_text()
code += "\n"
if src_code.has("textures"):
for t in src_code.textures.keys():
code += "uniform sampler2D "+t+";\n"
if src_code.has("globals"):
for g in src_code.globals:
code += g
var shader_code = src_code.defs
shader_code += "\nvoid mainImage(out vec4 fragColor, in vec2 fragCoord) {\nvec2 UV = fragCoord/iResolution.xy;\n"
shader_code += src_code.code
shader_code += "fragColor = "+src_code.rgba+";\n"
shader_code += "}\n"
#print("GENERATED SHADER:\n"+shader_code)
code += shader_code
return code
func _on_Button_pressed():
var src = generator.get_source(0)
if src != null:
var context : MMGenContext = MMGenContext.new(null)
var source = src.generator.get_shader_code("UV", src.output_index, context)
var popup = preload("res://addons/material_maker/nodes/debug/debug_popup.tscn").instance()
get_parent().add_child(popup)
popup.show_code(generate_shader(source))

View File

@ -0,0 +1,24 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://addons/material_maker/nodes/debug.gd" type="Script" id=1]
[node name="Debug" type="GraphNode"]
margin_right = 124.0
margin_bottom = 49.0
title = "Debug"
show_close = true
slot/0/left_enabled = true
slot/0/left_type = 0
slot/0/left_color = Color( 0, 1, 0, 0.501961 )
slot/0/right_enabled = false
slot/0/right_type = 0
slot/0/right_color = Color( 1, 1, 1, 1 )
script = ExtResource( 1 )
[node name="Button" type="Button" parent="."]
margin_left = 16.0
margin_top = 24.0
margin_right = 108.0
margin_bottom = 44.0
text = "Show shader"
[connection signal="pressed" from="Button" to="." method="_on_Button_pressed"]

View File

@ -0,0 +1,5 @@
extends Popup
func show_code(text : String) -> void:
$TextEdit.text = text
popup_centered()

View File

@ -0,0 +1,16 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://addons/material_maker/nodes/debug/debug_popup.gd" type="Script" id=1]
[node name="Popup" type="Popup"]
visible = true
margin_right = 739.0
margin_bottom = 662.0
rect_min_size = Vector2( 500, 300 )
script = ExtResource( 1 )
[node name="TextEdit" type="TextEdit" parent="."]
anchor_right = 1.0
anchor_bottom = 1.0
syntax_highlighting = true
show_line_numbers = true

View File

@ -25,7 +25,7 @@ func on_parameter_changed(p, v) -> void:
elif controls.has(p):
var o = controls[p]
if o is LineEdit:
o.text = str(v)
o.text = v
elif o is SpinBox:
o.value = v
elif o is HSlider:
@ -81,7 +81,7 @@ func update_shaders() -> void:
func _on_text_changed(new_text, variable) -> void:
ignore_parameter_change = variable
generator.set_parameter(variable, float(new_text))
generator.set_parameter(variable, new_text)
ignore_parameter_change = ""
update_shaders()
@ -135,6 +135,8 @@ func create_parameter_control(p : Dictionary) -> Control:
control = ColorPickerButton.new()
elif p.type == "gradient":
control = preload("res://addons/material_maker/widgets/gradient_editor.tscn").instance()
elif p.type == "string":
control = LineEdit.new()
return control
func save_preview_widget() -> void:

View File

@ -35,6 +35,16 @@ _global_script_classes=[ {
"path": "res://addons/material_maker/engine/gen_convolution.gd"
}, {
"base": "MMGenBase",
"class": "MMGenDebug",
"language": "GDScript",
"path": "res://addons/material_maker/engine/gen_debug.gd"
}, {
"base": "MMGenBase",
"class": "MMGenExport",
"language": "GDScript",
"path": "res://addons/material_maker/engine/gen_export.gd"
}, {
"base": "MMGenBase",
"class": "MMGenGraph",
"language": "GDScript",
"path": "res://addons/material_maker/engine/gen_graph.gd"
@ -135,6 +145,8 @@ _global_script_class_icons={
"MMGenComment": "",
"MMGenContext": "",
"MMGenConvolution": "",
"MMGenDebug": "",
"MMGenExport": "",
"MMGenGraph": "",
"MMGenIOs": "",
"MMGenImage": "",