44 lines
1.3 KiB
GDScript
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()
|