Exemple #1
0
        public static MToonMaterial Load(VrmMaterial mp, List <Texture> textures)
        {
            var mtoon = new MToonMaterial(mp.name);

            if (mp.floatProperties.TryGetValue(Utils.PropDebugMode, out float value))
            {
                mtoon._DebugMode = value;
            }
            mtoon.Definition = MToon.Utils.FromVrm0x(mp, textures);
            return(mtoon);
        }
Exemple #2
0
        public void ExportMaterialMToon(Material src, MToonMaterial mtoon, List <Texture> textures)
        {
            if (!Storage.Gltf.extensionsUsed.Contains(UnlitMaterial.ExtensionName))
            {
                Storage.Gltf.extensionsUsed.Add(UnlitMaterial.ExtensionName);
            }

            var material = mtoon.MToonToGltf(textures);

            Storage.Gltf.materials.Add(material);
            if (!Storage.Gltf.extensionsUsed.Contains(MToonMaterial.ExtensionName))
            {
                Storage.Gltf.extensionsUsed.Add(MToonMaterial.ExtensionName);
            }
        }
Exemple #3
0
        public void ExportMaterialMToon(Material src, MToonMaterial mtoon, List <Texture> textures)
        {
            if (!Gltf.ExtensionsUsed.Contains(UnlitMaterial.ExtensionName))
            {
                Gltf.ExtensionsUsed.Add(UnlitMaterial.ExtensionName);
            }

            var material = mtoon.MToonToGltf(src.Name, textures);

            Gltf.Materials.Add(material);
            if (!Gltf.ExtensionsUsed.Contains(MToonMaterial.ExtensionName))
            {
                Gltf.ExtensionsUsed.Add(MToonMaterial.ExtensionName);
            }
        }
