public static Material EditorCreateOrLoadMaskMaterialAsset(SkeletonRenderer.SpriteMaskInteractionMaterials maskMaterials,
                                                                   UnityEngine.Rendering.CompareFunction maskFunction, Material originalMaterial)
        {
            string originalMaterialPath = UnityEditor.AssetDatabase.GetAssetPath(originalMaterial);
            int    posOfExtensionDot    = originalMaterialPath.LastIndexOf('.');
            string materialPath         = (maskFunction == SkeletonRenderer.STENCIL_COMP_MASKINTERACTION_VISIBLE_INSIDE) ?
                                          originalMaterialPath.Insert(posOfExtensionDot, MATERIAL_FILENAME_SUFFIX_INSIDE_MASK) :
                                          originalMaterialPath.Insert(posOfExtensionDot, MATERIAL_FILENAME_SUFFIX_OUTSIDE_MASK);

            Material material = UnityEditor.AssetDatabase.LoadAssetAtPath <Material>(materialPath);

            if (material != null)
            {
                return(material);
            }

            material = new Material(originalMaterial);
            material.SetFloat(SkeletonRenderer.STENCIL_COMP_PARAM_ID, (int)maskFunction);

            UnityEditor.AssetDatabase.CreateAsset(material, materialPath);
            Debug.Log(string.Concat("Created material '", materialPath, "' for mask interaction based on '", originalMaterialPath, "'."));
            UnityEditor.EditorUtility.SetDirty(material);
            UnityEditor.AssetDatabase.SaveAssets();
            return(material);
        }
 public static void EditorInitMaskMaterials(SkeletonRenderer skeleton, SkeletonRenderer.SpriteMaskInteractionMaterials maskMaterials, SpriteMaskInteraction maskType)
 {
     if (maskType == SpriteMaskInteraction.None)
     {
         EditorConfirmDisabledMaskMaterialsInit(skeleton);
     }
     else if (maskType == SpriteMaskInteraction.VisibleInsideMask)
     {
         EditorInitSpriteMaskMaterialsInsideMask(skeleton);
     }
     else if (maskType == SpriteMaskInteraction.VisibleOutsideMask)
     {
         EditorInitSpriteMaskMaterialsOutsideMask(skeleton);
     }
 }
        public static void EditorDeleteMaskMaterials(SkeletonRenderer.SpriteMaskInteractionMaterials maskMaterials, SpriteMaskInteraction maskType)
        {
            Material[] targetMaterials;
            if (maskType == SpriteMaskInteraction.VisibleInsideMask)
            {
                targetMaterials = maskMaterials.materialsInsideMask;
            }
            else if (maskType == SpriteMaskInteraction.VisibleOutsideMask)
            {
                targetMaterials = maskMaterials.materialsOutsideMask;
            }
            else
            {
                Debug.LogWarning("EditorDeleteMaskMaterials: Normal materials are kept as a reference and shall never be deleted.");
                return;
            }

            for (int i = 0; i < targetMaterials.Length; ++i)
            {
                var material = targetMaterials[i];
                if (material != null)
                {
                    string materialPath = UnityEditor.AssetDatabase.GetAssetPath(material);
                    UnityEditor.AssetDatabase.DeleteAsset(materialPath);
                    Debug.Log(string.Concat("Deleted material '", materialPath, "'"));
                }
            }

            if (maskType == SpriteMaskInteraction.VisibleInsideMask)
            {
                maskMaterials.materialsInsideMask = new Material[0];
            }
            else if (maskType == SpriteMaskInteraction.VisibleOutsideMask)
            {
                maskMaterials.materialsOutsideMask = new Material[0];
            }
        }