package visad.java3d;
import visad.*;
import visad.data.CachedBufferedByteImage;
import javax.media.j3d.ImageComponent2D;
import javax.media.j3d.ImageComponent2D.Updater;
import javax.media.j3d.Behavior;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Switch;
import javax.media.j3d.BoundingSphere;
import javax.vecmath.Point3d;
import java.awt.image.*;
import java.awt.color.*;
import java.util.Enumeration;
import java.util.ArrayList;
import java.util.Iterator;
import javax.media.j3d.WakeupCriterion;
import javax.media.j3d.WakeupOnElapsedFrames;
import javax.media.j3d.WakeupOnElapsedTime;
import javax.media.j3d.WakeupOnBehaviorPost;
public class VisADImageNode {
VisADImageTile[] images;
public ArrayList<VisADImageTile> imageTiles = new ArrayList<VisADImageTile>();
public int numChildren = 0;
public BranchGroup branch;
Switch swit;
public int current_index = 0;
public int numImages;
public int data_width;
public int data_height;
AnimateBehavior animate = null;
public VisADImageNode() {
}
public VisADImageNode(BranchGroup branch, Switch swit) {
this.branch = branch;
this.swit = swit;
}
public void addTile(VisADImageTile tile) {
imageTiles.add(tile);
numChildren++;
}
public VisADImageTile getTile(int index) {
return imageTiles.get(index);
}
public Iterator getTileIterator() {
return imageTiles.iterator();
}
public int getNumTiles() {
return numChildren;
}
/**
//- for implementing Updater
public void updateData(ImageComponent2D imageC2d, int x, int y, int lenx, int leny) {
if (images != null) {
//-imageComp.set(images[current_index]); // This should probably not be done in updateData
}
}
**/
public void setCurrent(int idx) {
current_index = idx;
//images[i].setCurrent(idx);
for (int i=0; i<numChildren; i++) {
imageTiles.get(i).setCurrent(idx);
}
/** use if stepping via a Behavior
if (animate != null) {
animate.setCurrent(idx);
animate.postId(777);
}
*/
}
/** use these with custom Behavior below **/
public void initialize() {
animate = new AnimateBehavior(this);
animate.setEnable(true);
}
public void update(int index) {
// need to iterate over children (tiles)
/**
if (images != null && imageComp != null) {
imageComp.set(images[index]);
}
**/
}
public void setBranch(BranchGroup branch) {
this.branch = branch;
}
public void setSwitch(Switch swit) {
this.swit = swit;
}
public Switch getSwitch() {
return swit;
}
public BranchGroup getBranch() {
return branch;
}
}
class AnimateBehavior extends Behavior {
private WakeupCriterion wakeupC;
int current = 0;
VisADImageNode imageNode;
AnimateBehavior(VisADImageNode imgNode) {
this.imageNode = imgNode;
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
this.setSchedulingBounds(bounds);
imageNode.branch.addChild(this);
wakeupC = new WakeupOnBehaviorPost(null, 777);
}
public void initialize() {
wakeupOn(wakeupC);
}
// procesStimulus changes the ImageComponent of the texture
public void processStimulus(Enumeration criteria) {
imageNode.update(current);
wakeupOn(wakeupC);
}
public void setCurrent(int idx) {
current = idx;
}
}