|
var canvasWidth = 960; |
|
var canvasHeight = 500; |
|
var slider1, slider2, slider3, slider4, slider5; |
|
var faceSelector; |
|
|
|
function setup () { |
|
// create the drawing canvas, save the canvas element |
|
var main_canvas = createCanvas(canvasWidth, canvasHeight); |
|
main_canvas.parent('canvasContainer'); |
|
|
|
// create sliders |
|
slider1 = createSlider(0, 100, 50); |
|
slider2 = createSlider(0, 100, 50); |
|
slider3 = createSlider(0, 100, 50); |
|
slider4 = createSlider(0, 100, 50); |
|
slider5 = createSlider(0, 100, 50); |
|
|
|
slider1.parent('slider1Container'); |
|
slider2.parent('slider2Container'); |
|
slider3.parent('slider3Container'); |
|
slider4.parent('slider4Container'); |
|
slider5.parent('slider5Container'); |
|
|
|
faceSelector = createSelect(); |
|
faceSelector.option('1'); |
|
faceSelector.option('2'); |
|
faceSelector.option('3'); |
|
faceSelector.option('all') |
|
faceSelector.value('all'); |
|
faceSelector.parent('selector1Container'); |
|
|
|
// rotation in degrees |
|
angleMode(DEGREES); |
|
} |
|
|
|
// global variables for colors |
|
var bg_color1 = [255, 255, 255]; //these three are backgroudnd colors |
|
var bg_color2 = [255, 255, 255]; |
|
var bg_color3 = [255, 255, 255]; |
|
var blk= [0,0,0]; |
|
var skin = [255, 224, 204]; |
|
|
|
var fg_color1 = [198, 155, 232]; //fisrst face skin color |
|
var fg_color2 = [56, 91, 0]; //third face skin color |
|
var fg_color3 = [206, 207, 10]; //second face skin color |
|
|
|
var stroke_color1 = [95, 52, 8]; //irrelevent |
|
var stroke_color2 = [210, 219, 189]; |
|
var stroke_color3 = [50, 50, 50]; |
|
|
|
var colorHair = [20, 20, 0]; |
|
|
|
function drawFace1(x, y, w, h, tilt_value, eye_value, mouth_value) { |
|
push(); |
|
translate(x, y); |
|
rotate(tilt_value/5); |
|
|
|
var extent = 0; |
|
if(h < w) { |
|
extent = h / 2; |
|
} |
|
else { |
|
extent = w / 2; |
|
} |
|
var scale = extent / 220.0; |
|
|
|
fill(blk); |
|
//ellipse(0, 0, 300 * scale, 400 * scale); |
|
|
|
beginShape(); // hair |
|
vertex(-50, -146); //1 |
|
quadraticVertex(10, -172, 90, -115); //2 |
|
quadraticVertex(115, -85, 110, 30); //3 |
|
// quadraticVertex(120, 110, 90, 140); //4 |
|
//quadraticVertex(80, 160, -10, 185); //5 |
|
quadraticVertex(-160, -0, -120, -90); //8 |
|
//quadraticVertex(-50, -135, -50, -146); |
|
endShape(CLOSE) |
|
noFill(); |
|
|
|
strokeWeight(0); |
|
fill(skin); |
|
ellipse(0, -15, 300 * scale, 350 * scale); |
|
strokeWeight(2); |
|
ellipse(0, 0, 30 * scale, 30 * scale); //nose |
|
fill(skin); |
|
strokeWeight(0); |
|
rect(-10, -10, 40 * scale, 20 * scale); //nose |
|
|
|
fill(blk); |
|
rotate(10*PI); |
|
rect(-80, -120, 240 * scale, 80 * scale); //fringe |
|
rotate(-10*PI); |
|
rotate(10*-PI); |
|
rect(-70, -120, 200 * scale, 80 * scale); //fringe |
|
rotate(10*PI); |
|
|
|
fill(skin); |
|
//glasses |
|
strokeWeight(2); |
|
ellipse(-55 * scale, -50 * scale, 95 * scale, 95 * scale); //left |
|
ellipse( 65 * scale, -50 * scale, 95 * scale, 95 * scale); //right |
|
line(-8 * scale, -50 * scale, 15 * scale, -50 * scale); //line |
|
|
|
arc(35, -20, 60, 60, 250, 300); //right eyebrow |
|
arc(-20, -30, 60, 40, 210, 270); //left eyebrow |
|
|
|
|
|
strokeWeight(0); |
|
|
|
fill(42, 142, 8); //green outer |
|
ellipse(-50 * scale, -50 * scale, 50 * scale, 50 * scale); //left green eye |
|
ellipse( 60 * scale, -50 * scale, 50 * scale, 50 * scale); //rigth green eye |
|
fill(blk); //pupils |
|
ellipse( 60 * scale, -50 * scale, 35 * scale, 35 * scale); //right eye |
|
ellipse( -50 * scale, -50 * scale, 35 * scale, 35 * scale); //left eye |
|
|
|
fill(bg_color1); //eyeglint |
|
ellipse(-45 * scale, -55 * scale, 15 * scale, 15 * scale); //left eyeglint |
|
ellipse( 65 * scale, -55 * scale, 15 * scale, 15 * scale); //right eyeglint |
|
|
|
|
|
|
|
|
|
// eyes |
|
|
|
|
|
if (eye_value === 1) { |
|
|
|
//scar |
|
|
|
strokeWeight(2); |
|
stroke(247, 194, 180); |
|
line(-8 * scale, -115 * scale, 15 * scale, -115 * scale); //middle |
|
line(-8 * scale, -115 * scale, 15 * scale, -140 * scale); //top |
|
line(-8 * scale, -90 * scale, 15 * scale, -115 * scale); //bottom |
|
|
|
|
|
} |
|
|
|
if (eye_value >= 2) { |
|
|
|
//scar |
|
|
|
strokeWeight(2); |
|
stroke(255, 154, 127); |
|
line(-8 * scale, -115 * scale, 15 * scale, -115 * scale); //middle |
|
line(-8 * scale, -115 * scale, 15 * scale, -140 * scale); //top |
|
line(-8 * scale, -90 * scale, 15 * scale, -115 * scale); //bottom |
|
|
|
|
|
} |
|
|
|
if (eye_value === 3) { |
|
|
|
//scar |
|
strokeWeight(2); |
|
stroke(252, 73, 25); |
|
line(-8 * scale, -115 * scale, 15 * scale, -115 * scale); //middle |
|
line(-8 * scale, -115 * scale, 15 * scale, -140 * scale); //top |
|
line(-8 * scale, -90 * scale, 15 * scale, -115 * scale); //bottom |
|
|
|
|
|
|
|
|
|
} |
|
|
|
// mouth |
|
fill(blk); |
|
noStroke(); |
|
ellipse(0 * scale, 70 * scale, 150 * scale, mouth_value/5 * scale); |
|
pop(); |
|
} |
|
|
|
function drawFace2(x, y, w, h, hair_value, eye_value, blink_value) { |
|
rectMode(CENTER); |
|
push(); |
|
translate(x, y); |
|
|
|
var extent = 0; |
|
if(h < w) { |
|
extent = h / 2; |
|
} |
|
else { |
|
extent = w / 2; |
|
} |
|
var scale = extent / 220.0; |
|
strokeWeight(4); |
|
stroke(stroke_color3); |
|
//fill(fg_color3); |
|
// ellipse(0, 0, 300 * scale, 400 * scale); |
|
|
|
|
|
strokeWeight(0); |
|
|
|
fill(79, 37, 11); |
|
beginShape(); // head |
|
vertex(-50, -146); //1 |
|
quadraticVertex(10, -172, 90, -115); //2 |
|
quadraticVertex(115, -85, 130, 60); //3 |
|
quadraticVertex(120, 110, 90, 140); //4 |
|
quadraticVertex(80, 160, -10, 185); //5 |
|
quadraticVertex(-160, -0, -120, -90); //8 |
|
quadraticVertex(-50, -135, -50, -146); |
|
endShape(CLOSE) |
|
|
|
|
|
|
|
fill(skin); |
|
ellipse(0, -15, 300 * scale, 350 * scale); //face |
|
fill(79, 37, 11); |
|
|
|
rotate(10*PI); |
|
rect(-15, -90, 260 * scale, 100 * scale); //fringe |
|
rotate(-10*PI); |
|
|
|
strokeWeight(1); |
|
noFill(); |
|
arc(40, -10, 60, 60, 260, 300); //right eyebrow |
|
arc(37, -7, 60, 60, 260, 300); //right lash |
|
|
|
arc(-30, -20, 60, 40, 220, 270); //left eyebrow |
|
arc(-25, -17, 60, 40, 220, 270); //left lash |
|
|
|
|
|
strokeWeight(2); |
|
arc(35, -25, 60, 60, 250, 300); //right eyebrow |
|
arc(-20, -35, 60, 40, 210, 270); //left eyebrow |
|
ellipse(0, 0, 30 * scale, 30 * scale); //nose |
|
fill(skin); |
|
strokeWeight(0); |
|
rect(-0, -5, 40 * scale, 20 * scale); //nose |
|
strokeWeight(0); |
|
|
|
|
|
//wand |
|
strokeWeight(5); |
|
stroke(blk); |
|
line(10,120 ,110,20 + blink_value *10); |
|
strokeWeight(0); |
|
|
|
|
|
fill(153, 68, 45); //brown outer |
|
ellipse(-50 * scale, -50 * scale, 50 * scale, 50 * scale); //left brown eye |
|
ellipse( 60 * scale, -50 * scale, 50 * scale, 50 * scale); //rigth brown eye |
|
//strokeWeight(2); |
|
|
|
|
|
fill(blk); |
|
ellipse((-50 + eye_value/2) * scale, -50 * scale, 35 * scale, 35 * scale); //left |
|
ellipse(( 60 + eye_value/2) * scale, -50 * scale, 35 * scale, 35 * scale); //right |
|
|
|
fill(bg_color1); //eyeglint |
|
|
|
ellipse((-45 + eye_value/2) * scale, -55 * scale, 15 * scale, 15 * scale); //left |
|
ellipse(( 65 + eye_value/2) * scale, -55 * scale, 15 * scale, 15 * scale); //right |
|
|
|
fill(blk); //mouth |
|
arc(0, 30, 80, 40, 0, 180); |
|
|
|
|
|
|
|
|
|
// TODO: paramaterize hair |
|
var follicles = [ |
|
[705,250], |
|
[725,300], |
|
[705,200], |
|
[735,150], |
|
[705,100], |
|
[745,50], |
|
[705,0], |
|
[755,-50], |
|
[705,-100], |
|
|
|
]; |
|
|
|
resetMatrix(); |
|
fill(255, 226, 114); |
|
var radius = hair_value * scale; |
|
for(var i=0; i<follicles.length; i++) { |
|
ellipse(240+follicles[i][0]/2, 120 + (follicles[i][1]/2), radius/2, radius/2); |
|
} |
|
rectMode(CORNER); |
|
resetMatrix(); |
|
} |
|
|
|
function drawFace3(x, y, w, h, width_value, eye_value, mouth_value) { |
|
push(); |
|
rectMode(CENTER); |
|
translate(x, y); |
|
// rotate(width_value); |
|
|
|
|
|
|
|
var extent = 0; |
|
if(h < w) { |
|
extent = h / 2; |
|
} |
|
else { |
|
extent = w / 2; |
|
} |
|
var scale = extent / 220.0; |
|
|
|
fill(199,40,040); |
|
beginShape(); // head |
|
vertex(-50, -146); //1 |
|
quadraticVertex(10, -172, 90, -115); //2 |
|
quadraticVertex(115, -85, 110, 30); //3 |
|
quadraticVertex(-160, -0, -120, -90); //8 |
|
endShape(CLOSE) |
|
fill(fg_color2); |
|
strokeWeight(0); |
|
fill(skin); |
|
ellipse(0, -15, 300 * scale, 350 * scale); |
|
fill(199,40,040); |
|
rotate(10*PI); |
|
rect(-20, -90, 250 * scale, 100 * scale); //fringe |
|
rotate(-10*PI); |
|
|
|
noFill(); |
|
|
|
strokeWeight(2); |
|
ellipse(0, 0, 30 * scale, 30 * scale); //nose |
|
fill(skin); |
|
strokeWeight(0); |
|
rect(-0, -5, 40 * scale, 20 * scale); //nose |
|
|
|
fill(67, 172, 224); //green outer |
|
ellipse(-50 * scale, -50 * scale, 50 * scale, 50 * scale); //left blue eye |
|
ellipse( 60 * scale, -50 * scale, 50 * scale, 50 * scale); //rigth blue eye |
|
fill(blk); //pupils |
|
ellipse( 60 * scale, -50 * scale, 35 * scale, 35 * scale); //right eye |
|
ellipse( -50 * scale, -50 * scale, 35 * scale, 35 * scale); //left eye |
|
|
|
fill(bg_color1); //eyeglint |
|
ellipse(-45 * scale, -55 * scale, 15 * scale, 15 * scale); //left eyeglint |
|
ellipse( 65 * scale, -55 * scale, 15 * scale, 15 * scale); //right eyeglint |
|
|
|
strokeWeight(2); |
|
noFill(); |
|
arc(40, -15-width_value/5, 60, 60, 260, 300); //right eyebrow |
|
arc(-30, -25-width_value/5, 60, 40, 220, 270); //left eyebrow |
|
|
|
|
|
|
|
if (eye_value === 1) { |
|
|
|
//scar |
|
noStroke(); |
|
fill(204, 238, 255); |
|
ellipse(-35 * scale, -100 * scale, 15 * scale, 15 * scale); |
|
|
|
} |
|
|
|
if (eye_value >= 2) { |
|
|
|
//scar |
|
noStroke(); |
|
fill(204, 238, 255); |
|
ellipse(-35 * scale, -100 * scale, 15 * scale, 15 * scale); |
|
ellipse(60 * scale, -150 * scale, 15 * scale, 15 * scale); |
|
} |
|
|
|
if (eye_value === 3) { |
|
|
|
//scar |
|
noStroke(); |
|
fill(204, 238, 255); |
|
ellipse(-35 * scale, -100 * scale, 15 * scale, 15 * scale); |
|
ellipse(60 * scale, -150 * scale, 15 * scale, 15 * scale); |
|
ellipse(-20 * scale, -130 * scale, 15 * scale, 15 * scale); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
// mouth |
|
fill(blk); |
|
ellipse(0 * scale, 70 * scale, mouth_value * scale/2, mouth_value * scale/2.5); |
|
rectMode(CORNER); |
|
pop(); |
|
} |
|
|
|
function draw () { |
|
//noStroke(); |
|
|
|
var mode = faceSelector.value(); |
|
|
|
if (mode != 'all') { |
|
if (mode == '1') { |
|
background(bg_color1); |
|
} |
|
else if (mode == '2') { |
|
background(bg_color2); |
|
} |
|
else if (mode == '3') { |
|
background(bg_color3); |
|
} |
|
} |
|
|
|
var s1 = slider1.value(); |
|
var s2 = slider2.value(); |
|
var s3 = slider3.value(); |
|
var s4 = slider4.value(); |
|
var s5 = slider5.value(); |
|
|
|
// use same size / y_pos for all faces |
|
var face_w = canvasWidth / 4; |
|
var face_h = face_w; |
|
var face_y = height / 2; |
|
var face_x = width / 2; |
|
|
|
if (mode == '1' || mode == 'all') { |
|
// draw 1st face |
|
fill(bg_color1); |
|
rect(0, 0, width/3, height); |
|
var tilt_value = map(s1, 0, 100, -90, 90); |
|
var mouth_value = map(s3, 0, 100, 0, 200); |
|
var eye_value = Math.floor(map(s2, 0, 100, 1, 3)); |
|
if (mode == 'all') { |
|
face_x = width / 6; |
|
} |
|
drawFace1(face_x, face_y, face_w, face_h, tilt_value, eye_value, mouth_value); |
|
} |
|
|
|
if (mode == '2' || mode == 'all') { |
|
// draw 2nd face |
|
fill(bg_color2); |
|
rect(width/3, 0, 2*width/3, height); |
|
var hair_value = map(s1, 0, 100, 2, 90); |
|
var blink_value = map(s3, 0, 100, 0, 1); |
|
var eye_value = map(s2, 0, 100, -15, 15); |
|
if (mode == 'all') { |
|
face_x = 3 * width / 6; |
|
} |
|
drawFace2(face_x, face_y, face_w, face_h, hair_value, eye_value, blink_value); |
|
} |
|
|
|
if (mode == '3' || mode == 'all') { |
|
// draw 3nd face |
|
fill(bg_color3); |
|
rect(2*width/3, 0, width, height); |
|
var width_value = map(s1, 0, 100, 0, 100); |
|
var mouth_value = map(s3, 0, 100, 0, 200); |
|
var eye_value = Math.floor(map(s2, 0, 100, 0, 3)); |
|
if (mode == 'all') { |
|
face_x = 5 * width / 6; |
|
} |
|
drawFace3(face_x, face_y, face_w, face_h, width_value, eye_value, mouth_value); |
|
} |
|
} |
|
|
|
function keyTyped() { |
|
if (key == '!') { |
|
saveBlocksImages(); |
|
} |
|
else if (key == '@') { |
|
saveBlocksImages(true); |
|
} |
|
} |