SupaLidlGame/addons/GodotAnnotate/src/annotate_canvas_capture_vie...

44 lines
1.3 KiB
GDScript

class_name AnnotateCanvasCaptureViewport
extends SubViewport
##
## Class responsible for saving an image version of a AnnotateCanvas node to disk.
##
var _first_process := true
var _file_location: String
## Construct a AnnotateCanvasCaptureViewport node. [br]
## [param AnnotateCanvas]: AnnotateCanvas which should be saved as an image to disk.
## [param file]: Filename the image will be stored under.
## [param scale]: What the resolution of the image should be scaled by.
func _init(canvas: AnnotateCanvas, file: String, scale: float = 1.0):
canvas = canvas.duplicate()
_file_location = file
var canvas_area := canvas.get_canvas_area()
# viewports render anything from (0, 0) to (width, height),
# so we want to offset the canvas contents to make sure they fit inside this area.
canvas.position = -canvas_area.position * scale
canvas.scale *= scale
canvas_area.position = Vector2.ZERO
add_child(canvas)
size = canvas_area.size * scale
render_target_update_mode = SubViewport.UPDATE_ALWAYS
transparent_bg = true
func _process(_delta):
if _first_process:
# allow viewport to update itself before capturing
_first_process = false
return
get_texture().get_image().save_png(_file_location)
# make sure new image file is visible in the editor filesystem
GodotAnnotate.editor_interface.get_resource_filesystem().scan()
queue_free()