78 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import {
 | 
						|
	FileLoader,
 | 
						|
	Loader,
 | 
						|
	CanvasTexture,
 | 
						|
	NearestFilter,
 | 
						|
	SRGBColorSpace
 | 
						|
} from 'three';
 | 
						|
 | 
						|
import lottie from '../libs/lottie_canvas.module.js';
 | 
						|
 | 
						|
class LottieLoader extends Loader {
 | 
						|
 | 
						|
	setQuality( value ) {
 | 
						|
 | 
						|
		this._quality = value;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
	load( url, onLoad, onProgress, onError ) {
 | 
						|
 | 
						|
		const quality = this._quality || 1;
 | 
						|
 | 
						|
		const texture = new CanvasTexture();
 | 
						|
		texture.minFilter = NearestFilter;
 | 
						|
		texture.colorSpace = SRGBColorSpace;
 | 
						|
 | 
						|
		const loader = new FileLoader( this.manager );
 | 
						|
		loader.setPath( this.path );
 | 
						|
		loader.setWithCredentials( this.withCredentials );
 | 
						|
 | 
						|
		loader.load( url, function ( text ) {
 | 
						|
 | 
						|
			const data = JSON.parse( text );
 | 
						|
 | 
						|
			// lottie uses container.offetWidth and offsetHeight
 | 
						|
			// to define width/height
 | 
						|
 | 
						|
			const container = document.createElement( 'div' );
 | 
						|
			container.style.width = data.w + 'px';
 | 
						|
			container.style.height = data.h + 'px';
 | 
						|
			document.body.appendChild( container );
 | 
						|
 | 
						|
			const animation = lottie.loadAnimation( {
 | 
						|
				container: container,
 | 
						|
				animType: 'canvas',
 | 
						|
				loop: true,
 | 
						|
				autoplay: true,
 | 
						|
				animationData: data,
 | 
						|
				rendererSettings: { dpr: quality }
 | 
						|
			} );
 | 
						|
 | 
						|
			texture.animation = animation;
 | 
						|
			texture.image = animation.container;
 | 
						|
 | 
						|
			animation.addEventListener( 'enterFrame', function () {
 | 
						|
 | 
						|
				texture.needsUpdate = true;
 | 
						|
 | 
						|
			} );
 | 
						|
 | 
						|
			container.style.display = 'none';
 | 
						|
 | 
						|
			if ( onLoad !== undefined ) {
 | 
						|
 | 
						|
				onLoad( texture );
 | 
						|
 | 
						|
			}
 | 
						|
 | 
						|
		}, onProgress, onError );
 | 
						|
 | 
						|
		return texture;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
export { LottieLoader };
 |