Пример #1
0
        private void OnSelectionChange()
        {
            string                    selectionAssetPath       = this.GetSelectionAssetPath();
            AssetImporter             atPath                   = AssetImporter.GetAtPath(selectionAssetPath);
            ISpriteEditorDataProvider spriteEditorDataProvider = atPath as ISpriteEditorDataProvider;

            if (spriteEditorDataProvider == null || this.selectedProviderChanged)
            {
                this.HandleApplyRevertDialog(SpriteEditorWindow.SpriteEditorWindowStyles.applyRevertDialogTitle.text, string.Format(SpriteEditorWindow.SpriteEditorWindowStyles.applyRevertDialogContent.text, this.m_SelectedAssetPath));
                this.ResetWindow();
                this.RefreshPropertiesCache();
                this.RefreshRects();
            }
            if (this.m_RectsCache != null)
            {
                if (Selection.activeObject is Sprite)
                {
                    this.UpdateSelectedSpriteRect(Selection.activeObject as Sprite);
                }
                else if (Selection.activeGameObject != null && Selection.activeGameObject.GetComponent <SpriteRenderer>())
                {
                    Sprite sprite = Selection.activeGameObject.GetComponent <SpriteRenderer>().sprite;
                    this.UpdateSelectedSpriteRect(sprite);
                }
            }
            this.UpdateAvailableModules();
            base.Repaint();
        }
        public void OverwriteMesh()
        {
            ISpriteEditorDataProvider mainSpriteDataProvider = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(mainSprite)) as ISpriteEditorDataProvider;

            mainSpriteDataProvider.InitSpriteEditorDataProvider();
            ISpriteMeshDataProvider meshDataProvider = mainSpriteDataProvider.GetDataProvider <ISpriteMeshDataProvider>();

            for (int i = 0; i < spritesToOverwrite.Length; i++)
            {
                ISpriteEditorDataProvider spriteDataProvider = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(spritesToOverwrite[i])) as ISpriteEditorDataProvider;
                spriteDataProvider.InitSpriteEditorDataProvider();
                ISpriteMeshDataProvider meshDataToOverwrite = spriteDataProvider.GetDataProvider <ISpriteMeshDataProvider>();
                GUID toOver   = spritesToOverwrite[i].GetSpriteID();
                GUID mainGuid = mainSprite.GetSpriteID();

                meshDataToOverwrite.SetEdges(toOver, meshDataProvider.GetEdges(mainGuid));
                meshDataToOverwrite.SetIndices(toOver, meshDataProvider.GetIndices(mainGuid));
                meshDataToOverwrite.SetVertices(toOver, meshDataProvider.GetVertices(mainGuid));

                spriteDataProvider.Apply();

                //force SetBindPose
                AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(spritesToOverwrite[i]));
            }

            Debug.Log("Mesh overwritten");
        }
Пример #3
0
        static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
        {
            m_AssetList = new List <object>();
            List <string> assetPathModified = new List <string>();

            foreach (var importedAsset in importedAssets)
            {
                ISpriteEditorDataProvider ai = InternalEditorBridge.GetISpriteEditorDataProviderFromPath(importedAsset);
                if (ai != null)
                {
                    ai.InitSpriteEditorDataProvider();
                    var  assets      = AssetDatabase.LoadAllAssetsAtPath(importedAsset);
                    var  sprites     = assets.OfType <Sprite>().ToArray <Sprite>();
                    bool dataChanged = false;
                    dataChanged  = PostProcessBoneData(ai, sprites);
                    dataChanged |= PostProcessSpriteMeshData(ai, sprites);
                    if (dataChanged)
                    {
                        assetPathModified.Add(importedAsset);
                        m_AssetList.AddRange(assets);
                    }
                }
            }

            if (assetPathModified.Count > 0 && m_AssetList.Count > 0)
            {
                var originalValue = EditorPrefs.GetBool("VerifySavingAssets", false);
                EditorPrefs.SetBool("VerifySavingAssets", false);
                AssetDatabase.ForceReserializeAssets(assetPathModified, ForceReserializeAssetsOptions.ReserializeMetadata);
                EditorPrefs.SetBool("VerifySavingAssets", originalValue);
                m_AssetList.Clear();
            }
        }
 internal bool ContainsAllType(ISpriteEditorDataProvider provider)
 {
     return(provider == null ? false : m_Types.Where(x =>
     {
         return provider.HasDataProvider(x);
     }).Count() == m_Types.Length);
 }
