Andor Salga

Textured Bouncing Box Demo

// Demo written by Andor Salga
import processing.opengl.*;
/* @pjs preload="crate1.jpg,crate2.jpg,crate3.jpg"; */

PImage crate, crate2, crate3;

void setup()
{
  size(400, 400, OPENGL);
  crate = loadImage("crate1.jpg");
  crate2 = loadImage("crate2.jpg");
  crate3 = loadImage("crate3.jpg");
  textureMode(NORMALIZED);
}

float yRot = 0;
float xRot = 0;
float zRot = 0;

float frames = 0;
float s = 1;
float r = 0;

void drawBox(PImage i){
  beginShape(QUADS);

  texture(i);

  // -Z "back" face
  vertex( 1, -1, -1, 0, 0);
  vertex(-1, -1, -1, 1, 0);
  vertex(-1,  1, -1, 1, 1);
  vertex( 1,  1, -1, 0, 1);

  vertex(-1, -1,  1, 0, 0);
  vertex( 1, -1,  1, 1, 0);
  vertex( 1,  1,  1, 1, 1);
  vertex(-1,  1,  1, 0, 1);

  // +Y "bottom" face
  vertex(-1,  1,  1, 0, 0);
  vertex( 1,  1,  1, 1, 0);
  vertex( 1,  1, -1, 1, 1);
  vertex(-1,  1, -1, 0, 1);

  // -Y "top" face
  vertex(-1, -1, -1, 0, 0);
  vertex( 1, -1, -1, 1, 0);
  vertex( 1, -1,  1, 1, 1);
  vertex(-1, -1,  1, 0, 1);

  // +X "right" face
  vertex( 1, -1,  1, 0, 0);
  vertex( 1, -1, -1, 1, 0);
  vertex( 1,  1, -1, 1, 1);
  vertex( 1,  1,  1, 0, 1);

  // -X "left" face
  vertex(-1, -1, -1, 0, 0);
  vertex(-1, -1,  1, 1, 0);
  vertex(-1,  1,  1, 1, 1);
  vertex(-1,  1, -1, 0, 1);

  endShape();
}


void draw()
{
  frames++;
  background(0);

  pushMatrix();
    translate(width/2-80, height/2, 150);
    translate(0, sin((100+frames)/30)* 40, 0);  
    rotateY(yRot+=0.03);
    rotateX(xRot+=0.035);
    rotateZ(zRot+=0.065);
    scale(20);
    drawBox(crate);
  popMatrix();

  pushMatrix();
    translate(width/2, height/2, 150);
    translate(0, sin(frames/30)* 40, 0);  
    rotateY(yRot + PI);
    rotateX(xRot);
    rotateZ(zRot);
    scale(20);
    drawBox(crate2);
  popMatrix();

  pushMatrix();
    translate(width/2+80, height/2, 150);
    translate(0, sin(250+frames/30)* 40, 0);  
    rotateY(-yRot);
    rotateX(-xRot);
    rotateZ(zRot);
    scale(20);
    drawBox(crate3);
  popMatrix();
}