package brtestgratings;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import java.awt.event.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.Dimension;
import java.awt.GraphicsEnvironment;
import javax.media.j3d.PhysicalBody;
import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JPanel;

public class BrTestGratings extends Applet implements Runnable
{
   View view, viewleft;
    private Canvas3D canvas;
    private GraphicsContext3D gc = null, gcLeft=null, gcAnu=null;
    private Geometry grt0, grt1, grt2, grt3;
    private Transform3D cmt = new Transform3D();
    private Transform3D cmtleft=new Transform3D();
            Transform3D temp=new Transform3D();
    RotateGrating grat1=new RotateGrating();
    RotateGrating grat2=new RotateGrating();
    RotateGrating grat3=new RotateGrating();

    private Alpha rotAlpha = new Alpha(-1, 20000);
    Appearance appear=new Appearance();
    Shape3D shape=new Shape3D();
    Graphics grp;
    private SimpleUniverse u = null;
    static Dimension screenSize =java.awt.
                                 Toolkit.
                                 getDefaultToolkit().
                                 getScreenSize();
   Color3f green  = new Color3f(0.0f, 1.0f, 0.0f);
   Color3f blue  = new Color3f(0.0f, 0.0f, 1.0f);
   Color3f red  = new Color3f(1.0f, 0.0f, 0.0f);
   Color3f black  = new Color3f(0.0f, 0.0f, 0.0f);
   int numOfArray = 200;
   double height=1.7, radius=1.2, step=1.0;

    public void renderLeft()
    {
	if (gcLeft == null)
        {
	 gcLeft = canvas.getGraphicsContext3D();
         viewleft=canvas.getView();
         grat1.setParameter(numOfArray, height, radius, step, red);
         grt1=grat1.getRotate();
	}
	double angle1 = rotAlpha.value() * 2.0*Math.PI;
        temp.rotY(-angle1);
        cmtleft.rotZ(Math.PI/2);
        cmtleft.mul(temp);
	// Render the geometry for this frame
        viewleft.setMinimumFrameCycleTime(0);
	gcLeft.clear();
	gcLeft.setModelTransform(cmtleft);
        gcLeft.setStereoMode(GraphicsContext3D.STEREO_LEFT);
        gcLeft.draw(grt1);
        gcLeft.draw(grt3);
	canvas.swap();
        gcLeft.setStereoMode(GraphicsContext3D.STEREO_LEFT);
    }

    public void renderRight()
    {
	if (gc == null)
        {
	 gc = canvas.getGraphicsContext3D();
         view=canvas.getView();
         grat2.setParameter(numOfArray, height, radius, step, green);
         grt2=grat2.getRotate();
	}
	double angle = rotAlpha.value() * 2.0*Math.PI;
	cmt.rotY(-angle);
	// Render the geometry for this frame
	gc.clear();
	gc.setModelTransform(cmt);
        view.setMinimumFrameCycleTime(0);
        gc.setStereoMode(GraphicsContext3D.STEREO_RIGHT);
        gc.draw(grt2);
        gc.draw(grt3);
	canvas.swap();
        gc.setStereoMode(GraphicsContext3D.STEREO_RIGHT);
    }

    public void run()
    {
   grat3.setParameter(numOfArray, height, radius, step, red);
   grt3=grat3.getRotate();

     while (true)
      {
       renderLeft();
       renderRight();
      }
    }

    public BrTestGratings()
    {
    }

    public void init()
    {
	setLayout(new BorderLayout());
        GraphicsConfigTemplate3D g3d = new GraphicsConfigTemplate3D();
        g3d.setStereo(GraphicsConfigTemplate3D.REQUIRED);
        GraphicsConfiguration config = GraphicsEnvironment.
                                   getLocalGraphicsEnvironment().
                                   getDefaultScreenDevice().
                                   getBestConfiguration(g3d);
        canvas = new Canvas3D(config);
        canvas.stopRenderer();
        canvas.setStereoEnable(true);
        canvas.setDoubleBufferEnable(true);
	add("Center", canvas);
	u = new SimpleUniverse(canvas);
        u.getViewingPlatform().setNominalViewingTransform();
	new Thread(this).start();
    }

    public void destroy()
    {
	u.removeAllLocales();
    }

    public static void main(String[] args)
    {
	new MainFrame(new BrTestGratings(),
                          screenSize.width,
                          screenSize.height);
    }
}
