babylon.glTFLoaderExtension.ts 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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. /**
  8. * Gets or sets a boolean indicating if the extension is enabled
  9. */
  10. public enabled = true;
  11. /**
  12. * Gets or sets extension name
  13. */
  14. public abstract readonly name: string;
  15. protected _loader: GLTFLoader;
  16. /**
  17. * Creates new GLTFLoaderExtension
  18. * @param loader defines the GLTFLoader to use
  19. */
  20. constructor(loader: GLTFLoader) {
  21. this._loader = loader;
  22. }
  23. /**
  24. * Release all resources
  25. */
  26. public dispose(): void {
  27. delete this._loader;
  28. }
  29. // #region Overridable Methods
  30. /**
  31. * Override this method to modify the default behavior for loading scenes.
  32. * @hidden
  33. */
  34. protected _loadSceneAsync(context: string, node: _ILoaderScene): Nullable<Promise<void>> { return null; }
  35. /**
  36. * Override this method to modify the default behavior for loading nodes.
  37. * @hidden
  38. */
  39. protected _loadNodeAsync(context: string, node: _ILoaderNode): Nullable<Promise<void>> { return null; }
  40. /**
  41. * Override this method to modify the default behavior for loading mesh primitive vertex data.
  42. * @hidden
  43. */
  44. protected _loadVertexDataAsync(context: string, primitive: _ILoaderMeshPrimitive, babylonMesh: Mesh): Nullable<Promise<Geometry>> { return null; }
  45. /**
  46. * Override this method to modify the default behavior for loading materials.
  47. * @hidden
  48. */
  49. protected _loadMaterialAsync(context: string, material: _ILoaderMaterial, mesh: _ILoaderMesh, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>> { return null; }
  50. /**
  51. * Override this method to modify the default behavior for loading material properties.
  52. * @hidden
  53. */
  54. protected _loadMaterialPropertiesAsync(context: string, material: _ILoaderMaterial, babylonMaterial: Material): Nullable<Promise<void>> { return null; }
  55. /**
  56. * Override this method to modify the default behavior for loading textures.
  57. * @hidden
  58. */
  59. protected _loadTextureAsync(context: string, textureInfo: ITextureInfo, assign: (texture: Texture) => void): Nullable<Promise<void>> { return null; }
  60. /**
  61. * Override this method to modify the default behavior for loading uris.
  62. * @hidden
  63. */
  64. protected _loadUriAsync(context: string, uri: string): Nullable<Promise<ArrayBufferView>> { return null; }
  65. // #endregion
  66. /**
  67. * Helper method called by a loader extension to load an glTF extension.
  68. * @hidden
  69. */
  70. protected _loadExtensionAsync<TProperty, TResult = void>(context: string, property: IProperty, actionAsync: (extensionContext: string, extension: TProperty) => Nullable<Promise<TResult>>): Nullable<Promise<TResult>> {
  71. if (!property.extensions) {
  72. return null;
  73. }
  74. const extensions = property.extensions;
  75. const extension = extensions[this.name] as TProperty;
  76. if (!extension) {
  77. return null;
  78. }
  79. // Clear out the extension before executing the action to avoid infinite recursion.
  80. delete extensions[this.name];
  81. try {
  82. return actionAsync(`${context}/extensions/${this.name}`, extension);
  83. }
  84. finally {
  85. // Restore the extension after executing the action.
  86. extensions[this.name] = extension;
  87. }
  88. }
  89. /**
  90. * Helper method called by the loader to allow extensions to override loading scenes.
  91. * @hidden
  92. */
  93. protected _loadExtrasValueAsync<TProperty, TResult = void>(context: string, property: IProperty, actionAsync: (extensionContext: string, value: TProperty) => Nullable<Promise<TResult>>): Nullable<Promise<TResult>> {
  94. if (!property.extras) {
  95. return null;
  96. }
  97. const extras = property.extras;
  98. const value = extras[this.name] as TProperty;
  99. if (value === undefined) {
  100. return null;
  101. }
  102. // Clear out the extras value before executing the action to avoid infinite recursion.
  103. delete extras[this.name];
  104. try {
  105. return actionAsync(`${context}/extras/${this.name}`, value);
  106. }
  107. finally {
  108. // Restore the extras value after executing the action.
  109. extras[this.name] = value;
  110. }
  111. }
  112. /**
  113. * Helper method called by the loader to allow extensions to override loading scenes.
  114. * @hidden
  115. */
  116. public static _LoadSceneAsync(loader: GLTFLoader, context: string, scene: _ILoaderScene): Nullable<Promise<void>> {
  117. return loader._applyExtensions(extension => extension._loadSceneAsync(context, scene));
  118. }
  119. /**
  120. * Helper method called by the loader to allow extensions to override loading nodes.
  121. * @hidden
  122. */
  123. public static _LoadNodeAsync(loader: GLTFLoader, context: string, node: _ILoaderNode): Nullable<Promise<void>> {
  124. return loader._applyExtensions(extension => extension._loadNodeAsync(context, node));
  125. }
  126. /**
  127. * Helper method called by the loader to allow extensions to override loading mesh primitive vertex data.
  128. * @hidden
  129. */
  130. public static _LoadVertexDataAsync(loader: GLTFLoader, context: string, primitive: _ILoaderMeshPrimitive, babylonMesh: Mesh): Nullable<Promise<Geometry>> {
  131. return loader._applyExtensions(extension => extension._loadVertexDataAsync(context, primitive, babylonMesh));
  132. }
  133. /**
  134. * Helper method called by the loader to allow extensions to override loading materials.
  135. * @hidden
  136. */
  137. public static _LoadMaterialAsync(loader: GLTFLoader, context: string, material: _ILoaderMaterial, mesh: _ILoaderMesh, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>> {
  138. return loader._applyExtensions(extension => extension._loadMaterialAsync(context, material, mesh, babylonMesh, babylonDrawMode, assign));
  139. }
  140. /**
  141. * Helper method called by the loader to allow extensions to override loading material properties.
  142. * @hidden
  143. */
  144. public static _LoadMaterialPropertiesAsync(loader: GLTFLoader, context: string, material: _ILoaderMaterial, babylonMaterial: Material): Nullable<Promise<void>> {
  145. return loader._applyExtensions(extension => extension._loadMaterialPropertiesAsync(context, material, babylonMaterial));
  146. }
  147. /**
  148. * Helper method called by the loader to allow extensions to override loading textures.
  149. * @hidden
  150. */
  151. public static _LoadTextureAsync(loader: GLTFLoader, context: string, textureInfo: ITextureInfo, assign: (texture: Texture) => void): Nullable<Promise<void>> {
  152. return loader._applyExtensions(extension => extension._loadTextureAsync(context, textureInfo, assign));
  153. }
  154. /**
  155. * Helper method called by the loader to allow extensions to override loading uris.
  156. * @hidden
  157. */
  158. public static _LoadUriAsync(loader: GLTFLoader, context: string, uri: string): Nullable<Promise<ArrayBufferView>> {
  159. return loader._applyExtensions(extension => extension._loadUriAsync(context, uri));
  160. }
  161. }
  162. }
  163. /**
  164. * Defines the module of the glTF 2.0 loader extensions.
  165. */
  166. module BABYLON.GLTF2.Extensions {
  167. }