// Homework 7
//  Amy Nichols
//  Section D
//  aenichol@andrew.cmu.edu
// DO NOT ALTER THE COMMENT THAT STARTS ON THE NEXT LINE -- DETAILS IN CLASS
/*
 Lateral Motion Commands
 
 move in ---- [i]
 move out --- [o]
 move right - [r]
 move left -- [l]
 move up ---- [u]
 move down -- [d]
 
Rotational Motion Commands
 
 rotate left (y axis) --- [left arrow]
 rotate right(y axis) --- [right arrow]
 rotate up ( x axis ) --- [up arrow]
 rotate down ( x axis ) - [down arrow]
 rotate CCW ( z axis ) -- [,]
 rotate CW (z axis ) ---- [.] 
 
 reset to zero ---------- [space]
 
*/
// Declare gobal variables here
PFont f1;
int rotAmount, rotIncrease, rotXAmount, rotYAmount;
int x = 0;
int y = 0;
int z = 0;
void setup( )
{
    size( 500, 500, P3D );
    lights( );    
    f1 = loadFont("f1.vlw");
    textFont( f1 );
          
    background( #04075A );
    lights( );
    noStroke( );
   
    rotAmount = 0;
    rotXAmount = 0;
    rotYAmount = 0;
    rotIncrease = 1;
 
    y = 0;
    x = 0;
    z = 0;
    
}
//
void draw( )
{
  
  translate( width/2 + x, height/2 + y, 0 + z );  
  background( #04075A );
  
  rotate(radians(rotAmount));
  rotateX(radians(rotXAmount));
  rotateY(radians(rotYAmount));
  
    
  drawInitial( );
  
  drawAxis( );
  
}
void keyPressed( )
{
if (key == CODED)
    {
       if (keyCode == LEFT)
       {
         rotYAmount -= rotIncrease;
       }
       
       else if (keyCode == RIGHT)
       {
         rotYAmount += rotIncrease;
       }
       
       else if (keyCode == UP)
       {
          rotXAmount -= rotIncrease;
       }
       
       else if (keyCode == DOWN)
       {
          rotXAmount += rotIncrease;
       }
       
     }
    
    else if (key == ',')  // CCW
    {
      rotAmount -= rotIncrease;
    }
    
    else if (key == '.') // CW
    {
      rotAmount += rotIncrease;
    }
    
    else if (key == 'f')
    {
      
      rotIncrease++;
      
    }
    
    else if (key == 's')
    {
      
      rotIncrease--;
      
    }
    
    else if (key == 'i')
    {
      z = z + width/100;
    }
    
    else if (key == 'o')
    {
      z = z - width/100;
    }
    
    else if (key == 'r')
    {
      x = x + width/100;
    }
    
    else if (key == 'l')
    {
      x = x - width/100;
    }
    
    else if (key == 'u')
    {
      y = y - width/100;
    }
    
    else if (key == 'd')
    {
      y = y + width/100;
    }
    
    else if (key == ' ')
    {
      rotAmount = 0;
      rotYAmount = 0;
      rotXAmount = 0;
      x = 0;
      y = 0;
      z = 0;
    }
    
}
void drawInitial( )
{
  int x = 0;
  int y = 0;
  int z = 0;
  int depth = 0;
  int radius = (int)(.05*width);
  int edge = (int)(.08*width);
  
  background( #04075A );
  lights( );
  directionalLight(155, 155, 155, 15, 20, -1);
  directionalLight(155, 155, 155, 85, 20, -1);
  noStroke( );
// red top spheres
  pushMatrix( );
    translate( x, y-(height*.3), z+(depth) );
    fill( #AF1747 );
    sphere( radius );
  popMatrix( );
  pushMatrix( );
    translate( x, y-(height*.3), z+(depth + 60) );
    fill( #AF1747 );
    sphere( radius/2 );
  popMatrix( );
  pushMatrix( );
    translate( x, y-(height*.3), z+(depth - 60) );
    fill( #AF1747 );
    sphere( radius/2 );
  popMatrix( );
// green boxes
  pushMatrix( );
    translate( x-(width*.09), y-(height*.15), z+(depth) ); 
    fill( #71F500 );
    rotateZ(radians(115));
    box( edge*2, edge/3, edge );
  popMatrix( );
  pushMatrix( );
    translate( x+(width*.09), y-(height*.15), z+(depth) ); 
    fill( #71F500 );
    rotateZ(radians(-115));
    box( edge*2, edge/3, edge);
  popMatrix( );
  pushMatrix( );
    translate( x, y, z+(depth) ); 
    fill( #71F500 );
    rotateY(radians(45));
    rotateZ(radians(45));
    box(edge/2);
  popMatrix( );
  pushMatrix( );
    translate( x+(width*.08), y, z+(depth) ); 
    fill( #71F500 );
    rotateY(radians(45));
    rotateZ(radians(45));
    box(edge/2);
  popMatrix( );
  pushMatrix( );
    translate( x-(width*.08), y, z+(depth) ); 
    fill( #71F500 );
    rotateY(radians(45));
    rotateZ(radians(45));
    box(edge/2);
  popMatrix( );
  pushMatrix( );
    translate( x-(width*.23), y+(height*.14), z+(depth) ); 
    fill( #71F500 );
    rotateZ(radians(115));
    box( edge*2, edge/3, edge);
  popMatrix( );
  pushMatrix( );
    translate( x+(width*.23), y+(height*.14), z+(depth) ); 
    fill( #71F500 );
    rotateZ(radians(-115));
    box( edge*2, edge/3, edge);
  popMatrix( );
// orange middle spheres
  pushMatrix( );
    translate( x+(width*.17), y, z+(depth) ); 
    fill( #F55A00 );
    sphere( radius );
  popMatrix( );
  pushMatrix( );
    translate( x+(width*.17), y, z+(depth - 60) ); 
    fill( #F55A00 );
    sphere( radius/2 );
  popMatrix( );
  pushMatrix( );
    translate( x+(width*.17), y, z+(depth + 60) ); 
    fill( #F55A00 );
    sphere( radius/2 );
  popMatrix( );
  pushMatrix( );
    translate( x-(width*.17), y, z+(depth) ); 
    fill( #F55A00 );
    sphere( radius );
  popMatrix( );
  pushMatrix( );
    translate( x-(width*.17), y, z+(depth + 60) ); 
    fill( #F55A00 );
    sphere( radius/2 );
  popMatrix( );
  pushMatrix( );
    translate( x-(width*.17), y, z+(depth - 60) ); 
    fill( #F55A00 );
    sphere( radius/2 );
  popMatrix( );
// yellow spheres - bottom
  pushMatrix( );
    translate( x+(width*.30), y+(height*.28), z+(depth) ); 
    fill( #F5A400 );
    sphere( radius );
  popMatrix( );
  pushMatrix( );
    translate( x+(width*.30), y+(height*.28), z+(depth + 60) ); 
    fill( #F5A400 );
    rotateZ(radians(45));
    sphere( radius/2 );
  popMatrix( );
  pushMatrix( );
    translate( x+(width*.30), y+(height*.28), z+(depth - 60) ); 
    fill( #F5A400 );
    rotateZ(radians(45));
    sphere( radius/2 );
  popMatrix( );
  pushMatrix( );
    translate( x-(width*.30), y+(height*.28), z+(depth) ); 
    fill( #F5A400 );
    sphere( radius );
  popMatrix( );
  pushMatrix( );
    translate( x-(width*.30), y+(height*.28), z+(depth + 60) ); 
    fill( #F5A400 );
    rotateZ(radians(45));
    sphere( radius/2 );
  popMatrix( );
  pushMatrix( );
    translate( x-(width*.30), y+(height*.28), z+(depth - 60) ); 
    fill( #F5A400 );
    rotateZ(radians(45));
    sphere( radius/2 );
  popMatrix( );
  
// A middle line
  pushMatrix( );
    translate( x, y, z+(depth) ); 
    fill( #94F0ED, 95 );
    box(edge*4, edge/10, edge*5);
  popMatrix( );
  
// Top/bottom platforms
  pushMatrix( );
    translate( x+(width*.30), y+(height*.28), z+(depth) ); 
    fill( #94F0ED, 95 );
    box( edge*3, edge/10, edge*5 );
  popMatrix( );
  pushMatrix( );
    translate( x-(width*.30), y+(height*.28), z+(depth) ); 
    fill( #94F0ED, 95 );
    box( edge*3, edge/10, edge*5 );
  popMatrix( );
  pushMatrix( );
    translate( x, y-(height*.3), z+(depth) ); 
    fill( #94F0ED, 95 );
    box( edge*2, edge/10, edge*5);
  popMatrix( );
  
// Side platforms
  pushMatrix( );
    translate( x-(width*.17), y, z+(depth) ); 
    fill( #94F0ED, 95 );
    rotateZ(radians(115));
    box( edge*7.5, edge/10, edge*4 );
  popMatrix( );
  pushMatrix( );
    translate( x+(width*.17), y, z+(depth) ); 
    fill( #94F0ED, 95 );
    rotateZ(radians(-115));
    box( edge*7.5, edge/10, edge*4 );
  popMatrix( );
   
}
void drawAxis( )
{
  fill( 255 );
  sphere(1);
  stroke( 255, 0, 0 );
  strokeWeight( 1 );
  line( -200, 0, 0, 200, 0, 0);
  text( 'W', -200, 0, 0);
  text( 'E', 200, 0, 0);
  stroke( 0, 255, 0 );
  line( 0,  -200, 0, 0, 200, 0 );
  text( 'N', 0, -200, 0);
  text( 'S', 0,  200, 0);
  stroke(255, 255, 0 );
  line( 0, 0, -200, 0, 0, 200);
  text( 'F', 0, 0, 200);
  text( 'B', 0, 0,  -200); 
}