// This code was generated automatically by mjbWorld (c) Martin John Baker 1998-2000
// to generate other worlds goto: http://www.martinb.com
// then use the program to edit and export your simulation
// bug reports, ideas for new features, etc. to martinb@martinb.com
package mjbOutput;
import javax.vecmath.*;
import javax.media.j3d.*;
import java.awt.*; // for Frame
import java.awt.image.*; // for textures and rasters
import java.util.*; //for Enumeration
 
public class mjbOutput2 extends Frame{
GraphicsEnvironment local = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice screen = local.getDefaultScreenDevice();
Canvas3D canvas = new myCanvas3D(screen.getDefaultConfiguration());
public static void main(String[] args) {
  mjbOutput2 app=new mjbOutput2();
  app.setSize(new Dimension(600,400));
  app.show();
}
 
class myCanvas3D extends Canvas3D {
public myCanvas3D(GraphicsConfiguration graphicsConfiguration) {
  super(graphicsConfiguration);
    }
  public void preRender() {
  move1();
    move2();
    }
  }
 
public mjbOutput2(){
  super("mjbWorld");
  InitLocale(new VirtualUniverse());
  add(canvas);
}
 
  // code for locale-Locale
public void InitLocale(VirtualUniverse vu) {
  javax.media.j3d.Locale loc = new javax.media.j3d.Locale(vu);
  loc.addBranchGraph((BranchGroup)view_branch_1());
  loc.addBranchGraph((BranchGroup)scene_branch_2());
  }
 
// code for process definition mjbModel.branchGroupBean-view_branch
Group groupview_branch;
   
  public Group view_branch_1(){
  Group g = new BranchGroup();
  // code for directionallight-directionalLight
  DirectionalLight light = new DirectionalLight();
  light.setColor(new Color3f(1.0f,1.0f,1.0f));
  light.setDirection(0.30000001192092896f,0.30000001192092896f,-0.699999988079071f);
  light.setInfluencingBounds(new BoundingBox(new Point3d(-10.0, -10.0, -10.0),new Point3d(10.0, 10.0, 10.0)));
  light.setEnable(true);
  g.addChild(light);
  // code for behavior-behavior
  // code to call viewplatform mjbModel.viewPlatformBean-null
  g.addChild(setviewplatform(canvas));
  g.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  return g;
}
 
// viewplatform definition-null
public Group setviewplatform(Canvas3D canvas){
  PhysicalBody pb= new PhysicalBody();
  PhysicalEnvironment pe = new PhysicalEnvironment();
  View view = new View();
  view.addCanvas3D(canvas);
  view.setPhysicalBody(pb);
  view.setPhysicalEnvironment(pe);
  view.setFrontClipDistance(0.01);
  view.setBackClipDistance(10.0);
  Group g = new TransformGroup();
  ViewPlatform viewPlatform = new ViewPlatform();
  view.attachViewPlatform(viewPlatform);
  double viewDistance = 1.0/Math.tan((view.getFieldOfView())/2.0);
  Transform3D t3d = new Transform3D();
  Matrix4d m = new Matrix4d();
  double []d  = {
  1.0,0.0,0.0,0.0,
  0.0,1.0,0.0,0.0,
  0.0,0.0,1.0,viewDistance,
  0.0,0.0,0.0,1.0,
  };
  m.set(d);
  t3d.set(m);
  ((TransformGroup)g).setTransform(t3d);
  g.addChild(viewPlatform);
  return g;
}
// code for process definition mjbModel.branchGroupBean-scene_branch
Group groupscene_branch;
   
  public Group scene_branch_2(){
  Group g = new BranchGroup();
  // code for process call mjbModel.transformGroupBean-scene_transform
  groupscene_transform = scene_transform_6();
  g.addChild(groupscene_transform);
  g.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  return g;
}
 
// code for process definition mjbModel.transformGroupBean-scene_transform
Group groupscene_transform;
   
