From 5b63a0a6732bee7eaaee73d71e46d484a2baa967 Mon Sep 17 00:00:00 2001 From: Pyral Date: Fri, 20 Dec 2024 15:24:25 -0500 Subject: [PATCH] Add customizable assets via zip loading. --- asset_pack.gd | 34 ++++++++ asset_pack.gd.uid | 1 + assets.zip | Bin 0 -> 97585 bytes export_presets.cfg | 73 ++++++++++++++++- main.gd | 14 +++- main.gd.uid | 1 + main.tscn | 6 +- project.godot | 3 + vfs/create_vfs.gd | 193 +++++++++++++++++++++++++++++++++++++++++++++ vfs/vfs.gd | 179 +++++++++++++++++++++++++++++++++++++++++ vfs/vfs_loaders.gd | 71 +++++++++++++++++ 11 files changed, 569 insertions(+), 6 deletions(-) create mode 100644 asset_pack.gd create mode 100644 asset_pack.gd.uid create mode 100644 assets.zip create mode 100644 main.gd.uid create mode 100644 vfs/create_vfs.gd create mode 100644 vfs/vfs.gd create mode 100644 vfs/vfs_loaders.gd diff --git a/asset_pack.gd b/asset_pack.gd new file mode 100644 index 0000000..7617151 --- /dev/null +++ b/asset_pack.gd @@ -0,0 +1,34 @@ +class_name AssetPack extends Object + +const ASSET_DIR := "./assets.zip" + +static func load_sfx()->Dictionary[StringName, AudioStream]: + var dict := load_user_assets( + VFileAccess.IMPORTS.AUDIO_FILES, ["ogg","mp3","wav"]) + var ugh:Dictionary[StringName,AudioStream] + ugh.assign(dict) + return ugh + + +static func load_gfx()->Dictionary[StringName, Texture2D]: + var images:Dictionary = load_user_assets( + VFileAccess.IMPORTS.IMAGE_FILES, ["png","jpg","jpeg"]) + var output:Dictionary[StringName, Texture2D] = {} + for id:StringName in images.keys(): + output[id] = ImageTexture.create_from_image(images[id]) + return output + + +static func load_user_assets( + formats_supported:Dictionary[String,Callable], + formats:Array[String] + )->Dictionary: + var vfs := VFileAccess.CREATE.create_readonly_zip_access(ASSET_DIR, false, formats_supported) + var load_asset := vfs.load_any_supported.bind(formats) + var output:Dictionary = { + &"rest": load_asset.call("rest"), + &"longrest": load_asset.call("longrest"), + &"run": load_asset.call("run") + } + vfs.close() + return output diff --git a/asset_pack.gd.uid b/asset_pack.gd.uid new file mode 100644 index 0000000..b1068bd --- /dev/null +++ b/asset_pack.gd.uid @@ -0,0 +1 @@ +uid://d17o8drukf01j diff --git a/assets.zip b/assets.zip new file mode 100644 index 0000000000000000000000000000000000000000..5a4869b519c5da29236a820f8b638a305738c4b8 GIT binary patch literal 97585 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: + images = AssetPack.load_gfx() + sounds = AssetPack.load_sfx() + pass func _process(delta: float) -> void: @@ -69,6 +80,7 @@ func _process(delta: float) -> void: realtime_label.text = "[color=red]%s" % \ Time.get_time_string_from_unix_time(realtime_since_start) + func get_from_menus()->PomodoroContext: return PomodoroContext.new( 4, diff --git a/main.gd.uid b/main.gd.uid new file mode 100644 index 0000000..0fd9394 --- /dev/null +++ b/main.gd.uid @@ -0,0 +1 @@ +uid://c4mjp8t1rmhgx diff --git a/main.tscn b/main.tscn index 5b781a3..dfa1ed7 100644 --- a/main.tscn +++ b/main.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=3 format=3 uid="uid://dw6uk60j153g4"] -[ext_resource type="Script" path="res://main.gd" id="1_fn6k1"] +[ext_resource type="Script" uid="uid://c4mjp8t1rmhgx" path="res://main.gd" id="1_fn6k1"] [ext_resource type="AudioStream" uid="uid://doh10c785c5fm" path="res://assets/miss.wav" id="3_sir8a"] [node name="Main" type="Control" node_paths=PackedStringArray("time_label", "realtime_label", "rest_label", "timer", "image", "edits")] @@ -17,9 +17,9 @@ rest_label = NodePath("Rests") timer = NodePath("Timer") image = NodePath("FunnyImg") edits = { +&"longrest": NodePath("VBoxContainer/EditMinutesLongBreak"), &"rest": NodePath("VBoxContainer/EditMinutesBreak"), -&"run": NodePath("VBoxContainer/EditWorkMins"), -&"longrest": NodePath("VBoxContainer/EditMinutesLongBreak") +&"run": NodePath("VBoxContainer/EditWorkMins") } [node name="FunnyImg" type="TextureRect" parent="."] diff --git a/project.godot b/project.godot index 69b050a..f14d473 100644 --- a/project.godot +++ b/project.godot @@ -12,6 +12,8 @@ config_version=5 config/name="dino_tomato" run/main_scene="res://main.tscn" +config/use_custom_user_dir=true +config/custom_user_dir_name="dinoleaf/tools/tomato" config/features=PackedStringArray("4.4", "GL Compatibility") run/max_fps=30 run/low_processor_mode=true @@ -32,4 +34,5 @@ window/vsync/vsync_mode=0 [rendering] renderer/rendering_method="mobile" +textures/vram_compression/import_s3tc_bptc=true environment/defaults/default_clear_color=Color(1, 1, 1, 1) diff --git a/vfs/create_vfs.gd b/vfs/create_vfs.gd new file mode 100644 index 0000000..5a58800 --- /dev/null +++ b/vfs/create_vfs.gd @@ -0,0 +1,193 @@ +# Not unlike factory pattern. + +# This code's been directly written in due to time and lazy, but +# will be thrown into submodules eventually to clean readability up. + +## Recursively creates virtual file systems. +static func create_meta_accessor(file_accessors:Array[VFileAccess])->VFileAccess: + var vfiler := VFileAccess.new("") + + vfiler._get_stuff = func()->Variant: return file_accessors + + vfiler._file_exists = func(path:String)->bool: + return file_accessors.any(func(vfs:VFileAccess)->bool: + return vfs.file_exists(path)) + + vfiler._get_files_at = func(path:String)->Array[String]: + var accum:Array[String] = [] + accum.assign( + file_accessors.reduce( + (func _merge_files(total:Array, current:VFileAccess)->Array: + var res:Array = total.duplicate() + for file:String in current.get_files_at(path): + if not file in total: + res.append(file) + return res) ,[])) + return accum + + vfiler._get_buffer = func(path:String)->PackedByteArray: + for vfs:VFileAccess in file_accessors: + if vfs.file_exists(path): + return vfs.get_buffer(path) + push_error("File '%s' not found in any checked accessors." % path) + return PackedByteArray() + + vfiler._write_file = func _zip_write(_path:String, _buffer:PackedByteArray)->Error: + return ERR_FILE_CANT_WRITE + + vfiler._close = func()->void: + file_accessors.map(func(vfs:VFileAccess)->void: vfs.close()) + + return vfiler + + +## A basic file accessor. +static func create_file_access( + root:String = "./", + support_files:Dictionary[String,Callable] = VFileAccess.IMPORTS.DEFAULT_SUPPORTED_FILES + )->VFileAccess: + var vfiler := VFileAccess.new(root, support_files) + + vfiler._get_buffer = FileAccess.get_file_as_bytes # thanks for being static + + vfiler._file_exists = FileAccess.file_exists # thanks for being static + + vfiler._write_file = func _file_access_write(path:String, buffer:PackedByteArray)->void: + var abs_path := vfiler.get_absolute_path(path) + if not DirAccess.dir_exists_absolute(abs_path): + DirAccess.make_dir_recursive_absolute(abs_path.get_base_dir()) + var f := FileAccess.open(abs_path, FileAccess.WRITE_READ) + f.store_buffer(buffer) + f.close() + + vfiler._get_files_at = func(path:String)->Array[String]: + var paths:Array[String] = [] + #var abs_path := vfiler.get_absolute_path(path) + if not DirAccess.dir_exists_absolute(path): + print("Path '%s' not found. Adding..." % path) + DirAccess.make_dir_recursive_absolute(path) + paths.assign(DirAccess.get_files_at(path)) + return paths + + return vfiler + + +static func create_writeonly_zip_access( + zip_path:String, + append := ZIPPacker.ZipAppend.APPEND_CREATE, + )->VFileAccess: + var vfiler := VFileAccess.new() + if not is_instance_valid(vfiler): return null + + var writer := ZIPPacker.new() + # Open once to verify it exists and works. + var _open_err := writer.open(zip_path, append) + #if open_err != OK: + #push_error("Could not open zip writer '%s'" % error_string(open_err)) + #return null + #writer.close() + + vfiler._get_stuff = func()->Variant: return writer + + vfiler._write_file = func _zip_write(path:String, buffer:PackedByteArray)->Error: + var abs_path := vfiler.get_absolute_path(path) + writer.start_file(path) + var write_err := writer.write_file(buffer) + writer.close_file() + return write_err + + vfiler._get_buffer = func(_path:String)->PackedByteArray: + push_error("Attempted to read from write-only zip access! Returning 0 bytes.") + return PackedByteArray() + + vfiler._get_files_at = func(_path:String)->Array[String]: + push_error("Attempted to get files from write-only zip access!") + return [] + + vfiler._close = func()->void: writer.close() + + return vfiler + + + +## A single zip file accessor, but with write functions disabled. +## TODO option to keep zips open, for OS to flag files as in-use. +static func create_readonly_zip_access( + zip_path:String, keep_open:bool = false, + support_files:Dictionary[String,Callable] = VFileAccess.IMPORTS.DEFAULT_SUPPORTED_FILES + )->VFileAccess: + var vfiler := create_bulk_readonly_zip_access([zip_path], keep_open, support_files) + vfiler._get_stuff = func()->Variant: return vfiler.get_stuff()[0] + return vfiler + +## A multi-zip readonly accessor. Allows for multiple zips to load with overrides. +## TODO option to keep zips open, for OS to flag files as in-use. +## [param if_missing_zip(String)] executes if a requested file is not found. +static func create_bulk_readonly_zip_access( + zip_paths:Array[String], keep_open:bool = false, + support_files:Dictionary[String,Callable] = VFileAccess.IMPORTS.DEFAULT_SUPPORTED_FILES, + if_missing_zip := func _ignore(_zip_path:String)->bool: return false, + )->VFileAccess: + var vfiler := VFileAccess.new("", support_files) + + var readers:Array[ZIPReader] = [] + readers.assign(zip_paths.map( + func _open_zip_reader(zip_path:String)->ZIPReader: + var zip := ZIPReader.new() + if not FileAccess.file_exists(zip_path): # Use VFileAccess recursively so we are more powerful? + if_missing_zip.call(zip_path) + var open_err := zip.open(zip_path) + if open_err: + push_error("Could not open zip '%s': %s" % [zip_path, error_string(open_err)]) + return null + return zip)) + + readers.assign(readers.filter(is_instance_valid)) + + vfiler._get_stuff = func()->Variant: return readers + + # file exists set first so we can bulk-check later + vfiler._file_exists = func(abs_path:String)->bool: + return readers.any( + func(z:ZIPReader)->bool: return z.file_exists(abs_path)) + + vfiler._get_buffer = func(abs_path:String)->PackedByteArray: + var output := PackedByteArray() + if not vfiler.file_exists(abs_path): + push_error("Zips don't have file id '%s'" % abs_path) + return output + for index:int in readers.size(): + var z := readers[index] + if not z.file_exists(abs_path): continue + output = z.read_file(abs_path) + break + return output + + vfiler._write_file = func _zip_write(_path:String, _buffer:PackedByteArray)->Error: + return ERR_FILE_CANT_WRITE + vfiler._close = func()->void: + readers.map(func(z:ZIPReader)->void: z.close()) + + vfiler._get_files_at = func(path:String)->Array[String]: + if not path.ends_with("/"): # TODO ensure no // as well because that can be problem. + path += "/" # sorry for the mutation + var accum:Array = [] + accum.assign( readers.reduce( + (func _merge_files(total:Array, current:ZIPReader)->Array: + var res:Array = total.duplicate() + var filtered:Array = [] + filtered.assign(current.get_files()) + filtered = filtered.filter( + func _filter_dir(curpath:String)->bool: + return curpath.begins_with(path)) + for file:String in filtered: + var stripped_file:String = file.replace(path, "") + # remove files with / after the file stripping to prevent directories. + if not file in total and not stripped_file.contains("/"): + res.append(file) + return res) ,[])) + var out_accum:Array[String] = [] + out_accum.assign(accum) + return out_accum + + return vfiler diff --git a/vfs/vfs.gd b/vfs/vfs.gd new file mode 100644 index 0000000..41ac613 --- /dev/null +++ b/vfs/vfs.gd @@ -0,0 +1,179 @@ +## Virtual File Access +## [br] +## File access across different methods sucks. +## Here's something to abstract that away and suck a little less. +## [br] +## Written for Godot 4.4 + +class_name VFileAccess extends RefCounted + +## Built-in VFileAccess factories (Learn to make your own with these) +const CREATE := preload("create_vfs.gd") +## File importer functions. +const IMPORTS := preload("vfs_loaders.gd") + +## Path prefix. How this is handled depends on the file loader itself. +var root:String = "" + +## Callable(bytes:PackedByteArray, [...])->Variant +var supported_files:Dictionary[String,Callable] = {} + +## Get any stuff we might be using in our closures. +var _get_stuff:Callable = func()->Variant: return null +## How can we write to a file? +var _write_file:Callable = func(_abs_path:String, data:Variant)->Error: + return ERR_CANT_OPEN +## How do we get bytes from this? +var _get_buffer:Callable = func(_abs_path:String)->PackedByteArray: + return PackedByteArray() +## What determines if a file exists? +var _file_exists:Callable = func(_abs_path:String)->bool: + return false +## How do we get files at a subdirectory? +var _get_files_at:Callable = func(_abs_path:String)->Array[String]: + return [] +## Shutdown code here. +var _close:Callable = func()->void: pass + +## Default +func _init( + root_dir:String = "./", + support_files = IMPORTS.DEFAULT_SUPPORTED_FILES + )->void: + self.root = root_dir + self.supported_files = support_files.duplicate(true) + +#region Static ops + +static func copy_file(from:VFileAccess, to:VFileAccess)->bool: + push_warning("Copy file unimplemented") + return false + +#endregion + +## I never won awards for naming things correctly. +func get_stuff()->Variant: + return _get_stuff.call() + +## Add automatic file loaders to this virtual file system. +func add_supported_files(file_loaders:Dictionary[String,Callable])->Dictionary[String,bool]: + var results:Dictionary[String,bool] = {} + for key:String in file_loaders.keys(): + var loader := file_loaders[key] + results[key] = false + if not IMPORTS.validate_loader(loader): continue + supported_files[key] = loader + results[key] = true + return results + + +## Get all files supported for autoloading. +func get_supported_files()->Array[String]: + return supported_files.keys() + + +func load_supported_bulk( + paths:Array[String], + ext_override:String = "" + )->Array[Variant]: + return paths.map(load_supported.bind(ext_override)) + + +## Load a supported file. If [param path]'s extension matches a supported file, +## it will use that loader and return whatever it's supposed to. +## [param ext_override] allows for selecting a specific loader by key. +## Returns null if no matching loader is found. +func load_supported(path:String, ext_override:String = "")->Variant: + var abs_path := get_absolute_path(path) + var ext := abs_path.get_extension() \ + if ext_override.is_empty() else ext_override + + if not ext in supported_files.keys(): + push_error("File extension '%s' not supported by this loader!" % ext) + return null + + var buffer := get_buffer(path) + var result:Variant = supported_files[ext].call(buffer) + if not is_instance_valid(result) and result is not String: + push_warning("%s loader tried loading '%s' but received null. Does the file exist?" + % [ext, abs_path]) + + return result + + +## Like load_supported, but expects [param path] to not have an extension. +## Instead, [param extensions] can contain multiple extensions, which will be +## appended and checked to exist. This allows for prioritizing one format +## over another or loosely defining a file id and allowing the engine to +## find a first match. +func load_any_supported(base_path:String, extensions:Array[String] = [])->Variant: + var _append_ext := func _append_ext(ext:String)->String: + return (base_path + ext) \ + if ext.begins_with(".") \ + else (base_path + "." + ext) + var try_paths:Array = extensions.map(_append_ext) + for path:String in try_paths: + if not file_exists(path): continue + return load_supported(path) + push_error("Could not find any file for '%s'.%s!" % [base_path, extensions]) + return null + + +## [param parse] Callable(buffer:PackedByteArray)->Variant +func load_and_parse(path:String, parse:Callable)->Variant: + var abs_path:String = get_absolute_path(path) + var buffer:PackedByteArray = get_buffer(abs_path) + var result:Variant = parse.call(buffer) + return result + + +## Get bytes from this file loader. +func get_buffer(path:String)->PackedByteArray: + return get_multiple_buffers([path])[path] + + +## Get multiple file buffers. +## Returns Dictionary[String,PackedByteArray] +## which uses the path given as the key for the respective data buffer. +func get_multiple_buffers(paths:Array[String])->Dictionary[String,PackedByteArray]: + var output:Dictionary[String,PackedByteArray] = {} + for path:String in paths: + var abs_path := get_absolute_path(path) + if _file_exists.call(abs_path): + output[path] = _get_buffer.call(abs_path) + if output[path].size() == 0: + push_warning("File '%s' found but is 0 bytes long. Intentional?" % abs_path) + else: + push_error("File '%s' does not exist!" % abs_path) + output[path] = PackedByteArray() + return output + + +## Get files in a directory +func get_files_at(path:String)->Array[String]: + var abs_path := get_absolute_path(path) + return _get_files_at.call(abs_path) + + +## Write buffer to file, if possible. +func write_file(path:String, buffer:PackedByteArray)->Error: + return _write_file.call(path, buffer) + + +## Deallocate stuff. +func close()->void: + _close.call() + + +## Check if this file exists within this loader. +## If [param ignore_root] is true, file root will not be prefixed to [param path] +func file_exists(path:String, ignore_root := false)->bool: + return _file_exists.call(path) \ + if ignore_root else _file_exists.call(get_absolute_path(path)) + + +## Gets the internal absolute path based on this filesystem's root. +func get_absolute_path(relative_path:String)->String: + if root.is_empty() or root.ends_with("/"): + return root + relative_path + return "%s/%s" % [root, relative_path] diff --git a/vfs/vfs_loaders.gd b/vfs/vfs_loaders.gd new file mode 100644 index 0000000..019e161 --- /dev/null +++ b/vfs/vfs_loaders.gd @@ -0,0 +1,71 @@ + + +static func validate_loader(loader:Callable)->bool: + if loader.get_unbound_arguments_count() != 1: + push_error("Cannot add loader for %s as only one String arg can be taken.") + return false + elif loader.get_bound_arguments()[0] is not String \ + or loader.get_bound_arguments()[0] is not StringName: + push_error("Cannot add loader for %s as only one String arg can be taken.") + return false + return true + + +static func load_bin(buffer:PackedByteArray)->PackedByteArray: return buffer + +static func load_png(buffer:PackedByteArray)->Image: + var img := Image.new() + img.load_png_from_buffer(buffer) + return img + +static func load_jpg(buffer:PackedByteArray)->Image: + var img := Image.new() + img.load_jpg_from_buffer(buffer) + return img + +static func load_mp3(buffer:PackedByteArray)->AudioStreamMP3: + var sfx := AudioStreamMP3.new() + sfx.data = buffer + return sfx + +static func load_ogg(buffer:PackedByteArray)->AudioStreamOggVorbis: + return AudioStreamOggVorbis.load_from_buffer(buffer) + +static func load_txt(buffer:PackedByteArray)->String: + var txt:String = buffer.get_string_from_utf8() + return txt + +static func load_wav(buffer:PackedByteArray)->AudioStreamWAV: + var sfx := AudioStreamWAV.new() + sfx.load_from_buffer(buffer) + return sfx + +# can't use CONST since Callables are technically instanced dynamically + +static var DEFAULT_SUPPORTED_FILES:Dictionary[String,Callable] = { + "bin": load_bin, + "txt": load_txt, + "png": load_png, + "jpg": load_jpg, + "jpeg": load_jpg, + "mp3": load_mp3, + "ogg": load_ogg, + "wav": load_wav, +} + +static var DATA_FILES:Dictionary[String,Callable] = { + "bin": load_bin, + "txt": load_txt, +} + +static var IMAGE_FILES:Dictionary[String,Callable] = { + "png": load_png, + "jpg": load_jpg, + "jpeg": load_jpg, +} + +static var AUDIO_FILES:Dictionary[String,Callable] = { + "mp3": load_mp3, + "ogg": load_ogg, + "wav": load_wav, +}