Image Component By Reference : Texture « 3D « Java






Image Component By Reference

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;
  }
}



           
       








Related examples in the same category

1.LocalEyeApp creates a single plane with texture mappingLocalEyeApp creates a single plane with texture mapping
2.TexCoordGeneration class to automatically define the texture coordinates
3.The simple application of textures
4.ExTexture - illustrate use of textures
5.Illustrates how a texture image can be dynamically rotated at runtime
6.Illustrates dynamic texture coordinate generation using the TexCoordGeneration class
7.Create geometry to display the texture image mapped onto a triangulated polygon
8.Texture: picture ball
9.Interleaved TestInterleaved Test
10.Texture ImageTexture Image
11.Multi TextureMulti Texture
12.Texture By Reference
13.Texture MappingTexture Mapping