[Add] All in one shader

This commit is contained in:
2026-02-23 22:01:07 +07:00
parent ec0aa86ac2
commit 4f942cd7c0
806 changed files with 401510 additions and 33 deletions
@@ -0,0 +1,630 @@
using System.IO;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
namespace AllIn13DShader
{
public class GlobalConfiguration : ScriptableObject
{
private static GlobalConfiguration _instance;
public static GlobalConfiguration instance
{
get
{
return _instance;
}
}
public enum ProjectType
{
[InspectorName("Standard PBR")]STANDARD_PBR = 2,
[InspectorName("Standard Basic")]STANDARD_BASIC = 1,
[InspectorName("AllIn13DShader Look")] ALLIN13DSHADERLOOK = 4,
[InspectorName("Toon")] TOON = 0,
[InspectorName("Custom")] CUSTOM = 3,
}
//Project type and default materials
public ProjectType projectType;
public Material standardBasicMaterial;
public Material standardPBRMaterial;
public Material toonMaterial;
public Material allIn13dDShaderLookMaterial;
public Material defaultPreset;
//
public const string MAIN_ASSEMBLY_NAME = "AllIn13DShaderAssembly";
//
public const string ALLIN13SHADER_CONFIG_DEFAULT_FOLDER_NAME = "AllIn3DShaderConfig";
//public const string ALLIN13SHADER_CONFIG_DEFAULT_FOLDER = "Assets/AllIn3DShaderConfig";
public const string GLOBAL_CONFIGURATION_ASSET_NAME = "GlobalConfiguration.asset";
//Default Relative Paths
public const string MATERIAL_SAVE_FOLDER_NAME = "Materials";
public const string RENDER_IMAGE_SAVE_FOLDER_NAME = "Images";
public const string NORMAL_MAP_SAVE_FOLDER_NAME = "Normal Maps";
public const string GRADIENT_SAVE_FOLDER_NAME = "Gradients";
public const string ATLASES_SAVE_FOLDER_NAME = "Atlases";
public const string NOISES_SAVE_FOLDER_NAME = "Noises";
public const string BAKED_SHADER_FOLDER_NAME = "Baked Shaders";
//Default Root Plugin Path
public const string GLOBAL_CONFIG_FOLDER_DEFAULT_PATH = "AllIn3DShaderConfig";
public const string EXPORT_FOLDER_NAME_DEFAULT = "Export";
//Paths
[SerializeField] private string rootPluginPath;
[SerializeField] private string globalConfigFolderPath;
[SerializeField] private string exportFolderPath;
[SerializeField] private string materialSavePath;
[SerializeField] private string renderImageSavePath;
[SerializeField] private string normalMapSavePath;
[SerializeField] private string gradientSavePath;
[SerializeField] private string atlasesSavePath;
[SerializeField] private string noiseSavePath;
[SerializeField] private string bakedShaderSavePath;
//Render Image Scale
[SerializeField] private float renderImageScale;
//Project configured first time
[SerializeField] private bool projectConfiguredFirstTime;
//URP Configured first time
[SerializeField] private bool urpConfiguredFirstTime;
[SerializeField] private string lastPipelineConfiguredGUID;
//Properties Config Collection
//public PropertiesConfigCollection propertiesConfigCollection;
//Shaders
public Shader shStandard;
public Shader shStandardNoShadowCaster;
public Shader shOutline;
public Shader shOutlineNoShadowCaster;
//Effects Profile
public EffectsProfileCollection effectsProfileCollection;
//Shader Pass Collection
public ShaderPassCollection shaderPassCollection;
//URP Settings User Preferences
public URPSettingsUserPref urpSettingsUserPref;
public string RootPluginPath
{
get
{
return rootPluginPath;
}
set
{
rootPluginPath = value;
EditorUtility.SetDirty(this);
}
}
public string GlobalConfigFolderPath
{
get
{
return globalConfigFolderPath;
}
set
{
globalConfigFolderPath = value;
EditorUtility.SetDirty(this);
}
}
public string ExportFolderPath
{
get
{
return exportFolderPath;
}
set
{
exportFolderPath = value;
EditorUtility.SetDirty(this);
}
}
public string MaterialSavePath
{
get
{
return materialSavePath;
}
set
{
materialSavePath = value;
EditorUtility.SetDirty(this);
}
}
public string RenderImageSavePath
{
get
{
return renderImageSavePath;
}
set
{
renderImageSavePath = value;
EditorUtility.SetDirty(this);
}
}
public string NormalMapSavePath
{
get
{
return normalMapSavePath;
}
set
{
normalMapSavePath = value;
EditorUtility.SetDirty(this);
}
}
public string GradientSavePath
{
get
{
return gradientSavePath;
}
set
{
gradientSavePath = value;
EditorUtility.SetDirty(this);
}
}
public string AtlasesSavePath
{
get
{
return atlasesSavePath;
}
set
{
atlasesSavePath = value;
EditorUtility.SetDirty(this);
}
}
public string NoiseSavePath
{
get
{
return noiseSavePath;
}
set
{
noiseSavePath = value;
EditorUtility.SetDirty(this);
}
}
public string BakedShaderSavePath
{
get
{
return bakedShaderSavePath;
}
set
{
bakedShaderSavePath = value;
EditorUtility.SetDirty(this);
}
}
public string GradientsSavePath
{
get
{
return gradientSavePath;
}
set
{
gradientSavePath = value;
EditorUtility.SetDirty(this);
}
}
public float RenderImageScale
{
get
{
return renderImageScale;
}
set
{
renderImageScale = value;
EditorUtility.SetDirty(this);
}
}
public bool ProjectConfiguredFirstTime
{
get
{
return projectConfiguredFirstTime;
}
set
{
projectConfiguredFirstTime = value;
EditorUtility.SetDirty(this);
}
}
public bool URPConfiguredFirstTime
{
get
{
return urpConfiguredFirstTime;
}
set
{
urpConfiguredFirstTime = value;
EditorUtility.SetDirty(this);
}
}
public void Init(string defaultGlobalConfigFolderPath)
{
if (!ProjectConfiguredFirstTime)
{
SetDefaultValues();
ProjectConfiguredFirstTime = true;
}
globalConfigFolderPath = InitPath(globalConfigFolderPath, defaultGlobalConfigFolderPath, GLOBAL_CONFIG_FOLDER_DEFAULT_PATH);
exportFolderPath = InitPath(exportFolderPath, globalConfigFolderPath, EXPORT_FOLDER_NAME_DEFAULT);
materialSavePath = InitPath(materialSavePath, exportFolderPath, MATERIAL_SAVE_FOLDER_NAME);
renderImageSavePath = InitPath(renderImageSavePath, exportFolderPath, RENDER_IMAGE_SAVE_FOLDER_NAME);
normalMapSavePath = InitPath(normalMapSavePath, exportFolderPath, NORMAL_MAP_SAVE_FOLDER_NAME);
gradientSavePath = InitPath(gradientSavePath, exportFolderPath, GRADIENT_SAVE_FOLDER_NAME);
atlasesSavePath = InitPath(atlasesSavePath, exportFolderPath, ATLASES_SAVE_FOLDER_NAME);
noiseSavePath = InitPath(noiseSavePath, exportFolderPath, NOISES_SAVE_FOLDER_NAME);
bakedShaderSavePath = InitPath(bakedShaderSavePath, exportFolderPath, BAKED_SHADER_FOLDER_NAME);
bool foldersCreated = false;
CreateDefaultExportFoldersIfNotExist(ref foldersCreated);
if (foldersCreated)
{
AssetDatabase.Refresh();
}
}
public void InitDefault()
{
}
public string InitPath(string path, string parentFolder, string defaultValue, bool isRoot = false)
{
string res = path;
if (!AssetDatabase.IsValidFolder(res))
{
string defaultPath = defaultValue;
if (!isRoot)
{
defaultPath = Path.Combine(parentFolder, defaultValue);
}
res = defaultPath;
EditorUtility.SetDirty(this);
}
return res;
}
public void CreateDefaultExportFoldersIfNotExist(ref bool foldersCreated)
{
CreateFolderIfNotExist(globalConfigFolderPath, ref foldersCreated);
CreateFolderIfNotExist(exportFolderPath, ref foldersCreated);
CreateFolderIfNotExist(materialSavePath, ref foldersCreated);
CreateFolderIfNotExist(renderImageSavePath, ref foldersCreated);
CreateFolderIfNotExist(normalMapSavePath, ref foldersCreated);
CreateFolderIfNotExist(gradientSavePath, ref foldersCreated);
CreateFolderIfNotExist(atlasesSavePath, ref foldersCreated);
CreateFolderIfNotExist(noiseSavePath, ref foldersCreated);
CreateFolderIfNotExist(bakedShaderSavePath, ref foldersCreated);
}
private void CreateFolderIfNotExist(string absoluteFolderPath, ref bool foldersCreated)
{
if (!AssetDatabase.IsValidFolder(absoluteFolderPath))
{
AssetDatabase.CreateFolder(Path.GetDirectoryName(absoluteFolderPath), Path.GetFileName(absoluteFolderPath));
foldersCreated = foldersCreated || true;
}
}
public void RefreshDefaultMaterial()
{
switch (projectType)
{
case ProjectType.STANDARD_BASIC:
this.defaultPreset = standardBasicMaterial;
break;
case ProjectType.STANDARD_PBR:
this.defaultPreset = standardPBRMaterial;
break;
case ProjectType.TOON:
this.defaultPreset = toonMaterial;
break;
case ProjectType.ALLIN13DSHADERLOOK:
this.defaultPreset = allIn13dDShaderLookMaterial;
break;
}
}
public void RootFolderChanged(string oldPluginRootPath)
{
string oldGlobalConfigFolder = Path.Combine(oldPluginRootPath, GLOBAL_CONFIG_FOLDER_DEFAULT_PATH);
string oldExportFolder = GetExportFolderByParentFolder(oldGlobalConfigFolder);
GlobalConfigFolderPath = UpdateRootFolders(oldPluginRootPath, GlobalConfigFolderPath, RootPluginPath, GLOBAL_CONFIG_FOLDER_DEFAULT_PATH);
ExportFolderPath = UpdateRootFolders(oldGlobalConfigFolder, ExportFolderPath, GlobalConfigFolderPath, EXPORT_FOLDER_NAME_DEFAULT);
MaterialSavePath = UpdateRootFolders(oldExportFolder, MaterialSavePath, ExportFolderPath, MATERIAL_SAVE_FOLDER_NAME);
RenderImageSavePath = UpdateRootFolders(oldExportFolder, RenderImageSavePath, ExportFolderPath, RENDER_IMAGE_SAVE_FOLDER_NAME);
NormalMapSavePath = UpdateRootFolders(oldExportFolder, NormalMapSavePath, ExportFolderPath, NORMAL_MAP_SAVE_FOLDER_NAME);
GradientSavePath = UpdateRootFolders(oldExportFolder, GradientSavePath, ExportFolderPath, GRADIENT_SAVE_FOLDER_NAME);
AtlasesSavePath = UpdateRootFolders(oldExportFolder, AtlasesSavePath, ExportFolderPath, ATLASES_SAVE_FOLDER_NAME);
NoiseSavePath = UpdateRootFolders(oldExportFolder, NoiseSavePath, ExportFolderPath, NOISES_SAVE_FOLDER_NAME);
BakedShaderSavePath = UpdateRootFolders(oldExportFolder, BakedShaderSavePath, ExportFolderPath, BAKED_SHADER_FOLDER_NAME);
}
private string UpdateRootFolders(string oldRootFolder, string pathToCheck, string parentFolder, string relativePath)
{
string res = pathToCheck;
string pathToCheckFull = Path.GetFullPath(pathToCheck);
string pathWithOldRootFull = Path.GetFullPath(Path.Combine(oldRootFolder, relativePath));
if (pathToCheckFull == pathWithOldRootFull)
{
res = Path.Combine(parentFolder, relativePath);
}
return res;
}
public static string GetRootPluginFolderPath()
{
Object mainAssemblyAsset = EditorUtils.FindAsset<AssemblyDefinitionAsset>(MAIN_ASSEMBLY_NAME);
string assemblyPath = AssetDatabase.GetAssetPath(mainAssemblyAsset);
string res = Path.GetDirectoryName(assemblyPath);
return res;
}
public static bool CheckRootFolder(out string oldRootFolder)
{
bool res = false;
string newRootPluginFolderPath = GetRootPluginFolderPath();
oldRootFolder = instance.RootPluginPath;
if (newRootPluginFolderPath != instance.RootPluginPath && newRootPluginFolderPath != null)
{
string oldRootPath = instance.RootPluginPath;
instance.RootPluginPath = newRootPluginFolderPath;
res = true;
}
res = res && !string.IsNullOrEmpty(oldRootFolder);
return res;
}
public static void CheckGlobalConfigFolder()
{
string newGlobalConfigFolderPath = _instance.globalConfigFolderPath;
if (newGlobalConfigFolderPath != instance.GlobalConfigFolderPath)
{
string oldGlobalConfigFolderPath = instance.GlobalConfigFolderPath;
instance.GlobalConfigFolderPath = newGlobalConfigFolderPath;
instance.RootFolderChanged(oldGlobalConfigFolderPath);
}
}
public static void CheckMaterialReferences()
{
string allIn13DShaderLookMaterialPath = Path.Combine(_instance.RootPluginPath, "Editor/MaterialPresets/MAT_Preset_AllIn13DShaderLook.mat");
string basicMaterialPath = Path.Combine(_instance.RootPluginPath, "Editor/MaterialPresets/MAT_Preset_Basic.mat");
string standardPBRMaterialPath = Path.Combine(_instance.RootPluginPath, "Editor/MaterialPresets/MAT_Preset_StandardPBR.mat");
string toonMaterialPath = Path.Combine(_instance.RootPluginPath, "Editor/MaterialPresets/MAT_Preset_Toon.mat");
if(_instance.allIn13dDShaderLookMaterial == null)
{
_instance.allIn13dDShaderLookMaterial = AssetDatabase.LoadAssetAtPath<Material>(allIn13DShaderLookMaterialPath);
}
if(_instance.standardBasicMaterial == null)
{
_instance.standardBasicMaterial = AssetDatabase.LoadAssetAtPath<Material>(basicMaterialPath);
}
if(_instance.standardPBRMaterial == null)
{
_instance.standardPBRMaterial = AssetDatabase.LoadAssetAtPath<Material>(standardPBRMaterialPath);
}
if(_instance.toonMaterial == null)
{
_instance.toonMaterial = AssetDatabase.LoadAssetAtPath<Material>(toonMaterialPath);
}
if(_instance.defaultPreset == null)
{
_instance.RefreshDefaultMaterial();
}
}
public void SetDefaultValues()
{
projectType = ProjectType.STANDARD_PBR;
defaultPreset = standardPBRMaterial;
EditorUtility.SetDirty(this);
}
public void Save()
{
EditorUtility.SetDirty(this);
AssetDatabase.SaveAssetIfDirty(this);
}
public static string GetDefaultConfigFolderPath()
{
string res = string.Empty;
#if ALLIN13DSHADER_DEVELOP
res = Path.Combine("Assets", ALLIN13SHADER_CONFIG_DEFAULT_FOLDER_NAME);
#else
res = Path.Combine(_instance.RootPluginPath, ALLIN13SHADER_CONFIG_DEFAULT_FOLDER_NAME);
#endif
return res;
}
public static string GetParentConfigFolderPath()
{
string res = string.Empty;
#if ALLIN13DSHADER_DEVELOP
res = "Assets";
#else
res = instance.RootPluginPath;
#endif
return res;
}
public static string GetExportFolderByParentFolder(string rootFolder)
{
string res = string.Empty;
#if ALLIN13DSHADER_DEVELOP
res = Path.Combine("Assets", EXPORT_FOLDER_NAME_DEFAULT);
#else
res = Path.Combine(rootFolder, EXPORT_FOLDER_NAME_DEFAULT);
#endif
return res;
}
public static GlobalConfiguration SaveInstanceAsAsset()
{
string defaultConfigFolderPath = GetDefaultConfigFolderPath();
string parentFolder = GetParentConfigFolderPath();
string defaultGlobalConfigurationPath = Path.Combine(defaultConfigFolderPath, GLOBAL_CONFIGURATION_ASSET_NAME);
if (!AssetDatabase.IsValidFolder(defaultConfigFolderPath))
{
AssetDatabase.CreateFolder(Path.GetDirectoryName(defaultConfigFolderPath), Path.GetFileName(defaultConfigFolderPath));
}
_instance.Init(parentFolder);
AssetDatabase.CreateAsset(_instance, defaultGlobalConfigurationPath);
return _instance;
}
public static GlobalConfiguration CreateInstanceIfNeeded(out bool globalConfigInstanceCreated)
{
GlobalConfiguration res = EditorUtils.FindAsset<GlobalConfiguration>("GlobalConfiguration");
globalConfigInstanceCreated = false;
if (res == null)
{
res = ScriptableObject.CreateInstance<GlobalConfiguration>();
globalConfigInstanceCreated = true;
}
return res;
}
public static void InitIfNeeded()
{
bool globalConfigInstanceCreated = false;
bool needToCreateInstance = _instance == null || !AssetDatabase.IsMainAsset(_instance);
if (needToCreateInstance)
{
_instance = CreateInstanceIfNeeded(out globalConfigInstanceCreated);
}
string oldRootPath = string.Empty;
bool rootFolderChanged = CheckRootFolder(out oldRootPath);
if (globalConfigInstanceCreated)
{
SaveInstanceAsAsset();
}
else
{
string parentFolder = GetParentConfigFolderPath();
_instance.Init(parentFolder);
}
if (rootFolderChanged)
{
instance.RootFolderChanged(oldRootPath);
}
CheckMaterialReferences();
SessionState.SetString(ConstantsRuntime.SESSION_KEY_ROOT_PLUGIN_PATH, _instance.rootPluginPath);
}
public static void SetupShadersReferences()
{
if(_instance.shStandard == null)
{
_instance.shStandard = Shader.Find("AllIn13DShader/AllIn13DShader");
}
if(_instance.shStandardNoShadowCaster == null)
{
_instance.shStandardNoShadowCaster = Shader.Find("AllIn13DShader/AllIn13DShader_NoShadowCaster");
}
if(_instance.shOutline == null)
{
_instance.shOutline = Shader.Find("AllIn13DShader/AllIn13DShaderOutline");
}
if(_instance.shOutlineNoShadowCaster == null)
{
_instance.shOutlineNoShadowCaster = Shader.Find("AllIn13DShader/AllIn13DShaderOutline_NoShadowCaster");
}
}
public EffectsProfileCollection GetEffectsProfileCollection()
{
return effectsProfileCollection;
}
public void SetEffectsProfileCollection(EffectsProfileCollection effectsProfileCollection)
{
this.effectsProfileCollection = effectsProfileCollection;
}
}
}