diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/SkeletonSubmeshGraphicInspector.cs b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/SkeletonSubmeshGraphicInspector.cs new file mode 100644 index 000000000..a4a1cd950 --- /dev/null +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/SkeletonSubmeshGraphicInspector.cs @@ -0,0 +1,43 @@ +/****************************************************************************** + * Spine Runtimes License Agreement + * Last updated July 28, 2023. Replaces all prior versions. + * + * Copyright (c) 2013-2024, 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 UnityEditor; + +namespace Spine.Unity.Editor { + using Icons = SpineEditorUtilities.Icons; + + [CustomEditor(typeof(SkeletonSubmeshGraphic))] + [CanEditMultipleObjects] + public class SkeletonGraphicSubmeshInspector : UnityEditor.Editor { + + public override void OnInspectorGUI () { + EditorGUILayout.HelpBox("This component is manged by the parent SkeletonGraphic component.", MessageType.None); + } + } +} diff --git a/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/SkeletonSubmeshGraphicInspector.cs.meta b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/SkeletonSubmeshGraphicInspector.cs.meta new file mode 100644 index 000000000..aa9fcb622 --- /dev/null +++ b/spine-unity/Assets/Spine/Editor/spine-unity/Editor/Components/SkeletonSubmeshGraphicInspector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1bc35530b2335ef4da1dafa6214b6ccd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/spine-unity/Assets/Spine/package.json b/spine-unity/Assets/Spine/package.json index adb3b9fe1..8e064e43e 100644 --- a/spine-unity/Assets/Spine/package.json +++ b/spine-unity/Assets/Spine/package.json @@ -2,7 +2,7 @@ "name": "com.esotericsoftware.spine.spine-unity", "displayName": "spine-unity Runtime", "description": "This plugin provides the spine-unity runtime core.", - "version": "4.2.51", + "version": "4.2.52", "unity": "2018.3", "author": { "name": "Esoteric Software", diff --git a/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/Editor/GenericOnDemandTextureLoaderInspector.cs b/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/Editor/GenericOnDemandTextureLoaderInspector.cs index 50ce4aceb..49bc1fe47 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/Editor/GenericOnDemandTextureLoaderInspector.cs +++ b/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/Editor/GenericOnDemandTextureLoaderInspector.cs @@ -186,7 +186,8 @@ namespace Spine.Unity.Editor { } string originalTextureName = System.IO.Path.GetFileNameWithoutExtension(originalPath); - string texturePath = string.Format("{0}/{1}.png", dataPath, loader.GetPlaceholderTextureName(originalTextureName)); + string texturePath = string.Format("{0}/{1}.png", + dataPath, loader.GetPlaceholderTextureName(originalTextureName)); Texture placeholderTexture = AssetDatabase.LoadAssetAtPath(texturePath); if (placeholderTexture == null) { AssetDatabase.CopyAsset(originalPath, texturePath); @@ -203,18 +204,30 @@ namespace Spine.Unity.Editor { importer.SaveAndReimport(); if (resizePhysically) { + bool hasOverrides = TextureImporterUtility.DisableOverrides(importer, out List disabledPlatforms); + Texture2D texture2D = AssetDatabase.LoadAssetAtPath(texturePath); if (texture2D) { Color[] maxTextureSizePixels = texture2D.GetPixels(); - texture2D.SetPixels(maxTextureSizePixels); - var bytes = texture2D.EncodeToPNG(); + // SetPixels supports only uncompressed textures using certain formats. + Texture2D uncompressedTexture = + new Texture2D(texture2D.width, texture2D.height, TextureFormat.RGBA32, false); + uncompressedTexture.SetPixels(maxTextureSizePixels); + + byte[] bytes = uncompressedTexture.EncodeToPNG(); string targetPath = Application.dataPath + "/../" + texturePath; System.IO.File.WriteAllBytes(targetPath, bytes); - texture2D.Apply(updateMipmaps: true, makeNoLongerReadable: true); - EditorUtility.SetDirty(texture2D); + + importer.isReadable = false; + importer.SaveAndReimport(); + + EditorUtility.SetDirty(uncompressedTexture); AssetDatabase.SaveAssets(); } + + if (hasOverrides) + TextureImporterUtility.EnableOverrides(importer, disabledPlatforms); } placeholderTexture = AssetDatabase.LoadAssetAtPath(texturePath); } @@ -374,7 +387,11 @@ namespace Spine.Unity.Editor { public void DeletePlaceholderTextures (GenericOnDemandTextureLoader loader) { foreach (var materialMap in loader.placeholderMap) { - Texture texture = materialMap.textures[0].placeholderTexture; + var textures = materialMap.textures; + if (textures == null || textures.Length == 0) + continue; + + Texture texture = textures[0].placeholderTexture; if (texture) AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(texture)); } diff --git a/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/Editor/TextureImporterUtility.cs b/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/Editor/TextureImporterUtility.cs new file mode 100644 index 000000000..4edb81a2d --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/Editor/TextureImporterUtility.cs @@ -0,0 +1,93 @@ +/****************************************************************************** + * Spine Runtimes License Agreement + * Last updated July 28, 2023. Replaces all prior versions. + * + * Copyright (c) 2013-2024, 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; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; + +namespace Spine.Unity.Editor { + + /// + /// Utility class for working with TextureImporter. + /// + public static class TextureImporterUtility { + + private static IEnumerable GetAllPlatforms () { + BuildTarget[] buildTargets = (BuildTarget[])Enum.GetValues(typeof(BuildTarget)); + var platformNames = buildTargets.Select(x => x.ToString()).ToList(); + + // Add additional platforms that are not part of BuildTarget enum. + platformNames.Add("Server"); + + return platformNames.ToArray(); + } + + /// Disables Texture Import settings platform overrides for all platforms. + /// The TextureImporter wrapper of the target texture asset. + /// A list populated with platforms where overrides were previously enabled and + /// which have now been disabled. + /// True if an override has been disabled for any platform, false otherwise. + public static bool DisableOverrides (TextureImporter importer, out List disabledPlatforms) { + IEnumerable platforms = GetAllPlatforms(); + disabledPlatforms = new List(); + + foreach (string platform in platforms) { + var platformSettings = importer.GetPlatformTextureSettings(platform); + if (!platformSettings.overridden) + continue; + + disabledPlatforms.Add(platform); + platformSettings.overridden = false; + importer.SetPlatformTextureSettings(platformSettings); + } + + if (disabledPlatforms.Count <= 0) + return false; + + importer.SaveAndReimport(); + return true; + } + + /// Enables Texture Import settings platform overrides for given platforms. + /// The TextureImporter wrapper of the target texture asset. + /// A list of platforms for which overrides shall be enabled. + public static void EnableOverrides (TextureImporter importer, List platformsToEnable) { + if (platformsToEnable.Count == 0) + return; + + foreach (string platform in platformsToEnable) { + TextureImporterPlatformSettings platformSettings = importer.GetPlatformTextureSettings(platform); + platformSettings.overridden = true; + importer.SetPlatformTextureSettings(platformSettings); + } + importer.SaveAndReimport(); + } + } +} diff --git a/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/Editor/TextureImporterUtility.cs.meta b/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/Editor/TextureImporterUtility.cs.meta new file mode 100644 index 000000000..201a599c5 --- /dev/null +++ b/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/Editor/TextureImporterUtility.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d7e6bbfca422433c9e60e78930eae065 +timeCreated: 1708382726 \ No newline at end of file diff --git a/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/Runtime/GenericOnDemandTextureLoader.cs b/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/Runtime/GenericOnDemandTextureLoader.cs index 95e33ce19..c929b7dfd 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/Runtime/GenericOnDemandTextureLoader.cs +++ b/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/Runtime/GenericOnDemandTextureLoader.cs @@ -194,7 +194,12 @@ namespace Spine.Unity { loadedDataAtMaterial = new MaterialOnDemandData[placeholderMap.Length]; for (int i = 0, count = loadedDataAtMaterial.Length; i < count; ++i) { loadedDataAtMaterial[i].lastFrameRequested = -1; - int texturesAtMaterial = placeholderMap[i].textures.Length; + + PlaceholderTextureMapping[] textures = placeholderMap[i].textures; + if (textures == null) + continue; + + int texturesAtMaterial = textures.Length; loadedDataAtMaterial[i].textureRequests = new TextureRequest[texturesAtMaterial]; } } @@ -264,6 +269,9 @@ namespace Spine.Unity { System.Action onTextureLoaded) { PlaceholderTextureMapping[] placeholderTextures = placeholderMap[materialIndex].textures; + if (placeholderTextures == null || textureIndex >= placeholderTextures.Length) + return null; + TargetReference targetReference = placeholderTextures[textureIndex].targetTextureReference; loadedDataAtMaterial[materialIndex].lastFrameRequested = Time.frameCount; diff --git a/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/package.json b/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/package.json index e348393b3..7f0261ae4 100644 --- a/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/package.json +++ b/spine-unity/Modules/com.esotericsoftware.spine.on-demand-loading/package.json @@ -2,7 +2,7 @@ "name": "com.esotericsoftware.spine.on-demand-loading", "displayName": "Spine On-Demand Loading Extensions [Experimental]", "description": "This experimental plugin provides a generic basic implementation of on-demand texture loading for the spine-unity runtime. You might want to use the available com.esotericsoftware.spine.addressables package which depends on this package.\nPlease be sure to test this package first and create backups of your project before using.\n\nPrerequisites:\nIt requires a working installation of the spine-unity runtime (via the spine-unity unitypackage), version 4.2.\n(See http://esotericsoftware.com/git/spine-runtimes/spine-unity)", - "version": "4.2.0-preview.3", + "version": "4.2.0-preview.4", "unity": "2018.3", "author": { "name": "Esoteric Software",