Browse Source

Add support for draco via manager

Garrett Johnson 5 years ago
parent
commit
0eb26462ca
4 changed files with 46 additions and 35 deletions
  1. 4 2
      src/three/B3DMLoader.js
  2. 3 2
      src/three/I3DMLoader.js
  3. 3 1
      src/three/TilesRenderer.d.ts
  4. 36 30
      src/three/TilesRenderer.js

+ 4 - 2
src/three/B3DMLoader.js

@@ -1,9 +1,10 @@
 import { B3DMLoaderBase } from '../base/B3DMLoaderBase.js';
 import { B3DMLoaderBase } from '../base/B3DMLoaderBase.js';
+import { DefaultLoadingManager } from 'three';
 import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
 import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
 
 
 export class B3DMLoader extends B3DMLoaderBase {
 export class B3DMLoader extends B3DMLoaderBase {
 
 
-	constructor( manager ) {
+	constructor( manager = DefaultLoadingManager ) {
 
 
 		super();
 		super();
 		this.manager = manager;
 		this.manager = manager;
@@ -17,7 +18,8 @@ export class B3DMLoader extends B3DMLoaderBase {
 		return new Promise( ( resolve, reject ) => {
 		return new Promise( ( resolve, reject ) => {
 
 
 			const manager = this.manager;
 			const manager = this.manager;
-			new GLTFLoader( manager ).parse( gltfBuffer, null, model => {
+			const loader = manager.getHandler( 'path.gltf' ) || new GLTFLoader( manager );
+			loader.parse( gltfBuffer, null, model => {
 
 
 				model.batchTable = b3dm.batchTable;
 				model.batchTable = b3dm.batchTable;
 				model.featureTable = b3dm.featureTable;
 				model.featureTable = b3dm.featureTable;

+ 3 - 2
src/three/I3DMLoader.js

@@ -1,6 +1,6 @@
 import { I3DMLoaderBase } from '../base/I3DMLoaderBase.js';
 import { I3DMLoaderBase } from '../base/I3DMLoaderBase.js';
+import { DefaultLoadingManager, Matrix4, InstancedMesh, Vector3, Quaternion } from 'three';
 import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
 import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
-import { Matrix4, InstancedMesh, Vector3, Quaternion } from 'three';
 
 
 const tempPos = new Vector3();
 const tempPos = new Vector3();
 const tempQuat = new Quaternion();
 const tempQuat = new Quaternion();
@@ -26,7 +26,8 @@ export class I3DMLoader extends I3DMLoaderBase {
 				return new Promise( ( resolve, reject ) => {
 				return new Promise( ( resolve, reject ) => {
 
 
 					const manager = this.manager;
 					const manager = this.manager;
-					new GLTFLoader( manager ).parse( gltfBuffer, null, model => {
+					const loader = manager.getHandler( 'path.gltf' ) || new GLTFLoader( manager );
+					loader.parse( gltfBuffer, null, model => {
 
 
 						const INSTANCES_LENGTH = featureTable.getData( 'INSTANCES_LENGTH' );
 						const INSTANCES_LENGTH = featureTable.getData( 'INSTANCES_LENGTH' );
 
 

+ 3 - 1
src/three/TilesRenderer.d.ts

@@ -1,4 +1,4 @@
-import { Box3, Camera, Vector2, WebGLRenderer, Object3D } from 'three';
+import { Box3, Camera, Vector2, WebGLRenderer, Object3D, LoadingManager } from 'three';
 import { TilesRendererBase } from '../base/TilesRendererBase';
 import { TilesRendererBase } from '../base/TilesRendererBase';
 import { TilesGroup } from './TilesGroup';
 import { TilesGroup } from './TilesGroup';
 
 
@@ -6,6 +6,8 @@ export class TilesRenderer extends TilesRendererBase {
 
 
 	autoDisableRendererCulling : Boolean;
 	autoDisableRendererCulling : Boolean;
 
 
+	manager : LoadingManager;
+
 	group : TilesGroup;
 	group : TilesGroup;
 
 
 	getBounds( box : Box3 ) : Boolean;
 	getBounds( box : Box3 ) : Boolean;

+ 36 - 30
src/three/TilesRenderer.js

@@ -85,6 +85,30 @@ export class TilesRenderer extends TilesRendererBase {
 		this.onLoadModel = null;
 		this.onLoadModel = null;
 		this.onDisposeModel = null;
 		this.onDisposeModel = null;
 
 
+		this.manager = new LoadingManager();
+		if ( useImageBitmap ) {
+
+			// TODO: We should verify that `flipY` is false on the resulting texture after load because it can't be modified after
+			// the fact. Premultiply alpha default behavior is not well defined, either.
+			// TODO: Determine whether or not options are supported before using this so we can force flipY false and premultiply alpha
+			// behavior. Fall back to regular texture loading
+			this.manager.addHandler( /(^blob:)|(\.png$)|(\.jpg$)|(\.jpeg$)/g, {
+
+				load( url, onComplete, onProgress, onError ) {
+
+					const loader = new ImageBitmapLoader( this.manager );
+					loader.load( url, res => {
+
+						onComplete( new CanvasTexture( res ) );
+
+					}, onProgress, onError);
+
+				}
+
+			} );
+
+		}
+
 	}
 	}
 
 
 	/* Public API */
 	/* Public API */
@@ -445,49 +469,32 @@ export class TilesRenderer extends TilesRendererBase {
 		tile._loadIndex = tile._loadIndex || 0;
 		tile._loadIndex = tile._loadIndex || 0;
 		tile._loadIndex ++;
 		tile._loadIndex ++;
 
 
+		const manager = this.manager;
 		const loadIndex = tile._loadIndex;
 		const loadIndex = tile._loadIndex;
-		const manager = new LoadingManager();
 		let promise = null;
 		let promise = null;
 
 
-		if ( useImageBitmap ) {
-
-			// TODO: We should verify that `flipY` is false on the resulting texture after load because it can't be modified after
-			// the fact. Premultiply alpha default behavior is not well defined, either.
-			// TODO: Determine whether or not options are supported before using this so we can force flipY false and premultiply alpha
-			// behavior. Fall back to regular texture loading
-			manager.addHandler( /(^blob:)|(\.png$)|(\.jpg$)|(\.jpeg$)/g, {
-
-				load( url, onComplete, onProgress, onError ) {
-
-					const loader = new ImageBitmapLoader();
-					loader.load( url, res => {
-
-						onComplete( new CanvasTexture( res ) );
-
-					}, onProgress, onError);
-
-				}
-
-			} );
-
-		}
-
 		switch ( extension ) {
 		switch ( extension ) {
 
 
 			case 'b3dm':
 			case 'b3dm':
-				promise = new B3DMLoader( manager ).parse( buffer );
+				promise = new B3DMLoader( manager )
+					.parse( buffer )
+					.then( res => res.scene );
 				break;
 				break;
 
 
 			case 'pnts':
 			case 'pnts':
-				promise = Promise.resolve( new PNTSLoader( manager ).parse( buffer ) );
+				promise = Promise.resolve( new PNTSLoader( manager ).parse( buffer ).scene );
 				break;
 				break;
 
 
 			case 'i3dm':
 			case 'i3dm':
-				promise = new I3DMLoader( manager ).parse( buffer );
+				promise = new I3DMLoader( manager )
+					.parse( buffer )
+					.then( res => res.scene );
 				break;
 				break;
 
 
 			case 'cmpt':
 			case 'cmpt':
-				promise = new CMPTLoader( manager ).parse( buffer );
+				promise = new CMPTLoader( manager )
+					.parse( buffer )
+					.then( res => res.scene	);
 				break;
 				break;
 
 
 			default:
 			default:
@@ -497,7 +504,7 @@ export class TilesRenderer extends TilesRendererBase {
 
 
 		}
 		}
 
 
-		return promise.then( res => {
+		return promise.then( scene => {
 
 
 			if ( tile._loadIndex !== loadIndex ) {
 			if ( tile._loadIndex !== loadIndex ) {
 
 
@@ -509,7 +516,6 @@ export class TilesRenderer extends TilesRendererBase {
 			const cached = tile.cached;
 			const cached = tile.cached;
 			const cachedTransform = cached.transform;
 			const cachedTransform = cached.transform;
 
 
-			const scene = res ? res.scene : new Group();
 			switch ( upAxis.toLowerCase() ) {
 			switch ( upAxis.toLowerCase() ) {
 
 
 				case 'x':
 				case 'x':