Dies ist das Repository meines kleinen Portfolios.
Im Hintergrund läuft eine Planetensimulation, geschrieben in JavaScript und Three.js.
Die zu sehenden Texturen stammen von:
https://www.solarsystemscope.com/textures/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
2.3 KiB
130 lines
2.3 KiB
import { |
|
FileLoader, |
|
Group, |
|
Loader, |
|
LoadingManager |
|
} from 'three'; |
|
import { ColladaLoader } from '../loaders/ColladaLoader.js'; |
|
import * as fflate from '../libs/fflate.module.js'; |
|
|
|
class KMZLoader extends Loader { |
|
|
|
constructor( manager ) { |
|
|
|
super( manager ); |
|
|
|
} |
|
|
|
load( url, onLoad, onProgress, onError ) { |
|
|
|
const scope = this; |
|
|
|
const loader = new FileLoader( scope.manager ); |
|
loader.setPath( scope.path ); |
|
loader.setResponseType( 'arraybuffer' ); |
|
loader.setRequestHeader( scope.requestHeader ); |
|
loader.setWithCredentials( scope.withCredentials ); |
|
loader.load( url, function ( text ) { |
|
|
|
try { |
|
|
|
onLoad( scope.parse( text ) ); |
|
|
|
} catch ( e ) { |
|
|
|
if ( onError ) { |
|
|
|
onError( e ); |
|
|
|
} else { |
|
|
|
console.error( e ); |
|
|
|
} |
|
|
|
scope.manager.itemError( url ); |
|
|
|
} |
|
|
|
}, onProgress, onError ); |
|
|
|
} |
|
|
|
parse( data ) { |
|
|
|
function findFile( url ) { |
|
|
|
for ( const path in zip ) { |
|
|
|
if ( path.substr( - url.length ) === url ) { |
|
|
|
return zip[ path ]; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
const manager = new LoadingManager(); |
|
manager.setURLModifier( function ( url ) { |
|
|
|
const image = findFile( url ); |
|
|
|
if ( image ) { |
|
|
|
console.log( 'Loading', url ); |
|
|
|
const blob = new Blob( [ image.buffer ], { type: 'application/octet-stream' } ); |
|
return URL.createObjectURL( blob ); |
|
|
|
} |
|
|
|
return url; |
|
|
|
} ); |
|
|
|
// |
|
|
|
const zip = fflate.unzipSync( new Uint8Array( data ) ); // eslint-disable-line no-undef |
|
|
|
if ( zip[ 'doc.kml' ] ) { |
|
|
|
const xml = new DOMParser().parseFromString( fflate.strFromU8( zip[ 'doc.kml' ] ), 'application/xml' ); // eslint-disable-line no-undef |
|
|
|
const model = xml.querySelector( 'Placemark Model Link href' ); |
|
|
|
if ( model ) { |
|
|
|
const loader = new ColladaLoader( manager ); |
|
return loader.parse( fflate.strFromU8( zip[ model.textContent ] ) ); // eslint-disable-line no-undef |
|
|
|
} |
|
|
|
} else { |
|
|
|
console.warn( 'KMZLoader: Missing doc.kml file.' ); |
|
|
|
for ( const path in zip ) { |
|
|
|
const extension = path.split( '.' ).pop().toLowerCase(); |
|
|
|
if ( extension === 'dae' ) { |
|
|
|
const loader = new ColladaLoader( manager ); |
|
return loader.parse( fflate.strFromU8( zip[ path ] ) ); // eslint-disable-line no-undef |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
console.error( 'KMZLoader: Couldn\'t find .dae file.' ); |
|
return { scene: new Group() }; |
|
|
|
} |
|
|
|
} |
|
|
|
export { KMZLoader };
|
|
|