/****************************************************************************** * Spine Runtimes License Agreement * Last updated July 28, 2023. Replaces all prior versions. * * Copyright (c) 2013-2023, Esoteric Software LLC * * Integration of the Spine Runtimes into software or otherwise creating * derivative works of the Spine Runtimes is permitted under the terms and * conditions of Section 2 of the Spine Editor License Agreement: * http://esotericsoftware.com/spine-editor-license * * Otherwise, it is permitted to integrate the Spine Runtimes into software or * otherwise create derivative works of the Spine Runtimes (collectively, * "Products"), provided that each user of the Products must obtain their own * Spine Editor license and redistribution of the Products in any form must * include this license and copyright notice. * * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE * SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace Spine.Unity.Editor { using Editor = UnityEditor.Editor; using Icons = SpineEditorUtilities.Icons; public class SpriteAtlasImportWindow : EditorWindow { const bool IsUtilityWindow = false; [MenuItem("Window/Spine/SpriteAtlas Import", false, 5000)] public static void Init (MenuCommand command) { SpriteAtlasImportWindow window = EditorWindow.GetWindow(IsUtilityWindow); window.minSize = new Vector2(284f, 256f); window.maxSize = new Vector2(500f, 256f); window.titleContent = new GUIContent("Spine SpriteAtlas Import", Icons.spine); window.Show(); } public UnityEngine.U2D.SpriteAtlas spriteAtlasAsset; public TextAsset skeletonDataFile; public SpineSpriteAtlasAsset spineSpriteAtlasAsset; SerializedObject so; void OnEnable () { if (!SpineSpriteAtlasAsset.AnySpriteAtlasNeedsRegionsLoaded()) return; EditorApplication.update -= SpineSpriteAtlasAsset.UpdateWhenEditorPlayModeStarted; EditorApplication.update += SpineSpriteAtlasAsset.UpdateWhenEditorPlayModeStarted; } void OnDisable () { EditorApplication.update -= SpineSpriteAtlasAsset.UpdateWhenEditorPlayModeStarted; } void OnGUI () { so = so ?? new SerializedObject(this); EditorGUIUtility.wideMode = true; EditorGUILayout.LabelField("Spine SpriteAtlas Import", EditorStyles.boldLabel); using (new SpineInspectorUtility.BoxScope()) { EditorGUI.BeginChangeCheck(); SerializedProperty spriteAtlasAssetProperty = so.FindProperty("spriteAtlasAsset"); EditorGUILayout.PropertyField(spriteAtlasAssetProperty, new GUIContent("SpriteAtlas", EditorGUIUtility.IconContent("SpriteAtlas Icon").image)); if (EditorGUI.EndChangeCheck()) { so.ApplyModifiedProperties(); if (spriteAtlasAsset != null) { if (AssetUtility.SpriteAtlasSettingsNeedAdjustment(spriteAtlasAsset)) { AssetUtility.AdjustSpriteAtlasSettings(spriteAtlasAsset); } GenerateAssetsFromSpriteAtlas(spriteAtlasAsset); } } SerializedProperty spineSpriteAtlasAssetProperty = so.FindProperty("spineSpriteAtlasAsset"); EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(spineSpriteAtlasAssetProperty, new GUIContent("SpineSpriteAtlasAsset", EditorGUIUtility.IconContent("ScriptableObject Icon").image)); if (spineSpriteAtlasAssetProperty.objectReferenceValue == null) { spineSpriteAtlasAssetProperty.objectReferenceValue = spineSpriteAtlasAsset = FindSpineSpriteAtlasAsset(spriteAtlasAsset); } if (EditorGUI.EndChangeCheck()) { so.ApplyModifiedProperties(); } EditorGUILayout.Space(); using (new EditorGUI.DisabledScope(spineSpriteAtlasAsset == null)) { if (SpineInspectorUtility.LargeCenteredButton(new GUIContent("Load regions by entering Play mode"))) { GenerateAssetsFromSpriteAtlas(spriteAtlasAsset); SpineSpriteAtlasAsset.UpdateByStartingEditorPlayMode(); } } using (new SpineInspectorUtility.BoxScope()) { if (spriteAtlasAsset == null) { EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Please assign SpriteAtlas file.", Icons.warning), GUILayout.Height(46)); } else if (spineSpriteAtlasAsset == null || spineSpriteAtlasAsset.RegionsNeedLoading) { EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("Please hit 'Load regions ..' to load\nregion info. Play mode is started\nand stopped automatically.", Icons.warning), GUILayout.Height(54)); } else { EditorGUILayout.LabelField(SpineInspectorUtility.TempContent("SpriteAtlas imported\nsuccessfully.", Icons.spine), GUILayout.Height(46)); } } } bool isAtlasComplete = (spineSpriteAtlasAsset != null && !spineSpriteAtlasAsset.RegionsNeedLoading); bool canImportSkeleton = (spriteAtlasAsset != null && skeletonDataFile != null); using (new SpineInspectorUtility.BoxScope()) { using (new EditorGUI.DisabledScope(!isAtlasComplete)) { SerializedProperty skeletonDataAssetProperty = so.FindProperty("skeletonDataFile"); EditorGUI.BeginChangeCheck(); EditorGUILayout.PropertyField(skeletonDataAssetProperty, SpineInspectorUtility.TempContent("Skeleton json/skel file", Icons.spine)); if (EditorGUI.EndChangeCheck()) { so.ApplyModifiedProperties(); } EditorGUILayout.Space(); } using (new EditorGUI.DisabledScope(!canImportSkeleton)) { if (SpineInspectorUtility.LargeCenteredButton(new GUIContent("Import Skeleton"))) { //AssetUtility.IngestSpriteAtlas(spriteAtlasAsset, null); string skeletonPath = AssetDatabase.GetAssetPath(skeletonDataFile); string[] skeletons = new string[] { skeletonPath }; AssetUtility.ImportSpineContent(skeletons, null); } } } } void GenerateAssetsFromSpriteAtlas (UnityEngine.U2D.SpriteAtlas spriteAtlasAsset) { AssetUtility.IngestSpriteAtlas(spriteAtlasAsset, null); string texturePath; if (AssetUtility.GeneratePngFromSpriteAtlas(spriteAtlasAsset, out texturePath)) { Debug.Log(string.Format("Generated SpriteAtlas texture '{0}'", texturePath), spriteAtlasAsset); } } SpineSpriteAtlasAsset FindSpineSpriteAtlasAsset (UnityEngine.U2D.SpriteAtlas spriteAtlasAsset) { string path = AssetDatabase.GetAssetPath(spriteAtlasAsset).Replace(".spriteatlas", AssetUtility.SpriteAtlasSuffix + ".asset"); if (System.IO.File.Exists(path)) { return AssetDatabase.LoadAssetAtPath(path); } return null; } SkeletonDataAsset FindSkeletonDataAsset (TextAsset skeletonDataFile) { string path = AssetDatabase.GetAssetPath(skeletonDataFile); path = path.Replace(".json", AssetUtility.SkeletonDataSuffix + ".asset"); path = path.Replace(".skel.bytes", AssetUtility.SkeletonDataSuffix + ".asset"); if (System.IO.File.Exists(path)) { return AssetDatabase.LoadAssetAtPath(path); } return null; } } }