From fb9e7c8bef17ff268ac566ecc0124de323a5cc17 Mon Sep 17 00:00:00 2001 From: RodZill4 Date: Sun, 21 Feb 2021 14:00:40 +0100 Subject: [PATCH] Updated debug node to generate canvas_item and spatial shaders for Godot. --- material_maker/nodes/debug/debug.gd | 27 +------ material_maker/nodes/debug/debug.tscn | 5 +- material_maker/nodes/debug/debug_popup.gd | 90 ++++++++++++++++++++- material_maker/nodes/debug/debug_popup.tscn | 44 ++++++++-- 4 files changed, 129 insertions(+), 37 deletions(-) diff --git a/material_maker/nodes/debug/debug.gd b/material_maker/nodes/debug/debug.gd index d9db4398..5008e1c3 100644 --- a/material_maker/nodes/debug/debug.gd +++ b/material_maker/nodes/debug/debug.gd @@ -1,30 +1,5 @@ extends MMGraphNodeBase -static func generate_debug_shader(src_code) -> String: - var code - code = "" - code += mm_renderer.common_shader.right(mm_renderer.common_shader.find("//---")) - 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) {\nfloat minSize = min(iResolution.x, iResolution.y);\nvec2 UV = vec2(0.0, 1.0) + vec2(1.0, -1.0) * (fragCoord-0.5*(iResolution.xy-vec2(minSize)))/minSize;\n" - shader_code += src_code.code - if src_code.has("rgba"): - shader_code += "fragColor = "+src_code.rgba+";\n" - else: - shader_code += "fragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" - shader_code += "}\n" - #print("GENERATED SHADER:\n"+shader_code) - code += shader_code - code = code.replace("uniform", "const") - code = code.replace("elapsed_time", "iTime") - return code - func _on_Button_pressed() -> void: var src = generator.get_source(0) if src != null: @@ -32,4 +7,4 @@ func _on_Button_pressed() -> void: var source = src.generator.get_shader_code("UV", src.output_index, context) var popup = preload("res://material_maker/nodes/debug/debug_popup.tscn").instance() get_parent().add_child(popup) - popup.show_code(generate_debug_shader(source)) + popup.show_code(source) diff --git a/material_maker/nodes/debug/debug.tscn b/material_maker/nodes/debug/debug.tscn index 6bd3bbba..425e733a 100644 --- a/material_maker/nodes/debug/debug.tscn +++ b/material_maker/nodes/debug/debug.tscn @@ -2,8 +2,6 @@ [ext_resource path="res://material_maker/nodes/debug/debug.gd" type="Script" id=1] - - [node name="Debug" type="GraphNode"] margin_right = 124.0 margin_bottom = 49.0 @@ -16,6 +14,9 @@ slot/0/right_enabled = false slot/0/right_type = 0 slot/0/right_color = Color( 1, 1, 1, 1 ) script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} [node name="Button" type="Button" parent="."] margin_left = 16.0 diff --git a/material_maker/nodes/debug/debug_popup.gd b/material_maker/nodes/debug/debug_popup.gd index 8e45c143..2e69acb2 100644 --- a/material_maker/nodes/debug/debug_popup.gd +++ b/material_maker/nodes/debug/debug_popup.gd @@ -1,6 +1,90 @@ -extends Popup +extends WindowDialog -func show_code(text : String) -> void: - $TextEdit.text = text +var src_code + +const GENFUNCTIONS : Array = [ "generate_shadertoy", "generate_godot_canvasitem", "generate_godot_spatial" ] + +func show_code(s) -> void: + src_code = s + _on_ShaderType_item_selected(0) connect("popup_hide", self, "queue_free") popup_centered() + +func _on_ShaderType_item_selected(index): + $VBoxContainer/TextEdit.text = call(GENFUNCTIONS[index]) + +func _on_CopyToClipboard_pressed(): + OS.set_clipboard($VBoxContainer/TextEdit.text) + +func generate_shadertoy() -> String: + var code = "" + code += mm_renderer.common_shader.right(mm_renderer.common_shader.find("//---")) + 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 + code += src_code.defs + code += "\n" + code += "void mainImage(out vec4 fragColor, in vec2 fragCoord) {\n" + code += "float minSize = min(iResolution.x, iResolution.y);\n" + code += "vec2 UV = vec2(0.0, 1.0) + vec2(1.0, -1.0) * (fragCoord-0.5*(iResolution.xy-vec2(minSize)))/minSize;\n" + code += src_code.code + if src_code.has("rgba"): + code += "fragColor = "+src_code.rgba+";\n" + else: + code += "fragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" + code += "}\n" + #print("GENERATED SHADER:\n"+shader_code) + code = code.replace("uniform", "const") + code = code.replace("elapsed_time", "iTime") + return code + +func generate_godot_canvasitem() -> String: + var code = "shader_type canvas_item;\n" + code += mm_renderer.common_shader + 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 + code += src_code.defs + code += "\n" + code += "void fragment() {\n" + code += src_code.code + if src_code.has("rgba"): + code += "COLOR = "+src_code.rgba+";\n" + else: + code += "COLOR = vec4(1.0, 0.0, 0.0, 1.0);\n" + code += "}\n" + #print("GENERATED SHADER:\n"+shader_code) + code = code.replace("uniform", "const") + return code + +func generate_godot_spatial() -> String: + var code = "shader_type spatial;\n" + code += mm_renderer.common_shader + 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 + code += src_code.defs + code += "\n" + code += "void fragment() {\n" + code += src_code.code + if src_code.has("rgb"): + code += "ALBEDO = "+src_code.rgb+";\n" + else: + code += "ALBEDO = vec3(1.0, 0.0, 0.0);\n" + code += "}\n" + #print("GENERATED SHADER:\n"+shader_code) + code = code.replace("uniform", "const") + return code + diff --git a/material_maker/nodes/debug/debug_popup.tscn b/material_maker/nodes/debug/debug_popup.tscn index 18403add..6ded710b 100644 --- a/material_maker/nodes/debug/debug_popup.tscn +++ b/material_maker/nodes/debug/debug_popup.tscn @@ -2,16 +2,48 @@ [ext_resource path="res://material_maker/nodes/debug/debug_popup.gd" type="Script" id=1] - -[node name="Popup" type="Popup"] -margin_right = 500.0 -margin_bottom = 300.0 +[node name="GeneratedShaderWindow" type="WindowDialog"] +margin_right = 600.0 +margin_bottom = 400.0 rect_min_size = Vector2( 600, 400 ) +popup_exclusive = true +window_title = "Generated shader" script = ExtResource( 1 ) +__meta__ = { +"_edit_use_anchors_": false +} -[node name="TextEdit" type="TextEdit" parent="."] +[node name="VBoxContainer" type="VBoxContainer" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 -custom_colors/background_color = Color( 0, 0.00392157, 0.203922, 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 600.0 +margin_bottom = 20.0 + +[node name="ShaderType" type="OptionButton" parent="VBoxContainer/HBoxContainer"] +margin_right = 92.0 +margin_bottom = 20.0 +text = "Shadertoy" +items = [ "Shadertoy", null, false, 0, null, "Godot Canvas item", null, false, 1, null, "Godot Spatial", null, false, 2, null ] +selected = 0 + +[node name="CopyToClipboard" type="Button" parent="VBoxContainer/HBoxContainer"] +margin_left = 96.0 +margin_right = 219.0 +margin_bottom = 20.0 +text = "Copy to clipboard" + +[node name="TextEdit" type="TextEdit" parent="VBoxContainer"] +margin_top = 24.0 +margin_right = 600.0 +margin_bottom = 400.0 +size_flags_vertical = 3 syntax_highlighting = true show_line_numbers = true +[connection signal="popup_hide" from="." to="." method="queue_free"] +[connection signal="item_selected" from="VBoxContainer/HBoxContainer/ShaderType" to="." method="_on_ShaderType_item_selected"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer/CopyToClipboard" to="." method="_on_CopyToClipboard_pressed"]