import java.awt.*; public class ZDraw extends PixApplet { int w, h; // width/height of applet window int M = 50, N = 50; int mouseX =0, mouseY = 0, phi = 0, theta = 0; double focalLength = -3; final double[] bgColor = {0.3, 0.3, 0.3}; double[][] zBuffer; double[][][] frameBuffer; Light light1 = new Light( 1, 1, 1, 0.0, 0.0, 1.0); Light light2 = new Light( -1, -1, -1, 0.0, 1.0, 0.0); Light[] lights = {light1, light2}; Material material1 = new Material(0.3, 0.6, 0.3, 0.2, 0.3, 0.2, 0.4, 0.8, 0.4, 2); Material material2 = new Material(0.6, 0.3, 0.3, 0.5, 0.3, 0.3, 0.8, 0.4, 0.4, 2); Sphere sphere1 = new Sphere(M, N); Sphere sphere2 = new Sphere(M, N); MatrixStack stack = new MatrixStack(); Matrix3D t = new Matrix3D(); public void setPix(int frame) { System.out.println("frame " + frame); w = bounds().width; // FIND OUT HOW BIG THE APPLET WINDOW IS h = bounds().height; zBuffer = new double[w][h]; frameBuffer = new double[w][h][3]; for (int i = 0; i < frameBuffer.length; i++) { for (int j = 0; j < frameBuffer[i].length; j++) { frameBuffer[i][j][0] = bgColor[0]; frameBuffer[i][j][1] = bgColor[1]; frameBuffer[i][j][2] = bgColor[2]; zBuffer[i][j] = Double.MIN_VALUE; } } push(); // AFFECT ALL ITEMS IN WORLD //t.printMatrix(); t.translate(0, 0, -4); push(); sphere1.reset(); sphere1.setMaterial(material1); sphere1.transformedBy(t); sphere1.bufferTo(zBuffer, frameBuffer, lights, focalLength); push(); t.translate(-1, 0, -1); sphere2.reset(); sphere2.setMaterial(material2); sphere2.transformedBy(t); sphere2.bufferTo(zBuffer, frameBuffer, lights, focalLength); pop(); pop(); pop(); t.rotateX(phi * Math.PI / 180); t.rotateY(theta * Math.PI / 180); //damage = true; // display frame buffer int n = 0; for (int j = 0 ; j < H ; j++) // LOOP OVER IMAGE ROWS for (int i = 0 ; i < W ; i++) { // LOOP OVER IMAGE COLUMNS pix[n++] = pack(Math.max(0,Math.min(255,(int)(255 * frameBuffer[i][j][0]))), Math.max(0,Math.min(255,(int)(255 * frameBuffer[i][j][1]))), Math.max(0,Math.min(255,(int)(255 * frameBuffer[i][j][2])))); } } private void push() { stack.push(); t = stack.get(); } private void pop() { stack.pop(); t = stack.get(); } public boolean mouseDown(Event e, int x, int y) { mouseX = x; mouseY = y; return true; } public boolean mouseDrag(Event e, int x, int y) { theta = x - mouseX; phi = y - mouseY; mouseX = x; mouseY = y; damage = true; return true; } }