Files
nodewars/addons/curved_lines_2d/svg_resource.gd
2026-05-13 18:52:00 +02:00

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()