var FILE_START_LOAD=90;var NUM_FILES_TO_LOAD=20;var SCALE=1.5;var TWO_PI=Math.PI*2;var focalLength=2000;var canvas;var ctx;var imgData;//var particle;//var particleLoaded=false;var particleWidth;var particleHeight;var curShowing=0;var curParsed=0;var csvParser;var parsers=[];var particlePositions=[];var colours=[];var mouseX=0;var mouseY=0;document.onmousemove=function(e){	mouseX=e.clientX;	mouseY=e.clientY;}function init(){	SCALE=window.innerWidth/1024;	canvas=document.getElementById("myCanvas");	canvas.width=window.innerWidth;	canvas.height=window.innerHeight;	    if (canvas.getContext)     {        ctx = canvas.getContext('2d');    }		/*	particle=new Image();	particle.src="images/jam3.png";	particle.onload=onParticleLoaded;	*/		parseNextFile();		return setInterval(draw, 33);}function parseNextFile(){	curParsed++;		csvParser=new CSVParser("data/"+(curParsed+FILE_START_LOAD)+".csv");	csvParser.onDataParsed=onDataParsed;}function onDataParsed(){	particlePositions=csvParser.getPoints();	colours=csvParser.getColours();		particlePositions=scale(particlePositions, SCALE);	particlePositions=translate(particlePositions, -100*SCALE, -150*SCALE, 100*SCALE);		csvParser.setPoints(particlePositions);		parsers[parsers.length]=csvParser;		if(curParsed<NUM_FILES_TO_LOAD)	{		parseNextFile();	}}function draw(){	ctx.save();			if(curParsed==NUM_FILES_TO_LOAD)	{		ctx.fillStyle = 'rgba(30, 30, 30, 255)';		ctx.fillRect(0, 0, canvas.width, canvas.height);				particlePositions=parsers[curShowing].getPoints();		colours=parsers[curShowing].getColours();		curShowing=(curShowing+1)%NUM_FILES_TO_LOAD;				var mouseRatio=1-(mouseX/canvas.width);		var rotatedPoints=rotateY(particlePositions, mouseRatio*Math.PI-Math.PI*0.5);				var pos2d=projectVectors(rotatedPoints);		var numPoints=pos2d.length/3;				imgData=ctx.getImageData(0, 0, canvas.width, canvas.height);				for(var i=0;i<numPoints;i++)		{			var i3=i*3;						var x=parseInt(pos2d[i3]+canvas.width*0.5);			var y=parseInt(pos2d[i3+1]+canvas.height*0.5);			var scale=pos2d[i3+2];						/*			if(pos2d[i3+2]>0)			{				ctx.drawImage(particle, pos2d[i3]+canvas.width*0.5, 										pos2d[i3+1]+canvas.height*0.5, 										particleWidth*pos2d[i3+2], 										particleHeight*pos2d[i3+2]);				}			*/									if(pos2d[i3+2]>0)			{				var idx=(canvas.width*y+x)*4;								imgData.data[idx]=colours[i]+30; //red				imgData.data[idx+1]=colours[i]+10; //green				imgData.data[idx+2]=colours[i]+40; //blue				imgData.data[idx+3]=255; //alpha			}		}			ctx.putImageData(imgData, 0, 0);	}	else	{		ctx.fillStyle = 'rgba(255, 255, 255, 255)';		ctx.fillRect(0, 0, canvas.width, canvas.height);		ctx.fillStyle = 'rgba(0, 0, 0, 255)';		ctx.fillRect(0, canvas.height*0.5-1, curParsed/NUM_FILES_TO_LOAD*canvas.width, 2);	}		ctx.restore();}function projectVectors(vectors){	var pos2d=[];	var numPoints=vectors.length/3;		for(var i=0;i<numPoints;i++)	{		var i3=i*3;		var scale=focalLength/(focalLength+vectors[i3+2]);				var x=vectors[i3]*scale;		var y=vectors[i3+1]*scale;				pos2d[pos2d.length]=x;		pos2d[pos2d.length]=y;		pos2d[pos2d.length]=scale;	}		return pos2d;}function translate(vectors, x, y, z){	var numPoints=vectors.length/3;	var rVal=[];	for(var i=0;i<numPoints;i++)	{		var i3=i*3;				rVal[i3]=vectors[i3]+x;		rVal[i3+1]=vectors[i3+1]+y;		rVal[i3+2]=vectors[i3+2]+z;	}		return rVal;}function scale(vectors, amount){	var numPoints=vectors.length/3;	var rVal=[];	for(var i=0;i<numPoints;i++)	{		var i3=i*3;				rVal[i3]=vectors[i3]*amount;		rVal[i3+1]=vectors[i3+1]*amount;		rVal[i3+2]=vectors[i3+2]*amount;	}		return rVal;}function rotateX(vectors, amount){	var numPoints=vectors.length/3;	var rVal=[];	for(var i=0;i<numPoints;i++)	{		var i3=i*3;				var y=vectors[i3+1];		var z=vectors[i3+2];				y=Math.cos(amount)*y-Math.sin(amount)*z;		z=Math.cos(amount)*z+Math.sin(amount)*y;				rVal[i3]=vectors[i3];		rVal[i3+1]=y;		rVal[i3+2]=z;	}		return rVal;}function rotateY(vectors, amount){	var numPoints=vectors.length/3;	var rVal=[];	for(var i=0;i<numPoints;i++)	{		var i3=i*3;				var x=vectors[i3];		var z=vectors[i3+2];				x=Math.cos(amount)*x-Math.sin(amount)*z;		z=Math.cos(amount)*z+Math.sin(amount)*x;				rVal[i3]=x;		rVal[i3+1]=vectors[i3+1];		rVal[i3+2]=z;	}		return rVal;}function rotateZ(vectors, amount){	var numPoints=vectors.length/3;	var rVal=[];	for(var i=0;i<numPoints;i++)	{		var i3=i*3;				var x=vectors[i3];		var y=vectors[i3+1];				x=x*Math.cos(amount)+y*Math.sin(amount);		y=y*Math.cos(amount)-x*Math.sin(amount);				rVal[i3]=x;		rVal[i3+1]=y;		rVal[i3+2]=vectors[i3+2];	}		return rVal;}/*function onParticleLoaded(){	particleLoaded=true;	particleWidth=particle.width;	particleHeight=particle.height;}*/