Garrett Johnson 5 anni fa
parent
commit
818da0d123
3 ha cambiato i file con 110 aggiunte e 7 eliminazioni
  1. 94 3
      src/base/B3DMLoaderBase.js
  2. 5 1
      src/three/B3DMLoader.js
  3. 11 3
      src/three/TilesRenderer.js

+ 94 - 3
src/base/B3DMLoaderBase.js

@@ -72,20 +72,111 @@ export class B3DMLoaderBase {
 
 		const jsonFeatureTableData = new Uint8Array( buffer, featureTableStart, featureTableJSONByteLength );
 		const jsonFeatureTable = featureTableJSONByteLength === 0 ? {} : JSON.parse( arrayToString( jsonFeatureTableData ) );
+		const featureTable = {};
 
 		// const binFeatureTableData = new Uint8Array( buffer, featureTableStart + featureTableJSONByteLength, featureTableBinaryByteLength );
 		// TODO: dereference the json feature table data in to the binary array.
 		// https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/master/specification/TileFormats/FeatureTable/README.md#json-header
+		// TODO: The feature table contains data with implicit stride and data types, which means we can't parse it into arrays
+		// unless they are specified ahead of time?s
 
 		// Batch Table
 		const batchTableStart = featureTableStart + featureTableJSONByteLength + featureTableBinaryByteLength;
 
 		const jsonBatchTableData = new Uint8Array( buffer, batchTableStart, batchTableJSONByteLength );
 		const jsonBatchTable = batchTableJSONByteLength === 0 ? {} : JSON.parse( arrayToString( jsonBatchTableData ) );
+		const batchTable = { ...jsonBatchTable };
 
-		// const binBatchTableData = new Uint8Array( buffer, batchTableStart + batchTableJSONByteLength, batchTableBinaryByteLength );
-		// TODO: dereference the json batch table data in to the binary array.
+		// dereference the json batch table data in to the binary array.
 		// https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/master/specification/TileFormats/FeatureTable/README.md#json-header
+		// const binBatchTableData = new Uint8Array( buffer, batchTableStart + batchTableJSONByteLength, batchTableBinaryByteLength );
+		const batchLength = jsonFeatureTable.BATCH_LENGTH;
+		for ( const key in jsonBatchTable ) {
+
+			const feature = jsonBatchTable[ key ];
+			if ( Array.isArray( feature ) ) {
+
+				batchTable[ key ] = {
+
+					type: 'SCALAR',
+					stride: 1,
+					data: feature,
+
+				};
+
+			} else {
+
+				let stride;
+				let data;
+				const arrayStart = batchTableStart + batchTableJSONByteLength;
+				const arrayLength = batchLength * stride + feature.byteOffset;
+				switch ( feature.type ) {
+
+					case 'SCALAR':
+						stride = 1;
+						break;
+
+					case 'VEC2':
+						stride = 2;
+						break;
+
+					case 'VEC3':
+						stride = 3;
+						break;
+
+					case 'VEC4':
+						stride = 4;
+						break;
+
+				}
+
+				switch( feature.componentType ) {
+
+					case 'BYTE':
+						data = new Int8Array( buffer, arrayStart, arrayLength );
+						break;
+
+					case 'UNSIGNED_BYTE':
+						data = new Uint8Array( buffer, arrayStart, arrayLength );
+						break;
+
+					case 'SHORT':
+						data = new Int16Array( buffer, arrayStart, arrayLength );
+						break;
+
+					case 'UNSIGNED_SHORT':
+						data = new Uint16Array( buffer, arrayStart, arrayLength );
+						break;
+
+					case 'INT':
+						data = new Int32Array( buffer, arrayStart, arrayLength );
+						break;
+
+					case 'UNSIGNED_INT':
+						data = new Uint32Array( buffer, arrayStart, arrayLength );
+						break;
+
+					case 'FLOAT':
+						data = new Float32Array( buffer, arrayStart, arrayLength );
+						break;
+
+					case 'DOUBLE':
+						data = new Float64Array( buffer, arrayStart, arrayLength );
+						break;
+
+				}
+
+				batchTable[ key ] = {
+
+					type: feature.type,
+					stride,
+					data,
+
+				};
+
+			}
+
+		}
 
 		const glbStart = batchTableStart + batchTableJSONByteLength + batchTableBinaryByteLength;
 		const glbBytes = new Uint8Array( buffer, glbStart, byteLength - glbStart );
@@ -95,7 +186,7 @@ export class B3DMLoaderBase {
 		return {
 			version,
 			featureTable: jsonFeatureTable,
-			batchTable: jsonBatchTable,
+			batchTable,
 			glbBytes,
 		};
 

+ 5 - 1
src/three/B3DMLoader.js

@@ -17,7 +17,11 @@ export class B3DMLoader extends B3DMLoaderBase {
 		return new Promise( ( resolve, reject ) => {
 
 			const manager = this.manager;
-			new GLTFLoader( manager ).parse( gltfBuffer, null, resolve, reject );
+			new GLTFLoader( manager ).parse( gltfBuffer, null, model => {
+				model.batchTable = b3dm.batchTable;
+				model.featureTable = b3dm.featureTable;
+				resolve( model );
+			}, reject );
 
 		} );
 

+ 11 - 3
src/three/TilesRenderer.js

@@ -70,10 +70,18 @@ export class TilesRenderer extends TilesRendererBase {
 		const boundingBox = cached.box;
 		const obbMat = cached.boxTransform;
 
-		box.copy( boundingBox );
-		box.applyMatrix4( obbMat );
+		if ( boundingBox ) {
 
-		return true;
+			box.copy( boundingBox );
+			box.applyMatrix4( obbMat );
+
+			return true;
+
+		} else {
+
+			return false;
+
+		}
 
 	}