From 136b97bea59e5ef5efe03e0a7691a18037b43803 Mon Sep 17 00:00:00 2001 From: Casey Reas Date: Tue, 6 Sep 2011 00:28:13 +0000 Subject: [PATCH] Removing 3D example, integrated into Basics and Topics --- java/examples/3D/Camera/MoveEye/MoveEye.pde | 28 --- .../OrthoVSPerspective/OrthoVSPerspective.pde | 42 ----- .../3D/Camera/Perspective/Perspective.pde | 41 ----- java/examples/3D/Form/CubicGrid/CubicGrid.pde | 47 ----- java/examples/3D/Form/RunAmuck/Legs.pde | 162 ------------------ java/examples/3D/Form/RunAmuck/RunAmuck.pde | 45 ----- .../3D/Lights/Directional/Directional.pde | 28 --- java/examples/3D/Lights/Lights1/Lights1.pde | 29 ---- java/examples/3D/Lights/Lights2/Lights2.pde | 36 ---- .../3D/Lights/Reflection/Reflection.pde | 25 --- java/examples/3D/Lights/Spot/Spot.pde | 35 ---- .../3D/Textures/Texture1/Texture1.pde | 28 --- .../3D/Textures/Texture2/Texture2.pde | 25 --- .../3D/Textures/Texture3/Texture3.pde | 46 ----- .../3D/Textures/TextureCube/TextureCube.pde | 91 ---------- java/examples/3D/Transform/Bird/Bird.pde | 63 ------- java/examples/3D/Transform/Birds/Bird.pde | 99 ----------- java/examples/3D/Transform/Birds/Birds.pde | 53 ------ .../Transform/PushPopCubes/PushPopCubes.pde | 144 ---------------- .../examples/3D/Transform/Rotate1/Rotate1.pde | 38 ---- .../examples/3D/Transform/Rotate2/Rotate2.pde | 42 ----- .../3D/Typography/KineticType/KineticType.pde | 64 ------- .../3D/Typography/KineticType/Letter.pde | 13 -- .../3D/Typography/KineticType/Line.pde | 28 --- .../3D/Typography/KineticType/Word.pde | 10 -- .../KineticType/data/Univers-66.vlw | Bin 116537 -> 0 bytes .../3D/Typography/LetterK/LetterK.pde | 125 -------------- java/examples/3D/Typography/Typing/Typing.pde | 82 --------- .../3D/Typography/Typing/data/Univers45.vlw | Bin 95193 -> 0 bytes .../Geometry}/BrickTower/BrickTower.pde | 0 .../Geometry}/BrickTower/Cube.pde | 0 .../Geometry}/Icosahedra/Dimension3D.pde | 0 .../Geometry}/Icosahedra/Icosahedra.pde | 0 .../Geometry}/Icosahedra/Icosahedron.pde | 0 .../Geometry}/Icosahedra/Shape3D.pde | 0 .../Geometry}/Primitives3D/Primitives3D.pde | 0 .../Geometry}/RGBCube/RGBCube.pde | 0 .../ShapeTransform/ShapeTransform.pde | 0 .../Geometry}/Toroid/Toroid.pde | 0 .../Geometry}/Vertices/Vertices.pde | 0 .../Image Processing}/Explode/Explode.pde | 0 .../Explode/data/eames.jpg.tmp | Bin .../Image Processing}/Extrusion/Extrusion.pde | 0 .../Image Processing}/Zoom/Zoom.pde | 0 .../Motion}/CubesWithinCube/Cube.pde | 0 .../CubesWithinCube/CubesWithinCube.pde | 0 46 files changed, 1469 deletions(-) delete mode 100644 java/examples/3D/Camera/MoveEye/MoveEye.pde delete mode 100644 java/examples/3D/Camera/OrthoVSPerspective/OrthoVSPerspective.pde delete mode 100644 java/examples/3D/Camera/Perspective/Perspective.pde delete mode 100644 java/examples/3D/Form/CubicGrid/CubicGrid.pde delete mode 100644 java/examples/3D/Form/RunAmuck/Legs.pde delete mode 100644 java/examples/3D/Form/RunAmuck/RunAmuck.pde delete mode 100644 java/examples/3D/Lights/Directional/Directional.pde delete mode 100644 java/examples/3D/Lights/Lights1/Lights1.pde delete mode 100644 java/examples/3D/Lights/Lights2/Lights2.pde delete mode 100644 java/examples/3D/Lights/Reflection/Reflection.pde delete mode 100644 java/examples/3D/Lights/Spot/Spot.pde delete mode 100644 java/examples/3D/Textures/Texture1/Texture1.pde delete mode 100644 java/examples/3D/Textures/Texture2/Texture2.pde delete mode 100644 java/examples/3D/Textures/Texture3/Texture3.pde delete mode 100644 java/examples/3D/Textures/TextureCube/TextureCube.pde delete mode 100644 java/examples/3D/Transform/Bird/Bird.pde delete mode 100644 java/examples/3D/Transform/Birds/Bird.pde delete mode 100644 java/examples/3D/Transform/Birds/Birds.pde delete mode 100644 java/examples/3D/Transform/PushPopCubes/PushPopCubes.pde delete mode 100644 java/examples/3D/Transform/Rotate1/Rotate1.pde delete mode 100644 java/examples/3D/Transform/Rotate2/Rotate2.pde delete mode 100644 java/examples/3D/Typography/KineticType/KineticType.pde delete mode 100644 java/examples/3D/Typography/KineticType/Letter.pde delete mode 100644 java/examples/3D/Typography/KineticType/Line.pde delete mode 100644 java/examples/3D/Typography/KineticType/Word.pde delete mode 100644 java/examples/3D/Typography/KineticType/data/Univers-66.vlw delete mode 100644 java/examples/3D/Typography/LetterK/LetterK.pde delete mode 100644 java/examples/3D/Typography/Typing/Typing.pde delete mode 100644 java/examples/3D/Typography/Typing/data/Univers45.vlw rename java/examples/{3D/Form => Topics/Geometry}/BrickTower/BrickTower.pde (100%) rename java/examples/{3D/Form => Topics/Geometry}/BrickTower/Cube.pde (100%) rename java/examples/{3D/Form => Topics/Geometry}/Icosahedra/Dimension3D.pde (100%) mode change 100755 => 100644 rename java/examples/{3D/Form => Topics/Geometry}/Icosahedra/Icosahedra.pde (100%) mode change 100755 => 100644 rename java/examples/{3D/Form => Topics/Geometry}/Icosahedra/Icosahedron.pde (100%) mode change 100755 => 100644 rename java/examples/{3D/Form => Topics/Geometry}/Icosahedra/Shape3D.pde (100%) mode change 100755 => 100644 rename java/examples/{3D/Form => Topics/Geometry}/Primitives3D/Primitives3D.pde (100%) rename java/examples/{3D/Form => Topics/Geometry}/RGBCube/RGBCube.pde (100%) rename java/examples/{3D/Form => Topics/Geometry}/ShapeTransform/ShapeTransform.pde (100%) rename java/examples/{3D/Form => Topics/Geometry}/Toroid/Toroid.pde (100%) rename java/examples/{3D/Form => Topics/Geometry}/Vertices/Vertices.pde (100%) rename java/examples/{3D/Image => Topics/Image Processing}/Explode/Explode.pde (100%) rename java/examples/{3D/Image => Topics/Image Processing}/Explode/data/eames.jpg.tmp (100%) rename java/examples/{3D/Image => Topics/Image Processing}/Extrusion/Extrusion.pde (100%) rename java/examples/{3D/Image => Topics/Image Processing}/Zoom/Zoom.pde (100%) rename java/examples/{3D/Transform => Topics/Motion}/CubesWithinCube/Cube.pde (100%) rename java/examples/{3D/Transform => Topics/Motion}/CubesWithinCube/CubesWithinCube.pde (100%) diff --git a/java/examples/3D/Camera/MoveEye/MoveEye.pde b/java/examples/3D/Camera/MoveEye/MoveEye.pde deleted file mode 100644 index 6a6384640..000000000 --- a/java/examples/3D/Camera/MoveEye/MoveEye.pde +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Move Eye. - * by Simon Greenwold. - * - * The camera lifts up (controlled by mouseY) while looking at the same point. - */ - -void setup() { - size(640, 360, P3D); - fill(204); -} - -void draw() { - lights(); - background(0); - - // Change height of the camera with mouseY - camera(30.0, mouseY, 220.0, // eyeX, eyeY, eyeZ - 0.0, 0.0, 0.0, // centerX, centerY, centerZ - 0.0, 1.0, 0.0); // upX, upY, upZ - - noStroke(); - box(90); - stroke(255); - line(-100, 0, 0, 100, 0, 0); - line(0, -100, 0, 0, 100, 0); - line(0, 0, -100, 0, 0, 100); -} diff --git a/java/examples/3D/Camera/OrthoVSPerspective/OrthoVSPerspective.pde b/java/examples/3D/Camera/OrthoVSPerspective/OrthoVSPerspective.pde deleted file mode 100644 index 9c9a0ff1d..000000000 --- a/java/examples/3D/Camera/OrthoVSPerspective/OrthoVSPerspective.pde +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Ortho vs Perspective. - * - * Click to see the difference between orthographic projection - * and perspective projection as applied to a simple box. - * The ortho() function sets an orthographic projection and - * defines a parallel clipping volume. All objects with the - * same dimension appear the same size, regardless of whether - * they are near or far from the camera. The parameters to this - * function specify the clipping volume where left and right - * are the minimum and maximum x values, top and bottom are the - * minimum and maximum y values, and near and far are the minimum - * and maximum z values. - */ - -void setup() -{ - size(640, 360, P3D); - noStroke(); - fill(204); -} - -void draw() -{ - background(0); - lights(); - - if(mousePressed) { - float fov = PI/3.0; - float cameraZ = (height/2.0) / tan(fov/2.0); - perspective(fov, float(width)/float(height), - cameraZ/2.0, cameraZ*2.0); - } else { - ortho(0, width, 0, height); - } - - translate(width/2, height/2, 0); - rotateX(-PI/6); - rotateY(PI/3); - box(160); -} - diff --git a/java/examples/3D/Camera/Perspective/Perspective.pde b/java/examples/3D/Camera/Perspective/Perspective.pde deleted file mode 100644 index 46695397d..000000000 --- a/java/examples/3D/Camera/Perspective/Perspective.pde +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Perspective. - * - * Move the mouse left and right to change the field of view (fov). - * Click to modify the aspect ratio. The perspective() function - * sets a perspective projection applying foreshortening, making - * distant objects appear smaller than closer ones. The parameters - * define a viewing volume with the shape of truncated pyramid. - * Objects near to the front of the volume appear their actual size, - * while farther objects appear smaller. This projection simulates - * the perspective of the world more accurately than orthographic projection. - * The version of perspective without parameters sets the default - * perspective and the version with four parameters allows the programmer - * to set the area precisely. - */ - -void setup() { - size(640, 360, P3D); - noStroke(); -} - -void draw() { - lights(); - background(204); - float cameraY = height/2.0; - float fov = mouseX/float(width) * PI/2; - float cameraZ = cameraY / tan(fov / 2.0); - float aspect = float(width)/float(height); - if (mousePressed) { - aspect = aspect / 2.0; - } - perspective(fov, aspect, cameraZ/10.0, cameraZ*10.0); - - translate(width/2+30, height/2, 0); - rotateX(-PI/6); - rotateY(PI/3 + mouseY/float(height) * PI); - box(45); - translate(0, 0, -50); - box(30); -} - diff --git a/java/examples/3D/Form/CubicGrid/CubicGrid.pde b/java/examples/3D/Form/CubicGrid/CubicGrid.pde deleted file mode 100644 index 111cd3f3f..000000000 --- a/java/examples/3D/Form/CubicGrid/CubicGrid.pde +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Cubic Grid - * by Ira Greenberg. - * - * 3D translucent colored grid uses nested pushMatrix() - * and popMatrix() functions. - */ - -float boxSize = 40; -float margin = boxSize*2; -float depth = 400; -color boxFill; - -void setup() { - size(640, 360, P3D); - noStroke(); -} - -void draw() { - background(255); - - // Center and spin grid - translate(width/2, height/2, -depth); - rotateY(frameCount * 0.01); - rotateX(frameCount * 0.01); - - // Build grid using multiple translations - for (float i =- depth/2+margin; i <= depth/2-margin; i += boxSize){ - pushMatrix(); - for (float j =- height+margin; j <= height-margin; j += boxSize){ - pushMatrix(); - for (float k =- width+margin; k <= width-margin; k += boxSize){ - // Base fill color on counter values, abs function - // ensures values stay within legal range - boxFill = color(abs(i), abs(j), abs(k), 50); - pushMatrix(); - translate(k, j, i); - fill(boxFill); - box(boxSize, boxSize, boxSize); - popMatrix(); - } - popMatrix(); - } - popMatrix(); - } -} - diff --git a/java/examples/3D/Form/RunAmuck/Legs.pde b/java/examples/3D/Form/RunAmuck/Legs.pde deleted file mode 100644 index eb74d7859..000000000 --- a/java/examples/3D/Form/RunAmuck/Legs.pde +++ /dev/null @@ -1,162 +0,0 @@ -/** - * Legs class - * By Ira Greenberg
- * Processing for Flash Developers, - * Friends of ED, 2009 - */ - -class Legs { - // Instance properties with default values - float x = 0, y = 0, z = 0, w = 150, ht = 125; - color col = #77AA22; - // Advanced properties - float detailW = w/6.0; - float detailHt = ht/8.0; - float shoeBulge = detailHt*2.0; - float legGap = w/7.0; - - // Dynamics properties - float velocity = .02, stepL, stepR, stepRate = random(10, 50); - float speedX = 1.0, speedZ, spring, damping = .5, theta; - - // Default constructor - Legs() { - } - - // Standard constructor - Legs(float x, float z, float w, float ht, color col) { - this.x = x; - this.z = z; - this.w = w; - this.ht = ht; - this.col = col; - fill(col); - detailW = w/6.0; - detailHt = ht/8.0; - shoeBulge = detailHt*2.0; - legGap = w/7.0; - speedX = random(-speedX, speedX); - } - - // Advanced constructor - Legs(float x, float z, float w, float ht, color col, float detailW, - float detailHt, float shoeBulge, float legGap) { - this.x = x; - this.z = z; - this.w = w; - this.ht = ht; - this.col = col; - this.detailW = detailW; - this.detailHt = detailHt; - this.shoeBulge = shoeBulge; - this.legGap = legGap; - speedX = random(-speedX, speedX); - } - - // Draw legs - void create() { - fill(col); - float footWidth = (w - legGap)/2; - beginShape(); - vertex(x - w/2, y - ht, z); - vertex(x - w/2, y - ht + detailHt, z); - vertex(x - w/2 + detailW, y - ht + detailHt, z); - // left foot - vertex(x - w/2 + detailW, y + stepL, z); - curveVertex(x - w/2 + detailW, y + stepL, z); - curveVertex(x - w/2 + detailW, y + stepL, z); - curveVertex(x - w/2 + detailW - shoeBulge, y + detailHt/2 + stepL, z); - curveVertex(x - w/2, y + detailHt + stepL, z); - curveVertex(x - w/2, y + detailHt + stepL, z); - vertex(x - w/2 + footWidth, y + detailHt + stepL*.9, z); - // end left foot - vertex(x - w/2 + footWidth + legGap/2, y - ht + detailHt, z); - vertex(x - w/2 + footWidth + legGap/2, y - ht + detailHt, z); - // right foot - vertex(x - w/2 + footWidth + legGap, y + detailHt + stepR*.9, z); - vertex(x + w/2, y + detailHt + stepR, z); - curveVertex(x + w/2, y + detailHt + stepR, z); - curveVertex(x + w/2, y + detailHt + stepR, z); - curveVertex(x + w/2 - detailW + shoeBulge, y + detailHt/2 + stepR, z); - curveVertex(x + w/2 - detailW, y + stepR, z); - vertex(x + w/2 - detailW, y + stepR, z); - // end right foot - vertex(x + w/2 - detailW, y - ht + detailHt, z); - vertex(x + w/2, y - ht + detailHt, z); - vertex(x + w/2, y - ht, z); - endShape(CLOSE); - } - - // Set advanced property values - void setDetails(float detailW, float detailHt, float shoeBulge, float legGap) { - this.detailW = detailW; - this.detailHt = detailHt; - this.shoeBulge = shoeBulge; - this.legGap = legGap; - } - - // Make the legs step - void step(float stepRate) { - this.stepRate = stepRate; - spring = ht/2.0; - stepL = sin(theta)*spring; - stepR = cos(theta)*spring; - theta += radians(stepRate); - } - - // Alternative overloaded step method - void step() { - spring = ht/2.0; - stepL = sin(theta)*spring; - stepR = cos(theta)*spring; - theta += radians(stepRate); - } - - - // Moves legs along x, y, z axes - void move() { - // Move legs along y-axis - y = stepR*damping; - - // Move legs along x-axis and - // check for collision against frame edge - x += speedX; - if (screenX(x, y, z) > width) { - speedX *= -1; - } - if (screenX(x, y, z) < 0) { - speedX *= -1; - } - - // Move legs along z-axis based on speed of stepping - // and check for collision against extremes - speedZ = (stepRate*velocity); - z += speedZ; - if (z > 400) { - z = 400; - velocity *= -1; - } - if (z < -100) { - z = -100; - velocity *= -1; - } - } - - void setDynamics(float speedX, float spring, float damping) { - this.speedX = speedX; - this.spring = spring; - this.damping = damping; - } -} - - - - - - - - - - - - diff --git a/java/examples/3D/Form/RunAmuck/RunAmuck.pde b/java/examples/3D/Form/RunAmuck/RunAmuck.pde deleted file mode 100644 index 7a5b06fc2..000000000 --- a/java/examples/3D/Form/RunAmuck/RunAmuck.pde +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Run-Amuck - * By Ira Greenberg
- * Processing for Flash Developers, - * Friends of ED, 2009 - */ - -int count = 250; -Legs[] legs = new Legs[count]; - -void setup() { - size(640, 360, P3D); - noStroke(); - for (int i = 0; i < legs.length; i++) { - legs[i] = new Legs(random(-10, 10), random(-50, 150), random(.5, 5), - random(.5, 5), color(random(255), random(255), random(255))); - } -} - -void draw() { - background(0); - translate(width/2, height/2); - noStroke(); - fill(35); - - // Draw ground plane - beginShape(); - vertex(-width*2, 0, -1000); - vertex(width*2, 0, -1000); - vertex(width/2, height/2, 400); - vertex(-width/2, height/2, 400); - endShape(CLOSE); - - // Update and draw the legs - for (int i = 0; i < legs.length; i++) { - legs[i].create(); - // Set foot step rate - legs[i].step(random(10, 50)); - // Move legs along x, y, z axes - // z-movement dependent upon step rate - legs[i].move(); - } -} - - diff --git a/java/examples/3D/Lights/Directional/Directional.pde b/java/examples/3D/Lights/Directional/Directional.pde deleted file mode 100644 index 6a1af3008..000000000 --- a/java/examples/3D/Lights/Directional/Directional.pde +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Directional. - * - * Move the mouse the change the direction of the light. - * Directional light comes from one direction and is stronger - * when hitting a surface squarely and weaker if it hits at a - * a gentle angle. After hitting a surface, a directional lights - * scatters in all directions. - */ - -void setup() { - size(640, 360, P3D); - noStroke(); - fill(204); -} - -void draw() { - noStroke(); - background(0); - float dirY = (mouseY / float(height) - 0.5) * 2; - float dirX = (mouseX / float(width) - 0.5) * 2; - directionalLight(204, 204, 204, -dirX, -dirY, -1); - translate(width/2 - 100, height/2, 0); - sphere(80); - translate(200, 0, 0); - sphere(80); -} - diff --git a/java/examples/3D/Lights/Lights1/Lights1.pde b/java/examples/3D/Lights/Lights1/Lights1.pde deleted file mode 100644 index bf7a36edc..000000000 --- a/java/examples/3D/Lights/Lights1/Lights1.pde +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Lights 1. - * - * Uses the default lights to show a simple box. The lights() function - * is used to turn on the default lighting. - */ - -float spin = 0.0; - -void setup() -{ - size(640, 360, P3D); - noStroke(); -} - -void draw() -{ - background(51); - lights(); - - spin += 0.01; - - pushMatrix(); - translate(width/2, height/2, 0); - rotateX(PI/9); - rotateY(PI/5 + spin); - box(150); - popMatrix(); -} diff --git a/java/examples/3D/Lights/Lights2/Lights2.pde b/java/examples/3D/Lights/Lights2/Lights2.pde deleted file mode 100644 index e1693e590..000000000 --- a/java/examples/3D/Lights/Lights2/Lights2.pde +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Lights 2 - * by Simon Greenwold. - * - * Display a box with three different kinds of lights. - */ - -void setup() -{ - size(640, 360, P3D); - noStroke(); -} - -void draw() -{ - background(0); - translate(width / 2, height / 2); - - // Orange point light on the right - pointLight(150, 100, 0, // Color - 200, -150, 0); // Position - - // Blue directional light from the left - directionalLight(0, 102, 255, // Color - 1, 0, 0); // The x-, y-, z-axis direction - - // Yellow spotlight from the front - spotLight(255, 255, 109, // Color - 0, 40, 200, // Position - 0, -0.5, -0.5, // Direction - PI / 2, 2); // Angle, concentration - - rotateY(map(mouseX, 0, width, 0, PI)); - rotateX(map(mouseY, 0, height, 0, PI)); - box(150); -} diff --git a/java/examples/3D/Lights/Reflection/Reflection.pde b/java/examples/3D/Lights/Reflection/Reflection.pde deleted file mode 100644 index f6a3d7a94..000000000 --- a/java/examples/3D/Lights/Reflection/Reflection.pde +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Reflection - * by Simon Greenwold. - * - * Vary the specular reflection component of a material - * with the horizontal position of the mouse. - */ - -void setup() { - size(640, 360, P3D); - noStroke(); - colorMode(RGB, 1); - fill(0.4); -} - -void draw() { - background(0); - translate(width / 2, height / 2); - // Set the specular color of lights that follow - lightSpecular(1, 1, 1); - directionalLight(0.8, 0.8, 0.8, 0, 0, -1); - float s = mouseX / float(width); - specular(s, s, s); - sphere(120); -} diff --git a/java/examples/3D/Lights/Spot/Spot.pde b/java/examples/3D/Lights/Spot/Spot.pde deleted file mode 100644 index ce25c4bee..000000000 --- a/java/examples/3D/Lights/Spot/Spot.pde +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Spot. - * - * Move the mouse the change the position and concentation - * of a blue spot light. - */ - -int concentration = 600; // Try values 1 -> 10000 - -void setup() -{ - //size(200, 200, P3D); - size(640, 360, P3D); - noStroke(); - fill(204); - sphereDetail(60); -} - -void draw() -{ - background(0); - - // Light the bottom of the sphere - directionalLight(51, 102, 126, 0, -1, 0); - - // Orange light on the upper-right of the sphere - spotLight(204, 153, 0, 360, 160, 600, 0, 0, -1, PI/2, 600); - - // Moving spotlight that follows the mouse - spotLight(102, 153, 204, 360, mouseY, 600, 0, 0, -1, PI/2, 600); - - translate(width/2, height/2, 0); - sphere(120); -} - diff --git a/java/examples/3D/Textures/Texture1/Texture1.pde b/java/examples/3D/Textures/Texture1/Texture1.pde deleted file mode 100644 index 7eb36310a..000000000 --- a/java/examples/3D/Textures/Texture1/Texture1.pde +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Texture 1. - * - * Load an image and draw it onto a quad. The texture() function sets - * the texture image. The vertex() function maps the image to the geometry. - */ - -PImage img; - -void setup() { - size(640, 360, P3D); - img = loadImage("berlin-1.jpg"); - noStroke(); -} - -void draw() { - background(0); - translate(width / 2, height / 2); - rotateY(map(mouseX, 0, width, -PI, PI)); - rotateZ(PI/6); - beginShape(); - texture(img); - vertex(-100, -100, 0, 0, 0); - vertex(100, -100, 0, 400, 0); - vertex(100, 100, 0, 400, 400); - vertex(-100, 100, 0, 0, 400); - endShape(); -} diff --git a/java/examples/3D/Textures/Texture2/Texture2.pde b/java/examples/3D/Textures/Texture2/Texture2.pde deleted file mode 100644 index 1398fd3e5..000000000 --- a/java/examples/3D/Textures/Texture2/Texture2.pde +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Texture 2. - * - * Using a rectangular image to map a texture onto a triangle. - */ - -PImage img; - -void setup() { - size(640, 360, P3D); - img = loadImage("berlin-1.jpg"); - noStroke(); -} - -void draw() { - background(0); - translate(width / 2, height / 2); - rotateY(map(mouseX, 0, width, -PI, PI)); - beginShape(); - texture(img); - vertex(-100, -100, 0, 0, 0); - vertex(100, -40, 0, 400, 120); - vertex(0, 100, 0, 200, 400); - endShape(); -} diff --git a/java/examples/3D/Textures/Texture3/Texture3.pde b/java/examples/3D/Textures/Texture3/Texture3.pde deleted file mode 100644 index 66130f1e5..000000000 --- a/java/examples/3D/Textures/Texture3/Texture3.pde +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Texture 3. - * - * Load an image and draw it onto a cylinder and a quad. - */ - - -int tubeRes = 32; -float[] tubeX = new float[tubeRes]; -float[] tubeY = new float[tubeRes]; -PImage img; - -void setup() { - size(640, 360, P3D); - img = loadImage("berlin-1.jpg"); - float angle = 270.0 / tubeRes; - for (int i = 0; i < tubeRes; i++) { - tubeX[i] = cos(radians(i * angle)); - tubeY[i] = sin(radians(i * angle)); - } - noStroke(); -} - -void draw() { - background(0); - translate(width / 2, height / 2); - rotateX(map(mouseY, 0, height, -PI, PI)); - rotateY(map(mouseX, 0, width, -PI, PI)); - beginShape(QUAD_STRIP); - texture(img); - for (int i = 0; i < tubeRes; i++) { - float x = tubeX[i] * 100; - float z = tubeY[i] * 100; - float u = img.width / tubeRes * i; - vertex(x, -100, z, u, 0); - vertex(x, 100, z, u, img.height); - } - endShape(); - beginShape(QUADS); - texture(img); - vertex(0, -100, 0, 0, 0); - vertex(100, -100, 0, 100, 0); - vertex(100, 100, 0, 100, 100); - vertex(0, 100, 0, 0, 100); - endShape(); -} diff --git a/java/examples/3D/Textures/TextureCube/TextureCube.pde b/java/examples/3D/Textures/TextureCube/TextureCube.pde deleted file mode 100644 index 38df04997..000000000 --- a/java/examples/3D/Textures/TextureCube/TextureCube.pde +++ /dev/null @@ -1,91 +0,0 @@ -/** - * 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; - -void setup() -{ - size(640, 360, P3D); - tex = loadImage("berlin-1.jpg"); - textureMode(NORMALIZED); - fill(255); - stroke(color(44,48,32)); -} - -void draw() -{ - background(0); - noStroke(); - translate(width/2.0, height/2.0, -100); - rotateX(rotx); - rotateY(roty); - scale(90); - TexturedCube(tex); -} - -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(); -} - -void mouseDragged() { - float rate = 0.01; - rotx += (pmouseY-mouseY) * rate; - roty += (mouseX-pmouseX) * rate; -} diff --git a/java/examples/3D/Transform/Bird/Bird.pde b/java/examples/3D/Transform/Bird/Bird.pde deleted file mode 100644 index dacd405d1..000000000 --- a/java/examples/3D/Transform/Bird/Bird.pde +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Simple 3D Bird - * by Ira Greenberg. - * - * Using a box and 2 rects to simulate a flying bird. - * Trig functions handle the flapping and sinuous movement. - */ - -float ang = 0, ang2 = 0, ang3 = 0, ang4 = 0; -float px = 0, py = 0, pz = 0; -float flapSpeed = 0.2; - -void setup(){ - size(640, 360, P3D); - noStroke(); -} - -void draw(){ - background(0); - lights(); - - // Flight - px = sin(radians(ang3)) * 170; - py = cos(radians(ang3)) * 300; - pz = sin(radians(ang4)) * 500; - translate(width/2 + px, height/2 + py, -700+pz); - rotateX(sin(radians(ang2)) * 120); - rotateY(sin(radians(ang2)) * 50); - rotateZ(sin(radians(ang2)) * 65); - - // Body - fill(153); - box(20, 100, 20); - - - // Left wing - fill(204); - pushMatrix(); - rotateY(sin(radians(ang)) * -20); - rect(-75, -50, 75, 100); - popMatrix(); - - // Right wing - pushMatrix(); - rotateY(sin(radians(ang)) * 20); - rect(0, -50, 75, 100); - popMatrix(); - - // Wing flap - ang += flapSpeed; - if (ang > 3) { - flapSpeed *= -1; - } - if (ang < -3) { - flapSpeed *= -1; - } - - // Increment angles - ang2 += 0.01; - ang3 += 2.0; - ang4 += 0.75; -} - diff --git a/java/examples/3D/Transform/Birds/Bird.pde b/java/examples/3D/Transform/Birds/Bird.pde deleted file mode 100644 index 84ada2603..000000000 --- a/java/examples/3D/Transform/Birds/Bird.pde +++ /dev/null @@ -1,99 +0,0 @@ -class Bird { - - // Properties - float offsetX, offsetY, offsetZ; - float w, h; - int bodyFill; - int wingFill; - float ang = 0, ang2 = 0, ang3 = 0, ang4 = 0; - float radiusX = 120, radiusY = 200, radiusZ = 700; - float rotX = 15, rotY = 10, rotZ = 5; - float flapSpeed = 0.4; - float rotSpeed = 0.1; - - // Constructors - Bird(){ - this(0, 0, 0, 60, 80); - } - - Bird(float offsetX, float offsetY, float offsetZ, - float w, float h){ - this.offsetX = offsetX; - this.offsetY = offsetY; - this.offsetZ = offsetZ; - this.h = h; - this.w = w; - bodyFill = color(153); - wingFill = color(204); - } - - void setFlight(float radiusX, float radiusY, float radiusZ, - float rotX, float rotY, float rotZ){ - this.radiusX = radiusX; - this.radiusY = radiusY; - this.radiusZ = radiusZ; - - this.rotX = rotX; - this.rotY = rotY; - this.rotZ = rotZ; - } - - void setWingSpeed(float flapSpeed){ - this.flapSpeed = flapSpeed; - } - - void setRotSpeed(float rotSpeed){ - this.rotSpeed = rotSpeed; - } - - void fly() { - pushMatrix(); - float px, py, pz; - - // Flight - px = sin(radians(ang3)) * radiusX; - py = cos(radians(ang3)) * radiusY; - pz = sin(radians(ang4)) * radiusZ; - - translate(width/2 + offsetX + px, height/2 + offsetY+py, -700 + offsetZ+pz); - - rotateX(sin(radians(ang2)) * rotX); - rotateY(sin(radians(ang2)) * rotY); - rotateZ(sin(radians(ang2)) * rotZ); - - // Body - fill(bodyFill); - box(w/5, h, w/5); - - // Left wing - fill(wingFill); - pushMatrix(); - rotateY(sin(radians(ang)) * 20); - rect(0, -h/2, w, h); - popMatrix(); - - // Right wing - pushMatrix(); - rotateY(sin(radians(ang)) * -20); - rect(-w, -h/2, w, h); - popMatrix(); - - // Wing flap - ang += flapSpeed; - if (ang > 3) { - flapSpeed*=-1; - } - if (ang < -3) { - flapSpeed*=-1; - } - - // Ang's run trig functions - ang2 += rotSpeed; - ang3 += 1.25; - ang4 += 0.55; - popMatrix(); - } -} - - - diff --git a/java/examples/3D/Transform/Birds/Birds.pde b/java/examples/3D/Transform/Birds/Birds.pde deleted file mode 100644 index 5026bd2ae..000000000 --- a/java/examples/3D/Transform/Birds/Birds.pde +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Crazy Flocking 3D Birds - * by Ira Greenberg. - * - * Simulates a flock of birds using a Bird class and nested - * pushMatrix() / popMatrix() functions. - * Trigonometry functions handle the flapping and sinuous movement. - */ - -// Flock array -int birdCount = 200; -Bird[]birds = new Bird[birdCount]; -float[]x = new float[birdCount]; -float[]y = new float[birdCount]; -float[]z = new float[birdCount]; -float[]rx = new float[birdCount]; -float[]ry = new float[birdCount]; -float[]rz = new float[birdCount]; -float[]spd = new float[birdCount]; -float[]rot = new float[birdCount]; - -void setup() { - size(640, 360, P3D); - noStroke(); - - // Initialize arrays with random values - for (int i = 0; i < birdCount; i++){ - birds[i] = new Bird(random(-300, 300), random(-300, 300), - random(-500, -2500), random(5, 30), random(5, 30)); - - x[i] = random(20, 340); - y[i] = random(30, 350); - z[i] = random(1000, 4800); - rx[i] = random(-160, 160); - ry[i] = random(-55, 55); - rz[i] = random(-20, 20); - spd[i] = random(.1, 3.75); - rot[i] = random(.025, .15); - } -} - -void draw() { - background(0); - lights(); - for (int i = 0; i < birdCount; i++){ - birds[i].setFlight(x[i], y[i], z[i], rx[i], ry[i], rz[i]); - birds[i].setWingSpeed(spd[i]); - birds[i].setRotSpeed(rot[i]); - birds[i].fly(); - } -} - - diff --git a/java/examples/3D/Transform/PushPopCubes/PushPopCubes.pde b/java/examples/3D/Transform/PushPopCubes/PushPopCubes.pde deleted file mode 100644 index 52ae70fdc..000000000 --- a/java/examples/3D/Transform/PushPopCubes/PushPopCubes.pde +++ /dev/null @@ -1,144 +0,0 @@ -/** - * PushPop Cubes - * by Ira Greenberg. - * - * Array of rotating cubes creates - * dynamic field patterns. Color - * controlled by light sources. Example - * of pushMatrix() and popMatrix(). - */ - -// Cube class required -float ang; -int rows = 21; -int cols = 21; -int cubeCount = rows*cols; -int colSpan, rowSpan; -float rotspd = 2.0; -Cube[] cubes = new Cube[cubeCount]; -float[] angs = new float[cubeCount]; -float[] rotvals = new float[cubeCount]; - -void setup(){ - size(640, 360, P3D); - - colSpan = width/(cols-1); - rowSpan = height/(rows-1); - noStroke(); - - // instantiate cubes - for (int i = 0; i < cubeCount; i++){ - cubes[i] = new Cube(12, 12, 6, 0, 0, 0); - /* 3 different rotation options - - 1st option: cubes each rotate uniformly - - 2nd option: cubes each rotate randomly - - 3rd option: cube columns rotate as waves - To try the different rotations, leave one - of the rotVals[i] lines uncommented below - and the other 2 commented out. */ - - //rotvals[i] = rotspd; - //rotvals[i] = random(-rotspd * 2, rotspd * 2); - rotvals[i] = rotspd += .01; - } -} - -void draw(){ - int cubeCounter = 0; - background(0); - fill(200); - - // Set up some different colored lights - pointLight(51, 102, 255, width/3, height/2, 100); - pointLight(200, 40, 60, width/1.5, height/2, -150); - - // Raise overall light in scene - ambientLight(170, 170, 100); - - // Translate, rotate and draw cubes - for (int i = 0; i < cols; i++){ - for (int j = 0; j < rows; j++){ - pushMatrix(); - /* Translate each block. - pushmatix and popmatrix add each cube - translation to matrix, but restore - original, so each cube rotates around its - owns center */ - translate(i * colSpan, j * rowSpan, -20); - //rotate each cube around y and x axes - rotateY(radians(angs[cubeCounter])); - rotateX(radians(angs[cubeCounter])); - cubes[cubeCounter].drawCube(); - popMatrix(); - cubeCounter++; - } - } - // Angs used in rotate function calls above - for (int i = 0; i < cubeCount; i++){ - angs[i] += rotvals[i]; - } -} - -// Simple Cube class, based on Quads -class Cube { - - // Properties - int w, h, d; - int shiftX, shiftY, shiftZ; - - // Constructor - Cube(int w, int h, int d, int shiftX, int shiftY, int shiftZ){ - this.w = w; - this.h = h; - this.d = d; - this.shiftX = shiftX; - this.shiftY = shiftY; - this.shiftZ = shiftZ; - } - - /* Main cube drawing method, which looks - more confusing than it really is. It's - just a bunch of rectangles drawn for - each cube face */ - void drawCube(){ - - // Front face - beginShape(QUADS); - vertex(-w/2 + shiftX, -h/2 + shiftY, -d/2 + shiftZ); - vertex(w + shiftX, -h/2 + shiftY, -d/2 + shiftZ); - vertex(w + shiftX, h + shiftY, -d/2 + shiftZ); - vertex(-w/2 + shiftX, h + shiftY, -d/2 + shiftZ); - - // Back face - vertex(-w/2 + shiftX, -h/2 + shiftY, d + shiftZ); - vertex(w + shiftX, -h/2 + shiftY, d + shiftZ); - vertex(w + shiftX, h + shiftY, d + shiftZ); - vertex(-w/2 + shiftX, h + shiftY, d + shiftZ); - - // Left face - vertex(-w/2 + shiftX, -h/2 + shiftY, -d/2 + shiftZ); - vertex(-w/2 + shiftX, -h/2 + shiftY, d + shiftZ); - vertex(-w/2 + shiftX, h + shiftY, d + shiftZ); - vertex(-w/2 + shiftX, h + shiftY, -d/2 + shiftZ); - - // Right face - vertex(w + shiftX, -h/2 + shiftY, -d/2 + shiftZ); - vertex(w + shiftX, -h/2 + shiftY, d + shiftZ); - vertex(w + shiftX, h + shiftY, d + shiftZ); - vertex(w + shiftX, h + shiftY, -d/2 + shiftZ); - - // Top face - vertex(-w/2 + shiftX, -h/2 + shiftY, -d/2 + shiftZ); - vertex(w + shiftX, -h/2 + shiftY, -d/2 + shiftZ); - vertex(w + shiftX, -h/2 + shiftY, d + shiftZ); - vertex(-w/2 + shiftX, -h/2 + shiftY, d + shiftZ); - - // Bottom face - vertex(-w/2 + shiftX, h + shiftY, -d/2 + shiftZ); - vertex(w + shiftX, h + shiftY, -d/2 + shiftZ); - vertex(w + shiftX, h + shiftY, d + shiftZ); - vertex(-w/2 + shiftX, h + shiftY, d + shiftZ); - endShape(); - } -} - diff --git a/java/examples/3D/Transform/Rotate1/Rotate1.pde b/java/examples/3D/Transform/Rotate1/Rotate1.pde deleted file mode 100644 index 7aafc250a..000000000 --- a/java/examples/3D/Transform/Rotate1/Rotate1.pde +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Rotate 1. - * - * Rotating simultaneously in the X and Y axis. - * Transformation functions such as rotate() are additive. - * Successively calling rotate(1.0) and rotate(2.0) - * is equivalent to calling rotate(3.0). - */ - -float a = 0.0; -float rSize; // rectangle size - -void setup() { - size(640, 360, P3D); - rSize = width / 6; - noStroke(); - fill(204, 204); -} - -void draw() { - background(0); - - a += 0.005; - if(a > TWO_PI) { - a = 0.0; - } - - translate(width/2, height/2); - - rotateX(a); - rotateY(a * 2.0); - rect(-rSize, -rSize, rSize*2, rSize*2); - - rotateX(a * 1.001); - rotateY(a * 2.002); - rect(-rSize, -rSize, rSize*2, rSize*2); - -} diff --git a/java/examples/3D/Transform/Rotate2/Rotate2.pde b/java/examples/3D/Transform/Rotate2/Rotate2.pde deleted file mode 100644 index 1d5af0d49..000000000 --- a/java/examples/3D/Transform/Rotate2/Rotate2.pde +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Rotate 2. - * - * The push() and pop() functions allow for more control over transformations. - * The push function saves the current coordinate system to the stack - * and pop() restores the prior coordinate system. - */ - -float a; // Angle of rotation -float offset = PI/24.0; // Angle offset between boxes -int num = 12; // Number of boxes -color[] colors = new color[num]; // Colors of each box -color safecolor; - -boolean pink = true; - -void setup() -{ - size(640, 360, P3D); - noStroke(); - for(int i=0; izW+16M~;8BY`<2vUnbkf%Jylp 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 - buff = buff.substring(1); - } - break; - case 13: // Avoid special keys - case 10: - case 65535: - case 127: - case 27: - break; - default: - if(textWidth(buff+k)+leftmargin < width-rightmargin){ - didntTypeYet = false; - buff=k+buff; - } - break; - } -} - diff --git a/java/examples/3D/Typography/Typing/data/Univers45.vlw b/java/examples/3D/Typography/Typing/data/Univers45.vlw deleted file mode 100644 index 040e02170efb50dbce4576b305e0b6b4f53de200..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95193 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