180 lines
7.7 KiB
C#
180 lines
7.7 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace MToon
|
|
{
|
|
public static partial class Utils
|
|
{
|
|
public static MToonDefinition GetMToonParametersFromMaterial(Material material)
|
|
{
|
|
return new MToonDefinition
|
|
{
|
|
Meta = new MetaDefinition
|
|
{
|
|
Implementation = Implementation,
|
|
VersionNumber = material.GetInt(PropVersion),
|
|
},
|
|
Rendering = new RenderingDefinition
|
|
{
|
|
RenderMode = GetBlendMode(material),
|
|
CullMode = GetCullMode(material),
|
|
RenderQueueOffsetNumber = GetRenderQueueOffset(material, GetRenderQueueOriginMode(material)),
|
|
},
|
|
Color = new ColorDefinition
|
|
{
|
|
LitColor = GetColor(material, PropColor),
|
|
LitMultiplyTexture = GetTexture(material, PropMainTex),
|
|
ShadeColor = GetColor(material, PropShadeColor),
|
|
ShadeMultiplyTexture = GetTexture(material, PropShadeTexture),
|
|
CutoutThresholdValue = GetValue(material, PropCutoff),
|
|
},
|
|
Lighting = new LightingDefinition
|
|
{
|
|
LitAndShadeMixing = new LitAndShadeMixingDefinition
|
|
{
|
|
ShadingShiftValue = GetValue(material, PropShadeShift),
|
|
ShadingToonyValue = GetValue(material, PropShadeToony),
|
|
ShadowReceiveMultiplierValue = GetValue(material, PropReceiveShadowRate),
|
|
ShadowReceiveMultiplierMultiplyTexture = GetTexture(material, PropReceiveShadowTexture),
|
|
LitAndShadeMixingMultiplierValue = GetValue(material, PropShadingGradeRate),
|
|
LitAndShadeMixingMultiplierMultiplyTexture = GetTexture(material, PropShadingGradeTexture),
|
|
},
|
|
LightingInfluence = new LightingInfluenceDefinition
|
|
{
|
|
LightColorAttenuationValue = GetValue(material, PropLightColorAttenuation),
|
|
GiIntensityValue = GetValue(material, PropIndirectLightIntensity),
|
|
},
|
|
Normal = new NormalDefinition
|
|
{
|
|
NormalTexture = GetTexture(material, PropBumpMap),
|
|
NormalScaleValue = GetValue(material, PropBumpScale),
|
|
},
|
|
},
|
|
Emission = new EmissionDefinition
|
|
{
|
|
EmissionColor = GetColor(material, PropEmissionColor),
|
|
EmissionMultiplyTexture = GetTexture(material, PropEmissionMap),
|
|
},
|
|
MatCap = new MatCapDefinition
|
|
{
|
|
AdditiveTexture = GetTexture(material, PropSphereAdd),
|
|
},
|
|
Rim = new RimDefinition
|
|
{
|
|
RimColor = GetColor(material, PropRimColor),
|
|
RimMultiplyTexture = GetTexture(material, PropRimTexture),
|
|
RimLightingMixValue = GetValue(material, PropRimLightingMix),
|
|
RimFresnelPowerValue = GetValue(material, PropRimFresnelPower),
|
|
RimLiftValue = GetValue(material, PropRimLift),
|
|
},
|
|
Outline = new OutlineDefinition
|
|
{
|
|
OutlineWidthMode = GetOutlineWidthMode(material),
|
|
OutlineWidthValue = GetValue(material, PropOutlineWidth),
|
|
OutlineWidthMultiplyTexture = GetTexture(material, PropOutlineWidthTexture),
|
|
OutlineScaledMaxDistanceValue = GetValue(material, PropOutlineScaledMaxDistance),
|
|
OutlineColorMode = GetOutlineColorMode(material),
|
|
OutlineColor = GetColor(material, PropOutlineColor),
|
|
OutlineLightingMixValue = GetValue(material, PropOutlineLightingMix),
|
|
},
|
|
TextureOption = new TextureUvCoordsDefinition
|
|
{
|
|
MainTextureLeftBottomOriginScale = material.GetTextureScale(PropMainTex),
|
|
MainTextureLeftBottomOriginOffset = material.GetTextureOffset(PropMainTex),
|
|
UvAnimationMaskTexture = GetTexture(material, PropUvAnimMaskTexture),
|
|
UvAnimationScrollXSpeedValue = GetValue(material, PropUvAnimScrollX),
|
|
UvAnimationScrollYSpeedValue = GetValue(material, PropUvAnimScrollY),
|
|
UvAnimationRotationSpeedValue = GetValue(material, PropUvAnimRotation),
|
|
},
|
|
};
|
|
}
|
|
|
|
private static float GetValue(Material material, string propertyName)
|
|
{
|
|
return material.GetFloat(propertyName);
|
|
}
|
|
|
|
private static Color GetColor(Material material, string propertyName)
|
|
{
|
|
return material.GetColor(propertyName);
|
|
}
|
|
|
|
private static Texture2D GetTexture(Material material, string propertyName)
|
|
{
|
|
return (Texture2D) material.GetTexture(propertyName);
|
|
}
|
|
|
|
private static RenderMode GetBlendMode(Material material)
|
|
{
|
|
if (material.IsKeywordEnabled(KeyAlphaTestOn))
|
|
{
|
|
return RenderMode.Cutout;
|
|
}
|
|
else if (material.IsKeywordEnabled(KeyAlphaBlendOn))
|
|
{
|
|
switch (material.GetInt(PropZWrite))
|
|
{
|
|
case EnabledIntValue:
|
|
return RenderMode.TransparentWithZWrite;
|
|
case DisabledIntValue:
|
|
return RenderMode.Transparent;
|
|
default:
|
|
Debug.LogWarning("Invalid ZWrite Int Value.");
|
|
return RenderMode.Transparent;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return RenderMode.Opaque;
|
|
}
|
|
}
|
|
|
|
private static CullMode GetCullMode(Material material)
|
|
{
|
|
switch ((CullMode) material.GetInt(PropCullMode))
|
|
{
|
|
case CullMode.Off:
|
|
return CullMode.Off;
|
|
case CullMode.Front:
|
|
return CullMode.Front;
|
|
case CullMode.Back:
|
|
return CullMode.Back;
|
|
default:
|
|
Debug.LogWarning("Invalid CullMode.");
|
|
return CullMode.Back;
|
|
}
|
|
}
|
|
|
|
private static OutlineWidthMode GetOutlineWidthMode(Material material)
|
|
{
|
|
if (material.IsKeywordEnabled(KeyOutlineWidthWorld)) return OutlineWidthMode.WorldCoordinates;
|
|
if (material.IsKeywordEnabled(KeyOutlineWidthScreen)) return OutlineWidthMode.ScreenCoordinates;
|
|
|
|
return OutlineWidthMode.None;
|
|
}
|
|
|
|
private static OutlineColorMode GetOutlineColorMode(Material material)
|
|
{
|
|
if (material.IsKeywordEnabled(KeyOutlineColorFixed)) return OutlineColorMode.FixedColor;
|
|
if (material.IsKeywordEnabled(KeyOutlineColorMixed)) return OutlineColorMode.MixedLighting;
|
|
|
|
return OutlineColorMode.FixedColor;
|
|
}
|
|
|
|
private static RenderMode GetRenderQueueOriginMode(Material material)
|
|
{
|
|
return GetBlendMode(material);
|
|
}
|
|
|
|
private static int GetRenderQueueOffset(Material material, RenderMode originMode)
|
|
{
|
|
var rawValue = material.renderQueue;
|
|
var requirement = GetRenderQueueRequirement(originMode);
|
|
if (rawValue < requirement.MinValue || rawValue > requirement.MaxValue)
|
|
{
|
|
return 0;
|
|
}
|
|
return rawValue - requirement.DefaultValue;
|
|
}
|
|
}
|
|
} |