Пример #5
0
 static internal void ApplyChanges(SkinningCache skinningCache, ISpriteEditorDataProvider dataProvider)
 {
     skinningCache.applyingChanges = true;
     skinningCache.RestoreBindPose();
     ApplyBone(skinningCache, dataProvider);
     ApplyMesh(skinningCache, dataProvider);
     ApplyCharacter(skinningCache, dataProvider);
     skinningCache.applyingChanges = false;
 }
Пример #6
0
 public void OnEnable()
 {
     m_DataProvider = GetSpriteEditorDataProvider();
     m_DataProvider.InitSpriteEditorDataProvider();
     m_SkinningModule = new SkinningModule();
     m_SkinningModule.GetType()
     .GetProperty("spriteEditor", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)
     .SetValue(m_SkinningModule, this, null);
 }
        void OnPostprocessSprites(Texture2D texture, Sprite[] sprites)
        {
            var dataProviderFactories = new SpriteDataProviderFactories();

            dataProviderFactories.Init();
            PSDImporter psd = AssetImporter.GetAtPath(assetPath) as PSDImporter;

            if (psd == null)
            {
                return;
            }
            ISpriteEditorDataProvider importer = dataProviderFactories.GetSpriteEditorDataProviderFromObject(psd);

            if (importer != null)
            {
                importer.InitSpriteEditorDataProvider();
                var physicsOutlineDataProvider = importer.GetDataProvider <ISpritePhysicsOutlineDataProvider>();
                var textureDataProvider = importer.GetDataProvider <ITextureDataProvider>();
                int actualWidth = 0, actualHeight = 0;
                textureDataProvider.GetTextureActualWidthAndHeight(out actualWidth, out actualHeight);
                float definitionScaleW = (float)texture.width / actualWidth;
                float definitionScaleH = (float)texture.height / actualHeight;
                float definitionScale  = Mathf.Min(definitionScaleW, definitionScaleH);
                foreach (var sprite in sprites)
                {
                    var guid          = sprite.GetSpriteID();
                    var outline       = physicsOutlineDataProvider.GetOutlines(guid);
                    var outlineOffset = sprite.rect.size / 2;
                    if (outline != null && outline.Count > 0)
                    {
                        // Ensure that outlines are all valid.
                        int validOutlineCount = 0;
                        for (int i = 0; i < outline.Count; ++i)
                        {
                            validOutlineCount = validOutlineCount + ((outline[i].Length > 2) ? 1 : 0);
                        }

                        int index            = 0;
                        var convertedOutline = new Vector2[validOutlineCount][];
                        for (int i = 0; i < outline.Count; ++i)
                        {
                            if (outline[i].Length > 2)
                            {
                                convertedOutline[index] = new Vector2[outline[i].Length];
                                for (int j = 0; j < outline[i].Length; ++j)
                                {
                                    convertedOutline[index][j] = outline[i][j] * definitionScale + outlineOffset;
                                }
                                index++;
                            }
                        }
                        sprite.OverridePhysicsShape(convertedOutline);
                    }
                }
            }
        }
Пример #8
0
        private void CheckDataProviderChanged()
        {
            var dp = m_SpriteEditor.GetDataProvider <ISpriteEditorDataProvider>();

            if (dp != m_CurrentDataProvider)
            {
                DestoryTextures();
                m_OutlineTextureCache.Clear();
                m_CurrentDataProvider = dp;
            }
        }
