From e58835dc23a9c45478cb452ebab5ad0e15d549cc Mon Sep 17 00:00:00 2001 From: benfry Date: Tue, 21 Dec 2004 05:20:30 +0000 Subject: [PATCH] got textures with alpha/rgb working with gl.. changed to ARGB instead of RGBA for constant --- processing/app/PdeRuntime.java | 3 +- processing/core/PApplet.java | 8 ++--- processing/core/PConstants.java | 2 +- processing/core/PFont.java | 8 +++-- processing/core/PGraphics.java | 10 +++--- processing/core/PImage.java | 64 ++++++++++++++++++++++++--------- processing/core/PPolygon.java | 38 ++++++++++---------- processing/core/PTriangle.java | 2 +- processing/core/todo.txt | 9 ++++- processing/todo.txt | 2 ++ 10 files changed, 94 insertions(+), 52 deletions(-) diff --git a/processing/app/PdeRuntime.java b/processing/app/PdeRuntime.java index 3d2361f35..88e500a58 100644 --- a/processing/app/PdeRuntime.java +++ b/processing/app/PdeRuntime.java @@ -374,6 +374,7 @@ public class PdeRuntime implements PdeMessageConsumer { // this is PApplet sending a message (via System.out.println) // that signals that the applet has been quit. if (s.indexOf(PApplet.EXTERNAL_QUIT) == 0) { + System.out.println("external: quit"); editor.doClose(); return; } @@ -386,7 +387,7 @@ public class PdeRuntime implements PdeMessageConsumer { int left = Integer.parseInt(nums.substring(0, space)); int top = Integer.parseInt(nums.substring(space + 1)); editor.appletLocation = new Point(left, top); - //System.out.println("wanna move to " + left + " " + top); + System.out.println("external: move to " + left + " " + top); return; } diff --git a/processing/core/PApplet.java b/processing/core/PApplet.java index 03be9bc84..94b032c5d 100644 --- a/processing/core/PApplet.java +++ b/processing/core/PApplet.java @@ -1373,7 +1373,7 @@ public class PApplet extends Applet if (invisible_cursor == null) { //invisible_cursor = new PImage(new int[32*32], 32, 32, RGBA); - invisible_cursor = new PImage(new int[16*16], 16, 16, RGBA); + invisible_cursor = new PImage(new int[16*16], 16, 16, ARGB); } // was formerly 16x16, but the 0x0 was added by jdf as a fix // for macosx, which didn't wasn't honoring the invisible cursor @@ -2027,7 +2027,7 @@ public class PApplet extends Applet // 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, RGBA); + return new PImage(jpixels, jwidth, jheight, ARGB); //format = RGBA; //break; } @@ -2059,7 +2059,7 @@ public class PApplet extends Applet // setup new image object PImage img = new PImage(w,h); - img.format = (hasAlpha ? RGBA : RGB); + img.format = (hasAlpha ? ARGB : RGB); // targa's are written upside down, so we need to parse it in reverse int index = (h-1) * w; @@ -4101,7 +4101,7 @@ public class PApplet extends Applet Frame frame = new Frame(); frame.setResizable(false); // remove the grow box frame.pack(); // get insets. get more. - frame.show(); // gl hack + //frame.show(); // gl hack Class c = Class.forName(name); PApplet applet = (PApplet) c.newInstance(); applet.frame = frame; diff --git a/processing/core/PConstants.java b/processing/core/PConstants.java index 42c7bc4b4..97f2b766f 100644 --- a/processing/core/PConstants.java +++ b/processing/core/PConstants.java @@ -68,7 +68,7 @@ public interface PConstants { // for colors and/or images static final int RGB = 1; // image & color - static final int RGBA = 2; // image + static final int ARGB = 2; // image static final int HSB = 3; // color static final int ALPHA = 4; // image diff --git a/processing/core/PFont.java b/processing/core/PFont.java index fc8741cc1..906fa2625 100644 --- a/processing/core/PFont.java +++ b/processing/core/PFont.java @@ -195,9 +195,11 @@ public class PFont implements PConstants { //images[i].pixels[y * twidth + x] = valu; images[i].pixels[y * twidth + x] = - (valu << 24) | 0xFFFFFF; - //0xFFFFFF00 | valu; - //(valu << 24) | (valu << 16) | (valu << 8) | valu; + valu; + //(valu << 24) | 0xFFFFFF; // windows + //0xFFFFFF00 | valu; // macosx + + //(valu << 24) | (valu << 16) | (valu << 8) | valu; //0x8040ff40; //(valu << 24) | (valu << 16) | (valu << 8) | valu; //System.out.print((images[i].pixels[y*64+x] > 128) ? "*" : "."); diff --git a/processing/core/PGraphics.java b/processing/core/PGraphics.java index 786fabf4e..d960d2288 100644 --- a/processing/core/PGraphics.java +++ b/processing/core/PGraphics.java @@ -1855,7 +1855,7 @@ public class PGraphics extends PImage implements PMethods, PConstants { private void thick_point(float x, float y, float z, // note floats float r, float g, float b, float a) { spolygon.reset(4); - spolygon.interpRGBA = false; // no changes for vertices of a point + spolygon.interpARGB = false; // no changes for vertices of a point float strokeWidth2 = strokeWeight/2.0f; @@ -1915,7 +1915,7 @@ public class PGraphics extends PImage implements PMethods, PConstants { float r1, float g1, float b1, float a1, float ox2, float oy2, float r2, float g2, float b2, float a2) { - spolygon.interpRGBA = (r1 != r2) || (g1 != g2) || (b1 != b2) || (a1 != a2); + spolygon.interpARGB = (r1 != r2) || (g1 != g2) || (b1 != b2) || (a1 != a2); spolygon.interpZ = false; float dX = ox2-ox1 + EPSILON; @@ -1974,7 +1974,7 @@ public class PGraphics extends PImage implements PMethods, PConstants { float r1, float g1, float b1, float x2, float y2, float z2, float r2, float g2, float b2) { - spolygon.interpRGBA = (r1 != r2) || (g1 != g2) || (b1 != b2); + spolygon.interpARGB = (r1 != r2) || (g1 != g2) || (b1 != b2); spolygon.interpZ = true; float ox1 = x1; float oy1 = y1; float oz1 = z1; @@ -2465,7 +2465,7 @@ public class PGraphics extends PImage implements PMethods, PConstants { int source = iy1 * image.width + ix1; int target = sy1 * width; - if (image.format == RGBA) { + if (image.format == ARGB) { for (int y = sy1; y < sy2; y++) { int tx = 0; @@ -4893,7 +4893,7 @@ public class PGraphics extends PImage implements PMethods, PConstants { "as your application"); return; } - if ((image.format != RGB) && (image.format != RGBA)) { + if ((image.format != RGB) && (image.format != ARGB)) { System.err.println("background images should be RGB or RGBA"); return; } diff --git a/processing/core/PImage.java b/processing/core/PImage.java index c62568997..4c8c73865 100644 --- a/processing/core/PImage.java +++ b/processing/core/PImage.java @@ -70,7 +70,7 @@ import java.io.*; public class PImage implements PConstants, Cloneable { /** - * Format for this image, one of RGB, RGBA or ALPHA. + * Format for this image, one of RGB, ARGB or ALPHA. * note that RGB images still require 0xff in the high byte * because of how they'll be manipulated by other functions */ @@ -121,7 +121,7 @@ public class PImage implements PConstants, Cloneable { */ public PImage(int width, int height) { init(width, height, RGB); - //this(new int[width * height], width, height, RGBA); + //this(new int[width * height], width, height, ARGB); // toxi: is it maybe better to init the image with max alpha enabled? //for(int i=0; i twidth) || (height2 > theight)) { - // either twidth/theight are zero, or size has changed - tpixels = null; - } - if (tpixels == null) { - twidth = width2; - theight = height2; - tpixels = new int[twidth * theight]; - } - // copy image data into the texture - int p = 0; - int t = 0; - for (int y = 0; y < height; y++) { + */ + if ((width2 > twidth) || (height2 > theight)) { + // either twidth/theight are zero, or size has changed + tpixels = null; + } + if (tpixels == null) { + twidth = width2; + theight = height2; + tpixels = new int[twidth * theight]; + } + // copy image data into the texture + int p = 0; + int t = 0; + for (int y = 0; y < height; y++) { + switch (format) { + case ALPHA: + for (int x = 0; x < width; x++) { + tpixels[t++] = 0xFFFFFF00 | pixels[p++]; + } + t += twidth - width; + break; + + case RGB: + for (int x = 0; x < width; x++) { + int pixel = pixels[p++]; + tpixels[t++] = (pixel << 8) | 0xff; + } + t += twidth - width; + /* System.arraycopy(pixels, p, tpixels, t, width); p += width; t += twidth; + */ + break; + + case ARGB: + for (int x = 0; x < width; x++) { + int pixel = pixels[p++]; + //tpixels[t++] = 0x80808080; + tpixels[t++] = (pixel << 8) | ((pixel >> 24) & 0xff); + //tpixels[t++] = 0xFFFFFF00 | pixels[p++]; + } + t += twidth - width; + break; } } + //} } @@ -233,7 +263,7 @@ public class PImage implements PConstants, Cloneable { (image.pixels[i] & 0xffffff); } /* - if (highbits) { // grab alpha from the high 8 bits (RGBA style) + if (highbits) { // grab alpha from the high 8 bits (ARGB style) for (int i = 0; i < pixels.length; i++) { pixels[i] = pixels[i] & 0xffffff | (alpha[i] & 0xff000000); } @@ -243,7 +273,7 @@ public class PImage implements PConstants, Cloneable { } } */ - image.format = RGBA; + image.format = ARGB; } diff --git a/processing/core/PPolygon.java b/processing/core/PPolygon.java index 4ba805d6c..2751f5e0d 100644 --- a/processing/core/PPolygon.java +++ b/processing/core/PPolygon.java @@ -49,7 +49,7 @@ public class PPolygon implements PConstants { boolean interpX; boolean interpZ; boolean interpUV; // is this necessary? could just check timage != null - boolean interpRGBA; + boolean interpARGB; int rgba; int r2, g2, b2, a2, a2orig; @@ -108,7 +108,7 @@ public class PPolygon implements PConstants { interpX = true; interpZ = true; interpUV = false; - interpRGBA = true; + interpARGB = true; timage = null; } @@ -190,7 +190,7 @@ public class PPolygon implements PConstants { width1 = width - 1; height1 = height - 1; - if (!interpRGBA) { + if (!interpARGB) { r2 = (int) (vertices[0][R] * 255); g2 = (int) (vertices[0][G] * 255); b2 = (int) (vertices[0][B] * 255); @@ -434,9 +434,9 @@ public class PPolygon implements PConstants { px0 = (pixel00*tuf + pixel10*tuf1) >> 8; px1 = (pixel01*tuf + pixel11*tuf1) >> 8; ta = (((px0*tvf + px1*tvf1) >> 8) * - (interpRGBA ? ((int) (sp[A]*255)) : a2orig)) >> 8; + (interpARGB ? ((int) (sp[A]*255)) : a2orig)) >> 8; - } else if (tformat == RGBA) { + } else if (tformat == ARGB) { p00 = (pixel00 >> 24) & 0xff; p01 = (pixel01 >> 24) & 0xff; p10 = (pixel10 >> 24) & 0xff; @@ -445,13 +445,13 @@ public class PPolygon implements PConstants { px0 = (p00*tuf + p10*tuf1) >> 8; px1 = (p01*tuf + p11*tuf1) >> 8; ta = (((px0*tvf + px1*tvf1) >> 8) * - (interpRGBA ? ((int) (sp[A]*255)) : a2orig)) >> 8; + (interpARGB ? ((int) (sp[A]*255)) : a2orig)) >> 8; } else { // RGB image, no alpha - ta = interpRGBA ? ((int) (sp[A]*255)) : a2orig; + ta = interpARGB ? ((int) (sp[A]*255)) : a2orig; } - if ((tformat == RGB) || (tformat == RGBA)) { + if ((tformat == RGB) || (tformat == ARGB)) { p00 = (pixel00 >> 16) & 0xff; // red p01 = (pixel01 >> 16) & 0xff; p10 = (pixel10 >> 16) & 0xff; @@ -460,7 +460,7 @@ public class PPolygon implements PConstants { px0 = (p00*tuf + p10*tuf1) >> 8; px1 = (p01*tuf + p11*tuf1) >> 8; tr = (((px0*tvf + px1*tvf1) >> 8) * - (interpRGBA ? ((int) sp[R]*255) : r2)) >> 8; + (interpARGB ? ((int) sp[R]*255) : r2)) >> 8; p00 = (pixel00 >> 8) & 0xff; // green @@ -471,7 +471,7 @@ public class PPolygon implements PConstants { px0 = (p00*tuf + p10*tuf1) >> 8; px1 = (p01*tuf + p11*tuf1) >> 8; tg = (((px0*tvf + px1*tvf1) >> 8) * - (interpRGBA ? ((int) sp[G]*255) : g2)) >> 8; + (interpARGB ? ((int) sp[G]*255) : g2)) >> 8; p00 = pixel00 & 0xff; // blue @@ -482,10 +482,10 @@ public class PPolygon implements PConstants { px0 = (p00*tuf + p10*tuf1) >> 8; px1 = (p01*tuf + p11*tuf1) >> 8; tb = (((px0*tvf + px1*tvf1) >> 8) * - (interpRGBA ? ((int) sp[B]*255) : b2)) >> 8; + (interpARGB ? ((int) sp[B]*255) : b2)) >> 8; } else { // alpha image, only use current fill color - if (interpRGBA) { + if (interpARGB) { tr = (int) (sp[R] * 255); tg = (int) (sp[G] * 255); tb = (int) (sp[B] * 255); @@ -511,7 +511,7 @@ public class PPolygon implements PConstants { if (tformat == ALPHA) { ta = tpixel; - if (interpRGBA) { + if (interpARGB) { tr = (int) sp[R]*255; tg = (int) sp[G]*255; tb = (int) sp[B]*255; @@ -526,10 +526,10 @@ public class PPolygon implements PConstants { ta = (a2orig * ta) >> 8; } - } else { // RGB or RGBA + } else { // RGB or ARGB ta = (tformat == RGB) ? 255 : (tpixel >> 24) & 0xff; - if (interpRGBA) { + if (interpARGB) { tr = (((int) sp[R]*255) * ((tpixel >> 16) & 0xff)) >> 8; tg = (((int) sp[G]*255) * ((tpixel >> 8) & 0xff)) >> 8; tb = (((int) sp[B]*255) * ((tpixel) & 0xff)) >> 8; @@ -566,7 +566,7 @@ public class PPolygon implements PConstants { } else { // no image applied int weight = smoothing ? coverage(x) : 255; - if (interpRGBA) { + if (interpARGB) { r2 = (int) (sp[R] * 255); g2 = (int) (sp[G] * 255); b2 = (int) (sp[B] * 255); @@ -652,7 +652,7 @@ public class PPolygon implements PConstants { p[Z] = p1[Z] + dp[Z] * fraction; } - if (interpRGBA) { + if (interpARGB) { dp[R] = (p2[R] - p1[R]) / delta; dp[G] = (p2[G] - p1[G]) / delta; dp[B] = (p2[B] - p1[B]) / delta; @@ -699,7 +699,7 @@ public class PPolygon implements PConstants { p[Z] = p1[Z] + dp[Z] * fraction; } - if (interpRGBA) { + if (interpARGB) { dp[R] = (p2[R] - p1[R]) / delta; dp[G] = (p2[G] - p1[G]) / delta; dp[B] = (p2[B] - p1[B]) / delta; @@ -736,7 +736,7 @@ public class PPolygon implements PConstants { if (interpX) p[X] += dp[X]; if (interpZ) p[Z] += dp[Z]; - if (interpRGBA) { + if (interpARGB) { p[R] += dp[R]; p[G] += dp[G]; p[B] += dp[B]; diff --git a/processing/core/PTriangle.java b/processing/core/PTriangle.java index 870bec67e..f7633878c 100644 --- a/processing/core/PTriangle.java +++ b/processing/core/PTriangle.java @@ -348,7 +348,7 @@ public class PTriangle implements PConstants F_TEX_HEIGHT = TEX_HEIGHT-1; INTERPOLATE_UV = true; - if (image.format == RGBA) { + if (image.format == ARGB) { m_drawFlags|=R_TEXTURE32; } else if (image.format == RGB) { m_drawFlags|=R_TEXTURE24; diff --git a/processing/core/todo.txt b/processing/core/todo.txt index 55968ef4e..ff5d90d8c 100644 --- a/processing/core/todo.txt +++ b/processing/core/todo.txt @@ -10,6 +10,7 @@ X add TRIANGLE_FAN X eyeX, eyeY etc have been renamed cameraX/Y/Z, and cameraNear/Far X modify targa and tiff writing routines to break into header writing X writeTIFF, writeHeaderTIFF, writeTGA, writeHeaderTGA +X MAJOR CHANGE: RGBA becomes ARGB for accuracy opengl X why is the thing hanging until 'stop' is hit? @@ -24,7 +25,13 @@ X INVALID_OPERATION after drawing lines for cube X fix noLoop bug X remove errors when drawing textures -_ fix the usual nasty texture bug found in every acu app +_ figure out min/max texture sizes when binding to avoid problems +_ fix non-bound textures from mangling everything else +_ fix enable/disable textures for some objects +_ fix endian ordering issues so that things work properly +_ make play button un-highlight with opengl +_ also make window move messages work properly +_ can ALPHA fonts work using the other replace modes _ resolve ARGB versus RGBA versus just A issues for fonts _ make sure that current scenario works identically on mac _ if so, just switch the image code to expect alpha in the high bits diff --git a/processing/todo.txt b/processing/todo.txt index 72a2844e9..42755f145 100644 --- a/processing/todo.txt +++ b/processing/todo.txt @@ -18,6 +18,8 @@ _ may need a progress bar for "save as" _ or just the file copy function in general _ since it may take a long time (i.e. 1000s of screen grabs) +_ opening up sketch folder may be extremely slow + _ preproc: making all functions public that have no specifier _ this will make draw() etc all much easier _ as well as the library events