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