Пример #9
0
 private void UnifiedValues(out bool name, out bool alignment, out bool border)
 {
     name      = true;
     alignment = true;
     border    = true;
     if (base.targets.Length >= 2)
     {
         string assetPath = AssetDatabase.GetAssetPath(this.sprite);
         ISpriteEditorDataProvider spriteEditorDataProvider = AssetImporter.GetAtPath(assetPath) as ISpriteEditorDataProvider;
         if (spriteEditorDataProvider != null)
         {
             spriteEditorDataProvider.InitSpriteEditorDataProvider();
             SpriteRect[] spriteRects = spriteEditorDataProvider.GetSpriteRects();
             string       text        = null;
             int          num         = -1;
             Vector4?     vector      = null;
             for (int i = 0; i < base.targets.Length; i++)
             {
                 Sprite sprite = base.targets[i] as Sprite;
                 for (int j = 0; j < spriteRects.Length; j++)
                 {
                     if (spriteRects[j].name.Equals(sprite.name))
                     {
                         if (spriteRects[j].alignment != (SpriteAlignment)num && num > 0)
                         {
                             alignment = false;
                         }
                         else
                         {
                             num = (int)spriteRects[j].alignment;
                         }
                         if (spriteRects[j].name != text && text != null)
                         {
                             name = false;
                         }
                         else
                         {
                             text = spriteRects[j].name;
                         }
                         if (spriteRects[j].border != vector && vector.HasValue)
                         {
                             border = false;
                         }
                         else
                         {
                             vector = new Vector4?(spriteRects[j].border);
                         }
                     }
                 }
             }
         }
     }
 }
Пример #10
0
        static void ApplyBone(SkinningCache skinningCache, ISpriteEditorDataProvider dataProvider)
        {
            var boneDataProvider = dataProvider.GetDataProvider <ISpriteBoneDataProvider>();

            if (boneDataProvider != null)
            {
                var sprites = skinningCache.GetSprites();
                foreach (var sprite in sprites)
                {
                    var bones = sprite.GetSkeleton().bones;
                    boneDataProvider.SetBones(new GUID(sprite.id), bones.ToSpriteBone(sprite.localToWorldMatrix).ToList());
                }
            }
        }
Пример #11
0
        protected virtual void LoadOutline()
        {
            this.m_Outline = ScriptableObject.CreateInstance <SpriteOutlineModel>();
            ISpriteEditorDataProvider  dataProvider  = this.spriteEditorWindow.GetDataProvider <ISpriteEditorDataProvider>();
            ISpriteOutlineDataProvider dataProvider2 = this.spriteEditorWindow.GetDataProvider <ISpriteOutlineDataProvider>();

            SpriteRect[] spriteRects = dataProvider.GetSpriteRects();
            for (int i = 0; i < spriteRects.Length; i++)
            {
                SpriteRect       spriteRect = spriteRects[i];
                List <Vector2[]> outlines   = dataProvider2.GetOutlines(spriteRect.spriteID);
                this.m_Outline.AddListVector2(spriteRect.spriteID, outlines);
                this.m_Outline[this.m_Outline.Count - 1].tessellationDetail = dataProvider2.GetTessellationDetail(spriteRect.spriteID);
            }
        }
Пример #12
0
        void OnPostprocessSprites(Texture2D texture, Sprite[] sprites)
        {
            ISpriteEditorDataProvider ai = GetSpriteEditorDataProvider(assetPath);

            if (ai != null)
            {
                float definitionScale = CalculateDefinitionScale(texture, ai.GetDataProvider <ITextureDataProvider>());
                ai.InitSpriteEditorDataProvider();
                PostProcessBoneData(ai, definitionScale, sprites);
                PostProcessSpriteMeshData(ai, definitionScale, sprites);
                BoneGizmo.instance.ClearSpriteBoneCache();
            }

            // Get all SpriteSkin in scene and inform them to refresh their cache
            RefreshSpriteSkinCache();
        }
        void OnPostprocessSprites(Texture2D texture, Sprite[] sprites)
        {
            var dataProviderFactories = new SpriteDataProviderFactories();

            dataProviderFactories.Init();
            ISpriteEditorDataProvider ai = dataProviderFactories.GetSpriteEditorDataProviderFromObject(AssetImporter.GetAtPath(assetPath));

            if (ai != null)
            {
                float definitionScale = CalculateDefinitionScale(texture, ai.GetDataProvider <ITextureDataProvider>());
                ai.InitSpriteEditorDataProvider();
                PostProcessBoneData(ai, definitionScale, sprites);
                PostProcessSpriteMeshData(ai, definitionScale, sprites);
                BoneGizmo.instance.ClearSpriteBoneCache();
            }
        }
