//	Author:  Owen Merrick
//	Date:  2008 03 11
//	Description:  Congestion simulation
//	Spheres move along paths at a speed which depends upon the proximity of their neighbors
//	Based on the LA freeways


int $numClumps = 1; 							// Parameters for initial setup
int $numCarsPerClump = 20;
int $numFrames = 15;

// 	STARTS OUT BY DELETING EVERYTHING!!!!!!!!!!

select -all;
delete;


camera -n "perspCam1" -centerOfInterest 5 -focalLength 35 -lensSqueezeRatio 1 -cameraScale 1 -horizontalFilmAperture 1.4173 -horizontalFilmOffset 0 -verticalFilmAperture 0.9449 -verticalFilmOffset 0 -filmFit Fill -overscan 1 -motionBlur 0 -shutterAngle 144 -nearClipPlane 0.01 -farClipPlane 1000 -orthographic 0 -orthographicWidth 30; objectMoveCommand; cameraMakeNode 2 "";
setAttr "perspCam1Shape1.backgroundColor" -type double3 0.9 0.9 0.9 ;
xform -t 165 7.5 64;


// Set up materials
float $red = .25; 
for ($iii=1;$iii<5;$iii++){
       string $owenblinn = "owenredblinn"+$iii;
       string $owenblinnSG = "owenredblinn"+$iii+"SG";
       string $owenblinnoutcolor = "owenredblinn"+$iii+".outColor";
       string $owenblinnSGsS = "owenredblinn"+$iii+"SG.surfaceShader";
       string $owenblinncolor = "owenredblinn"+$iii+".color";
	string $owenblinnincand = "owenredblinn"+$iii+".incandescence";
       shadingNode -asShader blinn -n $owenblinn;
       renderCreateBarCB -asShader "surfaceShader" blinn;
       sets -renderable true -noSurfaceShader true -empty -name $owenblinnSG;
       connectAttr -f $owenblinnoutcolor $owenblinnSGsS;

       setAttr $owenblinncolor -type double3 $red 0 0 ;
       setAttr $owenblinnincand -type double3 $red 0 0 ;
		
	$red = $red+.25;
}

float $yel = .4; 
for ($iii=1;$iii<5;$iii++){
       string $owenblinn = "owenyellowblinn"+$iii;
       string $owenblinnSG = "owenyellowblinn"+$iii+"SG";
       string $owenblinnoutcolor = "owenyellowblinn"+$iii+".outColor";
       string $owenblinnSGsS = "owenyellowblinn"+$iii+"SG.surfaceShader";
       string $owenblinncolor = "owenyellowblinn"+$iii+".color";
	string $owenblinnincand = "owenyellowblinn"+$iii+".incandescence";
       
	shadingNode -asShader blinn -n $owenblinn;
       renderCreateBarCB -asShader "surfaceShader" blinn;
       sets -renderable true -noSurfaceShader true -empty -name $owenblinnSG;
       connectAttr -f $owenblinnoutcolor $owenblinnSGsS;

       setAttr $owenblinncolor -type double3 $yel $yel 0 ;
       setAttr $owenblinnincand -type double3 $yel $yel 0  ;

	$yel = $yel+.07;
}



string $filename = "traffix";
setAttr defaultRenderGlobals.imageFilePrefix -type "string" $filename;
setAttr defaultRenderGlobals.enableDefaultLight 1;  //turn on default lights
setAttr defaultRenderGlobals.extensionPadding 3;




//	Create Freeway network curves:

