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 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); }