Exemple #4
0
        public static MToonMaterial MToonFromGltf(VrmProtobuf.Material material, List <Texture> textures)
        {
            var mtoon     = new MToonMaterial(material.Name);
            var extension = material.Extensions.VRMCMaterialsMtoon;

            mtoon.Definition = new MToonDefinition
            {
                Meta = new MetaDefinition
                {
                    Implementation = "Santarh/MToon",
                },
                Color = new ColorDefinition
                {
                    LitColor             = material.PbrMetallicRoughness.BaseColorFactor.ToLinearColor(Nan),
                    ShadeColor           = extension.ShadeFactor.ToLinearColor(Nan),
                    ShadeMultiplyTexture = extension.ShadeMultiplyTexture.GetTexture(textures),
                    CutoutThresholdValue = material.AlphaCutoff.Value,
                },
                Outline = new OutlineDefinition
                {
                    OutlineColorMode              = (OutlineColorMode)extension.OutlineColorMode,
                    OutlineColor                  = extension.OutlineFactor.ToLinearColor(Nan),
                    OutlineLightingMixValue       = extension.OutlineLightingMixFactor.Value,
                    OutlineScaledMaxDistanceValue = extension.OutlineScaledMaxDistanceFactor.Value,
                    OutlineWidthMode              = (OutlineWidthMode)extension.OutlineWidthMode,
                    OutlineWidthValue             = extension.OutlineWidthFactor.Value,
                    OutlineWidthMultiplyTexture   = extension.OutlineWidthMultiplyTexture.GetTexture(textures),
                },
                Emission = new EmissionDefinition
                {
                    EmissionColor = material.EmissiveFactor.ToLinearColor(Nan),
                },
                Lighting = new LightingDefinition
                {
                    LightingInfluence = new LightingInfluenceDefinition
                    {
                        GiIntensityValue           = extension.GiIntensityFactor.Value,
                        LightColorAttenuationValue = extension.LightColorAttenuationFactor.Value,
                    },
                    LitAndShadeMixing = new LitAndShadeMixingDefinition
                    {
                        ShadingShiftValue = extension.ShadingShiftFactor.Value,
                        ShadingToonyValue = extension.ShadingToonyFactor.Value,
                    },
                    Normal = new NormalDefinition
                    {
                    },
                },
                MatCap = new MatCapDefinition
                {
                    AdditiveTexture = extension.AdditiveTexture.GetTexture(textures)
                },
                Rendering = new RenderingDefinition
                {
                    CullMode   = material.DoubleSided.Value ? CullMode.Off : CullMode.Back,
                    RenderMode = GetRenderMode(material.AlphaMode, extension.TransparentWithZWrite.Value),
                    RenderQueueOffsetNumber = extension.RenderQueueOffsetNumber.Value,
                },
                Rim = new RimDefinition
                {
                    RimColor             = extension.RimFactor.ToLinearColor(Nan),
                    RimMultiplyTexture   = extension.RimMultiplyTexture.GetTexture(textures),
                    RimLiftValue         = extension.RimLiftFactor.Value,
                    RimFresnelPowerValue = extension.RimFresnelPowerFactor.Value,
                    RimLightingMixValue  = extension.RimLightingMixFactor.Value,
                },
                TextureOption = new TextureUvCoordsDefinition
                {
                    UvAnimationMaskTexture        = extension.UvAnimationMaskTexture.GetTexture(textures),
                    UvAnimationRotationSpeedValue = extension.UvAnimationRotationSpeedFactor.Value,
                    UvAnimationScrollXSpeedValue  = extension.UvAnimationScrollXSpeedFactor.Value,
                    UvAnimationScrollYSpeedValue  = extension.UvAnimationScrollYSpeedFactor.Value,
                },
            };

            if (material.PbrMetallicRoughness.BaseColorTexture != null)
            {
                mtoon.Definition.Color.LitMultiplyTexture = material.PbrMetallicRoughness.BaseColorTexture.Index.GetTexture(textures);
                if (material.PbrMetallicRoughness.BaseColorTexture.Extensions != null &&
                    material.PbrMetallicRoughness.BaseColorTexture.Extensions.KHRTextureTransform != null)
                {
                    mtoon.Definition.TextureOption.MainTextureLeftBottomOriginOffset = material.PbrMetallicRoughness.BaseColorTexture.Extensions.KHRTextureTransform.Offset.ToVector2();
                    mtoon.Definition.TextureOption.MainTextureLeftBottomOriginScale  = material.PbrMetallicRoughness.BaseColorTexture.Extensions.KHRTextureTransform.Scale.ToVector2();
                }
            }
            if (material.EmissiveTexture != null)
            {
                mtoon.Definition.Emission.EmissionMultiplyTexture = material.EmissiveTexture.Index.GetTexture(textures);
            }
            if (material.NormalTexture != null)
            {
                mtoon.Definition.Lighting.Normal.NormalScaleValue = material.NormalTexture.Scale.Value;
                mtoon.Definition.Lighting.Normal.NormalTexture    = material.NormalTexture.Index.GetTexture(textures);
            }

            return(mtoon);
        }