curve -n "FWYsantaMonica" -d 3 -p 6.449833 56.113778 0.5 -p 38.877096 79.629732 -7 -p 79.720594 40.766524 2 -p 131.208156 93.491767 2.5 -p 172.794264 77.649441 9 -k 0 -k 0 -k 0 -k 1 -k 2 -k 2 -k 2 ;
curve -n "FWYhollywood"   -d 3 -p 0.0138882 118.740476 2 -p 45.313041 123.443666 19 -p 73.532186 74.679004 -18 -p 124.772211 62.797259 5 -p 138.881783 27.399561 -2 -k 0 -k 0 -k 0 -k 1 -k 2 -k 2 -k 2 ;
curve -n "FWYpasadena"    -d 3 -p 120.811629 101.165394 -16 -p 62.640586 88.788577 13 -p 79.225522 40.023915 -12 -p 74.769867 5.863898 14 -k 0 -k 0 -k 0 -k 1 -k 1 -k 1 ;
// curve -n "FWYsanDiego"    -d 3 -p 14.618533 133.592657 8 -p 18.084042 103.640758 12 -p 10.410415 77.649441 0 -p 59.917686 45.469715 -7 -p 42.590141 18.240715 5 -p 54.719423 5.121289 0 -k 0 -k 0 -k 0 -k 1 -k 2 -k 3 -k 3 -k 3 ;
// curve -n "FWYimperial"    -d 3 -p 42.660286 24.070244 2 -p 68.793464 34.634721 10 -p 103.452361 12.579059 2 -p 134.404423 22.031486 -2 -k 0 -k 0 -k 0 -k 1 -k 1 -k 1 ;

select "FWY*";
string $FWYS[] = `ls-sl`;						// FWYS[]  =  strings of freeway names
int $szFWYS = size($FWYS);						// $szFWYS  = # of freeways	
hide "FWY*";								// $cvLength[] = freeway lengths in parameter space

int $cvLength[];
for ($i=0; $i < $szFWYS; $i++){
	string $crap[] =`listHistory $FWYS[$i]`; 
	$cvLength[$i] = `getAttr ($crap[0]+".spans")`;
}


//  Create  initial setup
//  Place cars on the road, normally distributed along the path



float $a, $b, $c, $z, $aa, $bb, $cc, $zz;
string $thiscar;
string $All[];
clear $All;

for ($l = 0; $l < $szFWYS ; $l++){					// loop through each road
		
	for($lll = 0; $lll <= $numClumps;$lll++){			//

		
		$clumpMean = rand(.2,.8); 

		for($i=1;$i<$numCarsPerClump;$i++){
						
			do{
				$a = rand(-1,1);
				$b = rand(-1,1);
				$z = (($a*$a)+($b*$b));	
			
			}while($z == 0 || $z >= 1);
			
			do{
				$aa = rand(-1,1);
				$bb = rand(-1,1);
				$zz = (($aa*$aa)+($bb*$bb));	
			
			}while($zz == 0 || $zz >= 1);
		
			
			$z = sqrt((-2*log($z))/$z);
			$zz = sqrt((-2*log($zz))/$zz);
		
			$randX = $a*$z*.6;
			$randY = $b*$z*.6;				
			$randZ = $aa*$zz*.8;
			$randU = ((($bb*$zz)/35)+$clumpMean);
			
			if ($randU < 0 || $randU > 1){ 
				$randU = $clumpMean;
			}
		
			sphere -r .75 -n "car";
			string $curCar[] = `ls-sl`;	
					
			addAttr -longName parameterPosition -at "float" -defaultValue $randU -minValue 0 -maxValue 1;
			addAttr -longName currentFWY -at short -defaultValue $l; 
			
			string $carHist[] = `listHistory $curCar[0]`;
			
			float $pocVals[] = `pointOnCurve -top 1 -pr $randU -p $FWYS[$l]`;
	
			setAttr ($carHist[1]+".pivot") -type "double3" $pocVals[0] $pocVals[1] $pocVals[2];
			setAttr ($curCar[0]+".translate") -type "double3" $randX $randY $randZ ;	
			
		}
	}
}


// End of initial setup



// create an array of car names:


select `ls -tr`;

string $deselect[] =  {"perspCam1_group","perspCam1","perspCam1_aim","front", "persp", "side", "top", "FWYhollywood", "FWYpasadena", "FWYsantaMonica"};

// string $deselect[] =  {"front", "persp", "side", "top", "FWYhollywood", "FWYimperial", "FWYpasadena", "FWYsanDiego", "FWYsantaMonica"};
select -d $deselect;

