瀏覽代碼

JSM: Added module and TS file for KMZLoader.

Mugen87 6 年之前
父節點
當前提交
928465c256

+ 1 - 0
docs/manual/en/introduction/Import-via-modules.html

@@ -128,6 +128,7 @@
 						<li>FBXLoader</li>
 						<li>GCodeLoader</li>
 						<li>GLTFLoader</li>
+						<li>KMZLoader</li>
 						<li>MTLLoader</li>
 						<li>OBJLoader</li>
 						<li>PCDLoader</li>

+ 15 - 0
examples/jsm/loaders/KMZLoader.d.ts

@@ -0,0 +1,15 @@
+import {
+  LoadingManager
+} from '../../../src/Three';
+
+import { Collada } from './ColladaLoader';
+
+export class KMZLoader {
+  constructor(manager?: LoadingManager);
+  manager: LoadingManager;
+  path: string;
+
+  load(url: string, onLoad: (kmz: Collada) => void, onProgress?: (event: ProgressEvent) => void, onError?: (event: ErrorEvent) => void): void;
+  setPath(value: string): this;
+  parse(data: ArrayBuffer): Collada;
+}

+ 122 - 0
examples/jsm/loaders/KMZLoader.js

@@ -0,0 +1,122 @@
+/**
+ * @author mrdoob / http://mrdoob.com/
+ */
+
+import {
+	DefaultLoadingManager,
+	FileLoader,
+	Group,
+	LoadingManager
+} from "../../../build/three.module.js";
+import { ColladaLoader } from "../loaders/ColladaLoader.js";
+
+var KMZLoader = function ( manager ) {
+
+	this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
+
+};
+
+KMZLoader.prototype = {
+
+	constructor: KMZLoader,
+
+	load: function ( url, onLoad, onProgress, onError ) {
+
+		var scope = this;
+
+		var loader = new FileLoader( scope.manager );
+		loader.setPath( scope.path );
+		loader.setResponseType( 'arraybuffer' );
+		loader.load( url, function ( text ) {
+
+			onLoad( scope.parse( text ) );
+
+		}, onProgress, onError );
+
+	},
+
+	setPath: function ( value ) {
+
+		this.path = value;
+		return this;
+
+	},
+
+	parse: function ( data ) {
+
+		function findFile( url ) {
+
+			for ( var path in zip.files ) {
+
+				if ( path.substr( - url.length ) === url ) {
+
+					return zip.files[ path ];
+
+				}
+
+			}
+
+		}
+
+		var manager = new LoadingManager();
+		manager.setURLModifier( function ( url ) {
+
+			var image = findFile( url );
+
+			if ( image ) {
+
+				console.log( 'Loading', url );
+
+				var blob = new Blob( [ image.asArrayBuffer() ], { type: 'application/octet-stream' } );
+				return URL.createObjectURL( blob );
+
+			}
+
+			return url;
+
+		} );
+
+		//
+
+		var zip = new JSZip( data ); // eslint-disable-line no-undef
+
+		if ( zip.files[ 'doc.kml' ] ) {
+
+			var xml = new DOMParser().parseFromString( zip.files[ 'doc.kml' ].asText(), 'application/xml' );
+
+			var model = xml.querySelector( 'Placemark Model Link href' );
+
+			if ( model ) {
+
+				var loader = new ColladaLoader( manager );
+				return loader.parse( zip.files[ model.textContent ].asText() );
+
+			}
+
+		} else {
+
+			console.warn( 'KMZLoader: Missing doc.kml file.' );
+
+			for ( var path in zip.files ) {
+
+				var extension = path.split( '.' ).pop().toLowerCase();
+
+				if ( extension === 'dae' ) {
+
+					var loader = new ColladaLoader( manager );
+					return loader.parse( zip.files[ path ].asText() );
+
+				}
+
+			}
+
+		}
+
+		console.error( 'KMZLoader: Couldn\'t find .dae file.' );
+		return { scene: new Group() };
+
+	}
+
+};
+
+export { KMZLoader };

+ 1 - 0
utils/modularize.js

@@ -46,6 +46,7 @@ var files = [
 	{ path: 'loaders/FBXLoader.js', dependencies: [ { name: 'TGALoader', path: 'loaders/TGALoader.js' }, { name: 'NURBSCurve', path: 'curves/NURBSCurve.js' } ], ignoreList: [] },
 	{ path: 'loaders/GCodeLoader.js', dependencies: [], ignoreList: [] },
 	{ path: 'loaders/GLTFLoader.js', dependencies: [], ignoreList: [ 'NoSide', 'Matrix2', 'DDSLoader' ] },
+	{ path: 'loaders/KMZLoader.js', dependencies: [ { name: 'ColladaLoader', path: 'loaders/ColladaLoader.js' } ], ignoreList: [] },
 	{ path: 'loaders/MTLLoader.js', dependencies: [], ignoreList: [ 'BackSide', 'DoubleSide', 'ClampToEdgeWrapping', 'MirroredRepeatWrapping' ] },
 	{ path: 'loaders/OBJLoader.js', dependencies: [], ignoreList: [] },
 	{ path: 'loaders/PCDLoader.js', dependencies: [], ignoreList: [] },