mirror of
https://github.com/Relintai/material-maker.git
synced 2024-12-23 21:16:54 +01:00
Updated renderer to generate 16 bits float images, more histogram optimizations
This commit is contained in:
parent
29048fc307
commit
ab7568ccc5
@ -56,11 +56,15 @@ func update_shader() -> void:
|
|||||||
update_buffer()
|
update_buffer()
|
||||||
|
|
||||||
func on_float_parameters_changed(parameter_changes : Dictionary) -> void:
|
func on_float_parameters_changed(parameter_changes : Dictionary) -> void:
|
||||||
|
var do_update : bool = false
|
||||||
for n in parameter_changes.keys():
|
for n in parameter_changes.keys():
|
||||||
for p in VisualServer.shader_get_param_list(material.shader.get_rid()):
|
for p in VisualServer.shader_get_param_list(material.shader.get_rid()):
|
||||||
if p.name == n:
|
if p.name == n:
|
||||||
material.set_shader_param(n, parameter_changes[n])
|
material.set_shader_param(n, parameter_changes[n])
|
||||||
|
do_update = true
|
||||||
break
|
break
|
||||||
|
if do_update:
|
||||||
|
update_buffer()
|
||||||
|
|
||||||
func on_texture_changed(n : String) -> void:
|
func on_texture_changed(n : String) -> void:
|
||||||
for p in VisualServer.shader_get_param_list(material.shader.get_rid()):
|
for p in VisualServer.shader_get_param_list(material.shader.get_rid()):
|
||||||
|
@ -103,7 +103,7 @@ func render_textures() -> void:
|
|||||||
if source.has("textures"):
|
if source.has("textures"):
|
||||||
for k in source.textures.keys():
|
for k in source.textures.keys():
|
||||||
shader_materials[t.texture].set_shader_param(k, source.textures[k])
|
shader_materials[t.texture].set_shader_param(k, source.textures[k])
|
||||||
result = mm_renderer.render_material(shader_materials[t.texture], get_image_size())
|
result = mm_renderer.render_material(shader_materials[t.texture], get_image_size(), false)
|
||||||
else:
|
else:
|
||||||
generated_textures[t.texture] = null
|
generated_textures[t.texture] = null
|
||||||
need_update[t.texture] = false
|
need_update[t.texture] = false
|
||||||
@ -124,6 +124,7 @@ func render_textures() -> void:
|
|||||||
need_update[t.texture] = false
|
need_update[t.texture] = false
|
||||||
|
|
||||||
func on_float_parameters_changed(parameter_changes : Dictionary) -> void:
|
func on_float_parameters_changed(parameter_changes : Dictionary) -> void:
|
||||||
|
var do_update : bool = false
|
||||||
for t in TEXTURE_LIST:
|
for t in TEXTURE_LIST:
|
||||||
if generated_textures[t.texture] != null:
|
if generated_textures[t.texture] != null:
|
||||||
for n in parameter_changes.keys():
|
for n in parameter_changes.keys():
|
||||||
@ -131,17 +132,22 @@ func on_float_parameters_changed(parameter_changes : Dictionary) -> void:
|
|||||||
if p.name == n:
|
if p.name == n:
|
||||||
shader_materials[t.texture].set_shader_param(n, parameter_changes[n])
|
shader_materials[t.texture].set_shader_param(n, parameter_changes[n])
|
||||||
need_render[t.texture] = true
|
need_render[t.texture] = true
|
||||||
update_textures()
|
do_update = true
|
||||||
break
|
break
|
||||||
|
if do_update:
|
||||||
|
update_textures()
|
||||||
|
|
||||||
func on_texture_changed(n : String) -> void:
|
func on_texture_changed(n : String) -> void:
|
||||||
|
var do_update : bool = false
|
||||||
for t in TEXTURE_LIST:
|
for t in TEXTURE_LIST:
|
||||||
if generated_textures[t.texture] != null:
|
if generated_textures[t.texture] != null:
|
||||||
for p in VisualServer.shader_get_param_list(shader_materials[t.texture].shader.get_rid()):
|
for p in VisualServer.shader_get_param_list(shader_materials[t.texture].shader.get_rid()):
|
||||||
if p.name == n:
|
if p.name == n:
|
||||||
need_render[t.texture] = true
|
need_render[t.texture] = true
|
||||||
update_textures()
|
do_update = true
|
||||||
break
|
break
|
||||||
|
if do_update:
|
||||||
|
update_textures()
|
||||||
|
|
||||||
func update_textures() -> void:
|
func update_textures() -> void:
|
||||||
update_again = true
|
update_again = true
|
||||||
@ -152,7 +158,7 @@ func update_textures() -> void:
|
|||||||
update_again = false
|
update_again = false
|
||||||
for t in TEXTURE_LIST:
|
for t in TEXTURE_LIST:
|
||||||
if need_render[t.texture]:
|
if need_render[t.texture]:
|
||||||
var result = mm_renderer.render_material(shader_materials[t.texture], image_size)
|
var result = mm_renderer.render_material(shader_materials[t.texture], image_size, false)
|
||||||
while result is GDScriptFunctionState:
|
while result is GDScriptFunctionState:
|
||||||
result = yield(result, "completed")
|
result = yield(result, "completed")
|
||||||
result.copy_to_texture(generated_textures[t.texture])
|
result.copy_to_texture(generated_textures[t.texture])
|
||||||
|
@ -43,51 +43,12 @@ func generate_shader(src_code) -> String:
|
|||||||
code += shader_code
|
code += shader_code
|
||||||
return code
|
return code
|
||||||
|
|
||||||
func generate_combined_shader(red_code, green_code, blue_code) -> String:
|
|
||||||
var code
|
|
||||||
code = "shader_type canvas_item;\n"
|
|
||||||
code += "render_mode blend_disabled;\n"
|
|
||||||
code += common_shader
|
|
||||||
code += "\n"
|
|
||||||
var globals = []
|
|
||||||
var textures = {}
|
|
||||||
var output = []
|
|
||||||
for c in [ red_code, green_code, blue_code ]:
|
|
||||||
if c.has("textures"):
|
|
||||||
for t in c.textures.keys():
|
|
||||||
textures[t] = c.textures[t]
|
|
||||||
if c.has("globals"):
|
|
||||||
for g in c.globals:
|
|
||||||
if globals.find(g) == -1:
|
|
||||||
globals.push_back(g)
|
|
||||||
if c.has("f"):
|
|
||||||
output.push_back(c.f)
|
|
||||||
else:
|
|
||||||
output.push_back("1.0")
|
|
||||||
for t in textures.keys():
|
|
||||||
code += "uniform sampler2D "+t+";\n"
|
|
||||||
for g in globals:
|
|
||||||
code += g
|
|
||||||
var shader_code = ""
|
|
||||||
shader_code += red_code.defs
|
|
||||||
shader_code += green_code.defs
|
|
||||||
shader_code += blue_code.defs
|
|
||||||
shader_code += "void fragment() {\n"
|
|
||||||
shader_code += red_code.code
|
|
||||||
shader_code += green_code.code
|
|
||||||
shader_code += blue_code.code
|
|
||||||
shader_code += "COLOR = vec4("+output[0]+", "+output[1]+", "+output[2]+", 1.0);\n"
|
|
||||||
shader_code += "}\n"
|
|
||||||
#print("GENERATED COMBINED SHADER:\n"+shader_code)
|
|
||||||
code += shader_code
|
|
||||||
return code
|
|
||||||
|
|
||||||
func setup_material(shader_material, textures, shader_code) -> void:
|
func setup_material(shader_material, textures, shader_code) -> void:
|
||||||
for k in textures.keys():
|
for k in textures.keys():
|
||||||
shader_material.set_shader_param(k+"_tex", textures[k])
|
shader_material.set_shader_param(k+"_tex", textures[k])
|
||||||
shader_material.shader.code = shader_code
|
shader_material.shader.code = shader_code
|
||||||
|
|
||||||
func render_material(material, render_size) -> Object:
|
func render_material(material, render_size, with_hdr = true) -> Object:
|
||||||
while rendering:
|
while rendering:
|
||||||
yield(self, "done")
|
yield(self, "done")
|
||||||
rendering = true
|
rendering = true
|
||||||
@ -96,6 +57,7 @@ func render_material(material, render_size) -> Object:
|
|||||||
$ColorRect.rect_position = Vector2(0, 0)
|
$ColorRect.rect_position = Vector2(0, 0)
|
||||||
$ColorRect.rect_size = size
|
$ColorRect.rect_size = size
|
||||||
$ColorRect.material = material
|
$ColorRect.material = material
|
||||||
|
hdr = with_hdr
|
||||||
render_target_update_mode = Viewport.UPDATE_ONCE
|
render_target_update_mode = Viewport.UPDATE_ONCE
|
||||||
update_worlds()
|
update_worlds()
|
||||||
yield(get_tree(), "idle_frame")
|
yield(get_tree(), "idle_frame")
|
||||||
@ -145,4 +107,5 @@ func save_to_file(fn : String) -> void:
|
|||||||
|
|
||||||
func release() -> void:
|
func release() -> void:
|
||||||
rendering = false
|
rendering = false
|
||||||
|
hdr = false
|
||||||
emit_signal("done")
|
emit_signal("done")
|
||||||
|
@ -18,7 +18,6 @@ own_world = true
|
|||||||
transparent_bg = true
|
transparent_bg = true
|
||||||
hdr = false
|
hdr = false
|
||||||
keep_3d_linear = true
|
keep_3d_linear = true
|
||||||
usage = 0
|
|
||||||
render_target_v_flip = true
|
render_target_v_flip = true
|
||||||
render_target_update_mode = 1
|
render_target_update_mode = 1
|
||||||
gui_disable_input = true
|
gui_disable_input = true
|
||||||
|
@ -5,12 +5,6 @@ var fixed_lines : int = 0
|
|||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
update_node()
|
update_node()
|
||||||
|
|
||||||
func update_preview_buttons(index : int) -> void:
|
|
||||||
for i in range(generator.parameters.outputs):
|
|
||||||
if i != index:
|
|
||||||
var line = get_child(i)
|
|
||||||
line.get_child(2).pressed = false
|
|
||||||
|
|
||||||
func update_node() -> void:
|
func update_node() -> void:
|
||||||
if generator == null or !generator.parameters.has("outputs") or !generator.parameters.has("choices"):
|
if generator == null or !generator.parameters.has("outputs") or !generator.parameters.has("choices"):
|
||||||
return
|
return
|
||||||
|
@ -3,8 +3,6 @@
|
|||||||
[ext_resource path="res://material_maker/nodes/switch.gd" type="Script" id=1]
|
[ext_resource path="res://material_maker/nodes/switch.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://material_maker/widgets/preview_button.tscn" type="PackedScene" id=2]
|
[ext_resource path="res://material_maker/widgets/preview_button.tscn" type="PackedScene" id=2]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[sub_resource type="Theme" id=1]
|
[sub_resource type="Theme" id=1]
|
||||||
|
|
||||||
[node name="Switch" type="GraphNode"]
|
[node name="Switch" type="GraphNode"]
|
||||||
@ -36,6 +34,9 @@ slot/2/right_enabled = false
|
|||||||
slot/2/right_type = 0
|
slot/2/right_type = 0
|
||||||
slot/2/right_color = Color( 1, 1, 1, 1 )
|
slot/2/right_color = Color( 1, 1, 1, 1 )
|
||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
[node name="HBox1" type="HBoxContainer" parent="."]
|
[node name="HBox1" type="HBoxContainer" parent="."]
|
||||||
margin_left = 16.0
|
margin_left = 16.0
|
||||||
@ -69,9 +70,9 @@ margin_bottom = 16.0
|
|||||||
|
|
||||||
[node name="HBox2" type="HBoxContainer" parent="."]
|
[node name="HBox2" type="HBoxContainer" parent="."]
|
||||||
margin_left = 16.0
|
margin_left = 16.0
|
||||||
margin_top = 40.0
|
margin_top = 41.0
|
||||||
margin_right = 135.0
|
margin_right = 135.0
|
||||||
margin_bottom = 56.0
|
margin_bottom = 57.0
|
||||||
|
|
||||||
[node name="Label" type="Label" parent="HBox2"]
|
[node name="Label" type="Label" parent="HBox2"]
|
||||||
margin_top = 1.0
|
margin_top = 1.0
|
||||||
@ -99,9 +100,9 @@ margin_bottom = 16.0
|
|||||||
|
|
||||||
[node name="HBox3" type="HBoxContainer" parent="."]
|
[node name="HBox3" type="HBoxContainer" parent="."]
|
||||||
margin_left = 16.0
|
margin_left = 16.0
|
||||||
margin_top = 57.0
|
margin_top = 58.0
|
||||||
margin_right = 135.0
|
margin_right = 135.0
|
||||||
margin_bottom = 73.0
|
margin_bottom = 74.0
|
||||||
|
|
||||||
[node name="Label" type="Label" parent="HBox3"]
|
[node name="Label" type="Label" parent="HBox3"]
|
||||||
margin_top = 1.0
|
margin_top = 1.0
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
extends MMGraphNodeBase
|
extends MMGraphNodeGeneric
|
||||||
|
|
||||||
class Cursor:
|
class Cursor:
|
||||||
extends Control
|
extends Control
|
||||||
@ -69,10 +69,19 @@ func _ready() -> void:
|
|||||||
cursor_out_max = Cursor.new(Color(1.0, 1.0, 1.0), 1.0, false)
|
cursor_out_max = Cursor.new(Color(1.0, 1.0, 1.0), 1.0, false)
|
||||||
$Histogram.add_child(cursor_out_max)
|
$Histogram.add_child(cursor_out_max)
|
||||||
|
|
||||||
|
func update_node() -> void:
|
||||||
|
_on_Mode_item_selected(0)
|
||||||
|
on_parameter_changed("__input_changed__", 0)
|
||||||
|
# Preview
|
||||||
|
restore_preview_widget()
|
||||||
|
|
||||||
func on_parameter_changed(p, v) -> void:
|
func on_parameter_changed(p, v) -> void:
|
||||||
if p == "__input_changed__":
|
if p == "__input_changed__":
|
||||||
var source = generator.get_source(0)
|
var source = generator.get_source(0)
|
||||||
|
if source != null:
|
||||||
$Histogram.set_generator(source.generator, source.output_index)
|
$Histogram.set_generator(source.generator, source.output_index)
|
||||||
|
else:
|
||||||
|
$Histogram.set_generator(null, 0)
|
||||||
|
|
||||||
func get_parameter(n : String) -> float:
|
func get_parameter(n : String) -> float:
|
||||||
var value = generator.get_parameter(n)
|
var value = generator.get_parameter(n)
|
||||||
|
@ -41,7 +41,7 @@ func set_generator(g : MMGenBase, o : int = 0) -> void:
|
|||||||
material.set_shader_param(k, source.textures[k])
|
material.set_shader_param(k, source.textures[k])
|
||||||
|
|
||||||
func on_parameter_changed(n : String, v) -> void:
|
func on_parameter_changed(n : String, v) -> void:
|
||||||
if n == "__input_changed__":
|
if n == "__output_changed__" and output == v:
|
||||||
set_generator(generator, output)
|
set_generator(generator, output)
|
||||||
var p = generator.get_parameter_def(n)
|
var p = generator.get_parameter_def(n)
|
||||||
if p.has("type"):
|
if p.has("type"):
|
||||||
|
@ -3,7 +3,8 @@ extends Control
|
|||||||
var generator : MMGenBase = null
|
var generator : MMGenBase = null
|
||||||
var output : int = 0
|
var output : int = 0
|
||||||
|
|
||||||
onready var image : ColorRect = $ViewportImage/ColorRect
|
var updating : bool = false
|
||||||
|
var update_again : bool = false
|
||||||
|
|
||||||
func get_image_texture() -> ImageTexture:
|
func get_image_texture() -> ImageTexture:
|
||||||
return $ViewportImage/ColorRect.material.get_shader_param("tex")
|
return $ViewportImage/ColorRect.material.get_shader_param("tex")
|
||||||
@ -29,16 +30,16 @@ func set_generator(g : MMGenBase, o : int = 0) -> void:
|
|||||||
if source.empty():
|
if source.empty():
|
||||||
source = { defs="", code="", textures={}, type="f", f="1.0" }
|
source = { defs="", code="", textures={}, type="f", f="1.0" }
|
||||||
# Update shader
|
# Update shader
|
||||||
image.material.shader.code = MMGenBase.generate_preview_shader(source, source.type, "uniform vec2 size;void fragment() {COLOR = preview_2d(UV);}")
|
$ViewportImage/ColorRect.material.shader.code = MMGenBase.generate_preview_shader(source, source.type, "uniform vec2 size;void fragment() {COLOR = preview_2d(UV);}")
|
||||||
# Get parameter values from the shader code
|
# Get parameter values from the shader code
|
||||||
var regex = RegEx.new()
|
var regex = RegEx.new()
|
||||||
regex.compile("uniform\\s+(\\w+)\\s+([\\w_\\d]+)\\s*=\\s*([^;]+);")
|
regex.compile("uniform\\s+(\\w+)\\s+([\\w_\\d]+)\\s*=\\s*([^;]+);")
|
||||||
for p in regex.search_all(image.material.shader.code):
|
for p in regex.search_all($ViewportImage/ColorRect.material.shader.code):
|
||||||
image.material.set_shader_param(p.strings[2], float(p.strings[3]))
|
$ViewportImage/ColorRect.material.set_shader_param(p.strings[2], float(p.strings[3]))
|
||||||
# Set texture params
|
# Set texture params
|
||||||
if source.has("textures"):
|
if source.has("textures"):
|
||||||
for k in source.textures.keys():
|
for k in source.textures.keys():
|
||||||
image.material.set_shader_param(k, source.textures[k])
|
$ViewportImage/ColorRect.material.set_shader_param(k, source.textures[k])
|
||||||
update_histogram()
|
update_histogram()
|
||||||
|
|
||||||
func on_parameter_changed(n : String, v) -> void:
|
func on_parameter_changed(n : String, v) -> void:
|
||||||
@ -55,13 +56,34 @@ func on_parameter_changed(n : String, v) -> void:
|
|||||||
func on_float_parameters_changed(parameter_changes : Dictionary) -> void:
|
func on_float_parameters_changed(parameter_changes : Dictionary) -> void:
|
||||||
var need_update : bool = false
|
var need_update : bool = false
|
||||||
for n in parameter_changes.keys():
|
for n in parameter_changes.keys():
|
||||||
for p in VisualServer.shader_get_param_list(image.material.shader.get_rid()):
|
for p in VisualServer.shader_get_param_list($ViewportImage/ColorRect.material.shader.get_rid()):
|
||||||
if p.name == n:
|
if p.name == n:
|
||||||
image.material.set_shader_param(n, parameter_changes[n])
|
$ViewportImage/ColorRect.material.set_shader_param(n, parameter_changes[n])
|
||||||
need_update = true
|
need_update = true
|
||||||
break
|
break
|
||||||
if need_update:
|
if need_update:
|
||||||
update_histogram()
|
update_histogram()
|
||||||
|
|
||||||
func update_histogram() -> void:
|
func update_histogram() -> void:
|
||||||
pass
|
update_again = true
|
||||||
|
if !updating && is_visible_in_tree():
|
||||||
|
updating = true
|
||||||
|
while update_again:
|
||||||
|
update_again = false
|
||||||
|
$ViewportImage.render_target_update_mode = Viewport.UPDATE_ONCE
|
||||||
|
$ViewportImage.update_worlds()
|
||||||
|
yield(get_tree(), "idle_frame")
|
||||||
|
yield(get_tree(), "idle_frame")
|
||||||
|
$ViewportHistogram1.render_target_update_mode = Viewport.UPDATE_ONCE
|
||||||
|
$ViewportHistogram1.update_worlds()
|
||||||
|
yield(get_tree(), "idle_frame")
|
||||||
|
yield(get_tree(), "idle_frame")
|
||||||
|
$ViewportHistogram2.render_target_update_mode = Viewport.UPDATE_ONCE
|
||||||
|
$ViewportHistogram2.update_worlds()
|
||||||
|
yield(get_tree(), "idle_frame")
|
||||||
|
yield(get_tree(), "idle_frame")
|
||||||
|
updating = false
|
||||||
|
|
||||||
|
func _on_Histogram_visibility_changed():
|
||||||
|
if is_visible_in_tree():
|
||||||
|
update_histogram()
|
||||||
|
@ -112,7 +112,7 @@ transparent_bg = true
|
|||||||
hdr = false
|
hdr = false
|
||||||
usage = 0
|
usage = 0
|
||||||
render_target_v_flip = true
|
render_target_v_flip = true
|
||||||
render_target_update_mode = 3
|
render_target_update_mode = 1
|
||||||
|
|
||||||
[node name="ColorRect" type="ColorRect" parent="ViewportImage"]
|
[node name="ColorRect" type="ColorRect" parent="ViewportImage"]
|
||||||
material = SubResource( 3 )
|
material = SubResource( 3 )
|
||||||
@ -124,10 +124,10 @@ rect_min_size = Vector2( 256, 256 )
|
|||||||
size = Vector2( 128, 128 )
|
size = Vector2( 128, 128 )
|
||||||
own_world = true
|
own_world = true
|
||||||
transparent_bg = true
|
transparent_bg = true
|
||||||
hdr = false
|
disable_3d = true
|
||||||
usage = 0
|
keep_3d_linear = true
|
||||||
render_target_v_flip = true
|
render_target_v_flip = true
|
||||||
render_target_update_mode = 3
|
render_target_update_mode = 1
|
||||||
|
|
||||||
[node name="ColorRect" type="ColorRect" parent="ViewportHistogram1"]
|
[node name="ColorRect" type="ColorRect" parent="ViewportHistogram1"]
|
||||||
material = SubResource( 6 )
|
material = SubResource( 6 )
|
||||||
@ -140,7 +140,6 @@ size = Vector2( 128, 2 )
|
|||||||
transparent_bg = true
|
transparent_bg = true
|
||||||
disable_3d = true
|
disable_3d = true
|
||||||
keep_3d_linear = true
|
keep_3d_linear = true
|
||||||
usage = 0
|
|
||||||
render_target_v_flip = true
|
render_target_v_flip = true
|
||||||
render_target_update_mode = 3
|
render_target_update_mode = 3
|
||||||
|
|
||||||
@ -157,3 +156,4 @@ anchor_bottom = 1.0
|
|||||||
__meta__ = {
|
__meta__ = {
|
||||||
"_edit_use_anchors_": false
|
"_edit_use_anchors_": false
|
||||||
}
|
}
|
||||||
|
[connection signal="visibility_changed" from="." to="." method="_on_Histogram_visibility_changed"]
|
||||||
|
Loading…
Reference in New Issue
Block a user