string $All[] = `ls-sl`;
int $sizeAll = size($All);


string $closest;
string $closest2;
string $closest3;

for ($pp = 1; $pp < $numFrames ;$pp++){ 
	
	for ($k = 0; $k < $sizeAll; $k++){
	
		// find distance to nearest neighbor (approximate congestion)
		// then move along by some factor of distance to neighbor (or 3 closest)
			
		float $XYZVals01[] = `getAttr ($All[$k] + ".center")` ;
		vector $XYZVec01 = <<$XYZVals01[0], $XYZVals01[1], $XYZVals01[2]>> ;
			
		float $previousD = 1000000000;
		float $closestDist = 1000000;
		float $closest2Dist = 99999999;
		float $closest3Dist = 99999998;	
		
		// Find distances to nearest 3 neighbors
	
		for ($n = 0; $n < $sizeAll; $n++){	
	
			float $XYZVals02[] = `getAttr ($All[$n] + ".center")` ;
			vector $XYZVec02 = <<$XYZVals02[0], $XYZVals02[1], $XYZVals02[2]>> ;
		
			$DiffVec = $XYZVec01 - $XYZVec02 ;
	           	float $CurrentDist = mag($DiffVec);
			
			if ($CurrentDist < $previousD && $CurrentDist != 0){
				// $closest = $All[$n];
				$closestDist = $CurrentDist;
				$previousD = $CurrentDist;
			};
			
			if ($CurrentDist < $closest2Dist && $CurrentDist > $closestDist){
				// $closest2 = $All[$n];
				$closest2Dist = $CurrentDist;
				
			};
	
			if ($CurrentDist < $closest3Dist && $CurrentDist > $closest2Dist){
				// $closest3 = $All[$n];
				$closest3Dist = $CurrentDist;
				
			};
	
		};
	
		// print ($All[$k]+ " : " + $closest + " : "+ $closestDist + "\n");	
		// print ("second: "+ $closest2 + " : " +$closest2Dist + "\n");
		// print ("third: "+ $closest3 + " : " +$closest3Dist + "\n\n");
		
			
		float $deltaU = ($closestDist + $closest2Dist + $closest3Dist)/5000;

		if ($deltaU > .007){
			$deltaU = .06 + rand(-.001, .002);
		}
		
		float $oldU = `getAttr ($All[$k]+".parameterPosition")`;
		float $newU = ($oldU + $deltaU);	
	
		if ($newU > 1){ 
			do{
				$newU = $newU - 1;
			}while($newU > 1);
		}	
		

		int $curCarFwy = `getAttr ($All[$k]+".currentFWY")`;
		

		float $pocVals[] = `pointOnCurve -top 1 -pr $newU -p $FWYS[$curCarFwy]`;
		
		string $carHist[] = `listHistory $All[$k]`;
		setAttr ($carHist[1]+".pivot") -type "double3" $pocVals[0] $pocVals[1] $pocVals[2];
		setAttr ($All[$k]+".parameterPosition") $newU;
		
		select -r $All[$k];
       

		if ( $deltaU > .005) 
			{sets -e -forceElement owenyellowblinn2SG;}  
		
		else if ( $deltaU <= .005 && $deltaU > .002 ) 
			{sets -e -forceElement owenyellowblinn1SG;} 
		
		else if ( $deltaU <= .002 && $deltaU > .0011 ) 
			{sets -e -forceElement owenredblinn1SG;} 
		
		else if ( $deltaU <= .0011 && $deltaU > .0009 ) 
			{sets -e -forceElement owenredblinn2SG;} 
		
		else if ( $deltaU <= .0009&& $deltaU > .0007 ) 
			{sets -e -forceElement owenredblinn3SG;} 
		
		else  
			{sets -e -forceElement owenredblinn4SG;} 


	};




float $car54vals[] = `getAttr car54.center`;

xform -t $car54vals[0] $car54vals[1] $car54vals[2] perspCam1_aim; 


currentTime $pp;
// render perspCam1;
// render top;


}