Пример #14
0
        static bool PostProcessBoneData(ISpriteEditorDataProvider spriteDataProvider, float definitionScale, Sprite[] sprites)
        {
            var boneDataProvider    = spriteDataProvider.GetDataProvider <ISpriteBoneDataProvider>();
            var textureDataProvider = spriteDataProvider.GetDataProvider <ITextureDataProvider>();

            if (sprites == null || sprites.Length == 0 || boneDataProvider == null || textureDataProvider == null)
            {
                return(false);
            }

            bool dataChanged = false;
            var  spriteRects = spriteDataProvider.GetSpriteRects();

            foreach (var sprite in sprites)
            {
                var guid = sprite.GetSpriteID();
                {
                    var spriteBone = boneDataProvider.GetBones(guid);
                    if (spriteBone == null)
                    {
                        continue;
                    }

                    var spriteBoneCount = spriteBone.Count;
                    if (spriteBoneCount == 0)
                    {
                        continue;
                    }

                    var spriteRect = spriteRects.First(s => { return(s.spriteID == guid); });

                    var bindPose          = new NativeArray <Matrix4x4>(spriteBoneCount, Allocator.Temp);
                    var outputSpriteBones = new UnityEngine.U2D.SpriteBone ? [spriteBoneCount];
                    for (int i = 0; i < spriteBoneCount; ++i)
                    {
                        CalculateLocaltoWorldMatrix(i, spriteRect, definitionScale, sprite.pixelsPerUnit, spriteBone, ref outputSpriteBones, ref bindPose);
                    }
                    sprite.SetBindPoses(bindPose);
                    sprite.SetBones(outputSpriteBones.Select(x => x.Value).ToArray());
                    bindPose.Dispose();

                    dataChanged = true;
                }
            }

            return(dataChanged);
        }
Пример #15
0
 public void RefreshPropertiesCache()
 {
     this.m_SelectedAssetPath  = this.GetSelectionAssetPath();
     this.m_SpriteDataProvider = (AssetImporter.GetAtPath(this.m_SelectedAssetPath) as ISpriteEditorDataProvider);
     if (this.m_SpriteDataProvider != null)
     {
         this.m_SpriteDataProvider.InitSpriteEditorDataProvider();
         ITextureDataProvider dataProvider = this.m_SpriteDataProvider.GetDataProvider <ITextureDataProvider>();
         if (dataProvider != null)
         {
             int width  = 0;
             int height = 0;
             dataProvider.GetTextureActualWidthAndHeight(out width, out height);
             this.m_Texture = ((!(dataProvider.texture == null)) ? new SpriteEditorWindow.PreviewTexture2D(dataProvider.texture, width, height) : null);
         }
     }
 }
Пример #16
0
        public override void OnModuleActivate()
        {
            this.spriteImportMode      = SpriteUtility.GetSpriteImportMode(base.spriteEditor.GetDataProvider <ISpriteEditorDataProvider>());
            this.m_TextureDataProvider = base.spriteEditor.GetDataProvider <ITextureDataProvider>();
            this.m_SpriteDataProvider  = base.spriteEditor.GetDataProvider <ISpriteEditorDataProvider>();
            int textureActualWidth;
            int textureActualHeight;

            this.m_TextureDataProvider.GetTextureActualWidthAndHeight(out textureActualWidth, out textureActualHeight);
            this.textureActualWidth       = textureActualWidth;
            this.textureActualHeight      = textureActualHeight;
            this.m_RectsCache             = ScriptableObject.CreateInstance <SpriteRectModel>();
            this.m_RectsCache.spriteRects = this.m_SpriteDataProvider.GetSpriteRects().ToList <SpriteRect>();
            if (base.spriteEditor.selectedSpriteRect != null)
            {
                base.spriteEditor.selectedSpriteRect = this.m_RectsCache.spriteRects.FirstOrDefault((SpriteRect x) => x.spriteID == base.spriteEditor.selectedSpriteRect.spriteID);
            }
        }