  public Group scene_transform_6(){
  Group g = new TransformGroup();
  // code for mjbModel.transform3dBean
Transform3D t3d = new Transform3D();
  Matrix4d m = new Matrix4d();
  double []d  = {
  1.0,0.0,0.0,0.0,
  0.0,1.0,0.0,0.0,
  0.0,0.0,1.0,0.0,
  0.0,0.0,0.0,1.0,
  };
  m.set(d);
  t3d.set(m);
  ((TransformGroup)g).setTransform(t3d);
  // code for process call mjbModel.transformGroupBean-blueouter
  groupblueouter = blueouter_7();
  g.addChild(groupblueouter);
  // code for process call mjbModel.transformGroupBean-redouter
  groupredouter = redouter_8();
  g.addChild(groupredouter);
  g.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  return g;
}
 
// code for process definition mjbModel.transformGroupBean-blueouter
Group groupblueouter;
   
  public Group blueouter_7(){
  Group g = new TransformGroup();
  // code for mjbModel.transform3dBean
Transform3D t3d = new Transform3D();
  Matrix4d m = new Matrix4d();
  double []d  = {
  1.0,0.0,0.0,-0.5,
  0.0,1.0,0.0,0.0,
  0.0,0.0,1.0,0.0,
  0.0,0.0,0.0,1.0,
  };
  m.set(d);
  t3d.set(m);
  ((TransformGroup)g).setTransform(t3d);
  // code to call dynamicsBean-null
  g.addChild(dynamics9());
  // code for shape3d call -blueshape
  blueshaperef = blueshape_10();
  g.addChild(blueshaperef);
  // code to call kinematicsBean-bluekine
  bluekine(t3d,(TransformGroup)g);
  g.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  return g;
}
 
// code to define dynamicsBean-null
  public Behavior dynamics9(){
Behavior behavior= new dynamics9Behavior();
  return behavior;
  }
class dynamics9Behavior extends Behavior {
protected WakeupCriterion criterion;
  public dynamics9Behavior() {
  super();
    setSchedulingBounds(new BoundingSphere(new Point3d(0.0,0.0,0.0),100.0));
    }
  public void initialize() {
  criterion =
    new WakeupOnCollisionEntry(blueshaperef,WakeupOnCollisionEntry.USE_BOUNDS);
      wakeupOn (criterion);
    }
  public void processStimulus (Enumeration criteria) {
  WakeupCriterion wakeup;
    while (criteria.hasMoreElements()) {
    wakeup = (WakeupCriterion) criteria.nextElement();
      if (wakeup instanceof WakeupOnCollisionEntry) {
      bluekinereverse();
        System.out.println("collision occured");
        }
      }
    wakeupOn(criterion);
    }
  }

Shape3D blueshaperef =null;
// code for shape3d process definition -blueshape
public Shape3D blueshape_10(){
  Shape3D shape = new Shape3D();
  // code for apperance-null
  Appearance apperance = new Appearance();
  // code for material-null
  Material material = new Material();
  material.setDiffuseColor(new Color3f(0.0f,1.0f,1.0f));
  apperance.setMaterial(material);
  shape.setAppearance(apperance);
  // code for mjbModel.boxBean-null
  IndexedQuadArray indexedarray = new IndexedQuadArray(8,
    IndexedGeometryArray.COORDINATES | IndexedGeometryArray.NORMALS| GeometryArray.TEXTURE_COORDINATE_2,24);
  int [] coordIndex =
    {
  0, 
  1,2,3,4,5,6,7,7,6,1,0,3, 
  2,5,4,1,6,5,2,3,4,7,0};
  indexedarray.setCoordinateIndices(0,coordIndex);
    // code for mjbModel.coordinateBean-null
  double[] coordinates = {
  0.05999999865889549f,-0.05999999865889549f,0.05999999865889549f, 
    0.05999999865889549f,0.05999999865889549f,0.05999999865889549f,-0.05999999865889549f,0.05999999865889549f,0.05999999865889549f,-0.05999999865889549f,-0.05999999865889549f,0.05999999865889549f,-0.05999999865889549f,-0.05999999865889549f,-0.05999999865889549f, 
    -0.05999999865889549f,0.05999999865889549f,-0.05999999865889549f,0.05999999865889549f,0.05999999865889549f,-0.05999999865889549f,0.05999999865889549f,-0.05999999865889549f,-0.05999999865889549f};
  indexedarray.setCoordinates(0,coordinates);
  // code for mjbModel.normalBean-null
  float[] normals = {
     0.0f,0.0f,1.0f, 
     0.0f,0.0f,-1.0f, 1.0f,0.0f,0.0f, -1.0f,0.0f,0.0f, 0.0f,1.0f,0.0f, 
     0.0f,-1.0f,0.0f};
  indexedarray.setNormals(0,normals);
  int [] normalIndex =
    {
  0, 
  0,0,0,1,1,1,1,2,2,2,2,3, 
  3,3,3,4,4,4,4,5,5,5,5};
  indexedarray.setNormalIndices(0,normalIndex);
    int [] textureCoordIndex =
    {
  0, 
  1,2,3,4,5,6,7,7,6,1,0,3, 
  2,5,4,1,6,5,2,3,4,7,0};
  indexedarray.setTextureCoordinateIndices(0,textureCoordIndex);
    // code for TextureCoordinate-null
  float[] texturecoords = {
  1.0f,0.0f, 
    1.0f,1.0f,0.0f,1.0f,0.0f,0.0f,1.0f,0.0f, 
    1.0f,1.0f,0.0f,1.0f,0.0f,0.0f};
  indexedarray.setTextureCoordinates(0,texturecoords);
  shape.setGeometry(indexedarray);
  return shape;
}
// code to define kinematicsBean-bluekine
  Point3d bluekineposn = new Point3d(-0.5,0.0,0.0);
  Point3d bluekinevel = new Point3d(0.009999999776482582,0.0,0.0);
  Transform3D bluekinetrans = null;
  TransformGroup bluekinetg =null;
  public void bluekine(Transform3D t,TransformGroup tg) {
  bluekinetg = tg;
    bluekinetrans =t;
    }
  public void move1() {
  bluekineposn.add(bluekinevel);
    bluekinetrans.setTranslation(new Vector3d(bluekineposn));
    bluekinetg.setTransform(bluekinetrans);
    }
   
public void bluekinereverse() {
  bluekinevel.x =-bluekinevel.x ;
    bluekinevel.y =-bluekinevel.y ;
    bluekinevel.z =-bluekinevel.z ;
    }
   
// code for process definition mjbModel.transformGroupBean-redouter
Group groupredouter;
   
