示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
 public void ExportVrmBlendShape(BlendShapeManager src, List <MeshGroup> meshes, List <Material> materials)
 {
     Gltf.Extensions.VRMCVrm.BlendShape = src.ToGltf(meshes, materials);
 }