Files
YachtDice/Assets/Plugins/AllIn13DShader/Editor/Effects Profiles/EffectsProfileCollection.cs
T
2026-02-23 22:01:07 +07:00

196 lines
4.8 KiB
C#

using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
namespace AllIn13DShader
{
public class EffectsProfileCollection : ScriptableObject
{
public static string ASSET_NAME = "EffectsProfileCollection";
public EffectsProfile generalProfile;
public List<EffectsProfile> profiles;
public static EffectsProfileCollection CreateAsset(PropertiesConfigCollection propertiesConfigCollection)
{
EffectsProfileCollection res = EffectsProfileCollection.CreateInstance<EffectsProfileCollection>();
res.profiles = new List<EffectsProfile>();
EffectsProfile effectsProfile = new EffectsProfile(string.Empty, string.Empty);
effectsProfile.CreateDefault(propertiesConfigCollection);
res.generalProfile = effectsProfile;
string path = Path.Combine(GlobalConfiguration.GetDefaultConfigFolderPath(), ASSET_NAME + ".asset");
AssetDatabase.CreateAsset(res, path);
return res;
}
public EffectsProfile FindEffectProfileByGUID(string guid)
{
EffectsProfile res = null;
for (int i = 0; i < profiles.Count; i++)
{
if (profiles[i].shaderGUID == guid)
{
res = profiles[i];
break;
}
}
return res;
}
public EffectsProfile FindEffectProfileByShader(Shader shader)
{
EffectsProfile res = null;
string assetPath = AssetDatabase.GetAssetPath(shader);
string guid = AssetDatabase.AssetPathToGUID(assetPath);
res = FindEffectProfileByGUID(guid);
return res;
}
public bool RemoveEffectsProfileByShader(Shader shader)
{
bool res = false;
EffectsProfile effectProfile = FindEffectProfileByShader(shader);
if(effectProfile != null)
{
res = profiles.Remove(effectProfile);
}
if (res)
{
EditorUtility.SetDirty(this);
}
return res;
}
public void ConfigureEffectProfileByMaterialInfo(EffectsProfile target, EffectsProfile activeEffectsList, AbstractMaterialInfo matInfo, PropertiesConfig propertiesConfig)
{
List<AllIn13DEffectConfig> effectConfigs = propertiesConfig.GetAllEffects();
for(int i = 0; i < effectConfigs.Count; i++)
{
bool effectEnabled = AllIn13DEffectConfig.IsEffectEnabled(effectConfigs[i], matInfo) &&
effectConfigs[i].AreDependenciesMet(propertiesConfig, matInfo) &&
activeEffectsList.IsEffectEnabled(effectConfigs[i].effectName);
if (effectEnabled)
{
target.EnableEffect(effectConfigs[i], matInfo);
}
else
{
target.DisableEffect(effectConfigs[i]);
}
}
}
public EffectsProfile CreateNewProfile(string profileName)
{
System.Guid guid = System.Guid.NewGuid();
string id = $"{guid.ToString()}";
EffectsProfile res = new EffectsProfile(id, profileName);
profiles.Add(res);
return res;
}
public void BindEffectConfigs(PropertiesConfig propertiesConfig)
{
generalProfile.BindEffectConfigs(propertiesConfig);
for(int i = 0; i < profiles.Count; i++)
{
profiles[i].BindEffectConfigs(propertiesConfig);
}
}
public void CleanInvalidProfiles()
{
List<EffectsProfile> profilesToRemove = new List<EffectsProfile>();
for (int i = 0; i < profiles.Count - 1; i++)
{
bool removeThisProfile = false;
if (profiles[i] == null)
{
removeThisProfile = true;
}
else
{
Shader shader = profiles[i].FindShader();
if(shader == null)
{
removeThisProfile = true;
}
}
if (removeThisProfile)
{
profilesToRemove.Add(profiles[i]);
}
}
for(int i = 0; i < profilesToRemove.Count; i++)
{
profiles.Remove(profilesToRemove[i]);
}
}
public void CheckBakedShadersFolder(string folderPath, PropertiesConfig propertiesConfig)
{
if (AssetDatabase.IsValidFolder(folderPath))
{
string[] files = Directory.GetFiles(folderPath, "*.shader", SearchOption.AllDirectories);
for (int i = 0; i < files.Length; i++)
{
Shader shader = (Shader)AssetDatabase.LoadAssetAtPath(files[i], typeof(Shader));
EffectsProfile effectProfile = FindEffectProfileByShader(shader);
if (effectProfile == null)
{
EffectProfileCreatorFromShaderVariant.Create(shader, files[i], propertiesConfig, this);
}
}
}
}
public void CheckBakedShadersFolder(PropertiesConfig propertiesConfig)
{
string shaderVariantsFolderPath = ShaderVariantCreator.GetShaderVariantsFolderPath();
CheckBakedShadersFolder(shaderVariantsFolderPath, propertiesConfig);
if (AssetDatabase.IsValidFolder(Constants.DEMO_SHADERS_BAKED_FOLDER_PATH))
{
CheckBakedShadersFolder(Constants.DEMO_SHADERS_BAKED_FOLDER_PATH, propertiesConfig);
}
}
public void CheckRemovedShader(string removedPath)
{
string guid = AssetDatabase.AssetPathToGUID(removedPath);
EffectsProfile effectsProfileToRemove = FindEffectProfileByGUID(guid);
if(effectsProfileToRemove != null)
{
profiles.Remove(effectsProfileToRemove);
}
EditorUtility.SetDirty(this);
}
}
}