Пример #17
0
        // implements ISpriteEditorModule

        public override void OnModuleActivate()
        {
            spriteImportMode      = SpriteUtility.GetSpriteImportMode(spriteEditor.GetDataProvider <ISpriteEditorDataProvider>());
            m_TextureDataProvider = spriteEditor.GetDataProvider <ITextureDataProvider>();
            m_SpriteDataProvider  = spriteEditor.GetDataProvider <ISpriteEditorDataProvider>();
            int width, height;

            m_TextureDataProvider.GetTextureActualWidthAndHeight(out width, out height);
            textureActualWidth       = width;
            textureActualHeight      = height;
            m_RectsCache             = ScriptableObject.CreateInstance <SpriteRectModel>();
            m_RectsCache.spriteRects = m_SpriteDataProvider.GetSpriteRects().ToList();
            spriteEditor.spriteRects = m_RectsCache.spriteRects;
            if (spriteEditor.selectedSpriteRect != null)
            {
                spriteEditor.selectedSpriteRect = m_RectsCache.spriteRects.FirstOrDefault(x => x.spriteID == spriteEditor.selectedSpriteRect.spriteID);
            }
        }
        private static void OverwriteOutline(Sprite mainSprite, float tessellationDetail, List <Vector2[]> outlines)
        {
            ISpriteEditorDataProvider mainSpriteDataProvider = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(mainSprite)) as ISpriteEditorDataProvider;

            mainSpriteDataProvider.InitSpriteEditorDataProvider();
            ISpritePhysicsOutlineDataProvider meshDataProvider = mainSpriteDataProvider.GetDataProvider <ISpritePhysicsOutlineDataProvider>();


            GUID mainGuid = mainSprite.GetSpriteID();

            meshDataProvider.SetOutlines(mainGuid, outlines);
            meshDataProvider.SetTessellationDetail(mainGuid, tessellationDetail);
            mainSpriteDataProvider.Apply();


            //AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(mainSprite));

            Debug.Log("Outlines overwritten for " + mainSprite.name);
        }
Пример #19
0
        void OnPreprocessAsset()
        {
            ISpriteEditorDataProvider ai = GetSpriteEditorDataProvider(assetPath);

            if (ai != null)
            {
                var characterDataProvider = ai.GetDataProvider <ICharacterDataProvider>();
                var boneDataProvider      = ai.GetDataProvider <ISpriteBoneDataProvider>();
                var characterData         = characterDataProvider?.GetCharacterData();

                if (characterData.HasValue && characterData.Value.boneReadOnly && boneDataProvider != null)
                {
                    var skinningCache = Cache.Create <SkinningCache>();
                    skinningCache.Create(ai, new SkinningCachePersistentStateTemp());
                    SkinningModule.ApplyChanges(skinningCache, ai);
                    ai.Apply();
                }
            }
        }
        static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
        {
            var dataProviderFactories = new SpriteDataProviderFactories();

            dataProviderFactories.Init();
            m_AssetList = new List <object>();
            List <string> assetPathModified = new List <string>();

            foreach (var importedAsset in importedAssets)
            {
                var asset = AssetDatabase.LoadMainAssetAtPath(importedAsset);
                ISpriteEditorDataProvider ai = dataProviderFactories.GetSpriteEditorDataProviderFromObject(asset);
                if (ai != null)
                {
                    ai.InitSpriteEditorDataProvider();
                    var  assets      = AssetDatabase.LoadAllAssetsAtPath(importedAsset);
                    var  sprites     = assets.OfType <Sprite>().ToArray <Sprite>();
                    bool dataChanged = false;
                    dataChanged  = PostProcessBoneData(ai, sprites);
                    dataChanged |= PostProcessSpriteMeshData(ai, sprites);
                    if (ai is IAnimationAssetPostProcess)
                    {
                        dataChanged |= ((IAnimationAssetPostProcess)ai).OnAfterPostProcess();
                    }
                    if (dataChanged)
                    {
                        assetPathModified.Add(importedAsset);
                        m_AssetList.AddRange(assets);
                    }
                }
            }

            if (assetPathModified.Count > 0 && m_AssetList.Count > 0)
            {
                var originalValue = EditorPrefs.GetBool("VerifySavingAssets", false);
                EditorPrefs.SetBool("VerifySavingAssets", false);
                AssetDatabase.ForceReserializeAssets(assetPathModified, ForceReserializeAssetsOptions.ReserializeMetadata);
                EditorPrefs.SetBool("VerifySavingAssets", originalValue);
                m_AssetList.Clear();
                BoneGizmo.instance.ClearSpriteBoneCache();
            }
        }
