/* -------------------------------------------------------------------------------------
Interactive Drawing - Jeep
By Irvin Lam
Includes:
- shaking car (to imitate bumpy surface)
- horizontal movement by mouse position
- moving clouds and rocks (an illusion for a moving car)
---------------------------------------------------------------------------------------*/
void setup() {
size (400,400);
frameRate(45);
noCursor();
}
void draw () {
background (150, 200, 255);
noStroke();
//Gradient sky
fill(255, 25);
rectMode(CORNER);
rect(0, 100, 400, 300);
rect(0, 125, 400, 275);
rect(0, 150, 400, 250);
rect(0, 165, 400, 235);
//Clouds
noStroke();
fill (255);
ellipse(-250 + (frameCount*.25 % 1000), 50, 200, 15);
ellipse(-250 + (frameCount*.35 % 1000), 50, 175, 40);
ellipse(-250 + (frameCount*.5 % 1000), 10, 100, 30);
ellipse(-250 + (frameCount*.5 % 1000), 20, 200, 30);
ellipse(-250 + (frameCount*.65 % 1000), 15, 100, 25);
ellipse(-250 + (frameCount*.75 % 1000), 10, 50, 15);
ellipse(-250 + (frameCount*.75 % 1000), 17, 75, 18);
ellipse(-250 + (frameCount*.75 % 1000), 17, 125, 45);
ellipse(-250 + (frameCount*.95 % 1000), 10, 125, 25);
ellipse(-250 + (frameCount*.95 % 1000), 20, 200, 45);
ellipse(-300 + (frameCount % 1000), 30, 200, 70);
//Back Rocks
noStroke();
fill (125);
quad ((frameCount * 1.5 % 1000) - 310, 328,
(frameCount * 1.5 % 1000) - 320, 332,
(frameCount * 1.5 % 1000) - 300, 332,
(frameCount * 1.5 % 1000) - 310, 329);
quad ((frameCount * 1.5 % 1000) - 410, 338,
(frameCount * 1.5 % 1000) - 420, 332,
(frameCount * 1.5 % 1000) - 400, 332,
(frameCount * 1.5 % 1000) - 410, 329);
quad ((frameCount * 1.5 % 1000) - 610, 338,
(frameCount * 1.5 % 1000) - 630, 332,
(frameCount * 1.5 % 1000) - 595, 332,
(frameCount * 1.5 % 1000) - 600, 329);
//Jeep (TL, BL, BR, TR)
//Headlights
fill(255,231,96,75);
triangle(mouseX - 600, 220, mouseX - 600, 300, mouseX -50, 250);
triangle(mouseX - 600, 225, mouseX - 600, 310, mouseX -50, 250);
triangle(mouseX - 600, 230, mouseX - 600, 315, mouseX -50, 250);
triangle(mouseX - 600, 235, mouseX - 600, 320, mouseX -50, 250);
fill(255,231,96,155);
triangle(mouseX - 600, 245, mouseX - 600, 330, mouseX -50, 250);
//Body
//top
stroke(50); //accent
strokeWeight(7);
line(mouseX - 40, (frameCount % 2) + 190, mouseX + 70, (frameCount % 2) + 190);
noStroke(); //main body
fill (243,191,82);
quad (mouseX - 50, (frameCount % 2) + 190, mouseX -70, (frameCount % 2) + 240, mouseX + 70, (frameCount % 2) + 240, mouseX + 70, (frameCount % 2) + 190);
//hood
quad (mouseX - 150, (frameCount % 2) + 235, mouseX - 160, (frameCount % 2) + 280, mouseX - 75, (frameCount % 2) + 280, mouseX - 50, (frameCount % 2) + 230);
//bottom
quad (mouseX - 75, (frameCount % 2) + 240, mouseX -75, (frameCount % 2) + 300, mouseX + 70, (frameCount % 2) + 300, mouseX + 70, (frameCount % 2) + 240);
//trunk
rectMode(CORNER);
rect (mouseX + 70,(frameCount % 2) + 245, 80, 47.5);
//cutlines
stroke(110);
strokeWeight(1);
line(mouseX -88, (frameCount % 2) + 230, mouseX - 90, (frameCount % 2) + 241.7);
line(mouseX - 152, (frameCount % 2) + 242, mouseX - 60, (frameCount % 2) + 240);
line(mouseX - 45, (frameCount % 2) + 190, mouseX - 60, (frameCount % 2) + 235);
line(mouseX - 60, (frameCount % 2) + 235, mouseX -60, (frameCount % 2) + 280);
line(mouseX - 60, (frameCount % 2) + 280, mouseX -55, (frameCount % 2) + 285);
line(mouseX -55, (frameCount % 2) + 285, mouseX -15, (frameCount % 2) + 285);
line(mouseX - 15, (frameCount % 2) + 285, mouseX - 10, (frameCount % 2) + 283);
line(mouseX - 10, (frameCount % 2) + 283, mouseX + 10, (frameCount % 2) + 270);
line(mouseX + 10, (frameCount % 2) + 270, mouseX + 12, (frameCount % 2) + 268);
line(mouseX + 12, (frameCount % 2) + 268, mouseX + 12, (frameCount % 2) + 190);
line(mouseX + 15, (frameCount % 2) + 190, mouseX + 15, (frameCount % 2) + 278);
line(mouseX + 15, (frameCount % 2) + 278, mouseX + 17, (frameCount % 2) + 280);
line(mouseX + 17, (frameCount % 2) + 280, mouseX + 23, (frameCount % 2) + 285);
line(mouseX + 17, (frameCount % 2) + 280, mouseX + 23, (frameCount % 2) + 285);
line(mouseX + 23, (frameCount % 2) + 285, mouseX + 45, (frameCount % 2) + 285);
line(mouseX + 45, (frameCount % 2) + 285, mouseX + 48, (frameCount % 2) + 283);
line(mouseX + 48, (frameCount % 2) + 283, mouseX + 65, (frameCount % 2) + 260);
line(mouseX + 65, (frameCount % 2) + 260, mouseX + 68, (frameCount % 2) + 253);
line(mouseX + 68, (frameCount % 2) + 253, mouseX + 68, (frameCount % 2) + 190);
//rack
noStroke();
fill(75);
// ||
rect(mouseX + 70,(frameCount % 2) + 190,10,55);
fill(50);
// --
rect(mouseX + 80,(frameCount % 2) + 192.5,25,10);
quad(mouseX + 105, (frameCount % 2) + 192.5, mouseX + 105, (frameCount % 2) + 202.5, mouseX + 132.5, (frameCount % 2) + 245, mouseX + 140, (frameCount % 2) + 245);
//windows
//left
quad(mouseX - 40, (frameCount % 2) + 195, mouseX - 53, (frameCount % 2) + 235, mouseX + 6, (frameCount % 2) + 235, mouseX + 7, (frameCount % 2) + 195);
fill(75);
quad(mouseX - 35, (frameCount % 2) + 200, mouseX - 46, (frameCount % 2) + 230, mouseX + 1, (frameCount % 2) + 230, mouseX +2, (frameCount % 2) + 200);
//right
fill(50);
quad(mouseX + 20, (frameCount % 2) + 195, mouseX + 20, (frameCount % 2) + 235, mouseX + 63, (frameCount % 2) + 235, mouseX + 63, (frameCount % 2) + 195);
fill(75);
quad(mouseX + 25, (frameCount % 2) + 200, mouseX + 25, (frameCount % 2) + 230, mouseX + 58, (frameCount % 2) + 230, mouseX + 58, (frameCount % 2) + 200);
//under
fill(37);
quad(mouseX - 160, (frameCount % 2) + 248, mouseX - 165, (frameCount % 2) + 285, mouseX - 80, (frameCount % 2) + 300, mouseX - 90, (frameCount % 2) + 248);
quad(mouseX + 80, (frameCount % 2) + 255, mouseX + 50, (frameCount % 2) + 300, mouseX + 145, (frameCount % 2) + 295, mouseX + 120, (frameCount % 2) + 255);
//bumpers
fill(75);
quad(mouseX - 170, (frameCount % 2) + 275, mouseX -170, (frameCount % 2) + 285, mouseX - 160, (frameCount % 2) + 285, mouseX - 160, (frameCount % 2) + 275);
fill(50);
quad(mouseX - 160, (frameCount % 2) + 248, mouseX - 165, (frameCount % 2) + 285, mouseX -155, (frameCount % 2) + 285, mouseX - 150, (frameCount % 2) + 248);
quad(mouseX - 150, (frameCount % 2) + 248, mouseX - 152, (frameCount % 2) + 260, mouseX - 90, (frameCount % 2) + 260, mouseX - 90, (frameCount % 2) + 248);
quad(mouseX - 90, (frameCount % 2) + 248, mouseX - 95, (frameCount % 2) + 260, mouseX - 80, (frameCount % 2) + 300, mouseX - 70,(frameCount % 2) + 300);
quad(mouseX - 75, (frameCount % 2) + 290, mouseX - 75, (frameCount % 2) + 300, mouseX + 60, (frameCount % 2) + 300, mouseX + 60, (frameCount % 2) + 290);
quad(mouseX + 55, (frameCount % 2) + 290, mouseX + 60, (frameCount % 2) + 300, mouseX + 90, (frameCount % 2) + 255, mouseX + 80, (frameCount % 2) + 255);
quad(mouseX + 90, (frameCount % 2) + 255, mouseX + 80, (frameCount % 2) + 265, mouseX + 130, (frameCount % 2) + 265, mouseX + 130, (frameCount % 2) + 255);
quad(mouseX + 130, (frameCount % 2) + 255, mouseX + 125, (frameCount % 2) + 265, mouseX + 135, (frameCount % 2) + 295, mouseX + 145, (frameCount % 2) + 295);
quad(mouseX + 140, (frameCount % 2) + 285, mouseX + 145, (frameCount % 2) + 295, mouseX + 153, (frameCount % 2) + 295, mouseX + 153, (frameCount % 2) + 285);
//wheelLeft;
noStroke();
ellipseMode(CORNER);
//outer
fill (25);
ellipse (mouseX -153, (frameCount % 2) + 270, 65, 65);
//middle
fill (75);
ellipse (mouseX - 150.5, (frameCount % 2) + 272.5, 60, 60);
//inner
fill (25);
ellipse (mouseX - 145.5, (frameCount % 2) + 277.5, 50, 50);
//wheelRight;
//outer
fill (25);
ellipse (mouseX + 68, (frameCount % 2) + 270, 65, 65);
//middle
fill (75);
ellipse (mouseX + 70.5, (frameCount % 2) + 272.5, 60, 60);
//inner
fill (25);
ellipse (mouseX + 75.5, (frameCount % 2) + 277.5, 50, 50);
//Rocks (front);
noStroke();
fill (170);
quad ((frameCount * 2 % 1000) -250, 323,
(frameCount * 2 % 1000) - 253, 332,
(frameCount * 2 % 1000) - 210, 332,
(frameCount * 2 % 1000) - 223, 318);
quad ((frameCount * 2 % 1000) - 260, 323,
(frameCount * 2 % 1000) - 270, 332,
(frameCount * 2 % 1000) - 215, 332,
(frameCount * 2 % 1000) - 220, 315);
ellipse((frameCount * 2 % 1000) - 350, 328, 20, 10);
quad ((frameCount * 2 % 1000) - 380, 328,
(frameCount * 2 % 1000) - 390, 332,
(frameCount * 2 % 1000) - 365, 332,
(frameCount * 2 % 1000) - 375, 326);
quad ((frameCount * 2 % 1000) - 400, 323,
(frameCount * 2 % 1000) - 415, 332,
(frameCount * 2 % 1000) - 380, 332,
(frameCount * 2 % 1000) - 390, 315);
quad ((frameCount * 2 % 1000) - 600, 315,
(frameCount * 2 % 1000) - 620, 332,
(frameCount * 2 % 1000) - 570, 332,
(frameCount * 2 % 1000) - 590, 317);
//soil
fill (78,53,40);
rect(0, 332, 400, 100);
}