Exemple #5
0
        public static VrmProtobuf.Material MToonToGltf(this MToonMaterial mtoon, List <Texture> textures)
        {
            var material = mtoon.UnlitToGltf(textures);

            var dst = new VrmProtobuf.VRMC_materials_mtoon();

            material.Extensions.VRMCMaterialsMtoon = dst;

            // Color
            // unlit で済んでいる
            // material.PbrMetallicRoughness.BaseColorFactor.Assign(mtoon.Definition.Color.LitColor);
            if (mtoon.Definition.Color.LitMultiplyTexture != null)
            {
                // material.PbrMetallicRoughness.BaseColorTexture = new VrmProtobuf.TextureInfo
                // {
                //     Index = mtoon.Definition.Color.LitMultiplyTexture.ToIndex(textures),
                // };

                // standard, unlit, mtoon で共通処理にすべき?
                material.PbrMetallicRoughness.BaseColorTexture.Extensions = new VrmProtobuf.TextureInfo.Types.Extensions
                {
                    KHRTextureTransform = new VrmProtobuf.TextureInfo.Types.KHR_texture_transformtextureInfoextension
                    {
                    },
                };
                material.PbrMetallicRoughness.BaseColorTexture.Extensions.KHRTextureTransform.Offset.Assign(mtoon.Definition.TextureOption.MainTextureLeftBottomOriginOffset);
                material.PbrMetallicRoughness.BaseColorTexture.Extensions.KHRTextureTransform.Scale.Assign(mtoon.Definition.TextureOption.MainTextureLeftBottomOriginScale);
            }
            dst.ShadeFactor.Assign(mtoon.Definition.Color.ShadeColor);
            dst.ShadeMultiplyTexture = mtoon.Definition.Color.ShadeMultiplyTexture.ToIndex(textures);
            material.AlphaCutoff     = mtoon.Definition.Color.CutoutThresholdValue;

            // Outline
            dst.OutlineColorMode = (VrmProtobuf.VRMC_materials_mtoon.Types.OutlineColorMode)mtoon.Definition.Outline.OutlineColorMode;
            dst.OutlineFactor.Assign(mtoon.Definition.Outline.OutlineColor);
            dst.OutlineLightingMixFactor       = mtoon.Definition.Outline.OutlineLightingMixValue;
            dst.OutlineScaledMaxDistanceFactor = mtoon.Definition.Outline.OutlineScaledMaxDistanceValue;
            dst.OutlineWidthMode            = (VrmProtobuf.VRMC_materials_mtoon.Types.OutlineWidthMode)mtoon.Definition.Outline.OutlineWidthMode;
            dst.OutlineWidthFactor          = mtoon.Definition.Outline.OutlineWidthValue;
            dst.OutlineWidthMultiplyTexture = mtoon.Definition.Outline.OutlineWidthMultiplyTexture.ToIndex(textures);

            // Emission
            material.EmissiveFactor.Assign(mtoon.Definition.Emission.EmissionColor);
            if (mtoon.Definition.Emission.EmissionMultiplyTexture != null)
            {
                material.EmissiveTexture = new VrmProtobuf.TextureInfo
                {
                    Index = textures.IndexOfNullable(mtoon.Definition.Emission.EmissionMultiplyTexture.Texture)
                };
            }

            // Light
            dst.GiIntensityFactor           = mtoon.Definition.Lighting.LightingInfluence.GiIntensityValue;
            dst.LightColorAttenuationFactor = mtoon.Definition.Lighting.LightingInfluence.LightColorAttenuationValue;
            dst.ShadingShiftFactor          = mtoon.Definition.Lighting.LitAndShadeMixing.ShadingShiftValue;
            dst.ShadingToonyFactor          = mtoon.Definition.Lighting.LitAndShadeMixing.ShadingToonyValue;
            if (mtoon.Definition.Lighting.Normal.NormalTexture != null)
            {
                material.NormalTexture = new VrmProtobuf.MaterialNormalTextureInfo
                {
                    Scale = mtoon.Definition.Lighting.Normal.NormalScaleValue,
                    Index = textures.IndexOfNullable(mtoon.Definition.Lighting.Normal.NormalTexture.Texture)
                };
            }

            // matcap
            dst.AdditiveTexture = mtoon.Definition.MatCap.AdditiveTexture.ToIndex(textures);

            // rendering
            switch (mtoon.Definition.Rendering.CullMode)
            {
            case CullMode.Back:
                material.DoubleSided = false;
                break;

            case CullMode.Off:
                material.DoubleSided = true;
                break;

            case CullMode.Front:
                // GLTF not support
                material.DoubleSided = false;
                break;

            default:
                throw new NotImplementedException();
            }
            (material.AlphaMode, dst.TransparentWithZWrite) = GetRenderMode(mtoon.Definition.Rendering.RenderMode);
            dst.RenderQueueOffsetNumber = mtoon.Definition.Rendering.RenderQueueOffsetNumber;

            // rim
            dst.RimFactor.Assign(mtoon.Definition.Rim.RimColor);
            dst.RimMultiplyTexture    = mtoon.Definition.Rim.RimMultiplyTexture.ToIndex(textures);
            dst.RimLiftFactor         = mtoon.Definition.Rim.RimLiftValue;
            dst.RimFresnelPowerFactor = mtoon.Definition.Rim.RimFresnelPowerValue;
            dst.RimLightingMixFactor  = mtoon.Definition.Rim.RimLightingMixValue;

            // texture option
            dst.UvAnimationMaskTexture         = mtoon.Definition.TextureOption.UvAnimationMaskTexture.ToIndex(textures);
            dst.UvAnimationRotationSpeedFactor = mtoon.Definition.TextureOption.UvAnimationRotationSpeedValue;
            dst.UvAnimationScrollXSpeedFactor  = mtoon.Definition.TextureOption.UvAnimationScrollXSpeedValue;
            dst.UvAnimationScrollYSpeedFactor  = mtoon.Definition.TextureOption.UvAnimationScrollYSpeedValue;

            return(material);
        }
