From 60a10c9006019a350ed1a73a30f9af69e7028a80 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Tue, 23 Feb 2016 01:34:37 +0600 Subject: [PATCH] very dirty experiment for render flash anim data --- .../FlashTools/Examples/Animations/anim01.fla | Bin 3372679 -> 3371765 bytes .../FlashTools/Examples/Scenes/Scene00.unity | 4 +- Assets/FlashTools/Scripts/FlashAnim.cs | 154 +++++++++++++++++ Assets/FlashTools/Scripts/FlashAnimAsset.cs | 72 +++----- .../Internal/Editor/FlashAnimAssetEditor.cs | 53 +++++- .../Internal/Editor/FlashAnimEditor.cs | 19 ++- .../Internal/Editor/FlashAnimPostprocessor.cs | 157 ++++++++++++++---- ProjectSettings/QualitySettings.asset | 22 +-- Tools/FlashExport2.jsfl | 74 ++++++--- unityflash.userprefs | 9 +- 10 files changed, 430 insertions(+), 134 deletions(-) diff --git a/Assets/FlashTools/Examples/Animations/anim01.fla b/Assets/FlashTools/Examples/Animations/anim01.fla index c69e1eff93a39b00a33965b1d65d1b20ba61a995..b0e366ce2d1ff897bcb1811d8b4a49993dee94aa 100644 GIT binary patch delta 29432 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 IXoEohABHzT-v9sr delta 30383 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 _vertices = new List(); + List _triangles = new List(); + List _uvs = new List(); + + public void Play() { + } + + public void Stop() { + } + + public void Pause() { + } + + public void GoToFrame(int frame) { + } + + public int frameCount { + get { + int frames = 0; + if ( Asset ) { + foreach ( var layer in GetCurrentSymbol().Layers ) { + frames = Mathf.Max(frames, layer.Frames.Count); + } + } + return frames; + } + } + + FlashAnimSymbolData GetCurrentSymbol() { + //return Asset.Data.Library.Symbols[0]; + return Asset.Data.Stage; + } + + int GetNumFrameByNum(FlashAnimLayerData layer, int num) { + return num % layer.Frames.Count; + } + + FlashAnimFrameData GetFrameByNum(FlashAnimLayerData layer, int num) { + var frame_num = GetNumFrameByNum(layer, num); + if ( frame_num >= 0 && frame_num < layer.Frames.Count ) { + return layer.Frames[frame_num]; + } + return null; + } + + FlashAnimSymbolData FindSymbol(FlashAnimLibraryData library, string symbol_id) { + foreach ( var symbol in library.Symbols ) { + if ( symbol.Id == symbol_id ) { + return symbol; + } + } + return null; + } + + FlashAnimBitmapData FindBitmap(FlashAnimLibraryData library, string bitmap_id) { + foreach ( var bitmap in library.Bitmaps ) { + if ( bitmap.Id == bitmap_id ) { + return bitmap; + } + } + return null; + } + + void RenderInstance(FlashAnimInstData elem_data, int frame_num, Matrix4x4 matrix) { + if ( elem_data.Type == FlashAnimInstType.Bitmap ) { + var bitmap = Asset ? FindBitmap(Asset.Data.Library, elem_data.Asset) : null; + if ( bitmap != null ) { + var width = bitmap.RealSize.x; + var height = bitmap.RealSize.y; + + var v0 = new Vector3( 0, 0, 0); + var v1 = new Vector3( width, 0, 0); + var v2 = new Vector3( width, height, 0); + var v3 = new Vector3( 0, height, 0); + + _vertices.Add(matrix.MultiplyPoint3x4(v0)); + _vertices.Add(matrix.MultiplyPoint3x4(v1)); + _vertices.Add(matrix.MultiplyPoint3x4(v2)); + _vertices.Add(matrix.MultiplyPoint3x4(v3)); + + _triangles.Add(_vertices.Count - 4 + 2); + _triangles.Add(_vertices.Count - 4 + 1); + _triangles.Add(_vertices.Count - 4 + 0); + _triangles.Add(_vertices.Count - 4 + 0); + _triangles.Add(_vertices.Count - 4 + 3); + _triangles.Add(_vertices.Count - 4 + 2); + + var source_rect = bitmap.SourceRect; + _uvs.Add(new Vector2(source_rect.xMin, source_rect.yMax)); + _uvs.Add(new Vector2(source_rect.xMax, source_rect.yMax)); + _uvs.Add(new Vector2(source_rect.xMax, source_rect.yMin)); + _uvs.Add(new Vector2(source_rect.xMin, source_rect.yMin)); + } + } else if ( elem_data.Type == FlashAnimInstType.Symbol ) { + var symbol = Asset ? FindSymbol(Asset.Data.Library, elem_data.Asset) : null; + if ( symbol != null ) { + RenderSymbol(symbol, frame_num, matrix); + } + } + } + + void RenderSymbol(FlashAnimSymbolData symbol, int frame_num, Matrix4x4 matix) { + foreach ( var layer in symbol.Layers ) { + if ( layer.LayerType != FlashAnimLayerType.Mask ) { + var frame = GetFrameByNum(layer, frame_num); + if ( frame != null ) { + foreach ( var elem in frame.Elems ) { + if ( elem.Instance != null ) { + RenderInstance( + elem.Instance, frame_num, matix * elem.Matrix); + } + } + } + } + } + } + + void Update() { + _frame_timer += 25.0f * Time.deltaTime; + while ( _frame_timer > 1.0f ) { + _frame_timer -= 1.0f; + ++_current_frame; + if ( _current_frame > frameCount - 1 ) { + _current_frame = 0; + } + //Debug.LogFormat("Cur frame: {0}", _current_frame); + } + } + + void OnRenderObject() { + if ( Asset ) { + _vertices.Clear(); + _triangles.Clear(); + _uvs.Clear(); + RenderSymbol( + GetCurrentSymbol(), + _current_frame, + Matrix4x4.Scale(new Vector3(1,-1,1))); + + var mesh = new Mesh(); + mesh.vertices = _vertices.ToArray(); + mesh.triangles = _triangles.ToArray(); + mesh.uv = _uvs.ToArray(); + mesh.RecalculateNormals(); + GetComponent().mesh = mesh; + } + } } } \ No newline at end of file diff --git a/Assets/FlashTools/Scripts/FlashAnimAsset.cs b/Assets/FlashTools/Scripts/FlashAnimAsset.cs index 76b8300..4f335b0 100644 --- a/Assets/FlashTools/Scripts/FlashAnimAsset.cs +++ b/Assets/FlashTools/Scripts/FlashAnimAsset.cs @@ -28,6 +28,12 @@ namespace FlashTools { Folder } + public enum FlashAnimLoopingType { + Loop, + PlayOnce, + SingleFrame + } + public enum FlashAnimInstType { Bitmap, Symbol @@ -38,70 +44,42 @@ namespace FlashTools { MovieClip } - [System.Serializable] - public struct FlashAnimMatrix { - public float a; - public float b; - public float c; - public float d; - public float tx; - public float ty; - public FlashAnimMatrix( - float a, float b, float c, float d, - float tx, float ty) - { - this.a = a; - this.b = b; - this.c = c; - this.d = d; - this.tx = tx; - this.ty = ty; - } - static public FlashAnimMatrix identity { - get { - return new FlashAnimMatrix( - 1.0f, 1.0f, 1.0f, 1.0f, - 0.0f, 0.0f); - } - } - } - [System.Serializable] public class FlashAnimBitmapData { - public string Id = string.Empty; - public string ImageSource = string.Empty; + public string Id = string.Empty; + public Vector2 RealSize = Vector2.zero; + public Rect SourceRect = new Rect(); + public string ImageSource = string.Empty; } [System.Serializable] public class FlashAnimInstData { - public FlashAnimInstType Type = FlashAnimInstType.Bitmap; - public FlashAnimInstSymbolType SymbolType = FlashAnimInstSymbolType.Graphic; - public FlashAnimBlendMode BlendMode = FlashAnimBlendMode.Normal; - public string Asset = string.Empty; - public bool Visible = true; - // TODO: color_mode, looping, filters + public FlashAnimInstType Type = FlashAnimInstType.Bitmap; + public FlashAnimInstSymbolType SymbolType = FlashAnimInstSymbolType.Graphic; + public FlashAnimBlendMode BlendMode = FlashAnimBlendMode.Normal; + public string Asset = string.Empty; + public bool Visible = true; + public FlashAnimLoopingType LoopingType = FlashAnimLoopingType.SingleFrame; + public int LoopingFirstFrame = 0; + // TODO: color_mode, filters } [System.Serializable] public class FlashAnimElemData { - public string Id = string.Empty; - public int Depth = 0; - public FlashAnimMatrix Matrix = FlashAnimMatrix.identity; - public List Insts = new List(); + public string Id = string.Empty; + public Matrix4x4 Matrix = Matrix4x4.identity; + public FlashAnimInstData Instance = null; } [System.Serializable] public class FlashAnimFrameData { - public string Id = string.Empty; - public int Index = 0; - public int Duration = 0; - public List Elems = new List(); + public string Id = string.Empty; + public List Elems = new List(); } [System.Serializable] public class FlashAnimLayerData { public string Id = string.Empty; - public bool Visible = true; public FlashAnimLayerType LayerType = FlashAnimLayerType.Normal; public List Frames = new List(); } @@ -120,13 +98,13 @@ namespace FlashTools { [System.Serializable] public class FlashAnimData { + public Texture2D Atlas = null; public FlashAnimSymbolData Stage = new FlashAnimSymbolData(); public FlashAnimLibraryData Library = new FlashAnimLibraryData(); public List Strings = new List(); } public class FlashAnimAsset : ScriptableObject { - public FlashAnimData Data = new FlashAnimData(); - public float PixelsPerUnit = 100.0f; + public FlashAnimData Data = new FlashAnimData(); } } diff --git a/Assets/FlashTools/Scripts/Internal/Editor/FlashAnimAssetEditor.cs b/Assets/FlashTools/Scripts/Internal/Editor/FlashAnimAssetEditor.cs index 3fbfe11..24806f0 100644 --- a/Assets/FlashTools/Scripts/Internal/Editor/FlashAnimAssetEditor.cs +++ b/Assets/FlashTools/Scripts/Internal/Editor/FlashAnimAssetEditor.cs @@ -1,6 +1,57 @@ using UnityEngine; +using UnityEngine.Rendering; +using UnityEditor; +using System; namespace FlashTools.Internal { - public class FlashAnimAssetEditor : MonoBehaviour { + [CustomEditor(typeof(FlashAnimAsset))] + public class FlashAnimAssetEditor : Editor { + FlashAnimAsset _asset = null; + + void CreateFlashAnimOnScene() { + var anim_go = new GameObject("FlashAnim"); + try { + CreateFlashAnim(anim_go); + } catch ( Exception e ) { + Debug.LogErrorFormat("Create animation error: {0}", e.Message); + DestroyImmediate(anim_go, true); + } + Undo.RegisterCreatedObjectUndo(anim_go, "Create Animation"); + } + + void CreateFlashAnim(GameObject anim_go) { + var flash_anim = anim_go.AddComponent(); + flash_anim.Asset = _asset; + + var mesh_filter = anim_go.AddComponent(); + mesh_filter.mesh = null; + + var material = new Material(Shader.Find("Sprites/Default")); + material.SetTexture("_MainTex", _asset.Data.Atlas); + + var mesh_renderer = anim_go.AddComponent(); + mesh_renderer.sharedMaterial = material; + mesh_renderer.useLightProbes = false; + mesh_renderer.receiveShadows = false; + mesh_renderer.shadowCastingMode = ShadowCastingMode.Off; + mesh_renderer.reflectionProbeUsage = ReflectionProbeUsage.Off; + } + + // ------------------------------------------------------------------------ + // + // Messages + // + // ------------------------------------------------------------------------ + + void OnEnable() { + _asset = target as FlashAnimAsset; + } + + public override void OnInspectorGUI() { + DrawDefaultInspector(); + if ( GUILayout.Button("Create animation on scene") ) { + CreateFlashAnimOnScene(); + } + } } } \ No newline at end of file diff --git a/Assets/FlashTools/Scripts/Internal/Editor/FlashAnimEditor.cs b/Assets/FlashTools/Scripts/Internal/Editor/FlashAnimEditor.cs index 4014b63..a0dfcdc 100644 --- a/Assets/FlashTools/Scripts/Internal/Editor/FlashAnimEditor.cs +++ b/Assets/FlashTools/Scripts/Internal/Editor/FlashAnimEditor.cs @@ -1,6 +1,23 @@ using UnityEngine; +using UnityEditor; namespace FlashTools.Internal { - public class FlashAnimEditor : MonoBehaviour { + [CustomEditor(typeof(FlashAnim))] + public class FlashAnimEditor : Editor { + //FlashAnim _anim = null; + + // ------------------------------------------------------------------------ + // + // Messages + // + // ------------------------------------------------------------------------ + + void OnEnable() { + //_anim = target as FlashAnim; + } + + public override void OnInspectorGUI() { + DrawDefaultInspector(); + } } } \ No newline at end of file diff --git a/Assets/FlashTools/Scripts/Internal/Editor/FlashAnimPostprocessor.cs b/Assets/FlashTools/Scripts/Internal/Editor/FlashAnimPostprocessor.cs index 292c8fe..5ffeb7c 100644 --- a/Assets/FlashTools/Scripts/Internal/Editor/FlashAnimPostprocessor.cs +++ b/Assets/FlashTools/Scripts/Internal/Editor/FlashAnimPostprocessor.cs @@ -4,7 +4,9 @@ using System; using System.IO; using System.Linq; using System.Xml.Linq; +using System.Reflection; using System.Globalization; +using System.Collections.Generic; namespace FlashTools.Internal { public class FlashAnimPostprocessor : AssetPostprocessor { @@ -36,11 +38,13 @@ namespace FlashTools.Internal { static FlashAnimData LoadFlashAnimFromFtaFile(string fta_path) { try { - var fta_root_elem = XDocument.Load(fta_path).Document.Root; + var fta_root_elem = XDocument.Load(fta_path).Document.Root; var flash_anim_data = new FlashAnimData(); LoadFlashAnimStageFromFtaRootElem (fta_root_elem, flash_anim_data); LoadFlashAnimLibraryFromFtaRootElem(fta_root_elem, flash_anim_data); LoadFlashAnimStringsFromFtaRootElem(fta_root_elem, flash_anim_data); + PrepareBitmapTextures(fta_path, flash_anim_data); + PackBitmapTextures(fta_path, flash_anim_data); return flash_anim_data; } catch ( Exception e ) { Debug.LogErrorFormat("Parsing FTA file error: {0}", e.Message); @@ -70,12 +74,8 @@ namespace FlashTools.Internal { static void LoadFlashAnimBitmapsFromFtaLibraryElem(XElement library_elem, FlashAnimData data) { foreach ( var bitmap_elem in library_elem.Elements("bitmap") ) { var bitmap = new FlashAnimBitmapData(); - bitmap.Id = SafeLoadStrFromElemAttr(bitmap_elem, "id", bitmap.Id); - if ( string.IsNullOrEmpty(bitmap.Id) ) { - throw new UnityException("bitmap id not found"); - } + bitmap.Id = SafeLoadStrFromElemAttr(bitmap_elem, "id", bitmap.Id); bitmap.ImageSource = bitmap.Id + ".png"; - // TODO: add image importer check data.Library.Bitmaps.Add(bitmap); } } @@ -83,10 +83,7 @@ namespace FlashTools.Internal { static void LoadFlashAnimSymbolsFromFtaLibraryElem(XElement library_elem, FlashAnimData data) { foreach ( var symbol_elem in library_elem.Elements("symbol") ) { var symbol = new FlashAnimSymbolData(); - symbol.Id = SafeLoadStrFromElemAttr(symbol_elem, "id", symbol.Id); - if ( string.IsNullOrEmpty(symbol.Id) ) { - throw new UnityException("symbol id not found"); - } + symbol.Id = SafeLoadStrFromElemAttr(symbol_elem, "id", symbol.Id); LoadFlashAnimLayersFromFtaSymbolElem(symbol_elem, symbol); data.Library.Symbols.Add(symbol); } @@ -94,9 +91,8 @@ namespace FlashTools.Internal { static void LoadFlashAnimLayersFromFtaSymbolElem(XElement symbol_elem, FlashAnimSymbolData data) { foreach ( var layer_elem in symbol_elem.Elements("layer") ) { - var layer = new FlashAnimLayerData(); + var layer = new FlashAnimLayerData(); layer.Id = SafeLoadStrFromElemAttr (layer_elem, "id" , layer.Id); - layer.Visible = SafeLoadBoolFromElemAttr(layer_elem, "visible" , layer.Visible); layer.LayerType = SafeLoadEnumFromElemAttr(layer_elem, "layer_type", FlashAnimLayerType.Normal); LoadFlashAnimFramesFromFtaLayerElem(layer_elem, layer); data.Layers.Add(layer); @@ -106,9 +102,7 @@ namespace FlashTools.Internal { static void LoadFlashAnimFramesFromFtaLayerElem(XElement layer_elem, FlashAnimLayerData data) { foreach ( var frame_elem in layer_elem.Elements("frame") ) { var frame = new FlashAnimFrameData(); - frame.Id = SafeLoadStrFromElemAttr(frame_elem, "id" , frame.Id); - frame.Index = SafeLoadIntFromElemAttr(frame_elem, "index" , frame.Index); - frame.Duration = SafeLoadIntFromElemAttr(frame_elem, "duration" , frame.Duration); + frame.Id = SafeLoadStrFromElemAttr(frame_elem, "id", frame.Id); LoadFlashAnimElemsFromFtaFrameElem(frame_elem, frame); data.Frames.Add(frame); } @@ -116,25 +110,28 @@ namespace FlashTools.Internal { static void LoadFlashAnimElemsFromFtaFrameElem(XElement frame_elem, FlashAnimFrameData data) { foreach ( var elem_elem in frame_elem.Elements("element") ) { - var elem = new FlashAnimElemData(); + var elem = new FlashAnimElemData(); elem.Id = SafeLoadStrFromElemAttr(elem_elem, "id" , elem.Id); - elem.Depth = SafeLoadIntFromElemAttr(elem_elem, "depth" , elem.Depth); elem.Matrix = SafeLoadMatFromElemAttr(elem_elem, "matrix", elem.Matrix); - LoadFlashAnimInstsFromFtaElemElem(elem_elem, elem); + LoadFlashAnimInstFromFtaElemElem(elem_elem, elem); data.Elems.Add(elem); } } - static void LoadFlashAnimInstsFromFtaElemElem(XElement elem_elem, FlashAnimElemData data) { - foreach ( var inst_elem in elem_elem.Elements("instance") ) { - var inst = new FlashAnimInstData(); - inst.Type = SafeLoadEnumFromElemAttr(inst_elem, "type" , inst.Type); - inst.SymbolType = SafeLoadEnumFromElemAttr(inst_elem, "symbol_type", inst.SymbolType); - inst.BlendMode = SafeLoadEnumFromElemAttr(inst_elem, "blend_mode" , inst.BlendMode); - inst.Asset = SafeLoadStrFromElemAttr (inst_elem, "asset" , inst.Asset); - inst.Visible = SafeLoadBoolFromElemAttr(inst_elem, "visible" , inst.Visible); - data.Insts.Add(inst); + static void LoadFlashAnimInstFromFtaElemElem(XElement elem_elem, FlashAnimElemData data) { + var inst_elem = elem_elem.Element("instance"); + var instance = new FlashAnimInstData(); + instance.Type = SafeLoadEnumFromElemAttr(inst_elem, "type" , instance.Type); + instance.SymbolType = SafeLoadEnumFromElemAttr(inst_elem, "symbol_type", instance.SymbolType); + instance.BlendMode = SafeLoadEnumFromElemAttr(inst_elem, "blend_mode" , instance.BlendMode); + instance.Asset = SafeLoadStrFromElemAttr (inst_elem, "asset" , instance.Asset); + instance.Visible = SafeLoadBoolFromElemAttr(inst_elem, "visible" , instance.Visible); + var looping_elem = inst_elem.Element("looping"); + if ( looping_elem != null ) { + instance.LoopingType = SafeLoadEnumFromElemAttr(looping_elem, "type" , instance.LoopingType); + instance.LoopingFirstFrame = SafeLoadIntFromElemAttr (looping_elem, "first_frame" , instance.LoopingFirstFrame); } + data.Instance = instance; } // ----------------------------- @@ -153,6 +150,91 @@ namespace FlashTools.Internal { } } + // ----------------------------- + // Textures + // ----------------------------- + + static void PrepareBitmapTextures(string fta_path, FlashAnimData data) { + } + + static void PackBitmapTextures(string fta_path, FlashAnimData data) { + var base_path = Path.GetDirectoryName(fta_path); + var textures = new List(); + var texturen = new List(); + foreach ( var bitmap in data.Library.Bitmaps ) { + var texture_path = Path.Combine(base_path, bitmap.ImageSource); + var importer = AssetImporter.GetAtPath(texture_path) as TextureImporter; + if ( !importer ) { + throw new UnityException(string.Format( + "bitmap ({0}) texture importer not found ({1})", + bitmap.Id, texture_path)); + } + if ( !importer.isReadable ) { + importer.isReadable = true; + AssetDatabase.ImportAsset(texture_path, ImportAssetOptions.ForceUpdate); + AssetDatabase.ImportAsset(fta_path, ImportAssetOptions.ForceUpdate); + return; + } + var texture = AssetDatabase.LoadAssetAtPath(texture_path); + if ( !texture ) { + throw new UnityException(string.Format( + "bitmap ({0}) texture not found ({1})", + bitmap.Id, texture_path)); + } + textures.Add(texture); + texturen.Add(bitmap.ImageSource); + } + + var atlas = new Texture2D(0, 0); + var atlas_rects = atlas.PackTextures(textures.ToArray(), 1, 1024); + var atlas_asset_path = Path.Combine( + Path.GetDirectoryName(Application.dataPath), + Path.Combine(base_path, "atlas.png")); + File.WriteAllBytes(atlas_asset_path, atlas.EncodeToPNG()); + GameObject.DestroyImmediate(atlas); + AssetDatabase.Refresh(); + + var atlas_path = Path.Combine(base_path, "atlas.png"); + data.Atlas = AssetDatabase.LoadAssetAtPath(atlas_path); + if ( !data.Atlas ) { + AssetDatabase.ImportAsset(fta_path, ImportAssetOptions.ForceUpdate); + return; + } + + var atlas_importer = AssetImporter.GetAtPath(atlas_path) as TextureImporter; + if ( !atlas_importer ) { + throw new UnityException(string.Format( + "atlas importer not found ({0})", + atlas_path)); + } + + var method_args = new object[2]{0,0}; + typeof(TextureImporter) + .GetMethod("GetWidthAndHeight", BindingFlags.NonPublic | BindingFlags.Instance) + .Invoke(atlas_importer, method_args); + var atlas_width = (int)method_args[0]; + var atlas_height = (int)method_args[1]; + + var meta_data = new List(); + for ( var i = 0; i < atlas_rects.Length; ++i ) { + var meta_elem = new SpriteMetaData(); + meta_elem.name = texturen[i]; + data.Library.Bitmaps[i].RealSize = new Vector2(textures[i].width, textures[i].height); + data.Library.Bitmaps[i].SourceRect = atlas_rects[i]; + meta_elem.rect = new Rect( + atlas_rects[i].xMin * atlas_width, + atlas_rects[i].yMin * atlas_height, + atlas_rects[i].width * atlas_width, + atlas_rects[i].height * atlas_height); + meta_data.Add(meta_elem); + } + atlas_importer.spritesheet = meta_data.ToArray(); + atlas_importer.textureType = TextureImporterType.Sprite; + atlas_importer.spriteImportMode = SpriteImportMode.Multiple; + atlas_importer.textureFormat = TextureImporterFormat.AutomaticTruecolor; + AssetDatabase.ImportAsset(atlas_path, ImportAssetOptions.ForceUpdate); + } + // ----------------------------- // Common // ----------------------------- @@ -166,7 +248,7 @@ namespace FlashTools.Internal { static int SafeLoadIntFromElemAttr(XElement elem, string attr_name, int def_value) { int value; - if ( elem != null && int.TryParse(SafeLoadStrFromElemAttr(elem, attr_name, ""), out value) ) { + if ( elem != null && int.TryParse(SafeLoadStrFromElemAttr(elem, attr_name, string.Empty), out value) ) { return value; } return def_value; @@ -174,14 +256,14 @@ namespace FlashTools.Internal { static bool SafeLoadBoolFromElemAttr(XElement elem, string attr_name, bool def_value) { bool value; - if ( elem != null && bool.TryParse(SafeLoadStrFromElemAttr(elem, attr_name, ""), out value) ) { + if ( elem != null && bool.TryParse(SafeLoadStrFromElemAttr(elem, attr_name, string.Empty), out value) ) { return value; } return def_value; } - static FlashAnimMatrix SafeLoadMatFromElemAttr(XElement elem, string attr_name, FlashAnimMatrix def_value) { - var mat_str = SafeLoadStrFromElemAttr(elem, attr_name, ""); + static Matrix4x4 SafeLoadMatFromElemAttr(XElement elem, string attr_name, Matrix4x4 def_value) { + var mat_str = SafeLoadStrFromElemAttr(elem, attr_name, string.Empty); var mat_strs = mat_str.Split(';'); if ( mat_strs.Length == 6 ) { float a, b, c, d, tx, ty; @@ -193,7 +275,14 @@ namespace FlashTools.Internal { float.TryParse(mat_strs[4], NumberStyles.Any, CultureInfo.InvariantCulture, out tx) && float.TryParse(mat_strs[5], NumberStyles.Any, CultureInfo.InvariantCulture, out ty) ) { - return new FlashAnimMatrix(a, b, c, d, tx, ty); + var mat = Matrix4x4.identity; + mat.m00 = a; + mat.m10 = b; + mat.m01 = c; + mat.m11 = d; + mat.m03 = tx; + mat.m13 = ty; + return mat; } } return def_value; @@ -201,10 +290,10 @@ namespace FlashTools.Internal { static T SafeLoadEnumFromElemAttr(XElement elem, string attr_name, T def_value) { try { - return (T)Enum.Parse(typeof(T), SafeLoadStrFromElemAttr(elem, attr_name, "")); + return (T)Enum.Parse(typeof(T), SafeLoadStrFromElemAttr(elem, attr_name, string.Empty), true); } catch ( Exception ) { return def_value; } } } -} \ No newline at end of file +} diff --git a/ProjectSettings/QualitySettings.asset b/ProjectSettings/QualitySettings.asset index 90962e5..861e617 100644 --- a/ProjectSettings/QualitySettings.asset +++ b/ProjectSettings/QualitySettings.asset @@ -162,24 +162,4 @@ QualitySettings: asyncUploadTimeSlice: 2 asyncUploadBufferSize: 4 excludedTargetPlatforms: [] - m_PerPlatformDefaultQuality: - Android: 2 - BlackBerry: 2 - GLES Emulation: 5 - Nintendo 3DS: 5 - PS3: 5 - PS4: 5 - PSM: 5 - PSP2: 2 - Samsung TV: 2 - Standalone: 5 - Tizen: 2 - WP8: 5 - Web: 5 - WebGL: 3 - WiiU: 5 - Windows Store Apps: 5 - XBOX360: 5 - XboxOne: 5 - iPhone: 2 - tvOS: 5 + m_PerPlatformDefaultQuality: {} diff --git a/Tools/FlashExport2.jsfl b/Tools/FlashExport2.jsfl index be3cc17..5829fa0 100644 --- a/Tools/FlashExport2.jsfl +++ b/Tools/FlashExport2.jsfl @@ -162,6 +162,18 @@ if (typeof Object.create != 'function') { } } }; + + ft.array_reverse_foreach = function (arr, func, filter) { + ft.type_assert(arr, Array); + ft.type_assert(func, Function); + ft.type_assert_if_defined(filter, Function); + for (var index = arr.length - 1; index >= 0; --index) { + var value = arr[index]; + if (filter === undefined || filter(value, index)) { + func(value, index); + } + } + }; ft.object_foreach = function (obj, func, filter) { ft.type_assert(obj, 'object'); @@ -509,7 +521,7 @@ if (typeof Object.create != 'function') { this.timeline.selectAllFrames(); this.timeline.convertToKeyframes(); } - ft.array_foreach(this.timeline.layers, function(layer, index) { + ft.array_reverse_foreach(this.timeline.layers, function(layer, index) { this.timeline.setSelectedLayers(index); new LayerInst(layer, this.uniqueIds) .convert(document, this.timeline); @@ -518,7 +530,7 @@ if (typeof Object.create != 'function') { TimelineInst.prototype.prepare = function (document) { ft.type_assert(document, Document); - ft.array_foreach(this.timeline.layers, function(layer, index) { + ft.array_reverse_foreach(this.timeline.layers, function(layer, index) { this.timeline.setSelectedLayers(index); new LayerInst(layer, this.uniqueIds) .prepare(document, this.timeline); @@ -527,7 +539,7 @@ if (typeof Object.create != 'function') { TimelineInst.prototype.export_description = function (xml_node) { ft.type_assert(xml_node, XmlNode); - ft.array_foreach(this.timeline.layers, function(layer) { + ft.array_reverse_foreach(this.timeline.layers, function(layer) { new LayerInst(layer, this.uniqueIds) .export_description(xml_node); }.bind(this)); @@ -564,11 +576,13 @@ if (typeof Object.create != 'function') { }; LayerInst.prototype.is_empty = function () { - var frames = this.layer.frames; - for ( var i = 0; i < frames.length; ++i ) { - var is_empty = new FrameInst(frames[i], i, this.uniqueIds).is_empty(); - if ( !is_empty ) { - return false; + if ( this.layer.visible ) { + var frames = this.layer.frames; + for ( var i = 0; i < frames.length; ++i ) { + var is_empty = new FrameInst(frames[i], i, this.uniqueIds).is_empty(); + if ( !is_empty ) { + return false; + } } } return true; @@ -620,7 +634,6 @@ if (typeof Object.create != 'function') { ft.type_assert(xml_node, XmlNode); var layer_node = xml_node.child("layer") .attr("id" , this.get_id()) - .attr("visible" , this.layer.visible) .attr("layer_type", this.layer.layerType); if (this.layer.parentLayer) { var parent_layer = new LayerInst(this.layer.parentLayer, this.uniqueIds); @@ -736,9 +749,7 @@ if (typeof Object.create != 'function') { FrameInst.prototype.export_description = function (xml_node) { ft.type_assert(xml_node, XmlNode); var frame_node = xml_node.child("frame") - .attr("id" , this.get_id()) - .attr("index" , this.get_index()) - .attr("duration", this.frame.duration); + .attr("id", this.get_id()); ft.array_foreach(this.frame.elements, function (element) { this.export_element(frame_node, element); }.bind(this)); @@ -777,7 +788,6 @@ if (typeof Object.create != 'function') { ft.type_assert(xml_node, XmlNode); return xml_node.child("element") .attr("id" , this.get_id()) - .attr("depth" , this.inst.depth) .attr("matrix", "{0};{1};{2};{3};{4};{5}".format( this.inst.matrix.a, this.inst.matrix.b, this.inst.matrix.c, this.inst.matrix.d, @@ -827,6 +837,24 @@ if (typeof Object.create != 'function') { .format(symbol_type); } }; + + SymbolInst.prototype.get_looping_type = function () { + var looping_type = this.inst.loop !== undefined ? this.inst.loop : "single frame"; + if ( looping_type == "loop" ) { + return "loop"; + } else if ( looping_type == "play once" ) { + return "playonce"; + } else if ( looping_type == "single frame" ) { + return "single frame"; + } else { + throw "Unsupported looping type ({0})!" + .format(looping_type); + } + }; + + SymbolInst.prototype.get_looping_first_frame = function () { + return this.inst.firstFrame !== undefined ? this.inst.firstFrame : 0; + }; SymbolInst.prototype.export_description = function (xml_node) { ft.type_assert(xml_node, XmlNode); @@ -837,6 +865,11 @@ if (typeof Object.create != 'function') { .attr("asset" , this.uniqueIds.get_string_id(this.inst.libraryItem.name)) .attr("visible" , this.inst.visible) .attr("blend_mode" , this.inst.blendMode); + instance_node.child("looping") + .attr("type" , this.get_looping_type()) + .attr("first_frame", this.get_looping_first_frame()); + + /* \TODO export color mode if (this.inst.colorMode !== "none") { var color_mode_node = instance_node.child("color_mode") .attr("color_mode", this.inst.colorMode); @@ -853,28 +886,23 @@ if (typeof Object.create != 'function') { } else if (this.inst.colorMode == "advanced") { color_mode_node .attr("a", "{0};{1}".format(this.inst.colorAlphaAmount, this.inst.colorAlphaPercent)) - .attr("r", "{0};{1}".format(this.inst.colorRedAmount, this.inst.colorRedPercent)) + .attr("r", "{0};{1}".format(this.inst.colorRedAmount, this.inst.colorRedPercent )) .attr("g", "{0};{1}".format(this.inst.colorGreenAmount, this.inst.colorGreenPercent)) - .attr("b", "{0};{1}".format(this.inst.colorBlueAmount, this.inst.colorBluePercent)); + .attr("b", "{0};{1}".format(this.inst.colorBlueAmount, this.inst.colorBluePercent )); } else { ft.assert(false, "Unsupported color mode ({0})!", this.inst.colorMode); } - } - if (this.inst.loop !== undefined && this.inst.firstFrame !== undefined) { - instance_node.child("looping") - .attr("loop" , this.inst.loop) - .attr("first_frame", this.inst.firstFrame); - } + }*/ + /* \TODO export filters if (this.inst.filters && this.inst.filters.length > 0) { var filters_node = instance_node.child("filters"); ft.array_foreach(this.inst.filters, function (filter) { - /// \TODO export filters filters_node.child("filter") .attr("name", filter.name); }); - } + }*/ }; // ---------------------------------------------------------------------------- diff --git a/unityflash.userprefs b/unityflash.userprefs index 46798da..7926746 100644 --- a/unityflash.userprefs +++ b/unityflash.userprefs @@ -1,11 +1,10 @@  - + - - - - + + +