babylon.glTF2FileLoader.d.ts 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. declare module BABYLON {
  2. enum GLTFLoaderCoordinateSystemMode {
  3. /**
  4. * Automatically convert the glTF right-handed data to the appropriate system based on the current coordinate system mode of the scene.
  5. */
  6. AUTO = 0,
  7. /**
  8. * Sets the useRightHandedSystem flag on the scene.
  9. */
  10. FORCE_RIGHT_HANDED = 1,
  11. }
  12. enum GLTFLoaderAnimationStartMode {
  13. /**
  14. * No animation will start.
  15. */
  16. NONE = 0,
  17. /**
  18. * The first animation will start.
  19. */
  20. FIRST = 1,
  21. /**
  22. * All animations will start.
  23. */
  24. ALL = 2,
  25. }
  26. interface IGLTFLoaderData {
  27. json: Object;
  28. bin: Nullable<ArrayBufferView>;
  29. }
  30. interface IGLTFLoaderExtension {
  31. /**
  32. * The name of this extension.
  33. */
  34. readonly name: string;
  35. /**
  36. * Whether this extension is enabled.
  37. */
  38. enabled: boolean;
  39. }
  40. enum GLTFLoaderState {
  41. Loading = 0,
  42. Ready = 1,
  43. Complete = 2,
  44. }
  45. interface IGLTFLoader extends IDisposable {
  46. coordinateSystemMode: GLTFLoaderCoordinateSystemMode;
  47. animationStartMode: GLTFLoaderAnimationStartMode;
  48. compileMaterials: boolean;
  49. useClipPlane: boolean;
  50. compileShadowGenerators: boolean;
  51. onMeshLoadedObservable: Observable<AbstractMesh>;
  52. onTextureLoadedObservable: Observable<BaseTexture>;
  53. onMaterialLoadedObservable: Observable<Material>;
  54. onAnimationGroupLoadedObservable: Observable<AnimationGroup>;
  55. onCompleteObservable: Observable<IGLTFLoader>;
  56. onDisposeObservable: Observable<IGLTFLoader>;
  57. onExtensionLoadedObservable: Observable<IGLTFLoaderExtension>;
  58. state: Nullable<GLTFLoaderState>;
  59. importMeshAsync: (meshesNames: any, scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: SceneLoaderProgressEvent) => void) => Promise<{
  60. meshes: AbstractMesh[];
  61. particleSystems: ParticleSystem[];
  62. skeletons: Skeleton[];
  63. }>;
  64. loadAsync: (scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: SceneLoaderProgressEvent) => void) => Promise<void>;
  65. }
  66. class GLTFFileLoader implements IDisposable, ISceneLoaderPluginAsync, ISceneLoaderPluginFactory {
  67. static CreateGLTFLoaderV1: () => IGLTFLoader;
  68. static CreateGLTFLoaderV2: () => IGLTFLoader;
  69. /**
  70. * Raised when the asset has been parsed.
  71. * The data.json property stores the glTF JSON.
  72. * The data.bin property stores the BIN chunk from a glTF binary or null if the input is not a glTF binary.
  73. */
  74. onParsedObservable: Observable<IGLTFLoaderData>;
  75. private _onParsedObserver;
  76. onParsed: (loaderData: IGLTFLoaderData) => void;
  77. static IncrementalLoading: boolean;
  78. static HomogeneousCoordinates: boolean;
  79. /**
  80. * The coordinate system mode (AUTO, FORCE_RIGHT_HANDED).
  81. */
  82. coordinateSystemMode: GLTFLoaderCoordinateSystemMode;
  83. /**
  84. * The animation start mode (NONE, FIRST, ALL).
  85. */
  86. animationStartMode: GLTFLoaderAnimationStartMode;
  87. /**
  88. * Set to true to compile materials before raising the success callback.
  89. */
  90. compileMaterials: boolean;
  91. /**
  92. * Set to true to also compile materials with clip planes.
  93. */
  94. useClipPlane: boolean;
  95. /**
  96. * Set to true to compile shadow generators before raising the success callback.
  97. */
  98. compileShadowGenerators: boolean;
  99. /**
  100. * Raised when the loader creates a mesh after parsing the glTF properties of the mesh.
  101. */
  102. readonly onMeshLoadedObservable: Observable<AbstractMesh>;
  103. private _onMeshLoadedObserver;
  104. onMeshLoaded: (mesh: AbstractMesh) => void;
  105. /**
  106. * Raised when the loader creates a texture after parsing the glTF properties of the texture.
  107. */
  108. readonly onTextureLoadedObservable: Observable<BaseTexture>;
  109. private _onTextureLoadedObserver;
  110. onTextureLoaded: (texture: BaseTexture) => void;
  111. /**
  112. * Raised when the loader creates a material after parsing the glTF properties of the material.
  113. */
  114. readonly onMaterialLoadedObservable: Observable<Material>;
  115. private _onMaterialLoadedObserver;
  116. onMaterialLoaded: (material: Material) => void;
  117. /**
  118. * Raised when the loader creates an animation group after parsing the glTF properties of the animation.
  119. */
  120. readonly onAnimationGroupLoadedObservable: Observable<AnimationGroup>;
  121. private _onAnimationGroupLoadedObserver;
  122. onAnimationGroupLoaded: (animationGroup: AnimationGroup) => void;
  123. /**
  124. * Raised when the asset is completely loaded, immediately before the loader is disposed.
  125. * For assets with LODs, raised when all of the LODs are complete.
  126. * For assets without LODs, raised when the model is complete, immediately after onSuccess.
  127. */
  128. readonly onCompleteObservable: Observable<GLTFFileLoader>;
  129. private _onCompleteObserver;
  130. onComplete: () => void;
  131. /**
  132. * Raised when the loader is disposed.
  133. */
  134. readonly onDisposeObservable: Observable<GLTFFileLoader>;
  135. private _onDisposeObserver;
  136. onDispose: () => void;
  137. /**
  138. * Raised after a loader extension is created.
  139. * Set additional options for a loader extension in this event.
  140. */
  141. readonly onExtensionLoadedObservable: Observable<IGLTFLoaderExtension>;
  142. private _onExtensionLoadedObserver;
  143. onExtensionLoaded: (extension: IGLTFLoaderExtension) => void;
  144. /**
  145. * Gets a promise that resolves when the asset is completely loaded.
  146. * @returns A promise that resolves when the asset is completely loaded.
  147. */
  148. whenCompleteAsync(): Promise<void>;
  149. /**
  150. * The loader state or null if not active.
  151. */
  152. readonly loaderState: Nullable<GLTFLoaderState>;
  153. private _loader;
  154. name: string;
  155. extensions: ISceneLoaderPluginExtensions;
  156. /**
  157. * Disposes the loader, releases resources during load, and cancels any outstanding requests.
  158. */
  159. dispose(): void;
  160. importMeshAsync(meshesNames: any, scene: Scene, data: any, rootUrl: string, onProgress?: (event: SceneLoaderProgressEvent) => void): Promise<{
  161. meshes: AbstractMesh[];
  162. particleSystems: ParticleSystem[];
  163. skeletons: Skeleton[];
  164. }>;
  165. loadAsync(scene: Scene, data: string | ArrayBuffer, rootUrl: string, onProgress?: (event: SceneLoaderProgressEvent) => void): Promise<void>;
  166. loadAssetContainerAsync(scene: Scene, data: string | ArrayBuffer, rootUrl: string, onProgress?: (event: SceneLoaderProgressEvent) => void): Promise<AssetContainer>;
  167. canDirectLoad(data: string): boolean;
  168. rewriteRootURL: (rootUrl: string, responseURL?: string) => string;
  169. createPlugin(): ISceneLoaderPlugin | ISceneLoaderPluginAsync;
  170. private _parse(data);
  171. private _getLoader(loaderData);
  172. private static _parseBinary(data);
  173. private static _parseV1(binaryReader);
  174. private static _parseV2(binaryReader);
  175. private static _parseVersion(version);
  176. private static _compareVersion(a, b);
  177. private static _decodeBufferToText(buffer);
  178. }
  179. }
  180. declare module BABYLON.GLTF2 {
  181. interface TypedArray extends ArrayBufferView {
  182. [index: number]: number;
  183. }
  184. interface IArrayItem {
  185. _index: number;
  186. }
  187. class ArrayItem {
  188. static Assign(values?: IArrayItem[]): void;
  189. }
  190. }
  191. declare module BABYLON.GLTF2 {
  192. interface ILoaderAccessor extends IAccessor, IArrayItem {
  193. _data?: Promise<TypedArray>;
  194. }
  195. interface ILoaderAnimationChannel extends IAnimationChannel, IArrayItem {
  196. }
  197. interface ILoaderAnimationSamplerData {
  198. input: Float32Array;
  199. interpolation: AnimationSamplerInterpolation;
  200. output: Float32Array;
  201. }
  202. interface ILoaderAnimationSampler extends IAnimationSampler, IArrayItem {
  203. _data: Promise<ILoaderAnimationSamplerData>;
  204. }
  205. interface ILoaderAnimation extends IAnimation, IArrayItem {
  206. channels: ILoaderAnimationChannel[];
  207. samplers: ILoaderAnimationSampler[];
  208. _babylonAnimationGroup?: AnimationGroup;
  209. }
  210. interface ILoaderBuffer extends IBuffer, IArrayItem {
  211. _data?: Promise<ArrayBufferView>;
  212. }
  213. interface ILoaderBufferView extends IBufferView, IArrayItem {
  214. _data?: Promise<ArrayBufferView>;
  215. }
  216. interface ILoaderCamera extends ICamera, IArrayItem {
  217. }
  218. interface ILoaderImage extends IImage, IArrayItem {
  219. _objectURL?: Promise<string>;
  220. }
  221. interface ILoaderMaterial extends IMaterial, IArrayItem {
  222. _babylonData?: {
  223. [drawMode: number]: {
  224. material: Material;
  225. meshes: AbstractMesh[];
  226. loaded: Promise<void>;
  227. };
  228. };
  229. }
  230. interface ILoaderMesh extends IMesh, IArrayItem {
  231. primitives: ILoaderMeshPrimitive[];
  232. }
  233. interface ILoaderMeshPrimitive extends IMeshPrimitive, IArrayItem {
  234. }
  235. interface ILoaderNode extends INode, IArrayItem {
  236. _parent: ILoaderNode;
  237. _babylonMesh?: Mesh;
  238. _primitiveBabylonMeshes?: Mesh[];
  239. _babylonAnimationTargets?: Node[];
  240. _numMorphTargets?: number;
  241. }
  242. interface ILoaderSamplerData {
  243. noMipMaps: boolean;
  244. samplingMode: number;
  245. wrapU: number;
  246. wrapV: number;
  247. }
  248. interface ILoaderSampler extends ISampler, IArrayItem {
  249. _data?: ILoaderSamplerData;
  250. }
  251. interface ILoaderScene extends IScene, IArrayItem {
  252. }
  253. interface ILoaderSkin extends ISkin, IArrayItem {
  254. _babylonSkeleton?: Skeleton;
  255. _loaded?: Promise<void>;
  256. }
  257. interface ILoaderTexture extends ITexture, IArrayItem {
  258. }
  259. interface ILoaderGLTF extends IGLTF {
  260. accessors?: ILoaderAccessor[];
  261. animations?: ILoaderAnimation[];
  262. buffers?: ILoaderBuffer[];
  263. bufferViews?: ILoaderBufferView[];
  264. cameras?: ILoaderCamera[];
  265. images?: ILoaderImage[];
  266. materials?: ILoaderMaterial[];
  267. meshes?: ILoaderMesh[];
  268. nodes?: ILoaderNode[];
  269. samplers?: ILoaderSampler[];
  270. scenes?: ILoaderScene[];
  271. skins?: ILoaderSkin[];
  272. textures?: ILoaderTexture[];
  273. }
  274. }
  275. declare module BABYLON.GLTF2 {
  276. interface MaterialConstructor<T extends Material> {
  277. readonly prototype: T;
  278. new (name: string, scene: Scene): T;
  279. }
  280. class GLTFLoader implements IGLTFLoader {
  281. _gltf: ILoaderGLTF;
  282. _babylonScene: Scene;
  283. _completePromises: Promise<void>[];
  284. private _disposed;
  285. private _state;
  286. private _extensions;
  287. private _rootUrl;
  288. private _rootBabylonMesh;
  289. private _defaultSampler;
  290. private _defaultBabylonMaterials;
  291. private _progressCallback?;
  292. private _requests;
  293. private static _Names;
  294. private static _Factories;
  295. static _Register(name: string, factory: (loader: GLTFLoader) => GLTFLoaderExtension): void;
  296. coordinateSystemMode: GLTFLoaderCoordinateSystemMode;
  297. animationStartMode: GLTFLoaderAnimationStartMode;
  298. compileMaterials: boolean;
  299. useClipPlane: boolean;
  300. compileShadowGenerators: boolean;
  301. readonly onDisposeObservable: Observable<IGLTFLoader>;
  302. readonly onMeshLoadedObservable: Observable<AbstractMesh>;
  303. readonly onTextureLoadedObservable: Observable<BaseTexture>;
  304. readonly onMaterialLoadedObservable: Observable<Material>;
  305. readonly onAnimationGroupLoadedObservable: Observable<AnimationGroup>;
  306. readonly onExtensionLoadedObservable: Observable<IGLTFLoaderExtension>;
  307. readonly onCompleteObservable: Observable<IGLTFLoader>;
  308. readonly state: Nullable<GLTFLoaderState>;
  309. dispose(): void;
  310. importMeshAsync(meshesNames: any, scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: SceneLoaderProgressEvent) => void): Promise<{
  311. meshes: AbstractMesh[];
  312. particleSystems: ParticleSystem[];
  313. skeletons: Skeleton[];
  314. }>;
  315. loadAsync(scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: SceneLoaderProgressEvent) => void): Promise<void>;
  316. private _loadAsync(nodes, scene, data, rootUrl, onProgress?);
  317. private _loadExtensions();
  318. private _loadData(data);
  319. private _setupData();
  320. private _checkExtensions();
  321. private _createRootNode();
  322. private _loadNodesAsync(nodes);
  323. _loadSceneAsync(context: string, scene: ILoaderScene): Promise<void>;
  324. private _forEachPrimitive(node, callback);
  325. private _getMeshes();
  326. private _getSkeletons();
  327. private _startAnimations();
  328. _loadNodeAsync(context: string, node: ILoaderNode): Promise<void>;
  329. private _loadMeshAsync(context, node, mesh, babylonMesh);
  330. private _loadPrimitiveAsync(context, node, mesh, primitive, babylonMesh);
  331. private _loadVertexDataAsync(context, primitive, babylonMesh);
  332. private _createMorphTargets(context, node, mesh, primitive, babylonMesh);
  333. private _loadMorphTargetsAsync(context, primitive, babylonMesh, babylonVertexData);
  334. private _loadMorphTargetVertexDataAsync(context, babylonVertexData, attributes, babylonMorphTarget);
  335. private static _ConvertToFloat32Array(context, accessor, data);
  336. private static _ConvertVec3ToVec4(context, data);
  337. private static _LoadTransform(node, babylonNode);
  338. private _loadSkinAsync(context, node, mesh, skin);
  339. private _loadSkinInverseBindMatricesDataAsync(context, skin);
  340. private _createBone(node, skin, parent, localMatrix, baseMatrix, index);
  341. private _loadBones(context, skin, inverseBindMatricesData);
  342. private _loadBone(node, skin, inverseBindMatricesData, babylonBones);
  343. private _getNodeMatrix(node);
  344. private _loadAnimationsAsync();
  345. private _loadAnimationAsync(context, animation);
  346. private _loadAnimationChannelAsync(context, animationContext, animation, channel, babylonAnimationGroup);
  347. private _loadAnimationSamplerAsync(context, sampler);
  348. private _loadBufferAsync(context, buffer);
  349. _loadBufferViewAsync(context: string, bufferView: ILoaderBufferView): Promise<ArrayBufferView>;
  350. private _loadAccessorAsync(context, accessor);
  351. private _buildArrayBuffer<T>(typedArray, data, byteOffset, count, numComponents, byteStride?);
  352. private _getDefaultMaterial(drawMode);
  353. private _loadMaterialMetallicRoughnessPropertiesAsync(context, material, babylonMaterial);
  354. _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Promise<void>;
  355. _createMaterial<T extends Material>(type: MaterialConstructor<T>, name: string, drawMode: number): T;
  356. _loadMaterialBasePropertiesAsync(context: string, material: ILoaderMaterial, babylonMaterial: PBRMaterial): Promise<void>;
  357. _loadMaterialAlphaProperties(context: string, material: ILoaderMaterial, babylonMaterial: PBRMaterial): void;
  358. _loadTextureAsync(context: string, textureInfo: ITextureInfo, assign: (texture: Texture) => void): Promise<void>;
  359. private _loadSampler(context, sampler);
  360. private _loadImageAsync(context, image);
  361. _loadUriAsync(context: string, uri: string): Promise<ArrayBufferView>;
  362. private _onProgress();
  363. static _GetProperty<T>(context: string, array: ArrayLike<T> | undefined, index: number | undefined): T;
  364. private static _GetTextureWrapMode(context, mode);
  365. private static _GetTextureSamplingMode(context, magFilter?, minFilter?);
  366. private static _GetNumComponents(context, type);
  367. private static _ValidateUri(uri);
  368. private static _GetDrawMode(context, mode);
  369. private _compileMaterialsAsync();
  370. private _compileShadowGeneratorsAsync();
  371. private _clear();
  372. _applyExtensions<T>(actionAsync: (extension: GLTFLoaderExtension) => Nullable<Promise<T>>): Nullable<Promise<T>>;
  373. }
  374. }
  375. declare module BABYLON.GLTF2 {
  376. abstract class GLTFLoaderExtension implements IGLTFLoaderExtension, IDisposable {
  377. enabled: boolean;
  378. readonly abstract name: string;
  379. protected _loader: GLTFLoader;
  380. constructor(loader: GLTFLoader);
  381. dispose(): void;
  382. /** Override this method to modify the default behavior for loading scenes. */
  383. protected _loadSceneAsync(context: string, node: ILoaderScene): Nullable<Promise<void>>;
  384. /** Override this method to modify the default behavior for loading nodes. */
  385. protected _loadNodeAsync(context: string, node: ILoaderNode): Nullable<Promise<void>>;
  386. /** Override this method to modify the default behavior for loading mesh primitive vertex data. */
  387. protected _loadVertexDataAsync(context: string, primitive: ILoaderMeshPrimitive, babylonMesh: Mesh): Nullable<Promise<VertexData>>;
  388. /** Override this method to modify the default behavior for loading materials. */
  389. protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
  390. /** Override this method to modify the default behavior for loading uris. */
  391. protected _loadUriAsync(context: string, uri: string): Nullable<Promise<ArrayBufferView>>;
  392. /** Helper method called by a loader extension to load an glTF extension. */
  393. protected _loadExtensionAsync<TProperty, TResult = void>(context: string, property: IProperty, actionAsync: (context: string, extension: TProperty) => Promise<TResult>): Nullable<Promise<TResult>>;
  394. /** Helper method called by the loader to allow extensions to override loading scenes. */
  395. static _LoadSceneAsync(loader: GLTFLoader, context: string, scene: ILoaderScene): Nullable<Promise<void>>;
  396. /** Helper method called by the loader to allow extensions to override loading nodes. */
  397. static _LoadNodeAsync(loader: GLTFLoader, context: string, node: ILoaderNode): Nullable<Promise<void>>;
  398. /** Helper method called by the loader to allow extensions to override loading mesh primitive vertex data. */
  399. static _LoadVertexDataAsync(loader: GLTFLoader, context: string, primitive: ILoaderMeshPrimitive, babylonMesh: Mesh): Nullable<Promise<VertexData>>;
  400. /** Helper method called by the loader to allow extensions to override loading materials. */
  401. static _LoadMaterialAsync(loader: GLTFLoader, context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
  402. /** Helper method called by the loader to allow extensions to override loading uris. */
  403. static _LoadUriAsync(loader: GLTFLoader, context: string, uri: string): Nullable<Promise<ArrayBufferView>>;
  404. }
  405. }
  406. declare module BABYLON.GLTF2.Extensions {
  407. class MSFT_lod extends GLTFLoaderExtension {
  408. readonly name: string;
  409. /**
  410. * Maximum number of LODs to load, starting from the lowest LOD.
  411. */
  412. maxLODsToLoad: number;
  413. private _loadingNodeLOD;
  414. private _loadNodeSignals;
  415. private _loadingMaterialLOD;
  416. private _loadMaterialSignals;
  417. protected _loadNodeAsync(context: string, node: ILoaderNode): Nullable<Promise<void>>;
  418. protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
  419. protected _loadUriAsync(context: string, uri: string): Nullable<Promise<ArrayBufferView>>;
  420. /**
  421. * Gets an array of LOD properties from lowest to highest.
  422. */
  423. private _getLODs<T>(context, property, array, ids);
  424. }
  425. }
  426. declare module BABYLON.GLTF2.Extensions {
  427. class KHR_draco_mesh_compression extends GLTFLoaderExtension {
  428. readonly name: string;
  429. private _dracoCompression;
  430. constructor(loader: GLTFLoader);
  431. dispose(): void;
  432. protected _loadVertexDataAsync(context: string, primitive: ILoaderMeshPrimitive, babylonMesh: Mesh): Nullable<Promise<VertexData>>;
  433. }
  434. }
  435. declare module BABYLON.GLTF2.Extensions {
  436. class KHR_materials_pbrSpecularGlossiness extends GLTFLoaderExtension {
  437. readonly name: string;
  438. protected _loadMaterialAsync(context: string, material: ILoaderMaterial, babylonMesh: Mesh, babylonDrawMode: number, assign: (babylonMaterial: Material) => void): Nullable<Promise<void>>;
  439. private _loadSpecularGlossinessPropertiesAsync(context, material, properties, babylonMaterial);
  440. }
  441. }
  442. declare module BABYLON.GLTF2.Extensions {
  443. class KHR_lights extends GLTFLoaderExtension {
  444. readonly name: string;
  445. protected _loadSceneAsync(context: string, scene: ILoaderScene): Nullable<Promise<void>>;
  446. protected _loadNodeAsync(context: string, node: ILoaderNode): Nullable<Promise<void>>;
  447. private readonly _lights;
  448. }
  449. }