  public Group redouter_8(){
  Group g = new TransformGroup();
  // code for mjbModel.transform3dBean
Transform3D t3d = new Transform3D();
  Matrix4d m = new Matrix4d();
  double []d  = {
  1.0,0.0,0.0,0.5,
  0.0,1.0,0.0,0.0,
  0.0,0.0,1.0,0.0,
  0.0,0.0,0.0,1.0,
  };
  m.set(d);
  t3d.set(m);
  ((TransformGroup)g).setTransform(t3d);
  // code to call dynamicsBean-null
  g.addChild(dynamics12());
  // code for shape3d call -redshape
  redshaperef = redshape_13();
  g.addChild(redshaperef);
  // code to call kinematicsBean-redkine
  redkine(t3d,(TransformGroup)g);
  g.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  return g;
}
 
// code to define dynamicsBean-null
  public Behavior dynamics12(){
Behavior behavior= new dynamics12Behavior();
  return behavior;
  }
class dynamics12Behavior extends Behavior {
protected WakeupCriterion criterion;
  public dynamics12Behavior() {
  super();
    setSchedulingBounds(new BoundingSphere(new Point3d(0.0,0.0,0.0),100.0));
    }
  public void initialize() {
  criterion =
    new WakeupOnCollisionEntry(redshaperef,WakeupOnCollisionEntry.USE_BOUNDS);
      wakeupOn (criterion);
    }
  public void processStimulus (Enumeration criteria) {
  WakeupCriterion wakeup;
    while (criteria.hasMoreElements()) {
    wakeup = (WakeupCriterion) criteria.nextElement();
      if (wakeup instanceof WakeupOnCollisionEntry) {
      redkinereverse();
        System.out.println("collision occured");
        }
      }
    wakeupOn(criterion);
    }
  }
 
// code for shape3d process definition -redshape
Shape3D redshaperef =null;

public Shape3D redshape_13(){
  Shape3D shape = new Shape3D();
  // code for apperance-null
  Appearance apperance = new Appearance();
  // code for material-null
  Material material = new Material();
  material.setDiffuseColor(new Color3f(1.0f,0.0f,1.0f));
  apperance.setMaterial(material);
  shape.setAppearance(apperance);
  // code for mjbModel.boxBean-null
  IndexedQuadArray indexedarray = new IndexedQuadArray(8,
    IndexedGeometryArray.COORDINATES | IndexedGeometryArray.NORMALS| GeometryArray.TEXTURE_COORDINATE_2,24);
  int [] coordIndex =
    {
  0, 
  1,2,3,4,5,6,7,7,6,1,0,3, 
  2,5,4,1,6,5,2,3,4,7,0};
  indexedarray.setCoordinateIndices(0,coordIndex);
    // code for mjbModel.coordinateBean-null
  double[] coordinates = {
  0.05000000074505806f,-0.05000000074505806f,0.05000000074505806f, 
    0.05000000074505806f,0.05000000074505806f,0.05000000074505806f,-0.05000000074505806f,0.05000000074505806f,0.05000000074505806f,-0.05000000074505806f,-0.05000000074505806f,0.05000000074505806f,-0.05000000074505806f,-0.05000000074505806f,-0.05000000074505806f, 
    -0.05000000074505806f,0.05000000074505806f,-0.05000000074505806f,0.05000000074505806f,0.05000000074505806f,-0.05000000074505806f,0.05000000074505806f,-0.05000000074505806f,-0.05000000074505806f};
  indexedarray.setCoordinates(0,coordinates);
  // code for mjbModel.normalBean-null
  float[] normals = {
     0.0f,0.0f,1.0f, 
     0.0f,0.0f,-1.0f, 1.0f,0.0f,0.0f, -1.0f,0.0f,0.0f, 0.0f,1.0f,0.0f, 
     0.0f,-1.0f,0.0f};
  indexedarray.setNormals(0,normals);
  int [] normalIndex =
    {
  0, 
  0,0,0,1,1,1,1,2,2,2,2,3, 
  3,3,3,4,4,4,4,5,5,5,5};
  indexedarray.setNormalIndices(0,normalIndex);
    int [] textureCoordIndex =
    {
  0, 
  1,2,3,4,5,6,7,7,6,1,0,3, 
  2,5,4,1,6,5,2,3,4,7,0};
  indexedarray.setTextureCoordinateIndices(0,textureCoordIndex);
    // code for TextureCoordinate-null
  float[] texturecoords = {
  1.0f,0.0f, 
    1.0f,1.0f,0.0f,1.0f,0.0f,0.0f,1.0f,0.0f, 
    1.0f,1.0f,0.0f,1.0f,0.0f,0.0f};
  indexedarray.setTextureCoordinates(0,texturecoords);
  shape.setGeometry(indexedarray);
  return shape;
}
// code to define kinematicsBean-redkine
  Point3d redkineposn = new Point3d(0.5,0.0,0.0);
  Point3d redkinevel = new Point3d(-0.004999999888241291,0.0,0.0);
  Transform3D redkinetrans = null;
  TransformGroup redkinetg =null;
  public void redkine(Transform3D t,TransformGroup tg) {
  redkinetg = tg;
    redkinetrans =t;
    }
  public void move2() {
  redkineposn.add(redkinevel);
    redkinetrans.setTranslation(new Vector3d(redkineposn));
    redkinetg.setTransform(redkinetrans);
    }
   
public void redkinereverse() {
  redkinevel.x =-redkinevel.x ;
    redkinevel.y =-redkinevel.y ;
    redkinevel.z =-redkinevel.z ;
    }
   
}
