40 lines
1.3 KiB
GDScript
40 lines
1.3 KiB
GDScript
extends SubViewport
|
|
|
|
@onready var image_sprite = $ImageSprite
|
|
|
|
var image_original_tex: ImageTexture
|
|
var image_result: Image
|
|
var load_uniform_regex: RegEx
|
|
|
|
func _ready():
|
|
load_uniform_regex = RegEx.new()
|
|
load_uniform_regex.compile(r'\/\/!load\s(\w*)\s(.*)')
|
|
|
|
func set_original_image(image: Image):
|
|
image_original_tex = ImageTexture.create_from_image(image)
|
|
image_sprite.texture = image_original_tex
|
|
image_sprite.offset = image_original_tex.get_size() / 2
|
|
size = image_original_tex.get_size()
|
|
|
|
func update():
|
|
if image_original_tex != null:
|
|
image_sprite.texture = image_original_tex
|
|
var mat = ShaderMaterial.new()
|
|
mat.shader = Globals.shader
|
|
# load images from //!load directives and apply them to
|
|
# the material as shader parameters
|
|
for m in load_uniform_regex.search_all(Globals.shader.code):
|
|
var u_image = Image.load_from_file(m.strings[2])
|
|
mat.set_shader_parameter(
|
|
m.strings[1], # uniform param name
|
|
ImageTexture.create_from_image(u_image))
|
|
# assign material
|
|
image_sprite.material = mat
|
|
# Get viewport texture
|
|
await RenderingServer.frame_post_draw # for good measure
|
|
image_result = get_texture().get_image()
|
|
image_sprite.material = null
|
|
image_sprite.texture = ImageTexture.create_from_image(image_result)
|
|
|
|
func get_result():
|
|
return image_result
|