예제 #1
0
        public static void UnpackToSprite(UnityEngine.Object spriteCollectionData, out SpritePackage sprites, string fileLocation = null)
        {
            OutClass <SpritePackage> resultSprites = new OutClass <SpritePackage>();

            var iterator = UnpackToSpriteAsyncInternal(spriteCollectionData, resultSprites, fileLocation);

            while (iterator.MoveNext())
            {
            }

            sprites = resultSprites.Value;
        }
예제 #2
0
        public static IEnumerator DecomposeTK2DAnimation(UnityEngine.Object tk2dSpriteAnimation, string animationName = null)
        {
            //var data = GetCollectionData(tk2dSpriteCollection);

            if (animationName == null)
            {
                animationName = "DecomposedAnimation";
            }

            var animationData = GetAnimationData(tk2dSpriteAnimation);

            Dictionary <int, SpriteCollectionData> spriteCollections = new Dictionary <int, SpriteCollectionData>();


            Dictionary <int, SpritePackage> sprites = new Dictionary <int, SpritePackage>();

            foreach (var clip in animationData.Clips)
            {
                foreach (var frame in clip.Frames)
                {
                    if (!spriteCollections.ContainsKey(frame.SpriteCollectionRaw.GetInstanceID()))
                    {
                        spriteCollections.Add(frame.SpriteCollectionRaw.GetInstanceID(), GetCollectionData(frame.SpriteCollectionRaw));

                        OutClass <SpritePackage> outputSprites = new OutClass <SpritePackage>();
                        //List<Sprite> sprites = new List<Sprite>();

                        yield return(UnpackToSpriteAsyncInternal(frame.SpriteCollectionRaw, outputSprites, "Assets\\" + animationName));

                        sprites.Add(frame.SpriteCollectionRaw.GetInstanceID(), outputSprites.Value);
                    }
                }
            }

            WeaverAnimationData data = ScriptableObject.CreateInstance <WeaverAnimationData>();

            foreach (var clipRaw in animationData.Clips)
            {
                if (clipRaw.Name == null || clipRaw.Name == "")
                {
                    continue;
                }
                var clip = new WeaverAnimationData.Clip
                {
                    FPS       = clipRaw.FPS,
                    LoopStart = clipRaw.LoopStart,
                    Name      = clipRaw.Name,
                };
                switch (clipRaw.WrapMode)
                {
                case WrapMode.Loop:
                    clip.WrapMode = WeaverAnimationData.WrapMode.Loop;
                    break;

                case WrapMode.LoopSection:
                    clip.WrapMode = WeaverAnimationData.WrapMode.LoopSection;
                    break;

                case WrapMode.Once:
                    clip.WrapMode = WeaverAnimationData.WrapMode.Once;
                    break;

                case WrapMode.PingPong:
                    clip.WrapMode = WeaverAnimationData.WrapMode.PingPong;
                    break;

                case WrapMode.RandomFrame:
                    clip.WrapMode = WeaverAnimationData.WrapMode.RandomFrame;
                    break;

                case WrapMode.RandomLoop:
                    clip.WrapMode = WeaverAnimationData.WrapMode.RandomLoop;
                    break;

                case WrapMode.Single:
                    clip.WrapMode = WeaverAnimationData.WrapMode.SingleFrame;
                    break;

                default:
                    break;
                }

                foreach (var frameRaw in clipRaw.Frames)
                {
                    clip.AddFrame(sprites[frameRaw.SpriteCollectionRaw.GetInstanceID()].GetSprite(frameRaw.SpriteID));
                }

                data.AddClip(clip);
            }



            AssetDatabase.CreateAsset(data, "Assets/" + animationName + "/" + animationName + ".asset");
        }
