babylon.glTFLoaderExtension.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /// <reference path="../../../../dist/preview release/babylon.d.ts"/>
  2. module BABYLON.GLTF2 {
  3. /**
  4. * Abstract class that can be implemented to extend existing gltf loader behavior.
  5. */
  6. export abstract class GLTFLoaderExtension implements IGLTFLoaderExtension, IDisposable {
  7. public enabled = true;
  8. public abstract readonly name: string;
  9. protected _loader: GLTFLoader;
  10. constructor(loader: GLTFLoader) {
  11. this._loader = loader;
  12. }
  13. public dispose(): void {
  14. delete this._loader;
  15. }
  16. // #region Overridable Methods
  17. /** Override this method to modify the default behavior for loading scenes. */
  18. protected _loadSceneAsync(context: string, node: ILoaderScene): Nullable<Promise<void>> { return null; }
  19. /** Override this method to modify the default behavior for loading nodes. */
  20. protected _loadNodeAsync(context: string, node: ILoaderNode): Nullable<Promise<void>> { return null; }
  21. /** Override this method to modify the default behavior for loading mesh primitive vertex data. */
  22. protected _loadVertexDataAsync(context: string, primitive: ILoaderMeshPrimitive, babylonMesh: Mesh): Nullable<Promise<Geometry>> { return null; }
  23. /** Override this method to modify the default behavior for loading materials. */
  24. protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>> { return null; }
  25. /** Override this method to modify the default behavior for loading uris. */
  26. protected _loadUriAsync(context: string, uri: string): Nullable<Promise<ArrayBufferView>> { return null; }
  27. // #endregion
  28. /** Helper method called by a loader extension to load an glTF extension. */
  29. protected _loadExtensionAsync<TProperty, TResult = void>(context: string, property: IProperty, actionAsync: (extensionContext: string, extension: TProperty) => Promise<TResult>): Nullable<Promise<TResult>> {
  30. if (!property.extensions) {
  31. return null;
  32. }
  33. const extensions = property.extensions;
  34. const extension = extensions[this.name] as TProperty;
  35. if (!extension) {
  36. return null;
  37. }
  38. // Clear out the extension before executing the action to avoid recursing into the same property.
  39. delete extensions[this.name];
  40. try {
  41. return actionAsync(`${context}/extensions/${this.name}`, extension);
  42. }
  43. finally {
  44. // Restore the extension after executing the action.
  45. extensions[this.name] = extension;
  46. }
  47. }
  48. /** Helper method called by the loader to allow extensions to override loading scenes. */
  49. public static _LoadSceneAsync(loader: GLTFLoader, context: string, scene: ILoaderScene): Nullable<Promise<void>> {
  50. return loader._applyExtensions(extension => extension._loadSceneAsync(context, scene));
  51. }
  52. /** Helper method called by the loader to allow extensions to override loading nodes. */
  53. public static _LoadNodeAsync(loader: GLTFLoader, context: string, node: ILoaderNode): Nullable<Promise<void>> {
  54. return loader._applyExtensions(extension => extension._loadNodeAsync(context, node));
  55. }
  56. /** Helper method called by the loader to allow extensions to override loading mesh primitive vertex data. */
  57. public static _LoadVertexDataAsync(loader: GLTFLoader, context: string, primitive: ILoaderMeshPrimitive, babylonMesh: Mesh): Nullable<Promise<Geometry>> {
  58. return loader._applyExtensions(extension => extension._loadVertexDataAsync(context, primitive, babylonMesh));
  59. }
  60. /** Helper method called by the loader to allow extensions to override loading materials. */
  61. public static _LoadMaterialAsync(loader: GLTFLoader, context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>> {
  62. return loader._applyExtensions(extension => extension._loadMaterialAsync(context, material, babylonMesh, babylonDrawMode, assign));
  63. }
  64. /** Helper method called by the loader to allow extensions to override loading uris. */
  65. public static _LoadUriAsync(loader: GLTFLoader, context: string, uri: string): Nullable<Promise<ArrayBufferView>> {
  66. return loader._applyExtensions(extension => extension._loadUriAsync(context, uri));
  67. }
  68. }
  69. }