Files
2026-02-23 22:01:07 +07:00

339 lines
8.9 KiB
C#

using UnityEditor;
using UnityEngine;
namespace AllIn13DShader
{
public abstract class AbstractEffectDrawer
{
private const float HEIGHT_PER_LINE = 12.5f;
protected string drawerID;
protected PropertiesConfig propertiesConfig;
protected AllIn13DEffectConfig effectConfig;
protected AllIn13DShaderInspectorReferences references;
protected int globalEffectIndex;
public string ID
{
get
{
return drawerID;
}
}
public AbstractEffectDrawer(AllIn13DShaderInspectorReferences references, PropertiesConfig propertiesConfig)
{
this.references = references;
this.propertiesConfig = propertiesConfig;
}
public void Draw(PropertiesConfig propertiesConfig, AllIn13DEffectConfig effectConfig, int globalEffectIndex)
{
this.propertiesConfig = propertiesConfig;
this.effectConfig = effectConfig;
this.globalEffectIndex = globalEffectIndex;
Draw();
}
protected virtual void Draw()
{
bool isShaderVariant = references.IsShaderVariant();
bool areDependenciesMet = AreDependenciesMet();
bool isEffectAvailableOnGlobalConfig = references.effectsProfileCollection.generalProfile.IsEffectEnabled(effectConfig.effectName);
bool isEffectAvailable = AllIn13DEffectConfig.IsEffectAvailable(effectConfig, references);
bool groupEnabled = isEffectAvailable;
if (!isShaderVariant)
{
groupEnabled = groupEnabled && areDependenciesMet && isEffectAvailableOnGlobalConfig;
}
//bool groupEnabled = areDependenciesMet && isEffectAvailable && isEffectAvailableOnGlobalConfig /*|| (references.isShaderVariant && isEnabledInEffectsProfile)*/;
//bool disableGroup = !groupEnabled;
EditorGUILayout.BeginHorizontal();
EditorGUI.BeginDisabledGroup(!groupEnabled);
EffectPropertyDrawer.DrawMainProperty(globalEffectIndex, effectConfig, references, isEffectAvailable, isEffectAvailableOnGlobalConfig);
EditorGUILayout.EndHorizontal();
bool isAnyPropertyVisible = IsAnyPropertyVisible();
if (isAnyPropertyVisible)
{
EditorGUILayout.BeginVertical(references.propertiesStyle);
DrawExtraData();
DrawProperties();
EditorGUILayout.EndVertical();
}
EditorGUI.EndDisabledGroup();
}
private void DrawExtraData()
{
if (IsParentPropertyEnabled())
{
string customMessage = effectConfig.GetCustomMessage(references.targetMatInfos);
if (!string.IsNullOrEmpty(customMessage))
{
EditorGUILayout.BeginHorizontal();
int numLines = EditorUtils.GetNumLines(customMessage);
float heightField = numLines * HEIGHT_PER_LINE;
if (!string.IsNullOrEmpty(effectConfig.docURL))
{
if (GUILayout.Button("?", GUILayout.Width(heightField), GUILayout.Height(heightField)))
{
Application.OpenURL(effectConfig.docURL);
}
}
EditorGUILayout.LabelField(customMessage, references.smallLabelStyle, GUILayout.Height(heightField));
EditorGUILayout.EndHorizontal();
}
}
}
protected virtual void DrawProperties()
{
for (int i = 0; i < effectConfig.effectProperties.Count; i++)
{
EffectProperty effectProperty = effectConfig.effectProperties[i];
DrawProperty(effectProperty, string.Empty, true);
}
}
protected virtual void DrawProperty(EffectProperty effectProperty)
{
DrawProperty(effectProperty, true);
}
protected virtual void DrawProperty(EffectProperty effectProperty, bool allowReset)
{
DrawProperty(effectProperty, string.Empty, allowReset);
}
protected virtual void DrawProperty(EffectProperty effectProperty, string labelPrefix, bool allowReset)
{
if (IsEffectPropertyVisible(effectProperty, references.targetMatInfos))
{
EffectProperty.PropertyType propertyType = effectProperty.GetPropertyType();
MaterialProperty matProperty = references.matProperties[effectProperty.propertyIndex];
string propertyCustomValue = string.Empty;
if(references.IsShaderVariant() && effectProperty.IsPropertyWithKeywords())
{
int index = 0;
bool isEnabled = references.IsEffectPropertyEnabled(effectProperty, ref index);
if (isEnabled)
{
if (effectProperty.IsEnumProperty())
{
propertyCustomValue = effectProperty.propertyKeywords[index];
}
else
{
propertyCustomValue = string.Empty;
}
}
}
EffectPropertyDrawer.DrawProperty(
materialProperty: matProperty,
labelPrefix: labelPrefix,
displayName: effectProperty.displayName,
customValue: propertyCustomValue,
allowReset: allowReset,
isKeywordProperty: effectProperty.IsPropertyWithKeywords(),
propertyType: effectProperty.GetPropertyType(),
references: references);
//EffectPropertyDrawer.DrawProperty(effectProperty, labelPrefix, effectProperty.displayName, allowReset, effectProperty.IsPropertyWithKeywords(), references);
//EffectPropertyDrawer.DrawProperty(effectProperty, labelPrefix, allowReset, references);
}
}
protected bool IsParentPropertyEnabled()
{
bool res = true;
for (int matIdx = 0; matIdx < references.targetMatInfos.Length; matIdx++)
{
AbstractMaterialInfo targetMatInfo = references.targetMatInfos[matIdx];
bool thisMatParentPropertyEnabled = false;
for (int kwIdx = 0; kwIdx < effectConfig.keywords.Count; kwIdx++)
{
string kw = effectConfig.keywords[kwIdx].keyword;
if (targetMatInfo.IsKeywordEnabled(kw))
{
thisMatParentPropertyEnabled = true;
break;
}
}
res = res && thisMatParentPropertyEnabled;
}
return res;
}
protected bool IsAnyPropertyVisible()
{
bool res = false;
bool parentPropertyEnabled = IsParentPropertyEnabled();
if (parentPropertyEnabled)
{
for (int propIdx = 0; propIdx < effectConfig.effectProperties.Count; propIdx++)
{
EffectProperty effectProperty = effectConfig.effectProperties[propIdx];
res = IsEffectPropertyVisible(effectProperty, references.targetMatInfos);
if (res)
{
break;
}
}
}
res = res || (parentPropertyEnabled && !string.IsNullOrEmpty(effectConfig.GetCustomMessage(references.targetMatInfos)));
return res;
}
protected bool IsEffectPropertyVisible(EffectProperty effectProperty, AbstractMaterialInfo[] targetMatInfos)
{
bool res = true;
for (int i = 0; i < targetMatInfos.Length; i++)
{
res = res && IsEffectPropertyVisible(effectProperty, targetMatInfos[i]);
}
return res;
}
protected bool IsEffectPropertyVisible(EffectProperty effectProperty, AbstractMaterialInfo targetMatInfo)
{
bool res = false;
bool anyIncompatibilities = false;
for (int i = 0; i < effectProperty.incompatibleKeywords.Count; i++)
{
string incompatibleKw = effectProperty.incompatibleKeywords[i];
if (targetMatInfo.IsKeywordEnabled(incompatibleKw))
{
anyIncompatibilities = true;
}
}
if (!anyIncompatibilities)
{
if (effectProperty.keywordsOp == KeywordsOp.OR)
{
for (int i = 0; i < effectProperty.keywords.Count; i++)
{
string keyword = effectProperty.keywords[i];
if (targetMatInfo.IsKeywordEnabled(keyword))
{
res = true;
break;
}
}
}
else
{
res = true;
for (int i = 0; i < effectProperty.keywords.Count; i++)
{
string keyword = effectProperty.keywords[i];
if (!targetMatInfo.IsKeywordEnabled(keyword))
{
res = false;
break;
}
}
}
}
return res;
}
protected MaterialProperty FindPropertyByName(string propertyName)
{
MaterialProperty res = null;
for (int i = 0; i < references.matProperties.Length; i++)
{
if (references.matProperties[i].name == propertyName)
{
res = references.matProperties[i];
break;
}
}
return res;
}
protected int FindPropertyIndex(string propertyName)
{
int res = -1;
for (int i = 0; i < references.matProperties.Length; i++)
{
if (references.matProperties[i].name == propertyName)
{
res = i;
break;
}
}
return res;
}
protected bool AreDependenciesMet()
{
bool res = true;
if (!string.IsNullOrEmpty(effectConfig.dependentOnEffect))
{
AllIn13DEffectConfig dependentEffect = propertiesConfig.FindEffectConfigByID(effectConfig.dependentOnEffect);
res = res && AllIn13DEffectConfig.IsEffectEnabled(dependentEffect, references);
}
if (!string.IsNullOrEmpty(effectConfig.incompatibleWithEffectID))
{
AllIn13DEffectConfig dependentEffect = propertiesConfig.FindEffectConfigByID(effectConfig.incompatibleWithEffectID);
res = res && !AllIn13DEffectConfig.IsEffectEnabled(dependentEffect, references);
}
return res;
}
protected bool IsShaderVariant()
{
bool res = true;
for(int i = 0; i < references.targetMatInfos.Length; i++)
{
if (references.targetMatInfos[i].IsShaderVariant())
{
res = false;
break;
}
}
return res;
}
public virtual void Refresh(AllIn13DShaderInspectorReferences references)
{
this.references = references;
}
}
}