using LibMMD.Material; using UnityEngine; using UnityEngine.Rendering; namespace LibMMD.Unity3D { public sealed class LitMmdMaterialAdapter : MmdMaterialAdapterBase { public override string Id => MmdMaterialAdapterIds.Lit; public override string DisplayName => "Lit"; public override MmdMaterialSettings SupportedSettings => MmdMaterialSettings.ReceiveShadows | MmdMaterialSettings.CastShadows | MmdMaterialSettings.Outline | MmdMaterialSettings.TextureAlphaScan; public override Shader ResolveShader(MmdMaterial source, MmdMaterialContext context) => FindFirst( context.IsTransparent ? "MMD/Runtime/Standard Transparent" : "MMD/Runtime/Standard"); public override void Apply(UnityEngine.Material target, MmdMaterial source, MmdMaterialContext context) { base.Apply(target, source, context); SetColor(target, "_BaseColor", source.DiffuseColor); SetTexture(target, "_BaseMap", context.MainTexture); SetFloat(target, "_WorkflowMode", 0.0f); SetColor(target, "_SpecColor", source.SpecularColor); SetFloat(target, "_Metallic", 0.0f); SetFloat(target, "_Smoothness", Mathf.Clamp01(source.Shiness / 128.0f)); SetFloat(target, "_Glossiness", Mathf.Clamp01(source.Shiness / 128.0f)); SetFloat(target, "_Surface", context.IsTransparent ? 1.0f : 0.0f); SetFloat(target, "_Blend", 0.0f); SetFloat(target, "_AlphaClip", 0.0f); SetFloat(target, "_Cull", source.DrawDoubleFace ? (float)CullMode.Off : (float)CullMode.Back); SetKeyword(target, "_RECEIVE_SHADOWS_OFF", !context.ReceiveShadows); SetKeyword(target, "_SPECULAR_SETUP", true); SetKeyword(target, "_ALPHATEST_ON", false); SetFloat(target, "_CastShadows", context.CastShadows ? 1.0f : 0.0f); SetFloat(target, "_ReceiveShadows", context.ReceiveShadows ? 1.0f : 0.0f); target.SetShaderPassEnabled("ShadowCaster", context.CastShadows); ConfigureBlend(target, context.IsTransparent, "_SURFACE_TYPE_TRANSPARENT"); target.SetOverrideTag("RenderType", context.IsTransparent ? "Transparent" : "Opaque"); target.doubleSidedGI = source.DrawDoubleFace; } } }