Mega Code Archive

 
Categories / Java / 3D Graphics
 

Image Component By Reference

/*  * @(#)ImageComponentByReferenceTest.java 1.14 02/10/21 13:41:45  *   * Copyright (c) 1996-2002 Sun Microsystems, Inc. All Rights Reserved.  *   * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions are met:  *  - Redistributions of source code must retain the above copyright notice,  * this list of conditions and the following disclaimer.  *  - Redistribution in binary form must reproduce the above copyright notice,  * this list of conditions and the following disclaimer in the documentation  * and/or other materials provided with the distribution.  *   * Neither the name of Sun Microsystems, Inc. or the names of contributors may  * be used to endorse or promote products derived from this software without  * specific prior written permission.  *   * This software is provided "AS IS," without a warranty of any kind. ALL  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY  * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR  * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE  * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING  * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS  * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,  * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER  * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF  * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY  * OF SUCH DAMAGES.  *   * You acknowledge that Software is not designed,licensed or intended for use in  * the design, construction, operation or maintenance of any nuclear facility.  */ import java.awt.Container; import java.awt.Rectangle; import java.awt.Transparency; import java.awt.color.ColorSpace; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.ComponentColorModel; import java.awt.image.DataBuffer; import java.awt.image.DataBufferByte; import java.awt.image.Raster; import java.awt.image.RenderedImage; import java.awt.image.SampleModel; import java.awt.image.WritableRaster; import java.util.Vector; import javax.media.j3d.Appearance; import javax.media.j3d.BoundingSphere; import javax.media.j3d.BranchGroup; import javax.media.j3d.Canvas3D; import javax.media.j3d.Group; import javax.media.j3d.ImageComponent; import javax.media.j3d.ImageComponent2D; import javax.media.j3d.Shape3D; import javax.media.j3d.Texture; import javax.media.j3d.Texture2D; import javax.media.j3d.Transform3D; import javax.media.j3d.TransformGroup; import javax.swing.BoxLayout; import javax.swing.JApplet; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.vecmath.Point3d; import javax.vecmath.Point3f; import javax.vecmath.Vector3f; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.geometry.Box; import com.sun.j3d.utils.image.TextureLoader; import com.sun.j3d.utils.universe.SimpleUniverse; public class ImageComponentByReferenceTest extends JApplet implements     ActionListener {   Shape3D s1, s2;   TextureLoader t0, t1, t2;   int count = 0;   Appearance app = new Appearance();   BranchGroup objRoot = new BranchGroup();   TransformGroup objTrans = new TransformGroup();   BufferedImage bImage1;   TiledImage checkBoard;   boolean yUp = false;   boolean byRef = true;   JComboBox rasterType, texType;   ImageComponent2D[] image = new ImageComponent2D[8];   Appearance dummyApp = new Appearance();   Texture2D texOne, texCheckBoard;   javax.media.j3d.Raster raster;   Box textureCube;   Shape3D boxShape;   int w1 = 64, h1 = 32, checkw = 16, checkh = 16;   private java.net.URL texImage = null;   private SimpleUniverse u = null;   public BranchGroup createSceneGraph() {     objRoot = new BranchGroup();     objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);     objTrans.setCapability(Group.ALLOW_CHILDREN_WRITE);     objRoot.addChild(objTrans);     BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0),         100.0);     app.setCapability(Appearance.ALLOW_TEXTURE_WRITE);     textureCube = new Box(0.4f, 0.4f, 0.4f, Box.GENERATE_TEXTURE_COORDS         | Box.GENERATE_NORMALS, app);     boxShape = textureCube.getShape(Box.FRONT);     boxShape.setCapability(Shape3D.ALLOW_APPEARANCE_WRITE);     objTrans.addChild(textureCube);     checkBoard = new TiledImage();     TextureLoader texLoader = new TextureLoader(texImage, this);     ImageComponent2D oneImage = texLoader.getImage();     bImage1 = oneImage.getImage();     int index = 0;     image[index++] = new ImageComponent2D(oneImage.getFormat(),         (RenderedImage) bImage1, false, true);     image[index++] = new ImageComponent2D(oneImage.getFormat(),         (RenderedImage) bImage1, true, true);     image[index++] = new ImageComponent2D(oneImage.getFormat(),         (RenderedImage) bImage1, false, false);     image[index++] = new ImageComponent2D(oneImage.getFormat(),         (RenderedImage) bImage1, true, false);     createRaster(objRoot);     image[index++] = new ImageComponent2D(ImageComponent.FORMAT_RGBA,         checkBoard, false, true);     image[index++] = new ImageComponent2D(ImageComponent.FORMAT_RGBA,         checkBoard, true, true);     image[index++] = new ImageComponent2D(ImageComponent.FORMAT_RGBA,         checkBoard, false, false);     image[index++] = new ImageComponent2D(ImageComponent.FORMAT_RGBA,         checkBoard, true, false);     texOne = new Texture2D(Texture.BASE_LEVEL, Texture.RGBA, image[2]         .getWidth(), image[2].getHeight());     texOne.setCapability(Texture.ALLOW_IMAGE_WRITE);     texOne.setImage(0, image[2]);     app.setTexture(texOne);     texCheckBoard = new Texture2D(Texture.BASE_LEVEL, Texture.RGBA,         image[4].getWidth(), image[4].getHeight());     texCheckBoard.setCapability(Texture.ALLOW_IMAGE_WRITE);     objRoot.compile();     return objRoot;   }   public void actionPerformed(ActionEvent e) {     Object target = e.getSource();     if (target == rasterType) {       if (rasterType.getSelectedIndex() < 4) {         raster.setSize(w1, h1);       } else {         raster.setSize(checkw, checkh);       }       raster.setImage(image[rasterType.getSelectedIndex()]);     } else if (target == texType) {       boxShape.setAppearance(dummyApp);       if (texType.getSelectedIndex() < 4) {         texOne.setImage(0, image[texType.getSelectedIndex()]);         app.setTexture(texOne);       } else {         texCheckBoard.setImage(0, image[texType.getSelectedIndex()]);         app.setTexture(texCheckBoard);       }       boxShape.setAppearance(app);     }   }   JPanel createImagePanel() {     JPanel panel = new JPanel();     String texVals[] = { "One_Yup_ByCopy", "One_Yup_ByReference",         "One_Ydown_ByCopy", "One_Ydown_ByReference",         "Checkered_Yup_ByCopy", "Checkered_Yup_ByReference",         "Checkered_Ydown_ByCopy", "Checkered_Ydown_ByReference" };     rasterType = new JComboBox(texVals);     rasterType.setLightWeightPopupEnabled(false);     rasterType.addActionListener(this);     rasterType.setSelectedIndex(2);     panel.add(new JLabel("Raster Image"));     panel.add(rasterType);     texType = new JComboBox(texVals);     texType.setLightWeightPopupEnabled(false);     texType.addActionListener(this);     texType.setSelectedIndex(2);     panel.add(new JLabel("Texture Image"));     panel.add(texType);     return panel;   }   public ImageComponentByReferenceTest() {   }   public ImageComponentByReferenceTest(java.net.URL url) {     texImage = url;   }   public void init() {     if (texImage == null) {       // the path to the image for an applet       try {         texImage = new java.net.URL(getCodeBase().toString()             + "/one.jpg");       } catch (java.net.MalformedURLException ex) {         System.out.println(ex.getMessage());         System.exit(1);       }     }     Canvas3D c = new Canvas3D(SimpleUniverse.getPreferredConfiguration());     BranchGroup scene = createSceneGraph();     u = new SimpleUniverse(c);     u.getViewingPlatform().setNominalViewingTransform();     u.addBranchGraph(scene);     Container contentPane = getContentPane();     JPanel p = new JPanel();     BoxLayout boxlayout = new BoxLayout(p, BoxLayout.Y_AXIS);     p.setLayout(boxlayout);     contentPane.add("Center", c);     contentPane.add("South", p);     p.add(createImagePanel());   }   public void destroy() {     u.cleanup();   }   public static void main(String[] args) {     java.net.URL url = null;     // the path to the image file for an application     try {       url = new java.net.URL("file:one.jpg");     } catch (java.net.MalformedURLException ex) {       System.out.println(ex.getMessage());       System.exit(1);     }     new MainFrame(new ImageComponentByReferenceTest(url), 800, 700);   }   void createRaster(BranchGroup scene) {     // Create raster geometries and shapes     Vector3f trans = new Vector3f();     Transform3D tr = new Transform3D();     TransformGroup tg;     // Left     raster = new javax.media.j3d.Raster();     raster.setCapability(javax.media.j3d.Raster.ALLOW_IMAGE_WRITE);     raster.setCapability(javax.media.j3d.Raster.ALLOW_SIZE_WRITE);     raster.setPosition(new Point3f(-0.9f, 0.75f, 0.0f));     raster.setType(javax.media.j3d.Raster.RASTER_COLOR);     raster.setOffset(0, 0);     raster.setSize(image[2].getWidth(), image[2].getHeight());     raster.setImage(image[2]);     Shape3D sh = new Shape3D(raster, new Appearance());     scene.addChild(sh);   } } class TiledImage extends Object implements RenderedImage {   WritableRaster[][] tile = new WritableRaster[3][3];   WritableRaster bigTile;   ComponentColorModel colorModel;   BufferedImage checkBoard;   int minX = -2;   int minY = -1;   TiledImage() {     ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);     int[] nBits = { 8, 8, 8, 8 };     int i, j, k, cc = 255;     int[] bandOffset = new int[4];     colorModel = new ComponentColorModel(cs, nBits, true, false,         Transparency.OPAQUE, 0);     // Create 9 tiles     bandOffset[0] = 3;     bandOffset[1] = 2;     bandOffset[2] = 1;     bandOffset[3] = 0;     for (i = 0; i < 3; i++) {       for (j = 0; j < 3; j++) {         tile[i][j] = Raster.createInterleavedRaster(             DataBuffer.TYPE_BYTE, 8, 8, 32, 4, bandOffset, null);       }     }     // tile {-2, -1}     byte[] byteData = ((DataBufferByte) tile[0][0].getDataBuffer())         .getData();     for (i = 4, k = 8 * 4 * 4 + 4 * 4; i < 8; i++, k += 16) {       for (j = 4; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) cc;         byteData[k + 2] = (byte) 0;         byteData[k + 3] = (byte) cc;       }     }     // tile {-1, -1}     byteData = ((DataBufferByte) tile[1][0].getDataBuffer()).getData();     for (i = 4, k = 8 * 4 * 4; i < 8; i++) {       for (j = 4; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) cc;         byteData[k + 2] = (byte) 0;         byteData[k + 3] = (byte) cc;       }       for (j = 4; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) 0;         byteData[k + 2] = (byte) 0;         byteData[k + 3] = (byte) cc;       }     }     // tile {1, -1}     byteData = ((DataBufferByte) tile[2][0].getDataBuffer()).getData();     for (i = 4, k = 8 * 4 * 4; i < 8; i++, k += 16) {       for (j = 0; j < 4; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) 0;         byteData[k + 2] = (byte) 0;         byteData[k + 3] = (byte) cc;       }     }     // tile {-2, 0}     byteData = ((DataBufferByte) tile[0][1].getDataBuffer()).getData();     for (i = 0, k = 16; i < 4; i++, k += 16) {       for (j = 4; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) cc;         byteData[k + 2] = (byte) 0;         byteData[k + 3] = (byte) cc;       }     }     for (i = 4, k = 8 * 4 * 4 + 16; i < 8; i++, k += 16) {       for (j = 4; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) 0;         byteData[k + 2] = (byte) cc;         byteData[k + 3] = (byte) 0;       }     }     // tile {-1, 0}     byteData = ((DataBufferByte) tile[1][1].getDataBuffer()).getData();     for (i = 0, k = 0; i < 4; i++) {       for (j = 4; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) cc;         byteData[k + 2] = (byte) 0;         byteData[k + 3] = (byte) cc;       }       for (j = 4; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) 0;         byteData[k + 2] = (byte) 0;         byteData[k + 3] = (byte) cc;       }     }     for (i = 0, k = 8 * 4 * 4; i < 4; i++) {       for (j = 4; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) 0;         byteData[k + 2] = (byte) cc;         byteData[k + 3] = (byte) 0;       }       for (j = 4; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) 0;         byteData[k + 2] = (byte) cc;         byteData[k + 3] = (byte) cc;       }     }     // tile {0, 0}     byteData = ((DataBufferByte) tile[2][1].getDataBuffer()).getData();     for (i = 0, k = 0; i < 4; i++, k += 16) {       for (j = 4; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) 0;         byteData[k + 2] = (byte) 0;         byteData[k + 3] = (byte) cc;       }     }     for (i = 4, k = 8 * 4 * 4; i < 8; i++, k += 16) {       for (j = 4; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) 0;         byteData[k + 2] = (byte) cc;         byteData[k + 3] = (byte) cc;       }     }     // tile {-2, 1}     byteData = ((DataBufferByte) tile[0][2].getDataBuffer()).getData();     for (i = 4, k = 16; i < 8; i++, k += 16) {       for (j = 4; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) 0;         byteData[k + 2] = (byte) cc;         byteData[k + 3] = (byte) 0;       }     }     // tile {-1, 1}     byteData = ((DataBufferByte) tile[1][2].getDataBuffer()).getData();     for (i = 0, k = 0; i < 8; i++) {       for (j = 4; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) 0;         byteData[k + 2] = (byte) cc;         byteData[k + 3] = (byte) 0;       }       for (j = 4; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) 0;         byteData[k + 2] = (byte) cc;         byteData[k + 3] = (byte) cc;       }     }     // tile {0, 1}     byteData = ((DataBufferByte) tile[2][2].getDataBuffer()).getData();     for (i = 4, k = 0; i < 8; i++, k += 16) {       for (j = 4; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) 0;         byteData[k + 2] = (byte) cc;         byteData[k + 3] = (byte) cc;       }     }     bigTile = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, 16, 16,         64, 4, bandOffset, null);     ;     byteData = ((DataBufferByte) bigTile.getDataBuffer()).getData();     for (i = 0, k = 0; i < 8; i++) {       for (j = 0; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) cc;         byteData[k + 2] = (byte) 0;         byteData[k + 3] = (byte) cc;       }       for (; j < 16; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) 0;         byteData[k + 2] = (byte) 0;         byteData[k + 3] = (byte) cc;       }     }     for (; i < 16; i++) {       for (j = 0; j < 8; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) 0;         byteData[k + 2] = (byte) cc;         byteData[k + 3] = (byte) 0;       }       for (; j < 16; j++, k += 4) {         byteData[k] = (byte) 0;         byteData[k + 1] = (byte) 0;         byteData[k + 2] = (byte) cc;         byteData[k + 3] = (byte) cc;       }     }     checkBoard = new BufferedImage(colorModel, bigTile, false, null);   }   // create four tiles {r, g, b, y}   public WritableRaster copyData(WritableRaster raster) {     return checkBoard.copyData(raster);   }   public ColorModel getColorModel() {     return checkBoard.getColorModel();   }   public Raster getData() {     return checkBoard.getData();   }   public Raster getData(Rectangle rect) {     return checkBoard.getData(rect);   }   public int getHeight() {     return 16;   }   public int getMinTileX() {     return minX;   }   public int getMinTileY() {     return minY;   }   public int getMinX() {     return -8;   }   public int getMinY() {     return -8;   }   public int getNumXTiles() {     return 3;   }   public int getNumYTiles() {     return 3;   }   public Object getProperty(String name) {     return checkBoard.getProperty(name);   }   public String[] getPropertyNames() {     return checkBoard.getPropertyNames();   }   public SampleModel getSampleModel() {     return checkBoard.getSampleModel();   }   public Vector getSources() {     return null;   }   public Raster getTile(int tileX, int tileY) {     return tile[tileX - minX][tileY - minY];   }   public int getTileGridXOffset() {     return 4;   }   public int getTileGridYOffset() {     return -4;   }   public int getTileHeight() {     return 8;   }   public int getTileWidth() {     return 8;   }   public int getWidth() {     return 16;   } }