The code below demonstrates what may be a bug in immediate-mode rendering of a texture with image data set by reference. I tested this on: Java3D 1.2 Maintenance Release Implementation JDK 1.3 Windows NT 4.0 PentiumIII laptop (Dell Inspiron 7500) with ATI Rage Mobility P OpenGL Also, despite statements in Java3D demos (and this mailing list) that a BufferedImage of TYPE_3BYTE_BGR enables images by reference, I have not found this to be true. Therefore, the code below uses a BufferedImage of TYPE_CUSTOM, which is the only way I know of (on Windows) to avoid copying from a BufferedImage to an ImageComponent2D. Finally, if someone can point me to a better place to submit a Java3D bug, I'd appreciate it. I noticed that I can view Java3D bugs in the Developer Connection Bug Database, but I could not find a category for Java3D in the "submit bug" form. Regards, Dave --- import java.applet.Applet; import java.awt.*; import java.awt.color.*; import java.awt.image.*; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.universe.*; import javax.media.j3d.*; import javax.vecmath.*; /** * Demonstrates a bug in Java3D 1.2. * * Immediate-mode rendering of texture with image data set by reference * yields an (incorrect) all-white image. When by reference is not specified, * the displayed image is (correct) shades of gray. Search for byReference * below. * * @author Dave Hale, Landmark Graphics * @version 06/14/2000 */ public class ImmTexByRefBug extends Applet implements Runnable { public ImmTexByRefBug() { setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); canvas = new Canvas3D(config); canvas.stopRenderer(); add("Center",canvas); SimpleUniverse u = new SimpleUniverse(canvas); u.getViewingPlatform().setNominalViewingTransform(); new Thread(this).start(); } public void render() { if (gc == null) { gc = canvas.getGraphicsContext3D(); gc.setAppearance(new Appearance()); tc = new TexturedQuad(); } gc.clear(); gc.draw(tc); canvas.swap(); } public void run() { while (true) { render(); Thread.yield(); } } public static void main(String[] args) { new MainFrame(new ImmTexByRefBug(),256,256); } private Canvas3D canvas; private GraphicsContext3D gc = null; private TexturedQuad tc = null; private class TexturedQuad extends Shape3D { public TexturedQuad() { QuadArray qa = new QuadArray( 4,QuadArray.COORDINATES|QuadArray.TEXTURE_COORDINATE_2); this.setGeometry(qa); float[] coords = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.5f, 0.5f, 0.0f, -0.5f, 0.5f, 0.0f, }; qa.setCoordinates(0,coords); int w = 256; int h = 256; float dw = 0.5f/(float)w; float dh = 0.5f/(float)h; float[] txcoords = { dw, dh, 1.0f-dw, dh, 1.0f-dw, 1.0f-dh, dw, 1.0f-dh, }; qa.setTextureCoordinates(0,0,txcoords); Appearance a = new Appearance(); this.setAppearance(a); // If byReference==true, then textured quad is white (WRONG!). // If byReference==false, then textured quad is shades of gray (RIGHT). boolean byReference = true; boolean yUp = true; // This is the only way I've found to avoid the copy for RGB images. // Documentation says TYPE_3BYTE_BGR will also avoid the copy, but // it does not (another bug?). ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB); int[] nbits = {8,8,8}; ColorModel cm = new ComponentColorModel( cs,nbits,false,false,Transparency.OPAQUE,0); int[] bandoffset = {0,1,2}; WritableRaster wr = java.awt.image.Raster.createInterleavedRaster( DataBuffer.TYPE_BYTE,w,h,w*3,3,bandoffset,null); BufferedImage bi = new BufferedImage(cm,wr,false,null); byte[] data = ((DataBufferByte)bi.getRaster().getDataBuffer()).getData(); for (int i=0,k=0; i<h; ++i) { for (int j=0; j<w; ++j) { byte c = (byte)((i+j)*255/(w+h-2)); data[k++] = c; data[k++] = c; data[k++] = c; } } ImageComponent2D ic = new ImageComponent2D( ImageComponent.FORMAT_RGB8,w,h,byReference,yUp); ic.set(bi); Texture2D tx = new Texture2D(Texture.BASE_LEVEL,Texture.RGB,w,h); tx.setMagFilter(Texture.BASE_LEVEL_LINEAR); tx.setMinFilter(Texture.BASE_LEVEL_LINEAR); tx.setImage(0,ic); tx.setEnable(true); a.setTexture(tx); } } } =========================================================================== To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff JAVA3D-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help".