> show canvas only <


/* built with Studio Sketchpad: 
 *   https://sketchpad.cc
 * 
 * observe the evolution of this sketch: 
 *   https://studio.sketchpad.cc/sp/pad/view/ro.37kmnnDoE91/rev.4
 * 
 * authors: 
 *   GoToLoop

 * license (unless otherwise specified): 
 *   creative commons attribution-share alike 3.0 license.
 *   https://creativecommons.org/licenses/by-sa/3.0/ 
 */ 



// Nature of Code - EXERCISE 1.3 - 3D Bouncing Ball
// Extend the bouncing ball with vectors example into 3D. 
// Can you get a sphere to bounce around a box?

// https://forum.processing.org/topic/
// the-nature-of-code-code-solutions-of-the-examples

// studio.processingtogether.com/sp/pad/export/ro.9o1T5z1ghf2s7/latest

final PVector location = new PVector();
final PVector velocity = new PVector(3, 2, 4);

final static int BALL_DIM = 30;
final static int CUBE_DIM = 450, CUBE_RAD = CUBE_DIM >> 1;

int cx, cy;

void setup() {
  size(400, 400, P3D);
  strokeWeight(2);

  cx = width  >> 1;
  cy = height >> 1;
}

void draw() {
  background(-1);

  drawCube();
  moveSphere();
  drawSphere();
}

void drawCube() {
  //move cube and ball to center:
  translate(cx, cy, -CUBE_DIM);

  //rotate cube and ball so it's 3D-ness can be appreciated:
  rotateX(-QUARTER_PI);
  rotateY(QUARTER_PI);
  rotateZ(QUARTER_PI/2);

  //draw cube:
  noFill();
  stroke(0);

  box(CUBE_DIM);
}

void moveSphere() {
  //move ball:
  location.add(velocity);

  //detect edges with center at 0,0 and edge minus width of ball:
  if ( checkBounce(location.x) )    velocity.x *= -1;
  if ( checkBounce(location.y) )    velocity.y *= -1;
  if ( checkBounce(location.z) )    velocity.z *= -1;
}

void drawSphere() {
  //draw ball, and lights for definition:
  translate(location.x, location.y, location.z);

  fill(0300);
  noStroke();
  lights();

  sphere(BALL_DIM);
}

static final boolean checkBounce(float coord) {
  return coord > CUBE_RAD - BALL_DIM | coord < BALL_DIM - CUBE_RAD;
}