예제 #3
0
        static IEnumerator UnpackToSpriteAsyncInternal(UnityEngine.Object tk2dSpriteCollection, OutClass <SpritePackage> resultSprites = null, string fileLocation = null)
        {
            //TODO : READ ACTUAL IMAGE SIZE AND RESIZE TEXTURE TO THAT SIZE
            var data = GetCollectionData(tk2dSpriteCollection);

            using (var resizeContext = new ResizeTextureContext(data.MainTexture))
            {
                List <Texture2D>      spriteTextures = new List <Texture2D>();
                List <tk2DSpriteData> sprites        = new List <tk2DSpriteData>();
                //yield return null;

                foreach (var spriteData in ReadSpritesFromData(data))
                {
                    sprites.Add(spriteData);
                    spriteTextures.Add(spriteData.Texture);
                    yield return(null);
                }

                //Debug.Log("Creating Texture with = " + new Vector2Int(data.MainTexture.width,data.MainTexture.height));
                Texture2D atlas     = new Texture2D(data.MainTexture.width, data.MainTexture.height);
                string    atlasName = data.MainTexture.name + "_unpacked";
                atlas.name = atlasName;

                var uvCoords = atlas.PackTextures(spriteTextures.ToArray(), 1, Mathf.Max(data.MainTexture.width, data.MainTexture.height), false);
                //WeaverLog.Log("Atlas Size = " + atlas.width + " , " + atlas.height);
                var pngData = atlas.EncodeToPNG();

                if (fileLocation == null)
                {
                    fileLocation = "Assets\\" + atlasName + ".png";
                }
                else if (!fileLocation.EndsWith(".png"))
                {
                    fileLocation += "\\" + atlasName + ".png";
                }

                var fileInfo = new FileInfo(fileLocation);

                if (!fileInfo.Directory.Exists)
                {
                    fileInfo.Directory.Create();
                }

                using (var fileTest = File.Create(fileLocation))
                {
                    fileTest.Write(pngData, 0, pngData.GetLength(0));
                }
                AssetDatabase.ImportAsset(fileLocation);

                yield return(null);

                //DefaultTexturePlatform


                var importer         = (TextureImporter)AssetImporter.GetAtPath(fileLocation);
                var platformSettings = importer.GetPlatformTextureSettings("DefaultTexturePlatform");
                platformSettings.maxTextureSize = Mathf.Max(data.MainTexture.width, data.MainTexture.height);
                importer.SetPlatformTextureSettings(platformSettings);

                float averagePPU = 0f;

                foreach (var sprite in sprites)
                {
                    averagePPU += sprite.PixelsPerUnit;
                    //yield return null;
                }
                averagePPU /= sprites.Count;


                importer.spriteImportMode    = SpriteImportMode.Multiple;
                importer.spritePixelsPerUnit = averagePPU;

                List <SpriteMetaData> metas = new List <SpriteMetaData>();

                Dictionary <Rect, int> rectToId = new Dictionary <Rect, int>();

                //foreach (var sprite in sprites)
                for (int i = 0; i < sprites.Count; i++)
                {
                    var sprite = sprites[i];
                    var uv     = uvCoords[i];
                    //var textureSize = new Vector2(sprite.Texture.width, sprite.Texture.height);
                    //WeaverLog.Log("Sprite Coords for " + sprite.Texture.name + " = " + uvCoords[i]);
                    metas.Add(new SpriteMetaData()
                    {
                        name      = sprite.Name,
                        border    = Vector4.zero,
                        pivot     = new Vector2(1 - sprite.Pivot.x, 1 - sprite.Pivot.y),
                        alignment = (int)SpriteAlignment.Custom,
                        rect      = new Rect(uv.x * atlas.width, uv.y * atlas.height, uv.width * atlas.width, uv.height * atlas.height)
                    });

                    rectToId.Add(metas[metas.Count - 1].rect, i);
                }
                importer.spritesheet = metas.ToArray();

                Debug.Log("Unpacked " + metas.Count + " different sprites");

                importer.SaveAndReimport();

                yield return(null);

                EditorUtility.ClearProgressBar();

                var finalTexture = AssetDatabase.LoadAssetAtPath <Texture2D>(fileLocation);

                if (resultSprites != null)
                {
                    var package = new SpritePackage(finalTexture);

                    var finalSprites = GetSpritesFromTexture(finalTexture);

                    foreach (var finalSprite in finalSprites)
                    {
                        var definition = data.Definitions.FirstOrDefault(d => d.Name == finalSprite.name);

                        if (definition.Positions != default(Vector2[]))
                        {
                            package.AddSprite(Array.IndexOf(data.Definitions, definition), finalSprite);
                        }
                    }

                    /*foreach (var finalSprite in finalSprites)
                     * {
                     *      if (rectToId.ContainsKey(finalSprite.rect))
                     *      {
                     *              //spriteList[rectToId[finalSprite.rect]] = finalSprite;
                     *              package.AddSprite(rectToId[finalSprite.rect], finalSprite);
                     *      }
                     * }*/

                    resultSprites.Value = package;
                }
            }
        }