public static BlendShapeManager FromGltf(this VrmBlendShapeMaster master, List <MeshGroup> meshes, List <Material> materials, List <Node> nodes) { var manager = new BlendShapeManager(); manager.BlendShapeList.AddRange(master.blendShapeGroups.Select(x => { var expression = new BlendShape(x.presetName.FromGltf(), x.name, x.isBinary); expression.BlendShapeValues.AddRange( x.binds.Select(y => { var group = meshes[y.mesh]; var node = nodes.First(z => z.MeshGroup == group); var blendShapeName = group.Meshes[0].MorphTargets[y.index].Name; var value = new BlendShapeBindValue(node, blendShapeName, y.weight); return(value); })); expression.MaterialValues.AddRange( x.materialValues.Select(y => { var material = materials.First(z => z.Name == y.materialName); var target = new Vector4(y.targetValue[0], y.targetValue[1], y.targetValue[2], y.targetValue[3]); var value = new MaterialBindValue(material, y.propertyName, target); return(value); })); return(expression); })); return(manager); }
public static BlendShapeManager FromGltf(this VrmProtobuf.BlendShape master, List <VrmLib.Node> nodes, List <VrmLib.Material> materials) { var manager = new BlendShapeManager(); foreach (var x in master.BlendShapeGroups) { VrmLib.BlendShape expression = FromGltf(x, nodes, materials); manager.BlendShapeList.Add(expression); } ; return(manager); }
public static BlendShapeManager FromGltf(this VrmBlendShapeMaster master, List <MeshGroup> meshes, List <Material> materials, List <Node> nodes) { var manager = new BlendShapeManager(); manager.BlendShapeList.AddRange(master.blendShapeGroups.Select(x => { var expression = new BlendShape(x.presetName.FromGltf(), x.name, x.isBinary); expression.BlendShapeValues.AddRange( x.binds.Select(y => { var group = meshes[y.mesh]; var node = nodes.First(z => z.MeshGroup == group); var blendShapeName = group.Meshes[0].MorphTargets[y.index].Name; var value = new BlendShapeBindValue(node, blendShapeName, y.weight); return(value); })); /// VRM-0.X の MaterialBindValue を VRM-1.0 仕様に変換する foreach (var y in x.materialValues) { var material = materials.First(z => z.Name == y.materialName); if (y.propertyName.EndsWith("_ST")) { expression.UVScaleOffsetValues.Add(new UVScaleOffsetValue(material, new Vector2(y.targetValue[0], y.targetValue[1]), new Vector2(y.targetValue[2], y.targetValue[3]))); } else if (y.propertyName.EndsWith("_ST_S")) { expression.UVScaleOffsetValues.Add(new UVScaleOffsetValue(material, new Vector2(y.targetValue[0], 1), new Vector2(y.targetValue[2], 0))); } else if (y.propertyName.EndsWith("_ST_T")) { expression.UVScaleOffsetValues.Add(new UVScaleOffsetValue(material, new Vector2(1, y.targetValue[1]), new Vector2(0, y.targetValue[3]))); } else { var bindType = material.GetBindType(y.propertyName); var target = new Vector4(y.targetValue[0], y.targetValue[1], y.targetValue[2], y.targetValue[3]); expression.MaterialValues.Add(new MaterialBindValue(material, bindType, target)); } } return(expression); })); return(manager); }
public static VrmProtobuf.BlendShape ToGltf(this BlendShapeManager src, List <VrmLib.Node> nodes, List <VrmLib.Material> materials) { var blendShape = new VrmProtobuf.BlendShape { }; if (src != null) { foreach (var x in src.BlendShapeList) { blendShape.BlendShapeGroups.Add(x.ToGltf(nodes, materials)); } } return(blendShape); }
public static BlendShapeManager FromGltf(this VrmProtobuf.BlendShape master, List <MeshGroup> meshes, List <Material> materials) { var manager = new BlendShapeManager(); manager.BlendShapeList.AddRange(master.BlendShapeGroups.Select(x => { var expression = new BlendShape((VrmLib.BlendShapePreset)x.Preset, x.Name, x.IsBinary.HasValue && x.IsBinary.Value); expression.BlendShapeValues.AddRange( x.Binds.Select(y => { var group = meshes[y.Mesh]; var blendShapeName = group.Meshes[0].MorphTargets[y.Index].Name; var value = new BlendShapeBindValue(group, blendShapeName, y.Weight); return(value); })); expression.MaterialValues.AddRange( x.MaterialValues.Select(y => { var material = materials[y.Material]; Vector4 target = default; if (y.TargetValue.Count > 0) { target.X = y.TargetValue[0]; } if (y.TargetValue.Count > 1) { target.Y = y.TargetValue[1]; } if (y.TargetValue.Count > 2) { target.Z = y.TargetValue[2]; } if (y.TargetValue.Count > 3) { target.W = y.TargetValue[3]; } var value = new MaterialBindValue(material, EnumUtil.Parse <MaterialBindType>(y.Type.ToString()), target); return(value); })); return(expression); })); return(manager); }
public void ExportVrmBlendShape(BlendShapeManager src, List <MeshGroup> meshes, List <Material> materials) { Gltf.Extensions.VRMCVrm.BlendShape = src.ToGltf(meshes, materials); }