/*
* @(#)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;
}
}
|