diff --git a/Assets/VRM10/Runtime/IO/ExpressionExtensions.cs b/Assets/VRM10/Runtime/IO/ExpressionExtensions.cs index 2ede6c0f4..2ec227f5d 100644 --- a/Assets/VRM10/Runtime/IO/ExpressionExtensions.cs +++ b/Assets/VRM10/Runtime/IO/ExpressionExtensions.cs @@ -1,4 +1,6 @@ +using System.Collections.Generic; using UniGLTF.Extensions.VRMC_vrm; +using UnityEngine; namespace UniVRM10 { @@ -17,5 +19,67 @@ namespace UniVRM10 ; return $"Expression.{key}"; } + + public static UniVRM10.MorphTargetBinding Build10(this MorphTargetBind bind, GameObject root, ModelMap loader, VrmLib.Model model) + { + var libNode = model.Nodes[bind.Node.Value]; + var node = loader.Nodes[libNode].transform; + var mesh = loader.Meshes[libNode.MeshGroup]; + var relativePath = node.RelativePathFrom(root.transform); + // VRM-1.0 では値域は [0-1.0f] + return new UniVRM10.MorphTargetBinding(relativePath, bind.Index.Value, bind.Weight.Value * 100.0f); + } + + // static UniVRM10.MaterialColorBinding? Build10(this MaterialColorBind bind, ModelMap loader) + // { + // var kv = bind.Property; + // var value = kv.Value.ToUnityVector4(); + // var material = loader.Materials[bind.Material]; + + // var binding = default(UniVRM10.MaterialColorBinding?); + // if (material != null) + // { + // try + // { + // binding = new UniVRM10.MaterialColorBinding + // { + // MaterialName = bind.Material.Name, // UniVRM-0Xの実装は名前で持っている + // BindType = bind.BindType, + // TargetValue = value, + // // BaseValue = material.GetColor(kv.Key), + // }; + // } + // catch (Exception) + // { + // // do nothing + // } + // } + // return binding; + // } + + // static UniVRM10.MaterialUVBinding? Build10(this VrmLib.TextureTransformBind bind, ModelMap loader) + // { + // var material = loader.Materials[bind.Material]; + + // var binding = default(UniVRM10.MaterialUVBinding?); + // if (material != null) + // { + // try + // { + // binding = new UniVRM10.MaterialUVBinding + // { + // MaterialName = bind.Material.Name, // UniVRM-0Xの実装は名前で持っている + // Scaling = new Vector2(bind.Scale.X, bind.Scale.Y), + // Offset = new Vector2(bind.Offset.X, bind.Offset.Y), + // }; + // } + // catch (Exception) + // { + // // do nothing + // } + // } + // return binding; + // } + } } diff --git a/Assets/VRM10/Runtime/IO/RuntimeUnityBuilder.cs b/Assets/VRM10/Runtime/IO/RuntimeUnityBuilder.cs index 64d12ba65..a36525152 100644 --- a/Assets/VRM10/Runtime/IO/RuntimeUnityBuilder.cs +++ b/Assets/VRM10/Runtime/IO/RuntimeUnityBuilder.cs @@ -237,6 +237,18 @@ namespace UniVRM10 clip.OverrideBlink = expression.OverrideBlink; clip.OverrideLookAt = expression.OverrideLookAt; clip.OverrideMouth = expression.OverrideMouth; + + clip.MorphTargetBindings = expression.MorphTargetBinds.Select(x => x.Build10(Root, m_asset.Map, m_model)) + .ToArray(); + // clip.MaterialColorBindings = expression.MaterialColorBinds.Select(x => x.Build10(asset.Map)) + // .Where(x => x.HasValue) + // .Select(x => x.Value) + // .ToArray(); + // clip.MaterialUVBindings = expression.TextureTransformBinds.Select(x => x.Build10(asset.Map)) + // .Where(x => x.HasValue) + // .Select(x => x.Value) + // .ToArray(); + m_exressionAvatar.Clips.Add(clip); } }