From 458224e9c0bdd441126c64f6b5286eef7acdc56e Mon Sep 17 00:00:00 2001
From: mob-sakai <sakai861104@gmail.com>
Date: Thu, 17 Aug 2023 09:21:12 +0900
Subject: [PATCH] fix: built-in shaders are no longer supported

close #233, close #257

Use UI shaders instead.
If built-in non-UI shaders are used, an error is displayed in the inspector.
---
 Scripts/Editor/UIParticleEditor.cs | 25 ++++++++-
 Scripts/Editor/UIParticleMenu.cs   |  6 +--
 Shaders/UIAdditive.mat             | 85 ++++++++++++++++++++++++++++++
 Shaders/UIAdditive.mat.meta        |  8 +++
 4 files changed, 119 insertions(+), 5 deletions(-)
 create mode 100644 Shaders/UIAdditive.mat
 create mode 100644 Shaders/UIAdditive.mat.meta

diff --git a/Scripts/Editor/UIParticleEditor.cs b/Scripts/Editor/UIParticleEditor.cs
index 14240f3..2a7e6c6 100644
--- a/Scripts/Editor/UIParticleEditor.cs
+++ b/Scripts/Editor/UIParticleEditor.cs
@@ -11,6 +11,7 @@ using UnityEditor.Experimental.SceneManagement;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Text.RegularExpressions;
 using UnityEditor;
 using UnityEditor.UI;
 using UnityEditorInternal;
@@ -299,8 +300,21 @@ namespace Coffee.UIExtensions
                 }
             }
 
-            // Does the shader support UI masks?
+            // Non-UI built-in shader is not supported.
+            foreach (var mat in current.materials)
+            {
+                if (!mat || !mat.shader) continue;
+                var shader = mat.shader;
+                if (IsBuiltInObject(shader) && !shader.name.StartsWith("UI/"))
+                {
+                    EditorGUILayout.HelpBox(
+                        $"Built-in shader '{shader.name}' in '{mat.name}' is not supported.\n" +
+                        "Use UI shaders instead.",
+                        MessageType.Error);
+                }
+            }
 
+            // Does the shader support UI masks?
             if (current.maskable && current.GetComponentInParent<Mask>())
             {
                 foreach (var mat in current.materials)
@@ -314,7 +328,8 @@ namespace Coffee.UIExtensions
                         if (mat.HasProperty(propName)) continue;
 
                         EditorGUILayout.HelpBox(
-                            $"Shader '{shader.name}' doesn't have '{propName}' property. This graphic cannot be masked.",
+                            $"Shader '{shader.name}' doesn't have '{propName}' property." +
+                            "\nThis graphic cannot be masked.",
                             MessageType.Warning);
                         break;
                     }
@@ -369,6 +384,12 @@ namespace Coffee.UIExtensions
             }
         }
 
+        private bool IsBuiltInObject(Object obj)
+        {
+            return AssetDatabase.TryGetGUIDAndLocalFileIdentifier(obj, out var guid, out long _)
+                   && Regex.IsMatch(guid, "^0{16}.0{15}$", RegexOptions.Compiled);
+        }
+
         private static int GetUsedComponentCount(ParticleSystemVertexStream s)
         {
             switch (s)
diff --git a/Scripts/Editor/UIParticleMenu.cs b/Scripts/Editor/UIParticleMenu.cs
index 4f01970..256a4f9 100644
--- a/Scripts/Editor/UIParticleMenu.cs
+++ b/Scripts/Editor/UIParticleMenu.cs
@@ -34,10 +34,10 @@ namespace Coffee.UIExtensions
             ps.transform.SetParent(uiParticle.transform, false);
             ps.transform.localPosition = Vector3.zero;
 
-            // Assign default material.
+            // Assign default material (UIAdditive).
             var renderer = ps.GetComponent<ParticleSystemRenderer>();
-            var defaultMat = AssetDatabase.GetBuiltinExtraResource<Material>("Default-Particle.mat");
-            renderer.material = defaultMat ? defaultMat : renderer.material;
+            var path = AssetDatabase.GUIDToAssetPath("9944483a3e009401ba5dcc42f14d5c63");
+            renderer.material = AssetDatabase.LoadAssetAtPath<Material>(path);
 
             // Refresh particles.
             uiParticle.RefreshParticles();
diff --git a/Shaders/UIAdditive.mat b/Shaders/UIAdditive.mat
new file mode 100644
index 0000000..9eb4c66
--- /dev/null
+++ b/Shaders/UIAdditive.mat
@@ -0,0 +1,85 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!21 &2100000
+Material:
+  serializedVersion: 6
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: UIAdditive
+  m_Shader: {fileID: 4800000, guid: ecfa8f5732b504ef98fba10aa18d0326, type: 3}
+  m_ShaderKeywords: 
+  m_LightmapFlags: 4
+  m_EnableInstancingVariants: 0
+  m_DoubleSidedGI: 0
+  m_CustomRenderQueue: -1
+  stringTagMap: {}
+  disabledShaderPasses: []
+  m_SavedProperties:
+    serializedVersion: 3
+    m_TexEnvs:
+    - _BumpMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailAlbedoMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailMask:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _DetailNormalMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _EmissionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MainTex:
+        m_Texture: {fileID: 10300, guid: 0000000000000000f000000000000000, type: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _MetallicGlossMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _OcclusionMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    - _ParallaxMap:
+        m_Texture: {fileID: 0}
+        m_Scale: {x: 1, y: 1}
+        m_Offset: {x: 0, y: 0}
+    m_Floats:
+    - _BumpScale: 1
+    - _ColorMask: 15
+    - _Cutoff: 0.5
+    - _DetailNormalMapScale: 1
+    - _DstBlend: 0
+    - _GlossMapScale: 1
+    - _Glossiness: 0.5
+    - _GlossyReflections: 1
+    - _Metallic: 0
+    - _Mode: 0
+    - _OcclusionStrength: 1
+    - _Parallax: 0.02
+    - _SmoothnessTextureChannel: 0
+    - _SpecularHighlights: 1
+    - _SrcBlend: 1
+    - _Stencil: 0
+    - _StencilComp: 8
+    - _StencilOp: 0
+    - _StencilReadMask: 255
+    - _StencilWriteMask: 255
+    - _UVSec: 0
+    - _UseUIAlphaClip: 0
+    - _ZWrite: 1
+    m_Colors:
+    - _Color: {r: 1, g: 1, b: 1, a: 1}
+    - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
+  m_BuildTextureStacks: []
diff --git a/Shaders/UIAdditive.mat.meta b/Shaders/UIAdditive.mat.meta
new file mode 100644
index 0000000..76c7bed
--- /dev/null
+++ b/Shaders/UIAdditive.mat.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9944483a3e009401ba5dcc42f14d5c63
+NativeFormatImporter:
+  externalObjects: {}
+  mainObjectFileID: 2100000
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: