瀏覽代碼

Updated Draco decoder javascript to the latest version.

Moved all Draco related stuff into a separate sub-folder that seems to
be a more common practice when it comes to multi file loaders. We can
keep it as it was if preferred.

We are also going to includ WebAssembly decoder in a separate PR.
Ondrej Stava 8 年之前
父節點
當前提交
14b82b9417

+ 40 - 15
examples/js/loaders/DRACOLoader.js → examples/js/loaders/draco/DRACOLoader.js

@@ -19,6 +19,7 @@ THREE.DRACOLoader = function(manager) {
         THREE.DefaultLoadingManager;
     this.materials = null;
     this.verbosity = 0;
+    this.dracoDecoderType = {};
 };
 
 
@@ -32,7 +33,7 @@ THREE.DRACOLoader.prototype = {
         loader.setPath(this.path);
         loader.setResponseType('arraybuffer');
         loader.load(url, function(blob) {
-            onLoad(scope.decodeDracoFile(blob));
+            scope.decodeDracoFile(blob, onLoad);
         }, onProgress, onError);
     },
 
@@ -44,8 +45,19 @@ THREE.DRACOLoader.prototype = {
         this.verbosity = level;
     },
 
-    decodeDracoFile: function(rawBuffer) {
-      const dracoDecoder = THREE.DRACOLoader.getDecoder();
+    setDracoDecoderType: function(dracoDecoderType) {
+        this.dracoDecoderType = dracoDecoderType;
+    },
+
+    decodeDracoFile: function(rawBuffer, callback) {
+      const scope = this;
+      THREE.DRACOLoader.getDecoder(this.dracoDecoderType,
+          function(dracoDecoder) {
+            scope.decodeDracoFileInternal(rawBuffer, dracoDecoder, callback);
+      });
+    },
+
+    decodeDracoFileInternal : function(rawBuffer, dracoDecoder, callback) {
       /*
        * Here is how to use Draco Javascript decoder and get the geometry.
        */
@@ -70,11 +82,12 @@ THREE.DRACOLoader.prototype = {
         console.error(errorMsg);
         throw new Error(errorMsg);
       }
-      return this.convertDracoGeometryTo3JS(wrapper, geometryType, buffer);
+      callback(this.convertDracoGeometryTo3JS(dracoDecoder, wrapper,
+          geometryType, buffer));
     },
 
-    convertDracoGeometryTo3JS: function(wrapper, geometryType, buffer) {
-        const dracoDecoder = THREE.DRACOLoader.getDecoder();
+    convertDracoGeometryTo3JS: function(dracoDecoder, wrapper, geometryType,
+                                        buffer) {
         let dracoGeometry;
         const start_time = performance.now();
         if (geometryType == dracoDecoder.TRIANGULAR_MESH) {
@@ -263,26 +276,38 @@ THREE.DRACOLoader.prototype = {
         return geometry;
     },
 
-    isVersionSupported: function(version) {
-        return THREE.DRACOLoader.getDecoder().isVersionSupported(version);
+    isVersionSupported: function(version, callback) {
+        return THREE.DRACOLoader.getDecoder(this.dracoDecoderType,
+            function(decoder) { return decoder.isVersionSupported(version); });
     }
 };
 
 /**
- * Returns a singleton instance of the DracoModule decoder. Creating multiple
- * copies of the decoder is expensive.
+ * Creates and returns a singleton instance of the DracoModule decoder.
+ * The module loading is done asynchronously for WebAssembly. Initialized module
+ * can be accessed through the callback function |onDracoModuleLoadedCallback|.
  */
 THREE.DRACOLoader.getDecoder = (function() {
     let decoder;
 
-    return function() {
+    return function(dracoDecoderType, onDracoModuleLoadedCallback) {
         if (typeof DracoModule === 'undefined') {
           throw new Error('THREE.DRACOLoader: DracoModule not found.');
         }
-
-        decoder = decoder || DracoModule();
-
-        return decoder;
+        if (typeof decoder !== 'undefined') {
+          // Module already initialized.
+          if (typeof onDracoModuleLoadedCallback !== 'undefined') {
+            onDracoModuleLoadedCallback(decoder);
+          }
+        } else {
+          dracoDecoderType['onModuleLoaded'] = function(module) {
+            if (typeof onDracoModuleLoadedCallback === 'function') {
+              decoder = module;
+              onDracoModuleLoadedCallback(module);
+            }
+          };
+          DracoModule(dracoDecoderType);
+        }
     };
 
 })();

文件差異過大導致無法顯示
+ 4 - 0
examples/js/loaders/draco/draco_decoder.js


文件差異過大導致無法顯示
+ 0 - 4
examples/js/loaders/draco_decoder.js


+ 2 - 2
examples/webgl_loader_draco.html

@@ -38,8 +38,8 @@
 		<a href="https://github.com/google/draco" target="_blank">DRACO</a> loader
 	</div>
 	<script src="../build/three.js"></script>
-	<script src="js/loaders/draco_decoder.js"></script>
-	<script src="js/loaders/DRACOLoader.js"></script>
+	<script src="js/loaders/draco/draco_decoder.js"></script>
+	<script src="js/loaders/draco/DRACOLoader.js"></script>
 	<script>
 
 		var camera, scene, renderer;

部分文件因文件數量過多而無法顯示