Пример #21
0
        public void RefreshPropertiesCache()
        {
            m_SelectedAssetPath  = GetSelectionAssetPath();
            m_SpriteDataProvider = AssetImporter.GetAtPath(m_SelectedAssetPath) as ISpriteEditorDataProvider;
            if (m_SpriteDataProvider == null)
            {
                return;
            }

            m_SpriteDataProvider.InitSpriteEditorDataProvider();

            var textureProvider = m_SpriteDataProvider.GetDataProvider <ITextureDataProvider>();

            if (textureProvider != null)
            {
                int width = 0, height = 0;
                textureProvider.GetTextureActualWidthAndHeight(out width, out height);
                m_Texture = textureProvider.texture == null ? null : new PreviewTexture2D(textureProvider.texture, width, height);
            }
        }
        // implements ISpriteEditorModule

        public override void OnModuleActivate()
        {
            spriteImportMode      = SpriteFrameModule.GetSpriteImportMode(spriteEditor.GetDataProvider <ISpriteEditorDataProvider>());
            m_TextureDataProvider = spriteEditor.GetDataProvider <ITextureDataProvider>();
            m_SpriteDataProvider  = spriteEditor.GetDataProvider <ISpriteEditorDataProvider>();
            int width, height;

            m_TextureDataProvider.GetTextureActualWidthAndHeight(out width, out height);
            textureActualWidth       = width;
            textureActualHeight      = height;
            m_RectsCache             = ScriptableObject.CreateInstance <SpriteRectModel>();
            m_RectsCache.hideFlags   = HideFlags.HideAndDontSave;
            m_RectsCache.spriteRects = m_SpriteDataProvider.GetSpriteRects().ToList();
            spriteEditor.spriteRects = m_RectsCache.spriteRects;
            if (spriteEditor.selectedSpriteRect != null)
            {
                spriteEditor.selectedSpriteRect = m_RectsCache.spriteRects.FirstOrDefault(x => x.spriteID == spriteEditor.selectedSpriteRect.spriteID);
            }
            AddMainUI(spriteEditor.GetMainVisualContainer());
            undoSystem.RegisterUndoCallback(UndoCallback);
        }
Пример #23
0
        public void RefreshPropertiesCache()
        {
            var obj = AssetDatabase.LoadMainAssetAtPath(m_SelectedAssetPath);

            m_SpriteDataProvider = m_SpriteDataProviderFactories.GetSpriteEditorDataProviderFromObject(obj);
            if (!IsSpriteDataProviderValid())
            {
                m_SelectedAssetPath = "";
                return;
            }


            m_SpriteDataProvider.InitSpriteEditorDataProvider();

            var textureProvider = m_SpriteDataProvider.GetDataProvider <ITextureDataProvider>();

            if (textureProvider != null)
            {
                int width = 0, height = 0;
                textureProvider.GetTextureActualWidthAndHeight(out width, out height);
                m_Texture = textureProvider.previewTexture == null ? null : new PreviewTexture2D(textureProvider.previewTexture, width, height);
            }
        }
Пример #24
0
        static void ApplyMesh(SkinningCache skinningCache, ISpriteEditorDataProvider dataProvider)
        {
            var meshDataProvider = dataProvider.GetDataProvider <ISpriteMeshDataProvider>();

            if (meshDataProvider != null)
            {
                var sprites = skinningCache.GetSprites();
                foreach (var sprite in sprites)
                {
                    var mesh = sprite.GetMesh();
                    var guid = new GUID(sprite.id);
                    meshDataProvider.SetVertices(guid, mesh.vertices.Select(x =>
                                                                            new Vertex2DMetaData()
                    {
                        boneWeight = x.editableBoneWeight.ToBoneWeight(false),
                        position   = x.position
                    }
                                                                            ).ToArray());
                    meshDataProvider.SetIndices(guid, mesh.indices.ToArray());
                    meshDataProvider.SetEdges(guid, mesh.edges.Select(x => new Vector2Int(x.index1, x.index2)).ToArray());
                }
            }
        }