Exemple #6
0
        public static MToonMaterial MToonFromGltf(glTFMaterial material, List <Texture> textures, VRMC_materials_mtoon extension)
        {
            var mtoon = new MToonMaterial(material.name);

            var Meta = new MetaDefinition
            {
                Implementation = "Santarh/MToon",
            };
            var Color = new ColorDefinition
            {
                LitColor             = material.pbrMetallicRoughness.baseColorFactor.ToLinearColor(Nan),
                LitMultiplyTexture   = material.pbrMetallicRoughness.baseColorTexture?.index.GetTexture(textures),
                ShadeColor           = extension.ShadeFactor.ToLinearColor(Nan),
                ShadeMultiplyTexture = extension.ShadeMultiplyTexture.GetTexture(textures),
                CutoutThresholdValue = material.alphaCutoff,
            };
            var Outline = new OutlineDefinition
            {
                OutlineColorMode              = (VrmLib.MToon.OutlineColorMode)extension.OutlineColorMode,
                OutlineColor                  = extension.OutlineFactor.ToLinearColor(Nan),
                OutlineLightingMixValue       = extension.OutlineLightingMixFactor.Value,
                OutlineScaledMaxDistanceValue = extension.OutlineScaledMaxDistanceFactor.Value,
                OutlineWidthMode              = (VrmLib.MToon.OutlineWidthMode)extension.OutlineWidthMode,
                OutlineWidthValue             = extension.OutlineWidthFactor.Value,
                OutlineWidthMultiplyTexture   = extension.OutlineWidthMultiplyTexture.GetTexture(textures),
            };
            var Emission = new EmissionDefinition
            {
                EmissionColor = material.emissiveFactor.ToLinearColor(Nan),
            };

            if (material.emissiveTexture != null)
            {
                Emission.EmissionMultiplyTexture = material.emissiveTexture.index.GetTexture(textures);
            }

            var Lighting = new LightingDefinition
            {
                LightingInfluence = new LightingInfluenceDefinition
                {
                    GiIntensityValue           = extension.GiIntensityFactor.Value,
                    LightColorAttenuationValue = extension.LightColorAttenuationFactor.Value,
                },
                LitAndShadeMixing = new LitAndShadeMixingDefinition
                {
                    ShadingShiftValue = extension.ShadingShiftFactor.Value,
                    ShadingToonyValue = extension.ShadingToonyFactor.Value,
                },
                Normal = new NormalDefinition
                {
                },
            };

            if (material.normalTexture != null)
            {
                Lighting.Normal.NormalScaleValue = material.normalTexture.scale;
                Lighting.Normal.NormalTexture    = material.normalTexture.index.GetTexture(textures);
            }

            var MatCap = new MatCapDefinition
            {
                AdditiveTexture = extension.AdditiveTexture.GetTexture(textures)
            };
            var Rendering = new RenderingDefinition
            {
                CullMode   = material.doubleSided ? CullMode.Off : CullMode.Back,
                RenderMode = GetRenderMode(material.alphaMode, extension.TransparentWithZWrite.Value),
                RenderQueueOffsetNumber = extension.RenderQueueOffsetNumber.Value,
            };
            var Rim = new RimDefinition
            {
                RimColor             = extension.RimFactor.ToLinearColor(Nan),
                RimMultiplyTexture   = extension.RimMultiplyTexture.GetTexture(textures),
                RimLiftValue         = extension.RimLiftFactor.Value,
                RimFresnelPowerValue = extension.RimFresnelPowerFactor.Value,
                RimLightingMixValue  = extension.RimLightingMixFactor.Value,
            };

            var TextureOption = new TextureUvCoordsDefinition
            {
                UvAnimationMaskTexture        = extension.UvAnimationMaskTexture.GetTexture(textures),
                UvAnimationRotationSpeedValue = extension.UvAnimationRotationSpeedFactor.Value,
                UvAnimationScrollXSpeedValue  = extension.UvAnimationScrollXSpeedFactor.Value,
                UvAnimationScrollYSpeedValue  = extension.UvAnimationScrollYSpeedFactor.Value,
            };

            if (glTF_KHR_texture_transform.TryGet(material.pbrMetallicRoughness.baseColorTexture, out glTF_KHR_texture_transform t))
            {
                TextureOption.MainTextureLeftBottomOriginOffset = t.offset.ToVector2();
                TextureOption.MainTextureLeftBottomOriginScale  = t.scale.ToVector2();
            }

            mtoon.Definition = new MToonDefinition
            {
                Meta          = Meta,
                Color         = Color,
                Outline       = Outline,
                Emission      = Emission,
                Lighting      = Lighting,
                MatCap        = MatCap,
                Rendering     = Rendering,
                Rim           = Rim,
                TextureOption = TextureOption,
            };

            return(mtoon);
        }
