diff --git a/buildnumber.txt b/buildnumber.txt index fdbec449..85b0c4bd 100644 --- a/buildnumber.txt +++ b/buildnumber.txt @@ -1 +1 @@ -1459 \ No newline at end of file +1462 \ No newline at end of file diff --git a/source/flx3d/Flx3DView.hx b/source/flx3d/Flx3DView.hx index 1f344c96..46e19a79 100644 --- a/source/flx3d/Flx3DView.hx +++ b/source/flx3d/Flx3DView.hx @@ -1,5 +1,6 @@ package flx3d; +import away3d.loaders.misc.AssetLoaderToken; import away3d.library.assets.Asset3DType; import away3d.events.Asset3DEvent; import away3d.loaders.parsers.OBJParser; @@ -17,35 +18,63 @@ class Flx3DView extends FlxView3D { public function initLoader() { if (_loader != null) return; _loader = new Loader3D(); + _loader.addEventListener(Asset3DEvent.ASSET_COMPLETE, onAssetComplete); view.scene.addChild(_loader); } - public function addMesh(assetPath:String, callback:Mesh->Void, ?texturePath:String) { + private var meshCallback:Mesh->Void = null; + + private var queue:Array = []; + + private function onAssetComplete(event:Asset3DEvent) { + if (event.asset != null && event.asset.assetType == Asset3DType.MESH) { + var mesh:Mesh = cast(event.asset, Mesh); + if (meshCallback != null) + meshCallback(mesh); + meshCallback = null; + if (queue.length > 0) { + var m = queue.shift(); + addMesh(m.assetPath, m.callback, m.texturePath); + } + } + } + + public function addMesh(assetPath:String, callback:Mesh->Void, ?texturePath:String, smoothTexture:Bool = true) { initLoader(); var model = Assets.getBytes(assetPath); if (model == null) throw 'Model at ${assetPath} was not found.'; + if (meshCallback != null) { + queue.push({ + assetPath: assetPath, + callback: callback, + texturePath: texturePath + }); + return null; + } var context = new AssetLoaderContext(); var noExt = Path.withoutExtension(assetPath); + trace(noExt); context.mapUrlToData('${Path.withoutDirectory(noExt)}.mtl', '$noExt.mtl'); var material:TextureMaterial = null; if (texturePath != null) - material = new TextureMaterial(Cast.bitmapTexture(texturePath)); + material = new TextureMaterial(Cast.bitmapTexture(texturePath), smoothTexture); var token = _loader.loadData(model, context, null, new OBJParser()); - token.addEventListener(Asset3DEvent.MESH_COMPLETE, function(event) { - if (event.type != Asset3DEvent.ASSET_COMPLETE) return; - - if (event.asset.assetType == Asset3DType.MESH) { - var mesh = cast(event.asset, Mesh); - if (material != null) - mesh.material = material; - callback(mesh); - } - }); + meshCallback = function(mesh) { + if (material != null) + mesh.material = material; + callback(mesh); + }; return token; } +} + +typedef MeshQueueItem = { + var assetPath:String; + var callback:Mesh->Void; + var texturePath:String; } \ No newline at end of file