From f637bdd8efb5af5c7ade6afbab9081d1f2319ed4 Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Fri, 21 Jun 2019 15:07:08 -0700 Subject: [PATCH] Fixes for bundle loading --- src/lime/utils/AssetBundle.hx | 22 +++++++++++++++------- src/lime/utils/AssetLibrary.hx | 11 +++++++++++ src/lime/utils/AssetManifest.hx | 16 ++++++++++------ templates/haxe/ManifestResources.hx | 13 +++++++++---- 4 files changed, 45 insertions(+), 17 deletions(-) diff --git a/src/lime/utils/AssetBundle.hx b/src/lime/utils/AssetBundle.hx index 4e83b5318..ca1507ff6 100644 --- a/src/lime/utils/AssetBundle.hx +++ b/src/lime/utils/AssetBundle.hx @@ -1,10 +1,11 @@ package lime.utils; +import haxe.io.Bytes; import haxe.io.BytesInput; import haxe.io.Input; import haxe.zip.Reader; import lime.app.Future; -import lime.utils.Bytes; +import lime.utils.Bytes as LimeBytes; #if sys import sys.io.File; @@ -26,6 +27,12 @@ class AssetBundle paths = new Array(); } + public static function fromBytes(bytes:Bytes):AssetBundle + { + var input = new BytesInput(bytes); + return __extractBundle(input); + } + public static function fromFile(path:String):AssetBundle { #if sys @@ -36,13 +43,14 @@ class AssetBundle #end } + public static function loadFromBytes(bytes:Bytes):Future + { + return Future.withValue(fromBytes(bytes)); + } + public static function loadFromFile(path:String):Future { - return Bytes.loadFromFile(path).then(function(bytes) - { - var input = new BytesInput(bytes); - return Future.withValue(__extractBundle(input)); - }); + return LimeBytes.loadFromFile(path).then(loadFromBytes); } @:noCompletion private static function __extractBundle(input:Input):AssetBundle @@ -55,7 +63,7 @@ class AssetBundle { if (entry.compressed) { - var bytes:Bytes = entry.data; + var bytes:LimeBytes = entry.data; bundle.data.set(entry.fileName, bytes.decompress(DEFLATE)); } else diff --git a/src/lime/utils/AssetLibrary.hx b/src/lime/utils/AssetLibrary.hx index 556dcb047..a33ae9b63 100644 --- a/src/lime/utils/AssetLibrary.hx +++ b/src/lime/utils/AssetLibrary.hx @@ -566,6 +566,15 @@ class AssetLibrary { return Future.withValue(Type.createInstance(classTypes.get(id), [])); } + else if (cachedBytes.exists(id)) + { + return Image.loadFromBytes(cachedBytes.get(id)).then(function (image) + { + cachedBytes.remove(id); + cachedImages.set(id, image); + return Future.withValue(image); + }); + } else { return Image.loadFromFile(paths.get(id)); @@ -664,12 +673,14 @@ class AssetLibrary type = asset.type; switch(type) { + #if !web case IMAGE: cachedImages.set(id, Image.fromBytes(data)); case MUSIC, SOUND: cachedAudioBuffers.set(id, AudioBuffer.fromBytes(data)); case FONT: cachedFonts.set(id, Font.fromBytes(data)); + #end case TEXT: cachedText.set(id, data != null ? Std.string(data) : null); default: diff --git a/src/lime/utils/AssetManifest.hx b/src/lime/utils/AssetManifest.hx index c4f6d1ad1..7e0ba0ae2 100644 --- a/src/lime/utils/AssetManifest.hx +++ b/src/lime/utils/AssetManifest.hx @@ -92,13 +92,17 @@ class AssetManifest manifest.libraryArgs = manifestData.libraryArgs; } - if (Reflect.hasField(manifestData, "version") && manifestData.version <= 2) + if (Reflect.hasField(manifestData, "assets")) { - manifest.assets = Unserializer.run(manifestData.assets); - } - else if (Reflect.hasField(manifestData, "assets") && Std.is(manifestData.assets, Array)) - { - manifest.assets = cast manifestData.assets; + var assets:Dynamic = manifestData.assets; + if (Reflect.hasField(manifestData, "version") && manifestData.version <= 2) + { + manifest.assets = Unserializer.run(assets); + } + else + { + manifest.assets = assets; + } } if (Reflect.hasField(manifestData, "rootPath")) diff --git a/templates/haxe/ManifestResources.hx b/templates/haxe/ManifestResources.hx index 1cafb1db4..12687479f 100644 --- a/templates/haxe/ManifestResources.hx +++ b/templates/haxe/ManifestResources.hx @@ -1,6 +1,8 @@ package; +import haxe.io.Bytes; +import lime.utils.AssetBundle; import lime.utils.AssetLibrary; import lime.utils.AssetManifest; import lime.utils.Assets; @@ -56,7 +58,7 @@ import sys.FileSystem; ::end::::end::::end:: #end - var data, manifest, library; + var data, manifest, library, bundle; #if kha @@ -74,9 +76,12 @@ import sys.FileSystem; library = AssetLibrary.fromManifest (manifest); Assets.registerLibrary ("::library::", library); ::else::Assets.libraryPaths["::library::"] = rootPath + "::resourceName::"; - ::end::::end::::if (type == "bundle"):: - Assets.bundlePaths["::library::"] = rootPath + "::resourceName::"; - ::end::::end::::end:: + ::end::::end::::if (type == "bundle")::::if (embed):: + bundle = AssetBundle.fromBytes(#if flash Bytes.ofData(new __ASSET__::flatName::() #else new __ASSET__::flatName::() #end)); + library = AssetLibrary.fromBundle(bundle); + Assets.registerLibrary("::library::", library); + ::else::Assets.bundlePaths["::library::"] = rootPath + "::resourceName::"; + ::end::::end::::end::::end:: ::foreach libraries::::if (preload)::library = Assets.getLibrary ("::name::"); if (library != null) preloadLibraries.push (library);