50 lines
1.5 KiB
GDScript
50 lines
1.5 KiB
GDScript
@tool
|
|
class_name SVGResource
|
|
extends Resource
|
|
|
|
## Emitted when the SVG texture has been rendered or re-rendered.
|
|
signal texture_updated(new_texture: Texture2D)
|
|
|
|
@export_file("*.svg") var svg_file_path: String = "" : set = _set_svg_file_path
|
|
@export var render_scale: float = 1.0 : set = _set_render_scale # I'd recommend rendering at half scale
|
|
@export var svg_string := ""
|
|
@export var original_size := Vector2.ZERO
|
|
|
|
var texture: Texture2D
|
|
|
|
func _set_svg_file_path(path: String) -> void:
|
|
if Engine.is_editor_hint():
|
|
if svg_file_path == path:
|
|
return
|
|
svg_file_path = path
|
|
if FileAccess.file_exists(path):
|
|
var file := FileAccess.open(path, FileAccess.READ)
|
|
svg_string = Marshalls.utf8_to_base64(file.get_as_text())
|
|
var image := Image.new()
|
|
var error := image.load_svg_from_string(Marshalls.base64_to_utf8(svg_string))
|
|
if error != OK:
|
|
push_error("Failed to render SVG: " + str(error))
|
|
return
|
|
original_size = image.get_size()
|
|
file.close()
|
|
else:
|
|
svg_string = ""
|
|
texture = null
|
|
|
|
# Notify that the resource has changed. The helper will trigger a re-render.
|
|
emit_changed()
|
|
|
|
func _set_render_scale(scale: float) -> void:
|
|
if render_scale == scale:
|
|
return
|
|
render_scale = scale
|
|
# Notify that the resource has changed. The helper will trigger a re-render.
|
|
emit_changed()
|
|
|
|
## Internal method called by the manager upon render completion.
|
|
func _update_texture(new_texture: Texture2D) -> void:
|
|
texture = new_texture
|
|
texture_updated.emit(texture)
|
|
# Notify the editor that this resource has changed, so it updates the inspector.
|
|
emit_changed()
|