Exemple #7
0
        public static glTFMaterial MToonToGltf(this MToonMaterial mtoon, List <Texture> textures)
        {
            var material = mtoon.UnlitToGltf(textures);

            var dst = new VRMC_materials_mtoon();

            // Color
            material.pbrMetallicRoughness.baseColorFactor = mtoon.Definition.Color.LitColor.ToFloat4();
            if (mtoon.Definition.Color.LitMultiplyTexture != null)
            {
                material.pbrMetallicRoughness.baseColorTexture = new glTFMaterialBaseColorTextureInfo
                {
                    index = mtoon.Definition.Color.LitMultiplyTexture.ToIndex(textures).Value
                };
            }
            dst.ShadeFactor          = mtoon.Definition.Color.ShadeColor.ToFloat3();
            dst.ShadeMultiplyTexture = mtoon.Definition.Color.ShadeMultiplyTexture.ToIndex(textures);
            material.alphaCutoff     = mtoon.Definition.Color.CutoutThresholdValue;

            // Outline
            dst.OutlineColorMode               = (UniGLTF.Extensions.VRMC_materials_mtoon.OutlineColorMode)mtoon.Definition.Outline.OutlineColorMode;
            dst.OutlineFactor                  = mtoon.Definition.Outline.OutlineColor.ToFloat3();
            dst.OutlineLightingMixFactor       = mtoon.Definition.Outline.OutlineLightingMixValue;
            dst.OutlineScaledMaxDistanceFactor = mtoon.Definition.Outline.OutlineScaledMaxDistanceValue;
            dst.OutlineWidthMode               = (UniGLTF.Extensions.VRMC_materials_mtoon.OutlineWidthMode)mtoon.Definition.Outline.OutlineWidthMode;
            dst.OutlineWidthFactor             = mtoon.Definition.Outline.OutlineWidthValue;
            dst.OutlineWidthMultiplyTexture    = mtoon.Definition.Outline.OutlineWidthMultiplyTexture.ToIndex(textures);

            // Emission
            material.emissiveFactor = mtoon.Definition.Emission.EmissionColor.ToFloat3();
            if (mtoon.Definition.Emission.EmissionMultiplyTexture != null)
            {
                material.emissiveTexture = new glTFMaterialEmissiveTextureInfo
                {
                    index = textures.IndexOfNullable(mtoon.Definition.Emission.EmissionMultiplyTexture.Texture).Value
                };
            }

            // Light
            dst.GiIntensityFactor           = mtoon.Definition.Lighting.LightingInfluence.GiIntensityValue;
            dst.LightColorAttenuationFactor = mtoon.Definition.Lighting.LightingInfluence.LightColorAttenuationValue;
            dst.ShadingShiftFactor          = mtoon.Definition.Lighting.LitAndShadeMixing.ShadingShiftValue;
            dst.ShadingToonyFactor          = mtoon.Definition.Lighting.LitAndShadeMixing.ShadingToonyValue;
            if (mtoon.Definition.Lighting.Normal.NormalTexture != null)
            {
                material.normalTexture = new glTFMaterialNormalTextureInfo
                {
                    index = textures.IndexOfNullable(mtoon.Definition.Lighting.Normal.NormalTexture.Texture).Value,
                    scale = mtoon.Definition.Lighting.Normal.NormalScaleValue
                };
            }

            // matcap
            dst.AdditiveTexture = mtoon.Definition.MatCap.AdditiveTexture.ToIndex(textures);

            // rendering
            switch (mtoon.Definition.Rendering.CullMode)
            {
            case CullMode.Back:
                material.doubleSided = false;
                break;

            case CullMode.Off:
                material.doubleSided = true;
                break;

            case CullMode.Front:
                // GLTF not support
                material.doubleSided = false;
                break;

            default:
                throw new NotImplementedException();
            }
            (material.alphaMode, dst.TransparentWithZWrite) = GetRenderMode(mtoon.Definition.Rendering.RenderMode);
            dst.RenderQueueOffsetNumber = mtoon.Definition.Rendering.RenderQueueOffsetNumber;

            // rim
            dst.RimFactor             = mtoon.Definition.Rim.RimColor.ToFloat3();
            dst.RimMultiplyTexture    = mtoon.Definition.Rim.RimMultiplyTexture.ToIndex(textures);
            dst.RimLiftFactor         = mtoon.Definition.Rim.RimLiftValue;
            dst.RimFresnelPowerFactor = mtoon.Definition.Rim.RimFresnelPowerValue;
            dst.RimLightingMixFactor  = mtoon.Definition.Rim.RimLightingMixValue;

            // texture option
            dst.UvAnimationMaskTexture         = mtoon.Definition.TextureOption.UvAnimationMaskTexture.ToIndex(textures);
            dst.UvAnimationRotationSpeedFactor = mtoon.Definition.TextureOption.UvAnimationRotationSpeedValue;
            dst.UvAnimationScrollXSpeedFactor  = mtoon.Definition.TextureOption.UvAnimationScrollXSpeedValue;
            dst.UvAnimationScrollYSpeedFactor  = mtoon.Definition.TextureOption.UvAnimationScrollYSpeedValue;
            if (material.pbrMetallicRoughness.baseColorTexture != null)
            {
                var offset = mtoon.Definition.TextureOption.MainTextureLeftBottomOriginOffset;
                var scale  = mtoon.Definition.TextureOption.MainTextureLeftBottomOriginScale;
                glTF_KHR_texture_transform.Serialize(
                    material.pbrMetallicRoughness.baseColorTexture,
                    (offset.X, offset.Y),
                    (scale.X, scale.Y)
                    );
            }

            UniGLTF.Extensions.VRMC_materials_mtoon.GltfSerializer.SerializeTo(ref material.extensions, dst);

            return(material);
        }
        public static VrmProtobuf.Material MToonToGltf(this MToonMaterial mtoon, List <Texture> textures)
        {
            var material = mtoon.UnlitToGltf(textures);

            // Unlitも有効にする
            // material.Extensions.KHRMaterialsUnlit = null;

            var dst = new VrmProtobuf.VRMC_materials_mtoon();

            material.Extensions.VRMCMaterialsMtoon = dst;

            // Color
            dst.LitFactor.Assign(mtoon.Definition.Color.LitColor);
            dst.LitMultiplyTexture = mtoon.Definition.Color.LitMultiplyTexture.ToIndex(textures);
            dst.ShadeFactor.Assign(mtoon.Definition.Color.ShadeColor);
            dst.ShadeMultiplyTexture  = mtoon.Definition.Color.ShadeMultiplyTexture.ToIndex(textures);
            dst.CutoutThresholdFactor = mtoon.Definition.Color.CutoutThresholdValue;

            // Outline
            dst.OutlineColorMode = (VrmProtobuf.VRMC_materials_mtoon.Types.OutlineColorMode)mtoon.Definition.Outline.OutlineColorMode;
            dst.OutlineFactor.Assign(mtoon.Definition.Outline.OutlineColor);
            dst.OutlineLightingMixFactor       = mtoon.Definition.Outline.OutlineLightingMixValue;
            dst.OutlineScaledMaxDistanceFactor = mtoon.Definition.Outline.OutlineScaledMaxDistanceValue;
            dst.OutlineWidthMode            = (VrmProtobuf.VRMC_materials_mtoon.Types.OutlineWidthMode)mtoon.Definition.Outline.OutlineWidthMode;
            dst.OutlineWidthFactor          = mtoon.Definition.Outline.OutlineWidthValue;
            dst.OutlineWidthMultiplyTexture = mtoon.Definition.Outline.OutlineWidthMultiplyTexture.ToIndex(textures);

            // Emission
            dst.EmissionFactor.Assign(mtoon.Definition.Emission.EmissionColor);
            dst.EmissionMultiplyTexture = mtoon.Definition.Emission.EmissionMultiplyTexture.ToIndex(textures);
            if (mtoon.Definition.Emission.EmissionMultiplyTexture != null)
            {
                material.EmissiveTexture = new VrmProtobuf.TextureInfo
                {
                    Index = textures.IndexOfNullable(mtoon.Definition.Emission.EmissionMultiplyTexture.Texture)
                };
            }

            // Light
            dst.GiIntensityFactor           = mtoon.Definition.Lighting.LightingInfluence.GiIntensityValue;
            dst.LightColorAttenuationFactor = mtoon.Definition.Lighting.LightingInfluence.LightColorAttenuationValue;
            dst.ShadingShiftFactor          = mtoon.Definition.Lighting.LitAndShadeMixing.ShadingShiftValue;
            dst.ShadingToonyFactor          = mtoon.Definition.Lighting.LitAndShadeMixing.ShadingToonyValue;
            dst.NormalScaleFactor           = mtoon.Definition.Lighting.Normal.NormalScaleValue;
            dst.NormalTexture = mtoon.Definition.Lighting.Normal.NormalTexture.ToIndex(textures);
            if (mtoon.Definition.Lighting.Normal.NormalTexture != null)
            {
                material.NormalTexture = new VrmProtobuf.MaterialNormalTextureInfo
                {
                    Index = textures.IndexOfNullable(mtoon.Definition.Lighting.Normal.NormalTexture.Texture)
                };
            }

            // matcap
            dst.AdditiveTexture = mtoon.Definition.MatCap.AdditiveTexture.ToIndex(textures);

            // rendering
            dst.CullMode = (VrmProtobuf.VRMC_materials_mtoon.Types.CullMode)mtoon.Definition.Rendering.CullMode;
            switch (mtoon.Definition.Rendering.CullMode)
            {
            case CullMode.Back:
                material.DoubleSided = false;
                break;

            case CullMode.Off:
                material.DoubleSided = true;
                break;

            case CullMode.Front:
                // GLTF not support
                material.DoubleSided = false;
                break;

            default:
                throw new NotImplementedException();
            }
            dst.RenderMode = (VrmProtobuf.VRMC_materials_mtoon.Types.RenderMode)mtoon.Definition.Rendering.RenderMode;
            dst.RenderQueueOffsetNumber = mtoon.Definition.Rendering.RenderQueueOffsetNumber;

            // rim
            dst.RimFactor.Assign(mtoon.Definition.Rim.RimColor);
            dst.RimMultiplyTexture    = mtoon.Definition.Rim.RimMultiplyTexture.ToIndex(textures);
            dst.RimLiftFactor         = mtoon.Definition.Rim.RimLiftValue;
            dst.RimFresnelPowerFactor = mtoon.Definition.Rim.RimFresnelPowerValue;
            dst.RimLightingMixFactor  = mtoon.Definition.Rim.RimLightingMixValue;

            // texture option
            dst.UvAnimationMaskTexture         = mtoon.Definition.TextureOption.UvAnimationMaskTexture.ToIndex(textures);
            dst.UvAnimationRotationSpeedFactor = mtoon.Definition.TextureOption.UvAnimationRotationSpeedValue;
            dst.UvAnimationScrollXSpeedFactor  = mtoon.Definition.TextureOption.UvAnimationScrollXSpeedValue;
            dst.UvAnimationScrollYSpeedFactor  = mtoon.Definition.TextureOption.UvAnimationScrollYSpeedValue;
            dst.MainTextureLeftBottomOriginOffset.Assign(mtoon.Definition.TextureOption.MainTextureLeftBottomOriginOffset);
            dst.MainTextureLeftBottomOriginScale.Assign(mtoon.Definition.TextureOption.MainTextureLeftBottomOriginScale);

            return(material);
        }
        public static MToonMaterial MToonFromGltf(VrmProtobuf.Material material, List <Texture> textures)
        {
            var mtoon     = new MToonMaterial(material.Name);
            var extension = material.Extensions.VRMCMaterialsMtoon;

            mtoon.Definition = new MToonDefinition
            {
                Meta = new MetaDefinition
                {
                    Implementation = "Santarh/MToon",
                },
                Color = new ColorDefinition
                {
                    LitColor             = extension.LitFactor.ToLinearColor(Nan),
                    LitMultiplyTexture   = extension.LitMultiplyTexture.GetTexture(textures),
                    ShadeColor           = extension.ShadeFactor.ToLinearColor(Nan),
                    ShadeMultiplyTexture = extension.ShadeMultiplyTexture.GetTexture(textures),
                    CutoutThresholdValue = extension.CutoutThresholdFactor,
                },
                Outline = new OutlineDefinition
                {
                    OutlineColorMode              = (OutlineColorMode)extension.OutlineColorMode,
                    OutlineColor                  = extension.OutlineFactor.ToLinearColor(Nan),
                    OutlineLightingMixValue       = extension.OutlineLightingMixFactor,
                    OutlineScaledMaxDistanceValue = extension.OutlineScaledMaxDistanceFactor,
                    OutlineWidthMode              = (OutlineWidthMode)extension.OutlineWidthMode,
                    OutlineWidthValue             = extension.OutlineWidthFactor,
                    OutlineWidthMultiplyTexture   = extension.OutlineWidthMultiplyTexture.GetTexture(textures),
                },
                Emission = new EmissionDefinition
                {
                    EmissionColor           = extension.EmissionFactor.ToLinearColor(Nan),
                    EmissionMultiplyTexture = extension.EmissionMultiplyTexture.GetTexture(textures),
                },
                Lighting = new LightingDefinition
                {
                    LightingInfluence = new LightingInfluenceDefinition
                    {
                        GiIntensityValue           = extension.GiIntensityFactor,
                        LightColorAttenuationValue = extension.LightColorAttenuationFactor,
                    },
                    LitAndShadeMixing = new LitAndShadeMixingDefinition
                    {
                        ShadingShiftValue = extension.ShadingShiftFactor,
                        ShadingToonyValue = extension.ShadingToonyFactor,
                    },
                    Normal = new NormalDefinition
                    {
                        NormalScaleValue = extension.NormalScaleFactor,
                        NormalTexture    = extension.NormalTexture.GetTexture(textures),
                    },
                },
                MatCap = new MatCapDefinition
                {
                    AdditiveTexture = extension.AdditiveTexture.GetTexture(textures)
                },
                Rendering = new RenderingDefinition
                {
                    CullMode   = (CullMode)extension.CullMode,
                    RenderMode = (RenderMode)extension.RenderMode,
                    RenderQueueOffsetNumber = extension.RenderQueueOffsetNumber,
                },
                Rim = new RimDefinition
                {
                    RimColor             = extension.RimFactor.ToLinearColor(Nan),
                    RimMultiplyTexture   = extension.RimMultiplyTexture.GetTexture(textures),
                    RimLiftValue         = extension.RimLiftFactor,
                    RimFresnelPowerValue = extension.RimFresnelPowerFactor,
                    RimLightingMixValue  = extension.RimLightingMixFactor,
                },
                TextureOption = new TextureUvCoordsDefinition
                {
                    UvAnimationMaskTexture            = extension.UvAnimationMaskTexture.GetTexture(textures),
                    UvAnimationRotationSpeedValue     = extension.UvAnimationRotationSpeedFactor,
                    UvAnimationScrollXSpeedValue      = extension.UvAnimationScrollXSpeedFactor,
                    UvAnimationScrollYSpeedValue      = extension.UvAnimationScrollYSpeedFactor,
                    MainTextureLeftBottomOriginOffset = extension.MainTextureLeftBottomOriginOffset.ToVector2(),
                    MainTextureLeftBottomOriginScale  = extension.MainTextureLeftBottomOriginScale.ToVector2(),
                },
            };

            return(mtoon);
        }