// 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 mjbOutput extends Frame{
GraphicsEnvironment local = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice screen = local.getDefaultScreenDevice();
Canvas3D canvas = new myCanvas3D(screen.getDefaultConfiguration());
public static void main(String[] args) {
  mjbOutput app=new mjbOutput();
  app.setSize(new Dimension(600,400));
  app.show();
}
 
class myCanvas3D extends Canvas3D {
public myCanvas3D(GraphicsConfiguration graphicsConfiguration) {
  super(graphicsConfiguration);
    }
  public void preRender() {
  move1();
    }
  }
 
public mjbOutput(){
  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-blueTransform
  groupblueTransform = blueTransform_7();
  g.addChild(groupblueTransform);
  // code for process call mjbModel.transformGroupBean-redTransform
  groupredTransform = redTransform_8();
  g.addChild(groupredTransform);
  g.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  return g;
}
 
// code for process definition mjbModel.transformGroupBean-blueTransform
Group groupblueTransform;
   
  public Group blueTransform_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
  g.addChild(blueShape_10());
  // 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(groupblueTransform,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);
    }
  }
 
// 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-redTransform
Group groupredTransform;
   
  public Group redTransform_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 for shape3d call -redShape
  g.addChild(redShape_12());
  g.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
  return g;
}
 
// code for shape3d process definition -redShape
public Shape3D redShape_12(){
  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;
}
}
