using System; using System.Collections.Generic; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace GLTF.Schema { /// /// Abstract class that stores a reference to the root GLTF object and an id /// of an object of type T inside it. /// /// The value type returned by the GLTFId reference. public abstract class GLTFId { public int Id; public GLTFRoot Root; public abstract T Value { get; } protected GLTFId() { } public GLTFId(GLTFId gltfId, GLTFRoot newRoot) { Id = gltfId.Id; Root = newRoot; } public void Serialize(JsonWriter writer) { writer.WriteValue(Id); } } public class AccessorId : GLTFId { public AccessorId() { } public AccessorId(AccessorId id, GLTFRoot newRoot) : base(id, newRoot) { } public override Accessor Value { get { return Root.Accessors[Id]; } } public static AccessorId Deserialize(GLTFRoot root, JsonReader reader) { return new AccessorId { Id = reader.ReadAsInt32().Value, Root = root }; } } public class BufferId : GLTFId { public BufferId() { } public BufferId(BufferId id, GLTFRoot newRoot) : base(id, newRoot) { } public override GLTFBuffer Value { get { return Root.Buffers[Id]; } } public static BufferId Deserialize(GLTFRoot root, JsonReader reader) { return new BufferId { Id = reader.ReadAsInt32().Value, Root = root }; } } public class BufferViewId : GLTFId { public BufferViewId() { } public BufferViewId(BufferViewId id, GLTFRoot newRoot) : base(id, newRoot) { } public override BufferView Value { get { return Root.BufferViews[Id]; } } public static BufferViewId Deserialize(GLTFRoot root, JsonReader reader) { return new BufferViewId { Id = reader.ReadAsInt32().Value, Root = root }; } } public class CameraId : GLTFId { public CameraId() { } public CameraId(CameraId id, GLTFRoot newRoot) : base(id, newRoot) { } public override GLTFCamera Value { get { return Root.Cameras[Id]; } } public static CameraId Deserialize(GLTFRoot root, JsonReader reader) { return new CameraId { Id = reader.ReadAsInt32().Value, Root = root }; } } public class ImageId : GLTFId { public ImageId() { } public ImageId(ImageId id, GLTFRoot newRoot) : base(id, newRoot) { } public override GLTFImage Value { get { return Root.Images[Id]; } } public static ImageId Deserialize(GLTFRoot root, JsonReader reader) { return new ImageId { Id = reader.ReadAsInt32().Value, Root = root }; } } public class MaterialId : GLTFId { public MaterialId() { } public MaterialId(MaterialId id, GLTFRoot newRoot) : base(id, newRoot) { } public override GLTFMaterial Value { get { return Root.Materials[Id]; } } public static MaterialId Deserialize(GLTFRoot root, JsonReader reader) { return new MaterialId { Id = reader.ReadAsInt32().Value, Root = root }; } } public class MeshId : GLTFId { public MeshId() { } public MeshId(MeshId id, GLTFRoot newRoot) : base(id, newRoot) { } public override GLTFMesh Value { get { return Root.Meshes[Id]; } } public static MeshId Deserialize(GLTFRoot root, JsonReader reader) { return new MeshId { Id = reader.ReadAsInt32().Value, Root = root }; } } public class NodeId : GLTFId { public NodeId() { } public NodeId(NodeId id, GLTFRoot newRoot) : base(id, newRoot) { } public override Node Value { get { return Root.Nodes[Id]; } } public static NodeId Deserialize(GLTFRoot root, JsonReader reader) { return new NodeId { Id = reader.ReadAsInt32().Value, Root = root }; } public static List ReadList(GLTFRoot root, JsonReader reader) { if (reader.Read() && reader.TokenType != JsonToken.StartArray) { throw new Exception("Invalid array."); } var list = new List(); while (reader.Read() && reader.TokenType != JsonToken.EndArray) { var node = new NodeId { Id = int.Parse(reader.Value.ToString()), Root = root }; list.Add(node); } return list; } } public class SamplerId : GLTFId { public SamplerId() { } public SamplerId(SamplerId id, GLTFRoot newRoot) : base(id, newRoot) { } public override Sampler Value { get { return Root.Samplers[Id]; } } public static SamplerId Deserialize(GLTFRoot root, JsonReader reader) { return new SamplerId { Id = reader.ReadAsInt32().Value, Root = root }; } } public class AnimationSamplerId : GLTFId { public GLTFAnimation GLTFAnimation; public override AnimationSampler Value { get { return GLTFAnimation.Samplers[Id]; } } public AnimationSamplerId () { } public AnimationSamplerId (AnimationSamplerId sampler, GLTFRoot root) { Id = sampler.Id; GLTFAnimation = sampler.GLTFAnimation; Root = root; } public static AnimationSamplerId Deserialize(GLTFRoot root, GLTFAnimation anim, JsonReader reader) { return new AnimationSamplerId { Id = reader.ReadAsInt32().Value, GLTFAnimation = anim, Root = root }; } } public class SceneId : GLTFId { public SceneId() { } public SceneId(SceneId id, GLTFRoot newRoot) : base(id, newRoot) { } public override GLTFScene Value { get { return Root.Scenes[Id]; } } public static SceneId Deserialize(GLTFRoot root, JsonReader reader) { return new SceneId { Id = reader.ReadAsInt32().Value, Root = root }; } } public class SkinId : GLTFId { public SkinId() { } public SkinId(SkinId id, GLTFRoot newRoot) : base(id, newRoot) { } public override Skin Value { get { return Root.Skins[Id]; } } public static SkinId Deserialize(GLTFRoot root, JsonReader reader) { return new SkinId { Id = reader.ReadAsInt32().Value, Root = root }; } } public class TextureId : GLTFId { public TextureId() { } public TextureId(TextureId id, GLTFRoot newRoot) : base(id, newRoot) { } public override GLTFTexture Value { get { return Root.Textures[Id]; } } public static TextureId Deserialize(GLTFRoot root, JsonReader reader) { return new TextureId { Id = reader.ReadAsInt32().Value, Root = root }; } public static TextureId Deserialize(GLTFRoot root, JProperty jProperty) { return new TextureId { Id = (int)jProperty.Value, Root = root }; } } public class LightId : GLTFId { public LightId() { } public LightId(LightId id, GLTFRoot newRoot) : base(id, newRoot) { } public override GLTFLight Value { get { return Root.Lights[Id]; } //should be extensions? } public static LightId Deserialize(GLTFRoot root, JsonReader reader) { return new LightId { Id = reader.ReadAsInt32().Value, Root = root }; } } }