static Mesh FromGltf(Vrm10Storage storage, VrmProtobuf.Mesh x, VrmProtobuf.MeshPrimitive primitive, bool isShared) { var mesh = new Mesh((TopologyType)primitive.Mode.GetValueOrDefault()) { VertexBuffer = primitive.Attributes.FromGltf(storage) }; if (isShared) { // create joined index buffer mesh.IndexBuffer = storage.CreateAccessor(x.Primitives.Select(y => y.Indices.Value).ToArray()); } else { mesh.IndexBuffer = storage.CreateAccessor(primitive.Indices.Value); } { for (int i = 0; i < primitive.Targets.Count; ++i) { var gltfTarget = primitive.Targets[i]; string targetName = null; if (primitive.Extras != null && primitive.Extras.TargetNames != null && i < primitive.Extras.TargetNames.Count ) { targetName = primitive.Extras.TargetNames[i]; } var target = new MorphTarget(targetName) { VertexBuffer = gltfTarget.FromGltf(storage) }; // validate count foreach (var kv in target.VertexBuffer) { if (kv.Value.Count != mesh.VertexBuffer.Count) { throw new Exception(); } } mesh.MorphTargets.Add(target); } } return(mesh); }
public static VertexBuffer FromGltf(this global::Google.Protobuf.Collections.MapField <string, int> attributes, Vrm10Storage storage) { var b = new VertexBuffer(); foreach (var kv in attributes) { var accessor = storage.CreateAccessor(kv.Value); b.Add(kv.Key, accessor); } return(b); }