Dave:
You have uncovered 2 bugs in Java3D and both of which will be fixed in 1.2.1
beta.
Bug1: TYPE_3BYTE_BGR does make a copy on windows, the way to avoid copy
on windows is to use TYPE_CUSTOM
Bug2: ByReference texture and raster does not work with immediate mode.
As far as filing Java3D bugs, the best way to do this is to send mail to
[EMAIL PROTECTED]
-Uma
> MIME-Version: 1.0
> Date: Thu, 15 Jun 2000 18:59:10 -0500
> From: Dave Hale <[EMAIL PROTECTED]>
> Subject: [JAVA3D] ImageComponent2D by reference does not work with immediate
mode?
> To: [EMAIL PROTECTED]
>
> 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".
===========================================================================
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".