diff --git a/Assets/Editor/SpriteAssistSettings.asset b/Assets/Editor/SpriteAssistSettings.asset index eec43a1..f475d13 100644 --- a/Assets/Editor/SpriteAssistSettings.asset +++ b/Assets/Editor/SpriteAssistSettings.asset @@ -17,10 +17,12 @@ MonoBehaviour: prefabRelativePath: defaultTransparentShaderName: Unlit/Transparent defaultOpaqueShaderName: Unlit/Texture - defaultThickness: 0 defaultTag: Untagged defaultLayer: 0 defaultSortingLayerId: 0 defaultSortingOrder: 0 maxThumbnailPreviewCount: 10 enableRenameMeshPrefabAutomatically: 0 + inclusionMode: 0 + inclusionGlobs: + - Example/Excluded/* diff --git a/Assets/Example/Excluded.meta b/Assets/Example/Excluded.meta new file mode 100644 index 0000000..2ce94e4 --- /dev/null +++ b/Assets/Example/Excluded.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dbfee7c4e8d5b40328e8fd7a55ae9818 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Example/Excluded/service-pnp-cph-3b20000-3b24000-3b24100-3b24113r.jpg b/Assets/Example/Excluded/service-pnp-cph-3b20000-3b24000-3b24100-3b24113r.jpg new file mode 100644 index 0000000..16a8608 Binary files /dev/null and b/Assets/Example/Excluded/service-pnp-cph-3b20000-3b24000-3b24100-3b24113r.jpg differ diff --git a/Assets/Example/Excluded/service-pnp-cph-3b20000-3b24000-3b24100-3b24113r.jpg.meta b/Assets/Example/Excluded/service-pnp-cph-3b20000-3b24000-3b24100-3b24113r.jpg.meta new file mode 100644 index 0000000..773f83d --- /dev/null +++ b/Assets/Example/Excluded/service-pnp-cph-3b20000-3b24000-3b24100-3b24113r.jpg.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 6da5356c9489f4653a7fca6e2a6cb982 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SpriteAssist/Editor/Import/SpritePostProcessor.cs b/Assets/SpriteAssist/Editor/Import/SpritePostProcessor.cs index 9b89560..3e7159f 100644 --- a/Assets/SpriteAssist/Editor/Import/SpritePostProcessor.cs +++ b/Assets/SpriteAssist/Editor/Import/SpritePostProcessor.cs @@ -5,8 +5,11 @@ namespace SpriteAssist { public class SpritePostProcessor : AssetPostprocessor { - private void OnPostprocessSprites(Texture2D _, Sprite[] sprites) + private void OnPostprocessSprites(Texture2D tex, Sprite[] sprites) { + string path = AssetDatabase.GetAssetPath(tex); + if(!SpriteAssistSettings.instance.ShouldProcessSprite(path)) return; + SpriteInspector.isSpriteReloaded = true; TextureImporter textureImporter = assetImporter as TextureImporter; diff --git a/Assets/SpriteAssist/Editor/Inspector/SpriteInspector.cs b/Assets/SpriteAssist/Editor/Inspector/SpriteInspector.cs index db9ff4d..7673318 100644 --- a/Assets/SpriteAssist/Editor/Inspector/SpriteInspector.cs +++ b/Assets/SpriteAssist/Editor/Inspector/SpriteInspector.cs @@ -21,21 +21,32 @@ public class SpriteInspector : UnityInternalEditor protected override void OnEnable() { base.OnEnable(); - - SetSpriteProcessor(target, AssetDatabase.GetAssetPath(target)); - AssemblyReloadEvents.afterAssemblyReload += OnAfterAssemblyReload; + if(SpriteAssistSettings.instance.ShouldProcessSprite(target as Sprite)) + { + SetSpriteProcessor(target, AssetDatabase.GetAssetPath(target)); + AssemblyReloadEvents.afterAssemblyReload += OnAfterAssemblyReload; + } } protected override void OnDisable() { base.OnDisable(); - SpriteProcessor?.Dispose(); - AssemblyReloadEvents.afterAssemblyReload -= OnAfterAssemblyReload; + if(SpriteProcessor != null) + { + SpriteProcessor?.Dispose(); + AssemblyReloadEvents.afterAssemblyReload -= OnAfterAssemblyReload; + } } public override void OnInspectorGUI() { + if(SpriteProcessor == null) + { + base.OnInspectorGUI(); + return; + } + using (new EditorGUI.DisabledGroupScope(Application.isPlaying)) { using (var scroll = new EditorGUILayout.ScrollViewScope(_scrollPosition)) @@ -58,7 +69,7 @@ public override void OnPreviewGUI(Rect rect, GUIStyle background) base.OnPreviewGUI(rect, background); Sprite sprite = target as Sprite; - if (sprite == null) + if (SpriteProcessor == null || sprite == null) { return; } diff --git a/Assets/SpriteAssist/Editor/Settings/SpriteAssistInclusionMode.cs b/Assets/SpriteAssist/Editor/Settings/SpriteAssistInclusionMode.cs new file mode 100644 index 0000000..66c7959 --- /dev/null +++ b/Assets/SpriteAssist/Editor/Settings/SpriteAssistInclusionMode.cs @@ -0,0 +1,22 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace SpriteAssist +{ + /// + /// The include/exclude mode for SpriteAssist. + /// + public enum SpriteAssistInclusionMode + { + /// + /// All sprites except those listed in settings will be processed + /// + Exclude, + + /// + /// Only sprites explicitly matched by those in settings will be processed + /// + Include + } +} diff --git a/Assets/SpriteAssist/Editor/Settings/SpriteAssistInclusionMode.cs.meta b/Assets/SpriteAssist/Editor/Settings/SpriteAssistInclusionMode.cs.meta new file mode 100644 index 0000000..fb81209 --- /dev/null +++ b/Assets/SpriteAssist/Editor/Settings/SpriteAssistInclusionMode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e8c2ad6234ddd4ef896ab67bfca15dcb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SpriteAssist/Editor/Settings/SpriteAssistSettings.cs b/Assets/SpriteAssist/Editor/Settings/SpriteAssistSettings.cs index 558cd1c..1fc0aa4 100644 --- a/Assets/SpriteAssist/Editor/Settings/SpriteAssistSettings.cs +++ b/Assets/SpriteAssist/Editor/Settings/SpriteAssistSettings.cs @@ -1,8 +1,11 @@ -using UnityEditor; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using UnityEditor; +using UnityEngine; namespace SpriteAssist { - [FilePath(SETTINGS_PATH, FilePathAttribute.Location.PreferencesFolder)] + [FilePath(SETTINGS_PATH, FilePathAttribute.Location.ProjectFolder)] public class SpriteAssistSettings : ScriptableSingleton { private const string SETTINGS_PATH = "Assets/Editor/SpriteAssistSettings.asset"; @@ -27,5 +30,77 @@ public class SpriteAssistSettings : ScriptableSingleton public int maxThumbnailPreviewCount = THUMBNAIL_COUNT; public bool enableRenameMeshPrefabAutomatically; + + [Tooltip("Controls if sprites are automatically or explicitly marked for processing")] + public SpriteAssistInclusionMode inclusionMode; + + [Tooltip("Pattern matching globs to describe included/excluded files. All relative to Assets/.")] + public string[] inclusionGlobs = {}; + + protected Dictionary compiledRegexes = new Dictionary(); + + public bool ShouldProcessSprite(Sprite s) + { + if(s == null) + { + return false; + } + string path = AssetDatabase.GetAssetPath(s); + return ShouldProcessSprite(path); + } + + public bool ShouldProcessSprite(string path) + { + if(string.IsNullOrEmpty(path) || !path.StartsWith("Assets")) + { + return false; + } + + foreach(string glob in inclusionGlobs) + { + Regex r = GetRegex(glob); + if(r.IsMatch(path)) + { + // Debug.Log($"[SpriteAssistSettings] {path} matches {glob}!"); + // return true if explicit inclusion is selected, otherwise false for explicit exclusion + return inclusionMode == SpriteAssistInclusionMode.Include; + } + else + { + // Debug.Log($"[SpriteAssistSettings] {path} does not match {glob}"); + } + } + // fallthru: return true if "include by default", otherwise false + // Debug.Log($"[SpriteAssistSettings] No match for {path} found"); + return inclusionMode == SpriteAssistInclusionMode.Exclude; + } + + protected void OnValidate() + { + // we don't have granular information to decide if the globs have updated + // so just blow these away + compiledRegexes.Clear(); + } + + private Regex GetRegex(string glob) + { + Regex result = null; + if(!compiledRegexes.TryGetValue(glob, out result)) + { + result = CompileGlob(glob); + compiledRegexes.Add(glob, result); + } + return result; + } + + private Regex CompileGlob(string glob) + { + glob = "Assets/" + glob; + // Debug.Log($"[SpriteAssistSettings] compiling `${glob}`"); + return new Regex( + "^" + Regex.Escape(glob).Replace(@"\*", ".*").Replace(@"\?", ".") + "$", + RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Compiled + ); + } } -} \ No newline at end of file +}