diff --git a/Assets/VRM10/Runtime/Migration/Materials/MigrationMToonMaterial.cs b/Assets/VRM10/Runtime/Migration/Materials/MigrationMToonMaterial.cs index e1c3a208e..9079d505e 100644 --- a/Assets/VRM10/Runtime/Migration/Materials/MigrationMToonMaterial.cs +++ b/Assets/VRM10/Runtime/Migration/Materials/MigrationMToonMaterial.cs @@ -353,6 +353,7 @@ namespace UniVRM10 ); } } + // TODO: ミスってる? dst.UvAnimationRotationSpeedFactor = mtoon.Definition.TextureOption.UvAnimationRotationSpeedValue; dst.UvAnimationScrollXSpeedFactor = mtoon.Definition.TextureOption.UvAnimationScrollXSpeedValue; const float invertY = -1f; diff --git a/Assets/VRMShaders/VRM10/MToon10/Editor/EditorMenu.cs b/Assets/VRMShaders/VRM10/MToon10/Editor/EditorMenu.cs new file mode 100644 index 000000000..9500bb8e3 --- /dev/null +++ b/Assets/VRMShaders/VRM10/MToon10/Editor/EditorMenu.cs @@ -0,0 +1,36 @@ +using UnityEditor; +using UnityEngine; + +namespace VRMShaders.VRM10.MToon10.Editor +{ + internal static class EditorMenu + { + [MenuItem("Assets/VRM10/MToon -> MToon10 Migration", isValidateFunction: true, priority: 910)] + private static bool MigrateMToonMaterialValidation() + { + if (Selection.activeObject is Material material) + { + return material.shader != null && material.shader.name == "VRM/MToon"; + } + return false; + } + + [MenuItem("Assets/VRM10/MToon -> MToon10 Migration", isValidateFunction: false, priority: 910)] + private static void MigrateMToonMaterial() + { + if (Selection.activeObject is Material material) + { + Undo.RecordObject(material, nameof(MigrateMToonMaterial)); + var migrator = new MToonMaterialMigrator(); + if (migrator.TryMigrate(material)) + { + Debug.Log($"Migrated {material.name} to MToon10"); + } + else + { + Debug.LogWarning($"Failed to migrate {material.name} to MToon10"); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/VRMShaders/VRM10/MToon10/Editor/EditorMenu.cs.meta b/Assets/VRMShaders/VRM10/MToon10/Editor/EditorMenu.cs.meta new file mode 100644 index 000000000..edaa5a497 --- /dev/null +++ b/Assets/VRMShaders/VRM10/MToon10/Editor/EditorMenu.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bd9f851945dd4e66ad4fbd6c92f6b27e +timeCreated: 1716646767 \ No newline at end of file diff --git a/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonMaterialMigrator.cs b/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonMaterialMigrator.cs new file mode 100644 index 000000000..cd108c9af --- /dev/null +++ b/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonMaterialMigrator.cs @@ -0,0 +1,130 @@ +using System; +using UnityEngine; +using VRMShaders.VRM10.MToon10.Runtime; +using VRMShaders.VRM10.MToon10.Runtime.MToon0X; +using Object = UnityEngine.Object; + +namespace VRMShaders.VRM10.MToon10.Editor +{ + public sealed class MToonMaterialMigrator + { + public MToonMaterialMigrator() + { + + } + + public bool TryMigrate(Material material, bool validateShaderName = true) + { + var tempMat = new Material(Shader.Find("VRM10/MToon10")); + try + { + if (validateShaderName && material.shader.name != MToon0XUtils.ShaderName) + { + throw new ArgumentException($"The shader of the material is not {MToon0XUtils.ShaderName}"); + } + + var src = MToon0XUtils.GetMToonParametersFromMaterial(material); + var dst = new MToon10Context(tempMat); + + dst.AlphaMode = src.Rendering.RenderMode switch + { + MToon0XRenderMode.Opaque => MToon10AlphaMode.Opaque, + MToon0XRenderMode.Cutout => MToon10AlphaMode.Cutout, + MToon0XRenderMode.Transparent => MToon10AlphaMode.Transparent, + MToon0XRenderMode.TransparentWithZWrite => MToon10AlphaMode.Transparent, + _ => throw new ArgumentOutOfRangeException() + }; + dst.TransparentWithZWriteMode = src.Rendering.RenderMode switch + { + MToon0XRenderMode.Opaque => MToon10TransparentWithZWriteMode.Off, + MToon0XRenderMode.Cutout => MToon10TransparentWithZWriteMode.Off, + MToon0XRenderMode.Transparent => MToon10TransparentWithZWriteMode.Off, + MToon0XRenderMode.TransparentWithZWrite => MToon10TransparentWithZWriteMode.On, + _ => throw new ArgumentOutOfRangeException() + }; + dst.AlphaCutoff = src.Color.CutoutThresholdValue; + dst.RenderQueueOffsetNumber = src.Rendering.RenderQueueOffsetNumber; // NOTE: Breaking Change + dst.DoubleSidedMode = src.Rendering.CullMode switch + { + MToon0XCullMode.Back => MToon10DoubleSidedMode.Off, + MToon0XCullMode.Off => MToon10DoubleSidedMode.On, + MToon0XCullMode.Front => MToon10DoubleSidedMode.On, // NOTE: Breaking Change + _ => throw new ArgumentOutOfRangeException() + }; + dst.BaseColorFactorSrgb = src.Color.LitColor; // NOTE: gamma -> gamma + dst.BaseColorTexture = src.Color.LitMultiplyTexture; + dst.ShadeColorFactorSrgb = src.Color.ShadeColor; // NOTE: gamma -> gamma + dst.ShadeColorTexture = src.Color.ShadeMultiplyTexture; + dst.NormalTexture = src.Lighting.Normal.NormalTexture; + dst.NormalTextureScale = src.Lighting.Normal.NormalScaleValue; + dst.ShadingShiftFactor = MToon10Migrator.MigrateToShadingShift(src.Lighting.LitAndShadeMixing.ShadingToonyValue, src.Lighting.LitAndShadeMixing.ShadingShiftValue); + dst.ShadingShiftTexture = src.Lighting.LitAndShadeMixing.LitAndShadeMixingMultiplierMultiplyTexture; + dst.ShadingShiftTexture = null; + dst.ShadingShiftTextureScale = 1f; + dst.ShadingToonyFactor = MToon10Migrator.MigrateToShadingToony(src.Lighting.LitAndShadeMixing.ShadingToonyValue, src.Lighting.LitAndShadeMixing.ShadingShiftValue); + dst.GiEqualizationFactor = MToon10Migrator.MigrateToGiEqualization(src.Lighting.LightingInfluence.GiIntensityValue); + dst.EmissiveFactorLinear = src.Emission.EmissionColor; // NOTE: linear -> linear + dst.EmissiveTexture = src.Emission.EmissionMultiplyTexture; + dst.MatcapColorFactorSrgb = src.MatCap.AdditiveTexture != null ? new Color(1, 1, 1) : new Color(0, 0, 0); // NOTE: gamma -> gamma + dst.MatcapTexture = src.MatCap.AdditiveTexture; + dst.ParametricRimColorFactorSrgb = src.Rim.RimColor; // NOTE: gamma -> gamma + dst.ParametricRimFresnelPowerFactor = src.Rim.RimFresnelPowerValue; + dst.ParametricRimLiftFactor = src.Rim.RimLiftValue; + dst.RimMultiplyTexture = src.Rim.RimMultiplyTexture; + dst.RimLightingMixFactor = 1.0f; // NOTE: Breaking Change + dst.OutlineWidthMode = src.Outline.OutlineWidthMode switch + { + MToon0XOutlineWidthMode.None => MToon10OutlineMode.None, + MToon0XOutlineWidthMode.WorldCoordinates => MToon10OutlineMode.World, + MToon0XOutlineWidthMode.ScreenCoordinates => MToon10OutlineMode.Screen, + _ => throw new ArgumentOutOfRangeException() + }; + const float centimeterToMeter = 0.01f; + const float oneHundredth = 0.01f; + dst.OutlineWidthFactor = src.Outline.OutlineWidthMode switch + { + MToon0XOutlineWidthMode.None => 0f, + MToon0XOutlineWidthMode.WorldCoordinates => src.Outline.OutlineWidthValue * centimeterToMeter, + MToon0XOutlineWidthMode.ScreenCoordinates => src.Outline.OutlineWidthValue * oneHundredth * 0.5f, + _ => throw new ArgumentOutOfRangeException() + }; + dst.OutlineWidthMultiplyTexture = src.Outline.OutlineWidthMultiplyTexture; + dst.OutlineColorFactorSrgb = src.Outline.OutlineColor; // NOTE: gamma -> gamma + dst.OutlineLightingMixFactor = src.Outline.OutlineColorMode switch + { + MToon0XOutlineColorMode.FixedColor => 0f, + MToon0XOutlineColorMode.MixedLighting => src.Outline.OutlineLightingMixValue, + _ => throw new ArgumentOutOfRangeException() + }; + dst.UvAnimationMaskTexture = src.TextureOption.UvAnimationMaskTexture; + dst.UvAnimationScrollXSpeedFactor = src.TextureOption.UvAnimationScrollXSpeedValue; + dst.UvAnimationScrollYSpeedFactor = src.TextureOption.UvAnimationScrollYSpeedValue; + dst.UvAnimationRotationSpeedFactor = src.TextureOption.UvAnimationRotationSpeedValue; + dst.TextureScale = src.TextureOption.MainTextureLeftBottomOriginScale; + dst.TextureOffset = src.TextureOption.MainTextureLeftBottomOriginOffset; + + dst.Validate(); + + material.shader = tempMat.shader; + material.CopyPropertiesFromMaterial(tempMat); + return true; + } + catch (Exception ex) + { + Debug.LogException(ex); + return false; + } + finally + { + if (Application.isPlaying) + { + Object.Destroy(tempMat); + } + else + { + Object.DestroyImmediate(tempMat); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonMaterialMigrator.cs.meta b/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonMaterialMigrator.cs.meta new file mode 100644 index 000000000..65960b045 --- /dev/null +++ b/Assets/VRMShaders/VRM10/MToon10/Runtime/MToonMaterialMigrator.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2f7043f8da8e43e9bae0ac3013610ba5 +timeCreated: 1716646837 \ No newline at end of file