Пример #25
0
        public void Create(ISpriteEditorDataProvider spriteEditor, ISkinningCachePersistentState state)
        {
            Clear();

            var dataProvider    = spriteEditor.GetDataProvider <ISpriteEditorDataProvider>();
            var boneProvider    = spriteEditor.GetDataProvider <ISpriteBoneDataProvider>();
            var meshProvider    = spriteEditor.GetDataProvider <ISpriteMeshDataProvider>();
            var spriteRects     = dataProvider.GetSpriteRects();
            var textureProvider = spriteEditor.GetDataProvider <ITextureDataProvider>();

            m_State             = state;
            m_State.lastTexture = textureProvider.texture;

            for (var i = 0; i < spriteRects.Length; i++)
            {
                var spriteRect = spriteRects[i];
                var sprite     = CreateSpriteCache(spriteRect);
                CreateSkeletonCache(sprite, boneProvider);
                CreateMeshCache(sprite, meshProvider, textureProvider);
                CreateMeshPreviewCache(sprite);
            }

            CreateCharacter(spriteEditor);
        }
Пример #26
0
        static void ApplyCharacter(SkinningCache skinningCache, ISpriteEditorDataProvider dataProvider)
        {
            var characterDataProvider = dataProvider.GetDataProvider <ICharacterDataProvider>();
            var character             = skinningCache.character;

            if (characterDataProvider != null && character != null)
            {
                var data           = new CharacterData();
                var characterBones = character.skeleton.bones;
                data.bones = characterBones.ToSpriteBone(Matrix4x4.identity);

                var parts = character.parts;
                data.parts = parts.Select(x =>
                                          new CharacterPart()
                {
                    spriteId       = x.sprite.id,
                    spritePosition = new RectInt((int)x.position.x, (int)x.position.y, (int)x.sprite.textureRect.width, (int)x.sprite.textureRect.height),
                    bones          = x.bones.Select(bone => Array.IndexOf(characterBones, bone)).ToArray()
                }
                                          ).ToArray();

                characterDataProvider.SetCharacterData(data);
            }
        }
Пример #27
0
 public void InvalidatePropertiesCache()
 {
     m_RectsCache         = null;
     m_SpriteDataProvider = null;
 }
Пример #28
0
        private void CreateCharacter(ISpriteEditorDataProvider spriteEditor)
        {
            var characterProvider = spriteEditor.GetDataProvider <ICharacterDataProvider>();

            if (characterProvider != null)
            {
                var characterData  = characterProvider.GetCharacterData();
                var characterParts = new List <CharacterPartCache>();

                m_Character     = CreateCache <CharacterCache>();
                m_BonesReadOnly = spriteEditor.GetDataProvider <IMainSkeletonDataProvider>() != null;

                var skeleton = CreateCache <SkeletonCache>();

                var characterBones = characterData.bones;

                skeleton.SetBones(CreateBoneCacheFromSpriteBones(characterBones, 1.0f));
                skeleton.position = Vector3.zero;

                var bones = skeleton.bones;
                foreach (var p in characterData.parts)
                {
                    var spriteBones = p.bones != null?p.bones.ToList() : new List <int>();

                    var characterPartBones = spriteBones.ConvertAll(i => bones.ElementAtOrDefault(i)).ToArray();
                    var characterPart      = CreateCache <CharacterPartCache>();

                    var positionInt = p.spritePosition.position;
                    characterPart.position    = new Vector2(positionInt.x, positionInt.y);
                    characterPart.sprite      = GetSprite(p.spriteId);
                    characterPart.bones       = characterPartBones;
                    characterPart.parentGroup = p.parentGroup;
                    characterPart.order       = p.order;

                    var mesh = characterPart.sprite.GetMesh();
                    if (mesh != null)
                    {
                        mesh.SetCompatibleBoneSet(characterPartBones);
                    }

                    characterParts.Add(characterPart);

                    m_CharacterPartMap.Add(characterPart.sprite, characterPart);
                }
                if (characterData.characterGroups != null)
                {
                    m_Character.groups = characterData.characterGroups.Select(x =>
                    {
                        var group         = CreateCache <CharacterGroupCache>();
                        group.name        = x.name;
                        group.parentGroup = x.parentGroup;
                        group.order       = x.order;
                        return(group);
                    }).ToArray();
                }
                else
                {
                    m_Character.groups = new CharacterGroupCache[0];
                }

                m_Character.parts     = characterParts.ToArray();
                m_Character.skeleton  = skeleton;
                m_Character.dimension = characterData.dimension;
                CreateSpriteSheetSkeletons();
            }
        }
