using System.Collections.Generic;
using System.Linq;
using GLTF.Extensions;
using Newtonsoft.Json;
namespace GLTF.Schema
{
///
/// A set of primitives to be rendered. A node can contain one or more meshes.
/// A node's transform places the mesh in the scene.
///
public class GLTFMesh : GLTFChildOfRootProperty
{
///
/// An array of primitives, each defining geometry to be rendered with
/// a material.
/// 1
///
public List Primitives;
///
/// Array of weights to be applied to the Morph Targets.
/// 0
///
public List Weights;
public List TargetNames;
public GLTFMesh()
{
}
public GLTFMesh(GLTFMesh mesh, GLTFRoot gltfRoot) : base(mesh, gltfRoot)
{
if (mesh == null) return;
if (mesh.Primitives != null)
{
Primitives = new List(mesh.Primitives.Count);
foreach (MeshPrimitive primitive in mesh.Primitives)
{
Primitives.Add(new MeshPrimitive(primitive, gltfRoot));
}
}
if (mesh.Weights != null)
{
Weights = mesh.Weights.ToList();
}
}
public static GLTFMesh Deserialize(GLTFRoot root, JsonReader reader)
{
var mesh = new GLTFMesh();
while (reader.Read() && reader.TokenType == JsonToken.PropertyName)
{
var curProp = reader.Value.ToString();
switch (curProp)
{
case "primitives":
mesh.Primitives = reader.ReadList(() => MeshPrimitive.Deserialize(root, reader));
break;
case "weights":
mesh.Weights = reader.ReadDoubleList();
break;
default:
mesh.DefaultPropertyDeserializer(root, reader);
break;
}
}
// GLTF does not support morph target names, serialize in extras for now
// https://github.com/KhronosGroup/glTF/issues/1036
if (mesh.Extras != null)
{
var extrasReader = mesh.Extras.CreateReader();
extrasReader.Read();
while (extrasReader.Read() && extrasReader.TokenType == JsonToken.PropertyName)
{
var extraProperty = extrasReader.Value.ToString();
switch (extraProperty)
{
case "targetNames":
mesh.TargetNames = extrasReader.ReadStringList();
break;
default:
extrasReader.Skip();
break;
}
}
extrasReader.Close();
}
return mesh;
}
public override void Serialize(JsonWriter writer)
{
writer.WriteStartObject();
if (Primitives != null && Primitives.Count > 0)
{
writer.WritePropertyName("primitives");
writer.WriteStartArray();
foreach (var primitive in Primitives)
{
primitive.Serialize(writer);
}
writer.WriteEndArray();
}
if (Weights != null && Weights.Count > 0)
{
writer.WritePropertyName("weights");
writer.WriteStartArray();
foreach (var weight in Weights)
{
writer.WriteValue(weight);
}
writer.WriteEndArray();
}
// GLTF does not support morph target names, serialize in extras for now
// https://github.com/KhronosGroup/glTF/issues/1036
if (TargetNames != null && TargetNames.Count > 0)
{
writer.WritePropertyName("extras");
writer.WriteStartObject();
writer.WritePropertyName("targetNames");
writer.WriteStartArray();
foreach (var targetName in TargetNames)
{
writer.WriteValue(targetName);
}
writer.WriteEndArray();
writer.WriteEndObject();
}
base.Serialize(writer);
writer.WriteEndObject();
}
}
}