making a complete mess

This commit is contained in:
benfry
2005-02-26 23:23:21 +00:00
parent 901646fb3d
commit 17b301afcf
8 changed files with 547 additions and 363 deletions
+65 -199
View File
@@ -262,7 +262,15 @@ public class PApplet extends Applet
public void depth() {
g = new PGraphics3(DEFAULT_WIDTH, DEFAULT_HEIGHT);
if (g.width != 0) {
g = new PGraphics3(g.width, g.height);
} else {
g = new PGraphics3(DEFAULT_WIDTH, DEFAULT_HEIGHT);
}
// it's ok to call this, because depth() is only getting called
// at least inside of setup, so things can be drawn just
// fine since it's post-beginFrame.
g.defaults();
}
@@ -1949,126 +1957,19 @@ public class PApplet extends Applet
// IMAGE I/O
/*
private Image gimmeImage(URL url, boolean force) {
Toolkit tk = Toolkit.getDefaultToolkit();
URLConnection conn = null;
try {
//conn = new URLConnection(url);
conn = url.openConnection();
// i don't think this does anything,
// but just set the fella for good measure
conn.setUseCaches(false);
// also had a note from zach about parent.obj.close() on url
// but that doesn't seem to be needed anymore...
// throws an exception if it doesn't exist
conn.connect();
if (!force) {
// how do you close the bastard?
conn = null;
// close connection and just use regular method
return tk.getImage(url);
}
// slurp contents of that stream
InputStream stream = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(stream);
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
int c = bis.read();
while (c != -1) {
out.write(c);
c = bis.read();
}
} catch (IOException e) {
return null;
}
bis.close(); // will this help?
//byte bytes[] = out.toByteArray();
// build an image out of it
//return tk.createImage(bytes);
return tk.createImage(out.toByteArray());
} catch (Exception e) { // null pointer or i/o ex
//System.err.println("error loading image: " + url);
return null;
}
}
*/
public PImage loadImage(String filename) {
if (filename.toLowerCase().endsWith(".tga")) {
return loadTargaImage(filename);
return loadImageTGA(filename);
}
return loadImage(filename, true);
}
// returns null if no image of that name is found
public PImage loadImage(String filename, boolean force) {
//Image awtimage = null;
//String randomizer = "?" + nf((int) (random()*10000), 4);
/*
if (filename.startsWith("http://")) {
try {
URL url = new URL(filename);
awtimage = gimmeImage(url, force);
} catch (MalformedURLException e) {
System.err.println("error loading image from " + filename);
e.printStackTrace();
return null;
}
} else {
//System.out.println(getClass().getName());
//System.out.println(getClass().getResource(filename));
awtimage = gimmeImage(getClass().getResource(filename), force);
if (awtimage == null) {
awtimage =
gimmeImage(getClass().getResource("data/" + filename), force);
}
if (awtimage == null) {
try {
//FileInputStream fis =
//new FileInputStream(folder + "data/" + filename);
String url = "file:/" + folder + "/data/" + filename;
//URL url = new URL("file:/" + folder + "data/" + filename);
awtimage = gimmeImage(new URL(url), force);
} catch (IOException e) {
e.printStackTrace();
}
}
}
*/
Image awtImage =
Toolkit.getDefaultToolkit().createImage(loadBytes(filename));
/*
if (awtimage == null) {
System.err.println("could not load image " + filename);
return null;
}
*/
/*
Component component = this; //applet;
if (component == null) {
component = new Frame();
((Frame)component).pack();
// now we have a peer! yay!
}
MediaTracker tracker = new MediaTracker(component);
*/
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(awtImage, 0);
try {
@@ -2089,37 +1990,7 @@ public class PApplet extends Applet
}
}
}
return image;
/*
int jwidth = awtimage.getWidth(null);
int jheight = awtimage.getHeight(null);
int jpixels[] = new int[jwidth*jheight];
PixelGrabber pg =
new PixelGrabber(awtimage, 0, 0, jwidth, jheight, jpixels, 0, jwidth);
try {
pg.grabPixels();
} catch (InterruptedException e) {
e.printStackTrace();
}
//int format = RGB;
if (filename.toLowerCase().endsWith(".gif")) {
// if it's a .gif image, test to see if it has transparency
for (int i = 0; i < jpixels.length; i++) {
// since transparency is often at corners, hopefully this
// will find a non-transparent pixel quickly and exit
if ((jpixels[i] & 0xff000000) != 0xff000000) {
return new PImage(jpixels, jwidth, jheight, ARGB);
//format = RGBA;
//break;
}
}
}
return new PImage(jpixels, jwidth, jheight, RGB);
*/
}
@@ -2129,44 +2000,44 @@ public class PApplet extends Applet
* [fry] this could be optimized to not use loadBytes
* which would help out memory situations with large images
*/
protected PImage loadTargaImage(String filename) {
protected PImage loadImageTGA(String filename) {
// load image file as byte array
byte[] buffer = loadBytes(filename);
// check if it's a TGA and has 8bits/colour channel
if (buffer[2] == 2 && buffer[17] == 8) {
// get image dimensions
//int w=(b2i(buffer[13])<<8) + b2i(buffer[12]);
int w = ((buffer[13] & 0xff) << 8) + (buffer[12] & 0xff);
//int h=(b2i(buffer[15])<<8) + b2i(buffer[14]);
int h = ((buffer[15] & 0xff) << 8) + (buffer[14] & 0xff);
// check if image has alpha
boolean hasAlpha=(buffer[16] == 32);
// check if it's a TGA and has 8bits/colour channel
if (buffer[2] == 2 && buffer[17] == 8) {
// get image dimensions
//int w=(b2i(buffer[13])<<8) + b2i(buffer[12]);
int w = ((buffer[13] & 0xff) << 8) + (buffer[12] & 0xff);
//int h=(b2i(buffer[15])<<8) + b2i(buffer[14]);
int h = ((buffer[15] & 0xff) << 8) + (buffer[14] & 0xff);
// check if image has alpha
boolean hasAlpha=(buffer[16] == 32);
// setup new image object
PImage img = new PImage(w,h);
img.format = (hasAlpha ? ARGB : RGB);
// setup new image object
PImage img = new PImage(w,h);
img.format = (hasAlpha ? ARGB : RGB);
// targa's are written upside down, so we need to parse it in reverse
int index = (h-1) * w;
// actual bitmap data starts at byte 18
int offset = 18;
// targa's are written upside down, so we need to parse it in reverse
int index = (h-1) * w;
// actual bitmap data starts at byte 18
int offset = 18;
// read out line by line
for (int y = h-1; y >= 0; y--) {
for (int x = 0; x < w; x++) {
img.pixels[index + x] =
(buffer[offset++] & 0xff) |
((buffer[offset++] & 0xff) << 8) |
((buffer[offset++] & 0xff) << 16) |
(hasAlpha ? ((buffer[offset++] & 0xff) << 24) : 0xff000000);
}
index -= w;
}
return img;
}
die("loadImage(): bad targa image format");
return null;
// read out line by line
for (int y = h-1; y >= 0; y--) {
for (int x = 0; x < w; x++) {
img.pixels[index + x] =
(buffer[offset++] & 0xff) |
((buffer[offset++] & 0xff) << 8) |
((buffer[offset++] & 0xff) << 16) |
(hasAlpha ? ((buffer[offset++] & 0xff) << 24) : 0xff000000);
}
index -= w;
}
return img;
}
die("loadImage(): bad targa image format");
return null;
}
@@ -4510,23 +4381,18 @@ v PApplet.this.stop();
}
public void modified() {
g.modified();
public void updatePixels() {
g.updatePixels();
}
public void modified(int x, int y) {
g.modified(x, y);
public void updatePixels(int x1, int y1, int x2, int y2) {
g.updatePixels(x1, y1, x2, y2);
}
public void modified(int x1, int y1, int x2, int y2) {
g.modified(x1, y1, x2, y2);
}
public void resetModified() {
g.resetModified();
public void pixelsUpdated() {
g.pixelsUpdated();
}
@@ -4778,6 +4644,12 @@ v PApplet.this.stop();
}
public void quad(float x1, float y1, float x2, float y2,
float x3, float y3, float x4, float y4) {
g.quad(x1, y1, x2, y2, x3, y3, x4, y4);
}
public void rectMode(int mode) {
g.rectMode(mode);
}
@@ -4788,12 +4660,6 @@ v PApplet.this.stop();
}
public void quad(float x1, float y1, float x2, float y2,
float x3, float y3, float x4, float y4) {
g.quad(x1, y1, x2, y2, x3, y3, x4, y4);
}
public void ellipseMode(int mode) {
g.ellipseMode(mode);
}
@@ -5001,11 +4867,6 @@ v PApplet.this.stop();
}
public void angleMode(int mode) {
g.angleMode(mode);
}
public void translate(float tx, float ty) {
g.translate(tx, ty);
}
@@ -5016,6 +4877,16 @@ v PApplet.this.stop();
}
public void angleMode(int mode) {
g.angleMode(mode);
}
public void rotate(float angle) {
g.rotate(angle);
}
public void rotateX(float angle) {
g.rotateX(angle);
}
@@ -5031,11 +4902,6 @@ v PApplet.this.stop();
}
public void rotate(float angle) {
g.rotate(angle);
}
public void rotate(float angle, float vx, float vy, float vz) {
g.rotate(angle, vx, vy, vz);
}
+44 -45
View File
@@ -279,6 +279,7 @@ public class PGraphics extends PImage implements PConstants {
resize(iwidth, iheight);
// init color/stroke/fill
// called instead just before setup on first frame
//defaults();
// clear geometry for loading later
@@ -744,12 +745,6 @@ public class PGraphics extends PImage implements PConstants {
}
//////////////////////////////////////////////////////////////
// LINE
public void line(float x1, float y1, float x2, float y2) {
// TODO
}
@@ -761,18 +756,18 @@ public class PGraphics extends PImage implements PConstants {
}
//////////////////////////////////////////////////////////////
// TRIANGLE
public void triangle(float x1, float y1, float x2, float y2,
float x3, float y3) {
// TODO
}
public void quad(float x1, float y1, float x2, float y2,
float x3, float y3, float x4, float y4) {
// TODO
}
//////////////////////////////////////////////////////////////
@@ -809,19 +804,12 @@ public class PGraphics extends PImage implements PConstants {
y1 -= vradius;
}
// TODO write rect drawing function
draw_rect(x1, y1, x2, y2);
}
//////////////////////////////////////////////////////////////
// QUAD
public void quad(float x1, float y1, float x2, float y2,
float x3, float y3, float x4, float y4) {
// TODO
protected void draw_rect(float x1, float y1, float x2, float y2) {
// TODO write rect drawing function
}
@@ -857,6 +845,11 @@ public class PGraphics extends PImage implements PConstants {
y = b - d/2f;
}
draw_ellipse(x, y, w, h);
}
protected void draw_ellipse(float x, float y, float w, float h) {
// TODO draw an ellipse
}
@@ -900,7 +893,12 @@ public class PGraphics extends PImage implements PConstants {
while (stop < start) stop += TWO_PI;
}
// TODO draw an arc
draw_arc(start, stop, x, y, w, h);
}
protected void draw_arc(float start, float stop,
float x, float y, float w, float h) {
}
@@ -1407,7 +1405,7 @@ public class PGraphics extends PImage implements PConstants {
textFont.resetLeading();
} else {
System.err.println("Ignoring improperly loaded font in textFont()");
throw new RuntimeException("a null PFont was passed to textFont()");
}
}
@@ -1424,7 +1422,7 @@ public class PGraphics extends PImage implements PConstants {
textSize = size;
} else {
System.err.println("First set a font before setting its size.");
throw new RuntimeException("use textFont() before textSize()");
}
}
@@ -1434,7 +1432,7 @@ public class PGraphics extends PImage implements PConstants {
textFont.leading(leading);
} else {
System.err.println("First set a font before setting its leading.");
throw new RuntimeException("use textFont() before textLeading()");
}
}
@@ -1444,7 +1442,7 @@ public class PGraphics extends PImage implements PConstants {
textFont.align(mode);
} else {
System.err.println("First set a font before setting its mode.");
throw new RuntimeException("use textFont() before textMode()");
}
}
@@ -1454,7 +1452,7 @@ public class PGraphics extends PImage implements PConstants {
textFont.space(space);
} else {
System.err.println("First set a font before setting the space.");
throw new RuntimeException("use textFont() before textSpace()");
}
}
@@ -1464,7 +1462,7 @@ public class PGraphics extends PImage implements PConstants {
textFont.text(c, x, y, this);
} else {
System.err.println("text(): first set a font before drawing text");
throw new RuntimeException("use textFont() before text()");
}
}
@@ -1479,7 +1477,7 @@ public class PGraphics extends PImage implements PConstants {
textFont.text(s, x, y, this);
} else {
System.err.println("text(): first set a font before drawing text");
throw new RuntimeException("use textFont() before text()");
}
}
@@ -1521,7 +1519,7 @@ public class PGraphics extends PImage implements PConstants {
textFont.text(s, x1, y1, x2, y2, this);
} else {
System.err.println("text(): first set a font before drawing text");
throw new RuntimeException("use textFont() before text()");
}
}
@@ -1564,11 +1562,6 @@ public class PGraphics extends PImage implements PConstants {
// MATRIX TRANSFORMATIONS
public void angleMode(int mode) {
angleMode = mode;
}
public void translate(float tx, float ty) {
m02 += tx*m00 + ty*m01 + m02;
m12 += tx*m10 + ty*m11 + m12;
@@ -1579,16 +1572,9 @@ public class PGraphics extends PImage implements PConstants {
// not supported in 2D
}
public void rotateX(float angle) {
// not supported in 2D
}
public void rotateY(float angle) {
// not supported in 2D
}
public void rotateZ(float angle) {
// not supported in 2D
public void angleMode(int mode) {
angleMode = mode;
}
@@ -1605,6 +1591,19 @@ public class PGraphics extends PImage implements PConstants {
}
public void rotateX(float angle) {
// not supported in 2D
}
public void rotateY(float angle) {
// not supported in 2D
}
public void rotateZ(float angle) {
// not supported in 2D
}
public void rotate(float angle, float vx, float vy, float vz) {
// not supported in 2D
}
+7 -6
View File
@@ -561,20 +561,21 @@ public class PGraphics2 extends PGraphics {
if (who.cache == null) {
who.cache = new BufferedImage(who.width, who.height,
BufferedImage.TYPE_INT_ARGB);
who.modified(); // mark the whole thing for update
who.updatePixels(); // mark the whole thing for update
}
if (who.modified) {
// update the sub-portion of the image as necessary
BufferedImage bi = (BufferedImage) who.cache;
bi.setRGB(who.mx1, who.my1,
who.mx2 - who.mx1 + 1,
who.my2 - who.my1 + 1,
bi.setRGB(who.mx1,
who.my1,
who.mx2 - who.mx1,
who.my2 - who.my1,
who.pixels,
who.my1*who.width + who.mx1, // offset for copy
who.width); // scan size
who.resetModified();
who.pixelsUpdated();
}
}
@@ -843,7 +844,7 @@ public class PGraphics2 extends PGraphics {
public void copy(PImage src, int dx, int dy) {
// TODO if this image is not RGB, needs to behave differently
// TODO if this image is not ARGB or RGB, needs to behave differently
// (if it's gray, need to copy gray pixels)
// for alpha, just leave it be.. copy() doesn't composite
((BufferedImage) image).setRGB(dx, dy, src.width, src.height,
+155 -50
View File
@@ -4,7 +4,7 @@
PGraphics - main graphics and rendering context
Part of the Processing project - http://processing.org
Copyright (c) 2004- Ben Fry and Casey Reas
Copyright (c) 2004-05 Ben Fry and Casey Reas
Copyright (c) 2001-04 Massachusetts Institute of Technology
This library is free software; you can redistribute it and/or
@@ -25,11 +25,9 @@
package processing.core;
//import java.applet.*;
import java.awt.*;
//import java.awt.event.*;
import java.awt.image.*;
//import java.io.*;
public class PGraphics3 extends PGraphics {
@@ -207,7 +205,7 @@ public class PGraphics3 extends PGraphics {
allocate();
// clear the screen with the old background color
background(backgroundColor);
//background(backgroundColor);
// init perspective projection based on new dimensions
cameraFOV = 60; // at least for now
@@ -246,7 +244,9 @@ public class PGraphics3 extends PGraphics {
// because of a java 1.1 bug, pixels must be registered as
// opaque before their first run, the memimgsrc will flicker
// and run very slowly.
for (int i = 0; i < pixelCount; i++) pixels[i] = 0xffffffff;
backgroundColor |= 0xff000000; // just for good measure
for (int i = 0; i < pixelCount; i++) pixels[i] = backgroundColor;
//for (int i = 0; i < pixelCount; i++) pixels[i] = 0xffffffff;
cm = new DirectColorModel(32, 0x00ff0000, 0x0000ff00, 0x000000ff);;
mis = new MemoryImageSource(width, height, pixels, 0, width);
@@ -254,7 +254,6 @@ public class PGraphics3 extends PGraphics {
mis.setAnimated(true);
image = Toolkit.getDefaultToolkit().createImage(mis);
// TODO don't allocate these until depth() is called
zbuffer = new float[pixelCount];
stencil = new int[pixelCount];
@@ -266,6 +265,9 @@ public class PGraphics3 extends PGraphics {
public void defaults() {
super.defaults();
cameraMode(PERSPECTIVE);
//System.out.println("PGraphics3.defaults()");
// easiest for beginners
textureMode(IMAGE_SPACE);
@@ -1394,6 +1396,24 @@ public class PGraphics3 extends PGraphics {
}
//////////////////////////////////////////////////////////////
// BASIC SHAPES
public void point(float x, float y) {
point(x, y, 0);
}
public void point(float x, float y, float z) {
beginShape(POINTS);
vertex(x, y, z);
endShape();
}
/*
private void point3(float x, float y, float z, int color) {
// need to get scaled version of the stroke
float x1 = screenX(x - 0.5f, y - 0.5f, z);
@@ -1414,59 +1434,145 @@ public class PGraphics3 extends PGraphics {
// these will be
}
}
*/
//////////////////////////////////////////////////////////////
// SHAPES
public void point(float x, float y) {
point(x, y, 0);
}
public void point(float x, float y, float z) {
}
public void line(float x1, float y1, float x2, float y2) {
line(x1, y1, 0, x2, y2, 0);
}
public void line(float x1, float y1, float z1,
float x2, float y2, float z2) {
beginShape(LINES);
vertex(x1, y1, z1);
vertex(x2, y2, z2);
endShape();
}
public void triangle(float x1, float y1, float x2, float y2,
float x3, float y3) {
beginShape(TRIANGLES);
vertex(x1, y1);
vertex(x2, y2);
vertex(x3, y3);
endShape();
}
//public void rectMode(int mode)
public void rect(float x1, float y1, float x2, float y2) {
}
public void quad(float x1, float y1, float x2, float y2,
float x3, float y3, float x4, float y4) {
beginShape(QUADS);
vertex(x1, y1);
vertex(x2, y2);
vertex(x3, y3);
vertex(x4, y4);
endShape();
}
public void circle(float x, float y, float radius) {
//////////////////////////////////////////////////////////////
// PLACED SHAPES
public void draw_rect(float x1, float y1, float x2, float y2) {
quad(x1, y1, x2, y1, x2, y2, x1, y2);
}
public void ellipseMode(int mode) {
protected void draw_ellipse(float x, float y, float hradius, float vradius) {
// adapt accuracy to radii used w/ a minimum of 4 segments [toxi]
// now uses current scale factors to determine "real" transformed radius
//int cAccuracy = (int)(4+Math.sqrt(hradius*abs(m00)+vradius*abs(m11))*2);
//int cAccuracy = (int)(4+Math.sqrt(hradius+vradius)*2);
// notched this up to *3 instead of *2 because things were
// looking a little rough, i.e. the calculate->arctangent example [fry]
// also removed the m00 and m11 because those were causing weirdness
// need an actual measure of magnitude in there [fry]
int cAccuracy = (int)(4+Math.sqrt(hradius+vradius)*3);
// [toxi031031] adapted to use new lookup tables
float inc = (float)SINCOS_LENGTH / cAccuracy;
float val = 0;
beginShape(POLYGON);
for (int i = 0; i < cAccuracy; i++) {
vertex(x + cosLUT[(int) val] * hradius,
y + sinLUT[(int) val] * vradius);
val += inc;
}
endShape();
}
public void ellipse(float x, float y, float hradius, float vradius) {
/**
* Start and stop are in radians, converted by the parent function.
* Note that the radians can be greater (or less) than TWO_PI.
* This is so that an arc can be drawn that crosses zero mark,
* and the user will still collect $200.
*/
protected void draw_arc(float start, float stop,
float x, float y, float w, float h) {
float hr = w / 2f;
float vr = h / 2f;
if (fill) {
// shut off stroke for a minute
boolean savedStroke = stroke;
stroke = false;
int startLUT = (int) (0.5f + (start / TWO_PI) * SINCOS_LENGTH);
int stopLUT = (int) (0.5f + (stop / TWO_PI) * SINCOS_LENGTH);
beginShape(TRIANGLE_FAN);
vertex(x, y);
int increment = 1; // what's a good algorithm? stopLUT - startLUT;
for (int i = startLUT; i < stopLUT; i += increment) {
int ii = i % SINCOS_LENGTH;
vertex(x + cosLUT[ii] * hr,
y + sinLUT[ii] * vr);
}
// draw last point explicitly for accuracy
vertex(x + cosLUT[stopLUT % SINCOS_LENGTH] * hr,
y + sinLUT[stopLUT % SINCOS_LENGTH] * vr);
endShape();
stroke = savedStroke;
}
if (stroke) {
// Almost identical to above, but this uses a LINE_STRIP
// and doesn't include the first (center) vertex.
boolean savedFill = fill;
fill = false;
int startLUT = (int) (0.5f + (start / TWO_PI) * SINCOS_LENGTH);
int stopLUT = (int) (0.5f + (stop / TWO_PI) * SINCOS_LENGTH);
beginShape(LINE_STRIP);
int increment = 1; // what's a good algorithm? stopLUT - startLUT;
for (int i = startLUT; i < stopLUT; i += increment) {
int ii = i % SINCOS_LENGTH;
vertex(x + cosLUT[ii] * hr,
y + sinLUT[ii] * vr);
}
// draw last point explicitly for accuracy
vertex(x + cosLUT[stopLUT % SINCOS_LENGTH] * hr,
y + sinLUT[stopLUT % SINCOS_LENGTH] * vr);
endShape();
fill = savedFill;
}
}
//public void arcMode(int mode)
public void arc(float start, float stop,
float x, float y, float radius) {
}
public void arc(float start, float stop,
float x, float y, float hr, float vr) {
}
//////////////////////////////////////////////////////////////
@@ -1493,12 +1599,7 @@ public class PGraphics3 extends PGraphics {
// 3D BOX
// solid or wire depends on settings for stroke and fill
// slices/stacks can be set by an advanced option
//public void cube(float size) {
public void box(float size) {
//box(-size/2, -size/2, -size/2, size/2, size/2, size/2);
box(size, size, size);
}
@@ -1506,15 +1607,14 @@ public class PGraphics3 extends PGraphics {
// OPT this isn't the least bit efficient
// because it redraws lines along the vertices
// ugly ugly ugly!
//public void box(float x1, float y1, float z1,
// float x2, float y2, float z2) {
public void box(float w, float h, float d) {
float x1 = -w/2f; float x2 = w/2f;
float y1 = -h/2f; float y2 = h/2f;
float z1 = -d/2f; float z2 = d/2f;
//if (hints[NEW_GRAPHICS]) triangle.setCulling(true);
triangle.setCulling(true);
if (triangle != null) { // triangle is null in gl
triangle.setCulling(true);
}
beginShape(QUADS);
@@ -1556,8 +1656,9 @@ public class PGraphics3 extends PGraphics {
endShape();
//if (hints[NEW_GRAPHICS]) triangle.setCulling(false);
triangle.setCulling(false);
if (triangle != null) { // triangle is null in gl
triangle.setCulling(false);
}
}
@@ -1637,8 +1738,9 @@ public class PGraphics3 extends PGraphics {
if (x!=0f && y!=0f && z!=0f) translate(x,y,z);
scale(r);
//if (hints[NEW_GRAPHICS]) triangle.setCulling(true);
triangle.setCulling(true);
if (triangle != null) { // triangle is null in gl
triangle.setCulling(true);
}
// 1st ring from south pole
beginShape(TRIANGLE_STRIP);
@@ -1681,8 +1783,9 @@ public class PGraphics3 extends PGraphics {
endShape();
pop();
//if (hints[NEW_GRAPHICS]) triangle.setCulling(false);
triangle.setCulling(false);
if (triangle != null) { // triangle is null in gl
triangle.setCulling(false);
}
}
@@ -2236,6 +2339,8 @@ public class PGraphics3 extends PGraphics {
* even if noDepth() was called before draw() exited.
*/
public void clear() {
//System.out.println("PGraphics3.clear(" +
// PApplet.hex(backgroundColor) + ")");
for (int i = 0; i < pixelCount; i++) {
pixels[i] = backgroundColor;
zbuffer[i] = MAX_FLOAT;
+134 -42
View File
@@ -4,7 +4,7 @@
PImage - storage class for pixel data
Part of the Processing project - http://Proce55ing.net
Copyright (c) 2001-03
Copyright (c) 2001-05
Ben Fry, Massachusetts Institute of Technology and
Casey Reas, Interaction Design Institute Ivrea
@@ -28,6 +28,7 @@ package processing.core;
import java.awt.*;
import java.awt.image.*;
import java.lang.reflect.*;
import java.io.*;
@@ -84,6 +85,9 @@ public class PImage implements PConstants, Cloneable {
public int imageMode = CORNER;
public boolean smooth = false;
/** native storage for java 1.3 image object */
//public Object image;
/** for subclasses that need to store info about the image */
public Object cache;
@@ -186,10 +190,15 @@ public class PImage implements PConstants, Cloneable {
/**
* mode is one of CORNERS, CORNER, CENTER
* mode is one of CORNERS or CORNER, because the others are
* just too weird for the other functions
*/
public void imageMode(int mode) {
imageMode = mode;
if ((imageMode == CORNER) || (imageMode == CORNERS)) {
imageMode = mode;
} else {
throw new RuntimeException("imageMode() only works with CORNER or CORNERS");
}
}
@@ -216,41 +225,124 @@ public class PImage implements PConstants, Cloneable {
// MARKING IMAGE AS MODIFIED / FOR USE w/ GET/SET
public void modified() {
mx1 = 0;
my1 = 0;
mx2 = width - 1;
my2 = height - 1;
modified = true;
/*
public int[] loadPixels() {
return getPixels(0, 0, width, height);
}
*/
/**
* Note that when using imageMode(CORNERS),
* the x2 and y2 positions are non-inclusive.
*/
/*
public int[] loadPixels(int x1, int y1, int x2, int y2) {
if (modified) {
// have to set the modified region to include the min/max
// of the coordinates coming in.
// also, mustn't get the pixels for the section that's
// already been marked as modified. gah.
// too complicated, just throw an error
String msg =
"getPixels(x, y, w, h) cannot be used multiple times. " +
"Use getPixels() once to get the entire image instead.";
throw new RuntimeException(msg);
}
if (imageMode == CORNER) { // x2, y2 are w/h
x2 += x1;
y2 += y1;
}
if (pixels == null) { // this is a java 1.3 buffered image
if (image == null) { // this is just an error
throw new RuntimeException("PImage not properly setup for getPixels()");
} else {
pixels = new int[width*height];
}
}
if (image == null) {
// this happens when using just the 1.1 library
// no need to do anything, since the pixels have already been grabbed
} else {
// copy the contents of the buffered image to pixels[]
//((BufferedImage) image).getRGB(x, y, w, h, output.pixels, 0, width);
try {
//System.out.println("running getrgb...");
Class bufferedImageClass =
Class.forName("java.awt.image.BufferedImage");
// getRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize)
Method getRgbMethod =
bufferedImageClass.getMethod("getRGB", new Class[] {
Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE,
int[].class, Integer.TYPE, Integer.TYPE
});
getRgbMethod.invoke(image, new Object[] {
new Integer(x1), new Integer(y1),
new Integer(x2 - x1 + 1), new Integer(y2 - y1 + 1),
pixels, new Integer(0), new Integer(width)
});
} catch (Exception e) {
e.printStackTrace();
}
}
return pixels; // just to be nice
}
*/
/**
* Mark all pixels as needing update.
*/
public void updatePixels() {
updatePixels(0, 0, width, height);
}
public void modified(int x, int y) {
if (x < mx1) mx1 = x;
if (x > mx2) mx2 = x;
if (y < my1) my1 = y;
if (y > my2) my2 = y;
modified = true;
/**
* Note that when using imageMode(CORNERS),
* the x2 and y2 positions are non-inclusive.
*/
public void updatePixels(int x1, int y1, int x2, int y2) {
//if (!modified) { // could just set directly, but..
//}
if (imageMode == CORNER) { // x2, y2 are w/h
x2 += x1;
y2 += y1;
}
if (!modified) {
mx1 = x1;
mx2 = x2;
my1 = y1;
my2 = y2;
modified = true;
} else {
if (x1 < mx1) mx1 = x1;
if (x1 > mx2) mx2 = x1;
if (y1 < my1) my1 = y1;
if (y1 > my2) my2 = y1;
if (x2 < mx1) mx1 = x2;
if (x2 > mx2) mx2 = x2;
if (y2 < my1) my1 = y2;
if (y2 > my2) my2 = y2;
}
}
public void modified(int x1, int y1, int x2, int y2) {
if (x1 < mx1) mx1 = x1;
if (x1 > mx2) mx2 = x1;
if (y1 < my1) my1 = y1;
if (y1 > my2) my2 = y1;
if (x2 < mx1) mx1 = x2;
if (x2 > mx2) mx2 = x2;
if (y2 < my1) my1 = y2;
if (y2 > my2) my2 = y2;
modified = true;
}
public void resetModified() {
mx1 = -Integer.MAX_VALUE;
my1 = -Integer.MAX_VALUE;
mx2 = Integer.MAX_VALUE;
my2 = Integer.MAX_VALUE;
public void pixelsUpdated() {
//mx1 = Integer.MAX_VALUE;
//my1 = Integer.MAX_VALUE;
//mx2 = -Integer.MAX_VALUE;
//my2 = -Integer.MAX_VALUE;
modified = false;
}
@@ -283,10 +375,10 @@ public class PImage implements PConstants, Cloneable {
w = (w - x);
h = (h - x);
} else if (imageMode == CENTER) {
//} else if (imageMode == CENTER) {
// w/h are the proper w/h, but x/y need to be moved
x -= w/2;
y -= h/2;
//x -= w/2;
//y -= h/2;
}
if (x < 0) x = 0;
@@ -506,9 +598,9 @@ public class PImage implements PConstants, Cloneable {
sx2 += sx1; sy2 += sy1;
dx2 += dx1; dy2 += dy1;
} else if (imageMode == CENTER) {
sx2 /= 2f; sy2 /= 2f;
dx2 /= 2f; dy2 /= 2f;
//} else if (imageMode == CENTER) {
//sx2 /= 2f; sy2 /= 2f;
//dx2 /= 2f; dy2 /= 2f;
}
if ((src == this) &&
@@ -585,9 +677,9 @@ public class PImage implements PConstants, Cloneable {
sx2 += sx1; sy2 += sy1;
dx2 += dx1; dy2 += dy1;
} else if (imageMode == CENTER) {
sx2 /= 2f; sy2 /= 2f;
dx2 /= 2f; dy2 /= 2f;
//} else if (imageMode == CENTER) {
//sx2 /= 2f; sy2 /= 2f;
//dx2 /= 2f; dy2 /= 2f;
}
if ((src == this) &&
+19 -10
View File
@@ -140,27 +140,36 @@ public interface PMethods {
public void triangle(float x1, float y1, float x2, float y2,
float x3, float y3);
public void quad(float x1, float y1, float x2, float y2,
float x3, float y3, float x4, float y4);
//
public void rectMode(int mode);
public void rect(float x1, float y1, float x2, float y2);
public void quad(float x1, float y1, float x2, float y2,
float x3, float y3, float x4, float y4);
//protected void draw_rect(float x1, float y1, float x2, float y2);
//public void circle(float x, float y, float radius);
// REMOVED public void circle(float x, float y, float radius);
public void ellipseMode(int mode);
public void ellipse(float x, float y, float hradius, float vradius);
//public void arcMode(int mode);
//protected void draw_ellipse(float x, float y, float hradius, float vradius);
//public void arc(float start, float stop,
// float x, float y, float radius);
// REMOVED public void arcMode(int mode);
// REMOVED public void arc(float start, float stop,
// float x, float y, float radius);
public void arc(float start, float stop,
float x, float y, float hr, float vr);
//protected void draw_arc(float start, float stop,
// float x, float y, float hr, float vr);
//
public void box(float size);
@@ -263,20 +272,20 @@ public interface PMethods {
//
public void angleMode(int mode);
public void translate(float tx, float ty);
public void translate(float tx, float ty, float tz);
public void angleMode(int mode);
public void rotate(float angle);
public void rotateX(float angle);
public void rotateY(float angle);
public void rotateZ(float angle);
public void rotate(float angle);
public void rotate(float angle, float v0, float v1, float v2);
public void scale(float s);
+73 -10
View File
@@ -29,11 +29,71 @@ o saveFrame gets called at the beginning of loop()
o or is just a message to save the next frame (problem for anim)
X vertices max out at 512.. make it grow
X add gzipInput and gzipOutput
X light(x, y, z, c1, c2, c3, TYPE)
X also BLight with same constructor, and on() and off() fxn
image stuff
o could also do PImage2, which would need a getPixels() before messing w/ it
o bad idea, distinction not clear
o even in java 1.1, could use regular java.awt.Image and require getPixels()
o -> 1.1 wouldn't help anything, because needs pixels to render, oops
api changes
X removed circle.. it's dumb when ellipse() is in there
X (it's not like we have square() in the api)
X arcMode is gone.. just uses ellipseMode()
X save tga and tif methods are static and public
X imageMode(CORNER) and CORNERS are the only usable versions
_ sphere x,y,z,r or box w,h,d.. need to make them consistent
_ the updatePixels() in PGraphics has to be overridden (from PImage)
_ to make itself actually update on-screen
_ actually, should be no different than the check_image function
_ PGraphics2 and PGraphicsGL will need loadPixels() to be called
_ in order to read pixels from the buffer
_ loadPixels() and updatePixels() prolly should be shut off in opengl
_ make people use get() instead to grab sub-images
_ PGraphicsGL.copy() needs to be overridden.. use glDrawBitmap
o loadImage() needs to handle 1.1 vs 1.3 loading
o set image.format to be BUFFERED? no.. just use RGBA always
o have a flag to always use the cache, i.e. with BufferedImage
o turn that off when someone modifies it (nope, no need to)
X PImage.getPixels(), updatePixels(), updatePixels(x, y, w, h),
o PImage.setPixels(int another[]);
readPixels/writePixels?
has to happen, since this is so fundamental to gl as well
loadImage in 1.3 leaves pixels[] null (not in 1.1)
1.3 plus gl is a problem, since conflicting caches
gl has no need for a bufferedimage tho
so maybe checks to see if the cache is a BufferedImage
if it is, calls getPixels to set the int array
then replaces cache with glimageache
pappletgl loadimage could take care of this instead
calls super.loadImage(), if cache != null, proceed..
this is prolly a mess
PImage.getPixels() and PImage.getPixels(x, y, w, h) ->
(the xywh version still allocates the entire array, but only updates those)
only needed for java2d
not (necessarily) needed when loading images,
but definitely needed when setting pixels on PGraphics
PImage.updatePixels() and PImage.updatePixels(x, y, w, h)
(this is actually just setModified)
in opengl, marks all or some as modified
so next time it's drawn, the texture is updated PGraphicsGL.image()
in java2d, updates the BufferedImage on next draw
can't use regular getPixels() on PGraphics, because its image isn't 'cache'
also, the cache may be used to draw the whole surface as a gl texture (?)
not a problem for the main PGraphics, but for any others created to draw on
_ imageMode(CENTER) is weird for copy() and updatePixels()
_ perhaps copy() and get() ignore imageMode and use xywh or x1y1x2y2?
_ or disallow imageMode(CENTER) altogether?
_ in java 1.3, getPixels() can call getRGB() via reflection
_ cache.getClass().getName().equals("BufferedImage")
_ beginShape()
_ don't allow you to draw stroked items unless stroke() is called
@@ -50,32 +110,35 @@ _ get regular graphics engine working again
_ smooth is no longer working
_ ellipses aren't handled
_ look for size() method to determine default size of applet
_ (same as applet exporter function)
_ when using core graphics, don't show applet frame until first frame
_ (in opengl, open frame early, make sure this isn't inhibited)
_ default to single byte input from serial port
_ and add serial.setBuffer() for message length as alternative
_ or serial.setDelimiter() to fire message on delim
_ move textMode and textSpace back out of PFont
_ use die() to fail in font situations
_ can't, just use a RuntimeException
_ die() may need to throw a RuntimeException
_ light(x, y, z, c1, c2, c3, TYPE)
_ also BLight with same constructor, and on() and off() fxn
_ make light() functions actually do something in PGraphicsGL
_ make lights half do something in PGraphics3 too
_ bring in materials for opengl as well?
_ don't include a class, just make it similar to the light functions
_ be consistent about getXxx() methods
//
_ on start, mouseX is 0.. how to avoid?
_ use firstMouse variable.. figure out naming
//
_ basic sample audio playback needed for p5
_ make separate java 1.1 and java 1.3 classes
_ on start, mouseX is 0.. how to avoid?
_ use firstMouse variable.. figure out naming
_ microphone input for java 1.3
_ this may be reason to move sound classes out into a lib?
_ or maybe just microphone goes into its own library?
_ image loading bug is huge
_ figure out how to handle cached images, multiple images