浏览代码

Merge pull request #6916 from zeux/ext-loadbufferview

GLTFLoader: Allow extensions to override buffer view loading
David Catuhe 5 年之前
父节点
当前提交
a1319d63d6
共有 2 个文件被更改,包括 19 次插入2 次删除
  1. 9 0
      loaders/src/glTF/2.0/glTFLoader.ts
  2. 10 2
      loaders/src/glTF/2.0/glTFLoaderExtension.ts

+ 9 - 0
loaders/src/glTF/2.0/glTFLoader.ts

@@ -1400,6 +1400,11 @@ export class GLTFLoader implements IGLTFLoader {
      * @returns A promise that resolves with the loaded data when the load is complete
      * @returns A promise that resolves with the loaded data when the load is complete
      */
      */
     public loadBufferViewAsync(context: string, bufferView: IBufferView): Promise<ArrayBufferView> {
     public loadBufferViewAsync(context: string, bufferView: IBufferView): Promise<ArrayBufferView> {
+        const extensionPromise = this._extensionsLoadBufferViewAsync(context, bufferView);
+        if (extensionPromise) {
+            return extensionPromise;
+        }
+
         if (bufferView._data) {
         if (bufferView._data) {
             return bufferView._data;
             return bufferView._data;
         }
         }
@@ -2277,6 +2282,10 @@ export class GLTFLoader implements IGLTFLoader {
         return this._applyExtensions(property, "loadUri", (extension) => extension._loadUriAsync && extension._loadUriAsync(context, property, uri));
         return this._applyExtensions(property, "loadUri", (extension) => extension._loadUriAsync && extension._loadUriAsync(context, property, uri));
     }
     }
 
 
+    private _extensionsLoadBufferViewAsync(context: string, bufferView: IBufferView): Nullable<Promise<ArrayBufferView>> {
+        return this._applyExtensions(bufferView, "loadBufferView", (extension) => extension.loadBufferViewAsync && extension.loadBufferViewAsync(context, bufferView));
+    }
+
     /**
     /**
      * Helper method called by a loader extension to load an glTF extension.
      * Helper method called by a loader extension to load an glTF extension.
      * @param context The context when loading the asset
      * @param context The context when loading the asset

+ 10 - 2
loaders/src/glTF/2.0/glTFLoaderExtension.ts

@@ -9,7 +9,7 @@ import { Mesh } from "babylonjs/Meshes/mesh";
 import { AbstractMesh } from "babylonjs/Meshes/abstractMesh";
 import { AbstractMesh } from "babylonjs/Meshes/abstractMesh";
 import { IDisposable } from "babylonjs/scene";
 import { IDisposable } from "babylonjs/scene";
 
 
-import { IScene, INode, IMesh, ISkin, ICamera, IMeshPrimitive, IMaterial, ITextureInfo, IAnimation } from "./glTFLoaderInterfaces";
+import { IScene, INode, IMesh, ISkin, ICamera, IMeshPrimitive, IMaterial, ITextureInfo, IAnimation, IBufferView } from "./glTFLoaderInterfaces";
 import { IGLTFLoaderExtension as IGLTFBaseLoaderExtension } from "../glTFFileLoader";
 import { IGLTFLoaderExtension as IGLTFBaseLoaderExtension } from "../glTFFileLoader";
 import { IProperty } from 'babylonjs-gltf2interface';
 import { IProperty } from 'babylonjs-gltf2interface';
 
 
@@ -134,4 +134,12 @@ export interface IGLTFLoaderExtension extends IGLTFBaseLoaderExtension, IDisposa
      * @returns A promise that resolves with the loaded data when the load is complete or null if not handled
      * @returns A promise that resolves with the loaded data when the load is complete or null if not handled
      */
      */
     _loadUriAsync?(context: string, property: IProperty, uri: string): Nullable<Promise<ArrayBufferView>>;
     _loadUriAsync?(context: string, property: IProperty, uri: string): Nullable<Promise<ArrayBufferView>>;
-}
+
+    /**
+     * Define this method to modify the default behavior when loading buffer views.
+     * @param context The context when loading the asset
+     * @param bufferView The glTF buffer view property
+     * @returns A promise that resolves with the loaded buffer view when the load is complete or null if not handled
+     */
+    loadBufferViewAsync?(context: string, bufferView: IBufferView): Nullable<Promise<ArrayBufferView>>;
+}