Pārlūkot izejas kodu

Use static draco compression instance

Gary Hsu 6 gadi atpakaļ
vecāks
revīzija
4f0943d00f

+ 4 - 13
loaders/src/glTF/2.0/Extensions/KHR_draco_mesh_compression.ts

@@ -27,14 +27,13 @@ export class KHR_draco_mesh_compression implements IGLTFLoaderExtension {
     /** The name of this extension. */
     public readonly name = NAME;
 
-    /** The draco compression used to decode vertex data. */
+    /** The draco compression used to decode vertex data or DracoCompression.Default if not defined */
     public dracoCompression?: DracoCompression;
 
     /** Defines whether this extension is enabled. */
     public enabled = DracoCompression.DecoderAvailable;
 
     private _loader: GLTFLoader;
-    private _dracoCompressionOwned = false;
 
     /** @hidden */
     constructor(loader: GLTFLoader) {
@@ -43,11 +42,7 @@ export class KHR_draco_mesh_compression implements IGLTFLoaderExtension {
 
     /** @hidden */
     public dispose(): void {
-        if (this.dracoCompression && this._dracoCompressionOwned) {
-            this.dracoCompression.dispose();
-            delete this.dracoCompression;
-        }
-
+        delete this.dracoCompression;
         delete this._loader;
     }
 
@@ -93,12 +88,8 @@ export class KHR_draco_mesh_compression implements IGLTFLoaderExtension {
             var bufferView = ArrayItem.Get(extensionContext, this._loader.gltf.bufferViews, extension.bufferView) as IBufferViewDraco;
             if (!bufferView._dracoBabylonGeometry) {
                 bufferView._dracoBabylonGeometry = this._loader.loadBufferViewAsync(`#/bufferViews/${bufferView.index}`, bufferView).then((data) => {
-                    if (!this.dracoCompression) {
-                        this.dracoCompression = new DracoCompression();
-                        this._dracoCompressionOwned = true;
-                    }
-
-                    return this.dracoCompression.decodeMeshAsync(data, attributes).then((babylonVertexData) => {
+                    const dracoCompression = this.dracoCompression || DracoCompression.Default;
+                    return dracoCompression.decodeMeshAsync(data, attributes).then((babylonVertexData) => {
                         const babylonGeometry = new Geometry(babylonMesh.name, this._loader.babylonScene);
                         babylonVertexData.applyToGeometry(babylonGeometry);
                         return babylonGeometry;

+ 14 - 6
src/Meshes/Compression/dracoCompression.ts

@@ -117,17 +117,25 @@ export class DracoCompression implements IDisposable {
     public static DefaultNumWorkers = DracoCompression.GetDefaultNumWorkers();
 
     private static GetDefaultNumWorkers(): number {
-        if (typeof navigator === "undefined") {
+        if (typeof navigator === "undefined" || !navigator.hardwareConcurrency) {
             return 1;
         }
 
-        const hardwareConcurrency =  navigator.hardwareConcurrency;
-        if (!hardwareConcurrency) {
-            return 1;
+        // Use 50% of the available logical processors but capped at 4.
+        return Math.min(Math.floor(navigator.hardwareConcurrency * 0.5), 4);
+    }
+
+    private static _Default: Nullable<DracoCompression> = null;
+
+    /**
+     * Default instance for the draco compression object.
+     */
+    public static get Default(): DracoCompression {
+        if (!DracoCompression._Default) {
+            DracoCompression._Default = new DracoCompression();
         }
 
-        // Use 50% of the available logical processors but capped at 4.
-        return Math.min(Math.floor(hardwareConcurrency * 0.5), 4);
+        return DracoCompression._Default;
     }
 
     /**