Push asset logic deeper into 'loadFrom*' static methods and AssetLibrary
This commit is contained in:
@@ -3,46 +3,20 @@ package;
|
||||
|
||||
import haxe.Timer;
|
||||
import haxe.Unserializer;
|
||||
import lime.app.Future;
|
||||
import lime.app.Preloader;
|
||||
import lime.app.Promise;
|
||||
import lime.audio.AudioSource;
|
||||
import lime.audio.openal.AL;
|
||||
import lime.audio.AudioBuffer;
|
||||
import lime.graphics.Image;
|
||||
import lime.net.HTTPRequest;
|
||||
import lime.system.CFFI;
|
||||
import lime.text.Font;
|
||||
import lime.utils.AssetLibrary;
|
||||
import lime.utils.AssetType;
|
||||
import lime.utils.Bytes;
|
||||
import lime.utils.Log;
|
||||
import lime.utils.UInt8Array;
|
||||
import lime.Assets;
|
||||
|
||||
#if sys
|
||||
import haxe.io.Path;
|
||||
import sys.FileSystem;
|
||||
#end
|
||||
|
||||
#if flash
|
||||
import flash.display.Bitmap;
|
||||
import flash.display.BitmapData;
|
||||
import flash.display.Loader;
|
||||
import flash.events.Event;
|
||||
import flash.events.IOErrorEvent;
|
||||
import flash.events.ProgressEvent;
|
||||
import flash.media.Sound;
|
||||
import flash.net.URLLoader;
|
||||
import flash.net.URLRequest;
|
||||
#end
|
||||
|
||||
|
||||
@:keep class DefaultAssetLibrary extends AssetLibrary {
|
||||
|
||||
|
||||
public var className (default, null) = new Map<String, Dynamic> ();
|
||||
public var path (default, null) = new Map<String, String> ();
|
||||
public var type (default, null) = new Map<String, AssetType> ();
|
||||
|
||||
private var lastModified:Float;
|
||||
private var timer:Timer;
|
||||
|
||||
@@ -65,17 +39,17 @@ import flash.net.URLRequest;
|
||||
|
||||
#if flash
|
||||
|
||||
::if (assets != null)::::foreach assets::::if (embed)::className.set ("::id::", __ASSET__::flatName::);::else::path.set ("::id::", "::resourceName::");::end::
|
||||
type.set ("::id::", AssetType.$$upper(::type::));
|
||||
::if (assets != null)::::foreach assets::::if (embed)::classTypes.set ("::id::", __ASSET__::flatName::);::else::paths.set ("::id::", "::resourceName::");::end::
|
||||
types.set ("::id::", AssetType.$$upper(::type::));
|
||||
::end::::end::
|
||||
|
||||
#elseif html5
|
||||
|
||||
::if (assets != null)::var id;
|
||||
::foreach assets::id = "::id::";
|
||||
::if (embed)::::if (type == "font")::className.set (id, __ASSET__::flatName::);::else::path.set (id, ::if (resourceName == id)::id::else::"::resourceName::"::end::);::end::
|
||||
::else::path.set (id, ::if (resourceName == id)::id::else::"::resourceName::"::end::);::end::
|
||||
type.set (id, AssetType.$$upper(::type::));
|
||||
::if (embed)::::if (type == "font")::classTypes.set (id, __ASSET__::flatName::);::else::paths.set (id, ::if (resourceName == id)::id::else::"::resourceName::"::end::);::end::
|
||||
::else::paths.set (id, ::if (resourceName == id)::id::else::"::resourceName::"::end::);::end::
|
||||
types.set (id, AssetType.$$upper(::type::));
|
||||
::end::::end::
|
||||
|
||||
var assetsPrefix = null;
|
||||
@@ -83,22 +57,27 @@ import flash.net.URLRequest;
|
||||
assetsPrefix = ApplicationMain.config.assetsPrefix;
|
||||
}
|
||||
if (assetsPrefix != null) {
|
||||
for (k in path.keys()) {
|
||||
path.set(k, assetsPrefix + path[k]);
|
||||
for (k in paths.keys()) {
|
||||
paths.set(k, assetsPrefix + paths[k]);
|
||||
}
|
||||
}
|
||||
|
||||
for (id in paths.keys()) {
|
||||
trace (id);
|
||||
preload.set (id, true);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#if (windows || mac || linux)
|
||||
|
||||
var useManifest = false;
|
||||
::if (assets != null)::::foreach assets::::if (type == "font")::
|
||||
className.set ("::id::", __ASSET__::flatName::);
|
||||
type.set ("::id::", AssetType.$$upper(::type::));
|
||||
classTypes.set ("::id::", __ASSET__::flatName::);
|
||||
types.set ("::id::", AssetType.$$upper(::type::));
|
||||
::else::::if (embed)::
|
||||
className.set ("::id::", __ASSET__::flatName::);
|
||||
type.set ("::id::", AssetType.$$upper(::type::));
|
||||
classTypes.set ("::id::", __ASSET__::flatName::);
|
||||
types.set ("::id::", AssetType.$$upper(::type::));
|
||||
::else::useManifest = true;
|
||||
::end::::end::::end::::end::
|
||||
|
||||
@@ -106,7 +85,7 @@ import flash.net.URLRequest;
|
||||
|
||||
loadManifest ();
|
||||
|
||||
if (Sys.args ().indexOf ("-livereload") > -1) {
|
||||
if (false && Sys.args ().indexOf ("-livereload") > -1) {
|
||||
|
||||
var path = FileSystem.fullPath ("manifest");
|
||||
|
||||
@@ -146,487 +125,23 @@ import flash.net.URLRequest;
|
||||
}
|
||||
|
||||
|
||||
public override function exists (id:String, type:String):Bool {
|
||||
|
||||
var requestedType = type != null ? cast (type, AssetType) : null;
|
||||
var assetType = this.type.get (id);
|
||||
|
||||
if (assetType != null) {
|
||||
|
||||
if (assetType == requestedType || ((requestedType == SOUND || requestedType == MUSIC) && (assetType == MUSIC || assetType == SOUND))) {
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
#if flash
|
||||
|
||||
if (requestedType == BINARY && (assetType == BINARY || assetType == TEXT || assetType == IMAGE)) {
|
||||
|
||||
return true;
|
||||
|
||||
} else if (requestedType == TEXT && assetType == BINARY) {
|
||||
|
||||
return true;
|
||||
|
||||
} else if (requestedType == null || path.exists (id)) {
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
if (requestedType == BINARY || requestedType == null || (assetType == BINARY && requestedType == TEXT)) {
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
#end
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override function getAudioBuffer (id:String):AudioBuffer {
|
||||
|
||||
#if flash
|
||||
|
||||
var buffer = new AudioBuffer ();
|
||||
buffer.src = cast (Type.createInstance (className.get (id), []), Sound);
|
||||
return buffer;
|
||||
|
||||
#elseif html5
|
||||
|
||||
return Preloader.audioBuffers.get (path.get (id));
|
||||
|
||||
#else
|
||||
|
||||
if (className.exists (id)) return AudioBuffer.fromBytes (cast (Type.createInstance (className.get (id), []), Bytes));
|
||||
else return AudioBuffer.fromFile (rootPath + path.get (id));
|
||||
|
||||
#end
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override function getBytes (id:String):Bytes {
|
||||
|
||||
#if flash
|
||||
|
||||
switch (type.get (id)) {
|
||||
|
||||
case TEXT, BINARY:
|
||||
|
||||
return Bytes.ofData (cast (Type.createInstance (className.get (id), []), flash.utils.ByteArray));
|
||||
|
||||
case IMAGE:
|
||||
|
||||
var bitmapData = cast (Type.createInstance (className.get (id), []), BitmapData);
|
||||
return Bytes.ofData (bitmapData.getPixels (bitmapData.rect));
|
||||
|
||||
default:
|
||||
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
return cast (Type.createInstance (className.get (id), []), Bytes);
|
||||
|
||||
#elseif html5
|
||||
|
||||
var loader = Preloader.loaders.get (path.get (id));
|
||||
|
||||
if (loader == null) {
|
||||
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
var bytes:Bytes = cast loader.responseData;
|
||||
|
||||
if (bytes != null) {
|
||||
|
||||
return bytes;
|
||||
|
||||
} else {
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
if (className.exists(id)) return cast (Type.createInstance (className.get (id), []), Bytes);
|
||||
else return Bytes.readFile (rootPath + path.get (id));
|
||||
|
||||
#end
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override function getFont (id:String):Font {
|
||||
|
||||
#if flash
|
||||
|
||||
var src = Type.createInstance (className.get (id), []);
|
||||
|
||||
var font = new Font (src.fontName);
|
||||
font.src = src;
|
||||
return font;
|
||||
|
||||
#elseif html5
|
||||
|
||||
return cast (Type.createInstance (className.get (id), []), Font);
|
||||
|
||||
#else
|
||||
|
||||
if (className.exists (id)) {
|
||||
|
||||
var fontClass = className.get (id);
|
||||
return cast (Type.createInstance (fontClass, []), Font);
|
||||
|
||||
} else {
|
||||
|
||||
return Font.fromFile (rootPath + path.get (id));
|
||||
|
||||
}
|
||||
|
||||
#end
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override function getImage (id:String):Image {
|
||||
|
||||
#if flash
|
||||
|
||||
return Image.fromBitmapData (cast (Type.createInstance (className.get (id), []), BitmapData));
|
||||
|
||||
#elseif html5
|
||||
|
||||
return Image.fromImageElement (Preloader.images.get (path.get (id)));
|
||||
|
||||
#else
|
||||
|
||||
if (className.exists (id)) {
|
||||
|
||||
var fontClass = className.get (id);
|
||||
return cast (Type.createInstance (fontClass, []), Image);
|
||||
|
||||
} else {
|
||||
|
||||
return Image.fromFile (rootPath + path.get (id));
|
||||
|
||||
}
|
||||
|
||||
#end
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*public override function getMusic (id:String):Dynamic {
|
||||
|
||||
#if flash
|
||||
|
||||
return cast (Type.createInstance (className.get (id), []), Sound);
|
||||
|
||||
#elseif openfl_html5
|
||||
|
||||
//var sound = new Sound ();
|
||||
//sound.__buffer = true;
|
||||
//sound.load (new URLRequest (path.get (id)));
|
||||
//return sound;
|
||||
return null;
|
||||
|
||||
#elseif html5
|
||||
|
||||
return null;
|
||||
//return new Sound (new URLRequest (path.get (id)));
|
||||
|
||||
#else
|
||||
|
||||
return null;
|
||||
//if (className.exists(id)) return cast (Type.createInstance (className.get (id), []), Sound);
|
||||
//else return new Sound (new URLRequest (path.get (id)), null, true);
|
||||
|
||||
#end
|
||||
|
||||
}*/
|
||||
|
||||
|
||||
public override function getPath (id:String):String {
|
||||
|
||||
//#if ios
|
||||
|
||||
//return SystemPath.applicationDirectory + "/assets/" + path.get (id);
|
||||
|
||||
//#else
|
||||
|
||||
return path.get (id);
|
||||
|
||||
//#end
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override function getText (id:String):String {
|
||||
|
||||
#if html5
|
||||
|
||||
var loader = Preloader.loaders.get (path.get (id));
|
||||
|
||||
if (loader == null) {
|
||||
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
var bytes:Bytes = cast loader.responseData;
|
||||
|
||||
if (bytes != null) {
|
||||
|
||||
return bytes.getString (0, bytes.length);
|
||||
|
||||
} else {
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
var bytes = getBytes (id);
|
||||
|
||||
if (bytes == null) {
|
||||
|
||||
return null;
|
||||
|
||||
} else {
|
||||
|
||||
return bytes.getString (0, bytes.length);
|
||||
|
||||
}
|
||||
|
||||
#end
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override function isLocal (id:String, type:String):Bool {
|
||||
|
||||
#if flash
|
||||
|
||||
return className.exists (id);
|
||||
|
||||
#elseif html5
|
||||
|
||||
var requestedType = type != null ? cast (type, AssetType) : null;
|
||||
|
||||
return switch (requestedType) {
|
||||
|
||||
case FONT:
|
||||
|
||||
className.exists (id);
|
||||
|
||||
case IMAGE:
|
||||
|
||||
Preloader.images.exists (path.get (id));
|
||||
|
||||
case MUSIC, SOUND:
|
||||
|
||||
Preloader.audioBuffers.exists (path.get (id));
|
||||
|
||||
default:
|
||||
|
||||
Preloader.loaders.exists (path.get (id));
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
return true;
|
||||
|
||||
#end
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override function list (type:String):Array<String> {
|
||||
|
||||
var requestedType = type != null ? cast (type, AssetType) : null;
|
||||
var items = [];
|
||||
|
||||
for (id in this.type.keys ()) {
|
||||
|
||||
if (requestedType == null || exists (id, type)) {
|
||||
|
||||
items.push (id);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return items;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override function loadAudioBuffer (id:String):Future<AudioBuffer> {
|
||||
|
||||
var promise = new Promise<AudioBuffer> ();
|
||||
|
||||
if (Assets.isLocal (id)) {
|
||||
|
||||
promise.completeWith (new Future<AudioBuffer> (function () return getAudioBuffer (id), true));
|
||||
|
||||
} else if (path.exists (id)) {
|
||||
|
||||
promise.completeWith (AudioBuffer.loadFromFile (path.get (id)));
|
||||
|
||||
} else {
|
||||
|
||||
promise.error (null);
|
||||
|
||||
}
|
||||
|
||||
return promise.future;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override function loadBytes (id:String):Future<Bytes> {
|
||||
|
||||
var promise = new Promise<Bytes> ();
|
||||
|
||||
#if flash
|
||||
|
||||
if (path.exists (id)) {
|
||||
|
||||
var loader = new URLLoader ();
|
||||
loader.dataFormat = flash.net.URLLoaderDataFormat.BINARY;
|
||||
loader.addEventListener (Event.COMPLETE, function (event:Event) {
|
||||
|
||||
var bytes = Bytes.ofData (loader.data);
|
||||
promise.complete (bytes);
|
||||
|
||||
});
|
||||
loader.addEventListener (ProgressEvent.PROGRESS, function (event) {
|
||||
|
||||
promise.progress (event.bytesLoaded, event.bytesTotal);
|
||||
|
||||
});
|
||||
loader.addEventListener (IOErrorEvent.IO_ERROR, promise.error);
|
||||
loader.load (new URLRequest (path.get (id)));
|
||||
|
||||
} else {
|
||||
|
||||
promise.complete (getBytes (id));
|
||||
|
||||
}
|
||||
|
||||
#elseif html5
|
||||
|
||||
if (path.exists (id)) {
|
||||
|
||||
var request = new HTTPRequest<Bytes> ();
|
||||
promise.completeWith (request.load (path.get (id) + "?" + Assets.cache.version));
|
||||
|
||||
} else {
|
||||
|
||||
promise.complete (getBytes (id));
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
promise.completeWith (new Future<Bytes> (function () return getBytes (id), true));
|
||||
|
||||
#end
|
||||
|
||||
return promise.future;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override function loadImage (id:String):Future<Image> {
|
||||
|
||||
var promise = new Promise<Image> ();
|
||||
|
||||
#if flash
|
||||
|
||||
if (path.exists (id)) {
|
||||
|
||||
var loader = new Loader ();
|
||||
loader.contentLoaderInfo.addEventListener (Event.COMPLETE, function (event:Event) {
|
||||
|
||||
var bitmapData = cast (loader.content, Bitmap).bitmapData;
|
||||
promise.complete (Image.fromBitmapData (bitmapData));
|
||||
|
||||
});
|
||||
loader.contentLoaderInfo.addEventListener (ProgressEvent.PROGRESS, function (event) {
|
||||
|
||||
promise.progress (event.bytesLoaded, event.bytesTotal);
|
||||
|
||||
});
|
||||
loader.contentLoaderInfo.addEventListener (IOErrorEvent.IO_ERROR, promise.error);
|
||||
loader.load (new URLRequest (path.get (id)));
|
||||
|
||||
} else {
|
||||
|
||||
promise.complete (getImage (id));
|
||||
|
||||
}
|
||||
|
||||
#elseif html5
|
||||
|
||||
if (path.exists (id)) {
|
||||
|
||||
var image = new js.html.Image ();
|
||||
image.onload = function (_):Void {
|
||||
|
||||
promise.complete (Image.fromImageElement (image));
|
||||
|
||||
}
|
||||
image.onerror = promise.error;
|
||||
image.src = path.get (id) + "?" + Assets.cache.version;
|
||||
|
||||
} else {
|
||||
|
||||
promise.complete (getImage (id));
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
promise.completeWith (new Future<Image> (function () return getImage (id), true));
|
||||
|
||||
#end
|
||||
|
||||
return promise.future;
|
||||
|
||||
}
|
||||
|
||||
|
||||
#if (!flash && !html5)
|
||||
private function loadManifest ():Void {
|
||||
|
||||
try {
|
||||
|
||||
#if blackberry
|
||||
var bytes = Bytes.readFile ("app/native/manifest");
|
||||
var bytes = Bytes.fromFile ("app/native/manifest");
|
||||
#elseif tizen
|
||||
var bytes = Bytes.readFile ("../res/manifest");
|
||||
var bytes = Bytes.fromFile ("../res/manifest");
|
||||
#elseif emscripten
|
||||
var bytes = Bytes.readFile ("assets/manifest");
|
||||
var bytes = Bytes.fromFile ("assets/manifest");
|
||||
#elseif (mac && java)
|
||||
var bytes = Bytes.readFile ("../Resources/manifest");
|
||||
var bytes = Bytes.fromFile ("../Resources/manifest");
|
||||
#elseif (ios || tvos)
|
||||
var bytes = Bytes.readFile ("assets/manifest");
|
||||
var bytes = Bytes.fromFile ("assets/manifest");
|
||||
#else
|
||||
var bytes = Bytes.readFile ("manifest");
|
||||
var bytes = Bytes.fromFile ("manifest");
|
||||
#end
|
||||
|
||||
if (bytes != null) {
|
||||
@@ -641,14 +156,14 @@ import flash.net.URLRequest;
|
||||
|
||||
for (asset in manifest) {
|
||||
|
||||
if (!className.exists (asset.id)) {
|
||||
if (!classTypes.exists (asset.id)) {
|
||||
|
||||
#if (ios || tvos)
|
||||
path.set (asset.id, "assets/" + asset.path);
|
||||
paths.set (asset.id, rootPath + "assets/" + asset.path);
|
||||
#else
|
||||
path.set (asset.id, asset.path);
|
||||
paths.set (asset.id, rootPath + asset.path);
|
||||
#end
|
||||
type.set (asset.id, cast (asset.type, AssetType));
|
||||
types.set (asset.id, cast (asset.type, AssetType));
|
||||
|
||||
}
|
||||
|
||||
@@ -674,50 +189,6 @@ import flash.net.URLRequest;
|
||||
#end
|
||||
|
||||
|
||||
public override function loadText (id:String):Future<String> {
|
||||
|
||||
var promise = new Promise<String> ();
|
||||
|
||||
#if html5
|
||||
|
||||
if (path.exists (id)) {
|
||||
|
||||
var request = new HTTPRequest<String> ();
|
||||
promise.completeWith (request.load (path.get (id) + "?" + Assets.cache.version));
|
||||
|
||||
} else {
|
||||
|
||||
promise.complete (getText (id));
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
promise.completeWith (loadBytes (id).then (function (bytes) {
|
||||
|
||||
return new Future<String> (function () {
|
||||
|
||||
if (bytes == null) {
|
||||
|
||||
return null;
|
||||
|
||||
} else {
|
||||
|
||||
return bytes.getString (0, bytes.length);
|
||||
|
||||
}
|
||||
|
||||
}, true);
|
||||
|
||||
}));
|
||||
|
||||
#end
|
||||
|
||||
return promise.future;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user