package visad.test; import java.awt.BorderLayout; import java.rmi.RemoteException; import javax.media.j3d.BranchGroup; import javax.swing.JFrame; import javax.swing.JPanel; import visad.AnimationControl; import visad.CoordinateSystem; import visad.GridCoordinateSystem; import visad.DataReference; import visad.DataReferenceImpl; import visad.Display; import visad.DisplayImpl; import visad.Field; import visad.FieldImpl; import visad.FlatField; import visad.FunctionType; import visad.Integer1DSet; import visad.Linear2DSet; import visad.Gridded2DSet; import visad.RealTupleType; import visad.RealType; import visad.ScalarMap; import visad.VisADException; import visad.bom.ImageRendererJ3D; import visad.java3d.DisplayImplJ3D; import visad.java3d.DisplayRendererJ3D; import visad.util.Util; /** * Simple test for <code>AnimationControl</code> and <code>ImageRendererJ3D</code>. */ public class ImageAnimationTest extends JPanel { ImageRendererJ3D imgRend; public static final float[] makeSinusoidalSamples(int lenX, int lenY, int waveNum) { float[] samples = new float[lenX*lenY]; int index = 0; double PI = Math.PI; for (int ii = 0; ii < lenX; ii++) { for (int jj = 0; jj < lenY; jj++) { samples[index] = (float) ( Math.sin((waveNum*PI) / 100 * jj) * Math.sin((waveNum*PI) / 100 * ii)); index++; } } return samples; } protected float[][] makeSamples(int size, int num) { float[][] samples = new float[num][size^2]; for (int i=0; i<num; i++) samples[i] = makeSinusoidalSamples(size, size, i); return samples; } public ImageAnimationTest(int num, int size) throws VisADException, RemoteException { // (Time -> ((x, y) -> val)) RealTupleType pxlA = new RealTupleType(RealType.getRealType("x_a"), RealType.getRealType("y_a")); //-Linear2DSet imgSet = new Linear2DSet(pxl, 0, size-1, size, 0, size-1, size); Linear2DSet set = new Linear2DSet(RealTupleType.Generic2D, 0, size-1, size, 0, size-1, size); float[][] locs = set.getSamples(); Gridded2DSet locs_set = new Gridded2DSet(pxlA, locs, size, size); GridCoordinateSystem gcs = new GridCoordinateSystem(locs_set); //-RealTupleType pxl = new RealTupleType(RealType.getRealType("x"), RealType.getRealType("y")); RealTupleType pxl = new RealTupleType(RealType.getRealType("x"), RealType.getRealType("y"), gcs, null); Linear2DSet imgSet = new Linear2DSet(pxl, 0, size-1, size, 0, size-1, size); FunctionType pxlVal = new FunctionType(pxl, RealType.getRealType("val")); FunctionType timePxlVal = new FunctionType(RealType.Time, pxlVal); Field timeFld = new FieldImpl(timePxlVal, new Integer1DSet(RealType.Time, num)); float[][] samples = makeSamples(size, num); for (int i = 0; i < samples.length; i++) { FlatField imgFld = new FlatField(pxlVal, imgSet); imgFld.setSamples(new float[][]{samples[i]}, false); // set image for time timeFld.setSample(i, imgFld, false); } System.out.println("makeSamples done"); DataReference ref = new DataReferenceImpl("image"); ref.setData(timeFld); DisplayImpl display = new DisplayImplJ3D("image display"); imgRend = new ImageRendererJ3D(); System.err.println("Renderer:"+imgRend.toString()); //-display.addMap(new ScalarMap(RealType.getRealType("x"), Display.XAxis)); //-display.addMap(new ScalarMap(RealType.getRealType("y"), Display.YAxis)); display.addMap(new ScalarMap(RealType.getRealType("x_a"), Display.XAxis)); display.addMap(new ScalarMap(RealType.getRealType("y_a"), Display.YAxis)); display.addMap(new ScalarMap(RealType.getRealType("val"), Display.RGB)); ScalarMap aniMap = new ScalarMap(RealType.Time, Display.Animation); display.addMap(aniMap); AnimationControl aniCtrl = (AnimationControl) aniMap.getControl(); aniCtrl.setStep(500); aniCtrl.setOn(true); display.addReferences(imgRend, ref); setLayout(new BorderLayout()); add(display.getComponent()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } //-BranchGroup scene = ((DisplayRendererJ3D) imgRend.getDisplayRenderer()).getRoot(); //-Util.printSceneGraph(scene); } public static void main(String[] args) throws RemoteException, VisADException { int num = 0; int size = 0; try { num = Integer.parseInt(args[0]); size = Integer.parseInt(args[1]); } catch (Exception e) { System.err.println("USAGE: ImageAnimationTest <numImgs> <size>"); System.exit(1); } Util.printJ3DProperties(null); JFrame frame = new JFrame("Image Animation Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); final ImageAnimationTest aniTest = new ImageAnimationTest(num, size); frame.add(aniTest); frame.setSize(600, 600); frame.setVisible(true); } }