Пример #29
0
        static bool PostProcessSpriteMeshData(ISpriteEditorDataProvider spriteDataProvider, Sprite[] sprites)
        {
            var spriteMeshDataProvider = spriteDataProvider.GetDataProvider <ISpriteMeshDataProvider>();
            var boneDataProvider       = spriteDataProvider.GetDataProvider <ISpriteBoneDataProvider>();
            var textureDataProvider    = spriteDataProvider.GetDataProvider <ITextureDataProvider>();

            if (sprites == null || sprites.Length == 0 || spriteMeshDataProvider == null || textureDataProvider == null)
            {
                return(false);
            }

            bool  dataChanged     = false;
            float definitionScale = CalculateDefinitionScale(textureDataProvider);

            foreach (var sprite in sprites)
            {
                var guid       = sprite.GetSpriteID();
                var spriteRect = spriteDataProvider.GetSpriteRects().First(s => { return(s.spriteID == guid); });
                var spriteBone = boneDataProvider.GetBones(guid);

                var hasBones          = spriteBone != null && spriteBone.Count > 0;
                var hasInvalidWeights = false;

                var vertices = spriteMeshDataProvider.GetVertices(guid);
                var indices  = spriteMeshDataProvider.GetIndices(guid);

                if (vertices.Length > 2 && indices.Length > 2)
                {
                    var vertexArray     = new NativeArray <Vector3>(vertices.Length, Allocator.Temp);
                    var boneWeightArray = new NativeArray <BoneWeight>(vertices.Length, Allocator.Temp);

                    for (int i = 0; i < vertices.Length; ++i)
                    {
                        var boneWeight = vertices[i].boneWeight;

                        vertexArray[i]     = (Vector3)(vertices[i].position - Vector2.Scale(spriteRect.rect.size, spriteRect.pivot)) * definitionScale / sprite.pixelsPerUnit;
                        boneWeightArray[i] = boneWeight;

                        if (hasBones && !hasInvalidWeights)
                        {
                            var sum = boneWeight.weight0 + boneWeight.weight1 + boneWeight.weight2 + boneWeight.weight3;
                            hasInvalidWeights = sum < 0.999f;
                        }
                    }

                    var indicesArray = new NativeArray <ushort>(indices.Length, Allocator.Temp);

                    for (int i = 0; i < indices.Length; ++i)
                    {
                        indicesArray[i] = (ushort)indices[i];
                    }

                    sprite.SetVertexCount(vertices.Length);
                    sprite.SetVertexAttribute <Vector3>(VertexAttribute.Position, vertexArray);
                    sprite.SetIndices(indicesArray);
                    sprite.SetBoneWeights(boneWeightArray);
                    vertexArray.Dispose();
                    boneWeightArray.Dispose();
                    indicesArray.Dispose();

                    dataChanged = true;

                    if (hasBones && hasInvalidWeights)
                    {
                        Debug.LogWarning("Sprite \"" + spriteRect.name + "\" contains bone weights which sum zero or are not normalized. To avoid visual artifacts please consider fixing them.");
                    }
                }
                else
                {
                    var boneWeightArray   = new NativeArray <BoneWeight>(sprite.GetVertexCount(), Allocator.Temp);
                    var defaultBoneWeight = new BoneWeight()
                    {
                        weight0 = 1f
                    };

                    for (var i = 0; i < boneWeightArray.Length; ++i)
                    {
                        boneWeightArray[i] = defaultBoneWeight;
                    }

                    sprite.SetBoneWeights(boneWeightArray);
                }
            }

            return(dataChanged);
        }
Пример #30
0
 public static SpriteImportMode GetSpriteImportMode(ISpriteEditorDataProvider dataProvider)
 {
     return(dataProvider == null ? SpriteImportMode.None : dataProvider.spriteImportMode);
 }