{ predictions = results; }); // Hide the video element, and j"> { predictions = results; }); // Hide the video element, and j"> { predictions = results; }); // Hide the video element, and j">
// Reference from the Drawing code by Steve's Makerspace

let handpose;
let video;
let predictions = [];
let canvas2;
let prevtop = null;
let prevleft = null;
let leftArr = [];
let topArr = [];
let leftAvg, topAvg;
let colr = 0;
let colb = 255;
let colg = 0;
let pointerX, pointerY, knuckle, ring;
let rSlider, gSlider, bSlider;

function setup() {
  createCanvas(640, 480);
  rSlider = createSlider(0,255,255);
  text('Red');
  textSize(20, 200, 300);
  gSlider = createSlider(0,255,255);
  text('Green');
  textSize(20);
  bSlider = createSlider(0,255,255);
  text('Blue');
  textSize(20);

  canvas2 = createGraphics(width, height);
  video = createCapture(VIDEO);
  video.size(width, height);
  makesquares();
  handpose = ml5.handpose(video, modelReady);

  // This sets up an event that fills the global variable "predictions"
  // with an array every time new hand poses are detected
  handpose.on("predict", (results) => {
    predictions = results;
  });

  // Hide the video element, and just show the canvas
  video.hide();
  
  
}

function modelReady() {
  console.log("Model ready!");
}

function draw() {
  translate(width, 0);
  scale(-1, 1);
  //  background(0);

  image(video, 0, 0, width, height);
  image(canvas2, 0, 0);
  

  // We can call both functions to draw all keypoints and the skeletons
  let r = rSlider.value();
  let g = gSlider.value();
  let b = bSlider.value();
  drawKeypoints();
}

// A function to draw ellipses over the detected keypoints
function drawKeypoints() {
  for (let i = 0; i < predictions.length; i += 1) {
    const prediction = predictions[i];
    canvas2.strokeWeight(10);
    for (let j = 0; j < prediction.landmarks.length; j += 1) {
      const keypoint = prediction.landmarks[j];
      fill(0, 255, 0);
      noStroke();
      // ellipse(keypoint[0], keypoint[1], 10, 10);
      if (j == 8) {
        pointerX = keypoint[0];
        pointerY = keypoint[1];
        //print(keypoint);
      } else
      if (j == 14) {
        knuckle = keypoint[1];
      } else
      if (j == 16) {
        ring = keypoint[1];
      }
    }
    //If the ring finger is not extended then draw a line or pick a color
    if (knuckle < ring) {
      fill(0);
      
      ellipse(pointerX, pointerY, 10, 10);
      if (pointerX < width - 70) {
        getaverages();
        
        canvas2.stroke(colr, colg, colb);
        if (colr > 0) {
          text('🔥', pointerX, pointerY);
          textSize(50);
        }
        else if (colg > 0){
          text('🍀', pointerX, pointerY);
          textSize(50);
        }
        else {
          text('💧', pointerX, pointerY);
          textSize(50);
        }
        if (leftArr.length > 2 && prevleft>0) {
          canvas2.line(prevleft, prevtop, leftAvg, topAvg);
          if (prevleft > 0) {
          prevleft = leftAvg;
          prevtop = topAvg;}
          else{
            prevleft = pointerX;
            prevtop = pointerY;
          }
        }
      } else {
        let r = rSlider.value();
        let g = gSlider.value();
        let b = bSlider.value();
        if (pointerY < 70) {
          colr = r;
          colg = 0;
          colb = 0;
          text('🔥', pointerX, pointerY);
          textSize(50);
        }
        
        if (pointerY > 70 && pointerY < 140) {
          colr = 0;
          colg = g;
          colb = 0;
          text('🍀', pointerX, pointerY);
          textSize(50);
        }
        if (pointerY > 140 && pointerY < 210) {
          colr = 0;
          colg = 0;
          colb = b;
          text('💧', pointerX, pointerY);
          textSize(50);
        }
        // if (pointerY > 210 && pointerY < 280) {
        //   makesquares();
        // }
      }
    } else {
      //If the hand is extended, then just mark where it is and clear the arrays
      fill(255);
      ellipse(pointerX, pointerY, 10, 10);
      leftArr.length = 0;
      topArr.length = 0;
      leftAvg = 0;
      topAvg = 0;
      prevleft = pointerX;
      prevtop = pointerY;
    }
  }
}

function getaverages() {
  if (leftArr.length > 5) {
    leftArr.splice(0, 1);
    topArr.splice(0, 1);
  }
  if (pointerX > 0 ) {
  leftArr.push(pointerX);
  topArr.push(pointerY);
  }
  let leftSum = 0;
  let topSum = 0;
  for (i = 0; i < leftArr.length; i++) {
    leftSum = leftSum + leftArr[i];
    topSum = topSum + topArr[i];
  }
  leftAvg = leftSum / leftArr.length;
  topAvg = topSum / topArr.length;
  
}

function makesquares() {
  canvas2.background(255);
  canvas2.clear();
  //background(255);
  //clear();
  let r = rSlider.value();
  let g = gSlider.value();
  let b = bSlider.value();
  canvas2.fill(r, 0, 0);
  canvas2.rect(width, 0, -70, 70);
  canvas2.fill(0, g, 0);
  canvas2.rect(width, 70, -70, 70);
  canvas2.fill(0, 0, b);
  canvas2.rect(width, 140, -70, 70);
  canvas2.fill(0, 0, 0);
  canvas2.rect(width, 210, -70, 70);
  canvas2.stroke(255, 0, 0);
  canvas2.strokeWeight(10);
  canvas2.line(width - 5, 215, width - 65, 275);
}