import processing.core.*; import java.applet.*; import java.awt.*; import java.awt.image.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.text.*; import java.util.*; import java.util.zip.*; import java.util.regex.*; public class TextureCube extends PApplet { /** * TexturedCube * by Dave Bollinger. * * Drag mouse to rotate cube. Demonstrates use of u/v coords in * vertex() and effect on texture(). The textures get distorted using * the P3D renderer as you can see, but they look great using OPENGL. */ PImage tex; float rotx = PI/4; float roty = PI/4; public void setup() { size(640, 360, P3D); tex = loadImage("berlin-1.jpg"); textureMode(NORMALIZED); fill(255); stroke(color(44,48,32)); } public void draw() { background(0); noStroke(); translate(width/2.0f, height/2.0f, -100); rotateX(rotx); rotateY(roty); scale(90); TexturedCube(tex); } public void TexturedCube(PImage tex) { beginShape(QUADS); texture(tex); // Given one texture and six faces, we can easily set up the uv coordinates // such that four of the faces tile "perfectly" along either u or v, but the other // two faces cannot be so aligned. This code tiles "along" u, "around" the X/Z faces // and fudges the Y faces - the Y faces are arbitrarily aligned such that a // rotation along the X axis will put the "top" of either texture at the "top" // of the screen, but is not otherwised aligned with the X/Z faces. (This // just affects what type of symmetry is required if you need seamless // tiling all the way around the cube) // +Z "front" 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); // -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); // +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(); } public void mouseDragged() { float rate = 0.01f; rotx += (pmouseY-mouseY) * rate; roty += (mouseX-pmouseX) * rate; } static public void main(String args[]) { PApplet.main(new String[] { "TextureCube" }); } }