//- UNCLASSIFIED

extends base
append base_parms
	- tech = "three"
	- effect = "AnaglyphEffect"
append base_body

	script.

		if ( ! Detector.webgl ) Detector.addGetWebGLMessage();

		var container;

		var camera, scene, renderer, effect;

		var mesh, lightMesh, geometry;
		var spheres = [];

		var directionalLight, pointLight;

		var mouseX = 0;
		var mouseY = 0;

		var windowHalfX = window.innerWidth / 2;
		var windowHalfY = window.innerHeight / 2;

		document.addEventListener( 'mousemove', onDocumentMouseMove, false );

		init();
		animate();
		
		function init() {

			container = document.createElement( 'div' );
			document.body.appendChild( container );

			camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 100000 );
			camera.position.z = 3200;

			scene = new THREE.Scene();

			var geometry = new THREE.SphereGeometry( 100, 32, 16 );

			var path = "clients/threejs/examples/textures/cube/pisa/";
			var format = '.png';
			var urls = [
				path + 'px' + format, path + 'nx' + format,
				path + 'py' + format, path + 'ny' + format,
				path + 'pz' + format, path + 'nz' + format
			];

			var textureCube = THREE.ImageUtils.loadTextureCube( urls );
			var material = new THREE.MeshBasicMaterial( { color: 0xffffff, envMap: textureCube } );

			for ( var i = 0; i < 500; i ++ ) {

				var mesh = new THREE.Mesh( geometry, material );

				mesh.position.x = Math.random() * 10000 - 5000;
				mesh.position.y = Math.random() * 10000 - 5000;
				mesh.position.z = Math.random() * 10000 - 5000;

				mesh.scale.x = mesh.scale.y = mesh.scale.z = Math.random() * 3 + 1;

				scene.add( mesh );

				spheres.push( mesh );

			}

			// Skybox

			var shader = THREE.ShaderLib[ "cube" ];
			shader.uniforms[ "tCube" ].value = textureCube;

			var material = new THREE.ShaderMaterial( {

				fragmentShader: shader.fragmentShader,
				vertexShader: shader.vertexShader,
				uniforms: shader.uniforms,
				side: THREE.BackSide

			} ),

			mesh = new THREE.Mesh( new THREE.BoxGeometry( 100000, 100000, 100000 ), material );
			scene.add( mesh );

			//

			renderer = new THREE.WebGLRenderer();
			container.appendChild( renderer.domElement );

			var width = window.innerWidth || 2;
			var height = window.innerHeight || 2;

			effect = new THREE.AnaglyphEffect( renderer );
			effect.setSize( width, height );

			//

			window.addEventListener( 'resize', onWindowResize, false );

		}

		function onWindowResize() {

			windowHalfX = window.innerWidth / 2,
			windowHalfY = window.innerHeight / 2,

			camera.aspect = window.innerWidth / window.innerHeight;
			camera.updateProjectionMatrix();

			effect.setSize( window.innerWidth, window.innerHeight );

		}

		function onDocumentMouseMove(event) {

			mouseX = ( event.clientX - windowHalfX ) * 10;
			mouseY = ( event.clientY - windowHalfY ) * 10;

		}

		//

		function animate() {

			requestAnimationFrame( animate );

			render();

		}

		function render() {

			var timer = 0.0001 * Date.now();

			camera.position.x += ( mouseX - camera.position.x ) * .05;
			camera.position.y += ( - mouseY - camera.position.y ) * .05;

			camera.lookAt( scene.position );

			for ( var i = 0, il = spheres.length; i < il; i ++ ) {

				var sphere = spheres[ i ];

				sphere.position.x = 5000 * Math.cos( timer + i );
				sphere.position.y = 5000 * Math.sin( timer + i * 1.1 );

			}

			effect.render( scene, camera );

		}

//- UNCLASSIFIED
