| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 | 
							- ( function () {
 
- 	/**
 
-  * peppers ghost effect based on http://www.instructables.com/id/Reflective-Prism/?ALLSTEPS
 
-  */
 
- 	class PeppersGhostEffect {
 
- 		constructor( renderer ) {
 
- 			const scope = this;
 
- 			scope.cameraDistance = 15;
 
- 			scope.reflectFromAbove = false; // Internals
 
- 			let _halfWidth, _width, _height;
 
- 			const _cameraF = new THREE.PerspectiveCamera(); //front
 
- 			const _cameraB = new THREE.PerspectiveCamera(); //back
 
- 			const _cameraL = new THREE.PerspectiveCamera(); //left
 
- 			const _cameraR = new THREE.PerspectiveCamera(); //right
 
- 			const _position = new THREE.Vector3();
 
- 			const _quaternion = new THREE.Quaternion();
 
- 			const _scale = new THREE.Vector3(); // Initialization
 
- 			renderer.autoClear = false;
 
- 			this.setSize = function ( width, height ) {
 
- 				_halfWidth = width / 2;
 
- 				if ( width < height ) {
 
- 					_width = width / 3;
 
- 					_height = width / 3;
 
- 				} else {
 
- 					_width = height / 3;
 
- 					_height = height / 3;
 
- 				}
 
- 				renderer.setSize( width, height );
 
- 			};
 
- 			this.render = function ( scene, camera ) {
 
- 				scene.updateMatrixWorld();
 
- 				if ( camera.parent === null ) camera.updateMatrixWorld();
 
- 				camera.matrixWorld.decompose( _position, _quaternion, _scale ); // front
 
- 				_cameraF.position.copy( _position );
 
- 				_cameraF.quaternion.copy( _quaternion );
 
- 				_cameraF.translateZ( scope.cameraDistance );
 
- 				_cameraF.lookAt( scene.position ); // back
 
- 				_cameraB.position.copy( _position );
 
- 				_cameraB.quaternion.copy( _quaternion );
 
- 				_cameraB.translateZ( - scope.cameraDistance );
 
- 				_cameraB.lookAt( scene.position );
 
- 				_cameraB.rotation.z += 180 * ( Math.PI / 180 ); // left
 
- 				_cameraL.position.copy( _position );
 
- 				_cameraL.quaternion.copy( _quaternion );
 
- 				_cameraL.translateX( - scope.cameraDistance );
 
- 				_cameraL.lookAt( scene.position );
 
- 				_cameraL.rotation.x += 90 * ( Math.PI / 180 ); // right
 
- 				_cameraR.position.copy( _position );
 
- 				_cameraR.quaternion.copy( _quaternion );
 
- 				_cameraR.translateX( scope.cameraDistance );
 
- 				_cameraR.lookAt( scene.position );
 
- 				_cameraR.rotation.x += 90 * ( Math.PI / 180 );
 
- 				renderer.clear();
 
- 				renderer.setScissorTest( true );
 
- 				renderer.setScissor( _halfWidth - _width / 2, _height * 2, _width, _height );
 
- 				renderer.setViewport( _halfWidth - _width / 2, _height * 2, _width, _height );
 
- 				if ( scope.reflectFromAbove ) {
 
- 					renderer.render( scene, _cameraB );
 
- 				} else {
 
- 					renderer.render( scene, _cameraF );
 
- 				}
 
- 				renderer.setScissor( _halfWidth - _width / 2, 0, _width, _height );
 
- 				renderer.setViewport( _halfWidth - _width / 2, 0, _width, _height );
 
- 				if ( scope.reflectFromAbove ) {
 
- 					renderer.render( scene, _cameraF );
 
- 				} else {
 
- 					renderer.render( scene, _cameraB );
 
- 				}
 
- 				renderer.setScissor( _halfWidth - _width / 2 - _width, _height, _width, _height );
 
- 				renderer.setViewport( _halfWidth - _width / 2 - _width, _height, _width, _height );
 
- 				if ( scope.reflectFromAbove ) {
 
- 					renderer.render( scene, _cameraR );
 
- 				} else {
 
- 					renderer.render( scene, _cameraL );
 
- 				}
 
- 				renderer.setScissor( _halfWidth + _width / 2, _height, _width, _height );
 
- 				renderer.setViewport( _halfWidth + _width / 2, _height, _width, _height );
 
- 				if ( scope.reflectFromAbove ) {
 
- 					renderer.render( scene, _cameraL );
 
- 				} else {
 
- 					renderer.render( scene, _cameraR );
 
- 				}
 
- 				renderer.setScissorTest( false );
 
- 			};
 
- 		}
 
- 	}
 
- 	THREE.PeppersGhostEffect = PeppersGhostEffect;
 
- } )();
 
 
  |