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 }; |