using GLTF.Utilities; using Newtonsoft.Json.Linq; namespace GLTF.Schema { /// /// Additional interface for Root Extensions to support custom animation pointers /// public interface IImportAnimationPointerRootExtension { bool TryGetImportAnimationPointerData(GLTFRoot root, PointerPath pointerPath, out AnimationPointerData pointerData); } /// /// General interface for extensions /// public interface IExtension { /// /// Serializes the extension to a property /// /// JProperty of extension JProperty Serialize(); /// /// Clones the extension. When implementing note that root can be null if the extension is not attached to a GLTFChildOfRootProperty /// /// GLTFRoot is availible /// Cloned version of the extension IExtension Clone(GLTFRoot root); } /// /// Abstract class for factory which creates an extension. /// public abstract class ExtensionFactory { /// /// Name of the extension being created /// public string ExtensionName; /// /// Deserializes the input token /// /// Root node if needed for deserailization /// The token data /// public abstract IExtension Deserialize(GLTFRoot root, JProperty extensionToken); } /// /// Default implementation of extension in order to preserve any non explicitly overriden extension in the JSON /// public class DefaultExtension : IExtension { /// /// Extenion data as a JProperty /// public JProperty ExtensionData { get; internal set; } public IExtension Clone(GLTFRoot root) { return new DefaultExtension { ExtensionData = new JProperty(ExtensionData) }; } public JProperty Serialize() { return ExtensionData; } } /// /// Default implementation of ExtensionFactory to keep around any extensions not directly referenced /// public class DefaultExtensionFactory : ExtensionFactory { public override IExtension Deserialize(GLTFRoot root, JProperty extensionToken) { return new DefaultExtension { ExtensionData = extensionToken }; } } }