Files
YachtDice/Assets/Plugins/AllIn13DShader/Editor/MaterialConverter/Scripts/ConverterGeneral.cs
T
2026-02-23 22:01:07 +07:00

199 lines
5.6 KiB
C#

using UnityEngine;
using UnityEngine.Rendering;
namespace AllIn13DShader
{
public class ConverterGeneral
{
protected Material from;
protected Material target;
protected ConversionConfig conversionConfig;
protected PropertiesConfigCollection propertiesConfigCollection;
protected PropertiesConfig propertiesConfig;
public virtual void ApplyConversion(Material from, Material target)
{
this.from = from;
this.target = target;
this.conversionConfig = EditorUtils.FindAssetByName<ConversionConfig>("ConversionConfig");
this.propertiesConfigCollection = EditorUtils.FindAssetByName<PropertiesConfigCollection>("PropertiesConfigCollection");
this.propertiesConfig = propertiesConfigCollection.FindPropertiesConfigByShader(target.shader);
for (int i = 0; i < conversionConfig.conversionProperties.Length; i++)
{
ConversionProperty conversionProperty = conversionConfig.conversionProperties[i];
bool propertiveActive = false;
ApplyConversionProperty(conversionProperty, from, target, ref propertiveActive);
if (!string.IsNullOrEmpty(conversionProperty.belongingToEffect) && conversionProperty.requiredProperty && propertiveActive)
{
AllIn13DEffectConfig effectConfig = propertiesConfig.FindEffectConfigByID(conversionProperty.belongingToEffect);
EnableEffect(effectConfig);
}
}
target.renderQueue = from.renderQueue;
}
protected void SetEnableEffect(string effectID, bool enabled)
{
AllIn13DEffectConfig effectConfig = propertiesConfig.FindEffectConfigByID(effectID);
if (enabled)
{
EnableEffect(effectConfig);
}
else
{
DisableEffect(effectConfig);
}
}
protected void EnableEffect(AllIn13DEffectConfig effectConfig)
{
if (effectConfig.keywords.Count == 1)
{
target.EnableKeyword(effectConfig.keywords[0].keyword);
target.SetFloat(effectConfig.keywordPropertyName, 1f);
}
}
protected void DisableEffect(string effectID)
{
AllIn13DEffectConfig effectConfig = propertiesConfig.FindEffectConfigByID(effectID);
DisableEffect(effectConfig);
}
protected void DisableEffect(AllIn13DEffectConfig effectConfig)
{
for (int i = 0; i < effectConfig.keywords.Count; i++)
{
target.DisableKeyword(effectConfig.keywords[i].keyword);
}
target.SetFloat(effectConfig.keywordPropertyName, 0f);
}
protected void EnablePBR()
{
AllIn13DEffectConfig shadingModelEffect = propertiesConfig.FindEffectConfigByID("SHADINGMODEL");
DisableEffect(shadingModelEffect);
string pbrKeyword = shadingModelEffect.keywords[1].keyword;
target.EnableKeyword(pbrKeyword);
target.SetFloat("_ShadingModel", 1.0f);
}
protected void EnableLightModelClassic()
{
AllIn13DEffectConfig lightModelEffect = propertiesConfig.FindEffectConfigByID("LIGHTMODEL");
DisableEffect(lightModelEffect);
string lightModelClassicKeyword = lightModelEffect.keywords[1].keyword;
target.EnableKeyword(lightModelClassicKeyword);
target.SetFloat(lightModelEffect.keywordPropertyName, 1.0f);
}
protected void EnableSpecularClassic()
{
AllIn13DEffectConfig specularModelEffect = propertiesConfig.FindEffectConfigByID("SPECULARMODEL");
DisableEffect(specularModelEffect);
string specularModelClassicKeyword = specularModelEffect.keywords[1].keyword;
target.EnableKeyword(specularModelClassicKeyword);
target.SetFloat(specularModelEffect.keywordPropertyName, 1.0f);
}
protected void SetBlendSrc(UnityEngine.Rendering.BlendMode blendMode)
{
target.SetInt("_BlendSrc", (int)blendMode);
}
protected void SetBlendDst(UnityEngine.Rendering.BlendMode blendMode)
{
target.SetInt("_BlendDst", (int)blendMode);
}
protected void SetAlphaPreset()
{
target.SetFloat("_RenderPreset", 2);
}
protected void SetOpaquePreset()
{
target.SetFloat("_RenderPreset", 1);
}
protected void ApplyConversionProperty(ConversionProperty conversionProperty, Material from, Material target, ref bool propertyActive)
{
string propertyNameFrom = string.Empty;
string propertyNameTarget = conversionProperty.propertyName;
if (from.HasProperty(conversionProperty.propertyName))
{
propertyNameFrom = conversionProperty.propertyName;
}
else
{
for (int i = 0; i < conversionProperty.alternativeNames.Length; i++)
{
if (from.HasProperty(conversionProperty.alternativeNames[i]))
{
propertyNameFrom = conversionProperty.alternativeNames[i];
break;
}
}
}
if (!string.IsNullOrEmpty(propertyNameFrom))
{
switch (conversionProperty.propertyType)
{
case ConversionPropertyType.TEXTURE:
Texture texValue = from.GetTexture(propertyNameFrom);
Vector2 texOffset = from.GetTextureOffset(propertyNameFrom);
Vector2 texScale = from.GetTextureScale(propertyNameFrom);
target.SetTexture(propertyNameTarget, texValue);
target.SetTextureOffset(propertyNameTarget, texOffset);
target.SetTextureScale(propertyNameTarget, texScale);
propertyActive = texValue != null;
break;
case ConversionPropertyType.FLOAT:
float floatValue = from.GetFloat(propertyNameFrom);
target.SetFloat(propertyNameTarget, floatValue);
propertyActive = true;
break;
case ConversionPropertyType.COLOR:
Color colorValue = from.GetColor(propertyNameFrom);
target.SetColor(propertyNameTarget, colorValue);
propertyActive = true;
break;
case ConversionPropertyType.VECTOR:
Vector4 vectorValue = from.GetVector(propertyNameFrom);
target.SetVector(propertyNameTarget, vectorValue);
propertyActive = true;
break;
}
}
}
}
}