package brtestgratings;

import java.util.*;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.Dimension;
import java.awt.GraphicsEnvironment;
import javax.swing.JWindow;
import com.sun.j3d.utils.geometry.*;

public class BrTestGratings extends JWindow implements Runnable
{
   View view;
    private Canvas3D canvas;
    private GraphicsContext3D gc = null;
    RotateGrating grating1=new RotateGrating();
    RotateGrating grating2=new RotateGrating();
    private Geometry grt1, black1;
    private Transform3D cmt = new Transform3D();
    private Transform3D cmtanu = new Transform3D();
    private Transform3D cmtemp=new Transform3D();
    private Transform3D trans1 = new Transform3D();
    private Transform3D trans2 = new Transform3D();
    private Transform3D c1 = new Transform3D();
    private Transform3D c2 = new Transform3D();
    Color3f colorLeft=new Color3f(0.0f, 1.0f, 0.0f);
    Color3f colorBlack=new Color3f(0.0f, 0.0f, 0.0f);
    private SimpleUniverse u = null;
    static Dimension screenSize =java.awt.
                                 Toolkit.
                                 getDefaultToolkit().
                                 getScreenSize();
   int numOfArray = 300;
   double height=1.8, radius=1.4, step=1.0;
   private Alpha rotAlpha = new Alpha(-1, 20000);

    public void renderTwo()
    {
	if (gc == null)
        {
	 gc = canvas.getGraphicsContext3D();
         gc.setBufferOverride(true);
         view=canvas.getView();
         view.setMinimumFrameCycleTime(0);
         grating1.setParameter(numOfArray, height, radius, step, colorLeft);
         grating2.setParameter(numOfArray, height, radius, step, colorBlack);
         grt1=grating1.getRotate(canvas, 0);
         black1=grating2.getRotate(canvas, 0);
	}

	double angle1 = rotAlpha.value() * 2.0*Math.PI;
        cmtemp.rotY(-angle1);
        cmt.rotZ(Math.PI/2);
        cmt.mul(cmtemp);

	c1.set(cmt);
	c1.mul(trans1);
	c2.mul(trans2);

        gc.setModelTransform(c1);
        gc.setStereoMode(GraphicsContext3D.STEREO_LEFT);

	gc.clear();
        gc.draw(grt1);
//        gc.draw(black1);
	canvas.swap();

    }

    public void run()
    {
     while (true)
      {
       renderTwo();
      }
    }

    public BrTestGratings()
    {
     super();
        GraphicsConfigTemplate3D g3d = new GraphicsConfigTemplate3D();
        g3d.setStereo(GraphicsConfigTemplate3D.REQUIRED);
        GraphicsConfiguration config = GraphicsEnvironment.
                                   getLocalGraphicsEnvironment().
                                   getDefaultScreenDevice().
                                   getBestConfiguration(g3d);
        canvas = new Canvas3D(config);
	trans1 = new Transform3D();
	trans1.set( new Vector3f(-0.0f, 0, 0));
	trans2 = new Transform3D();
	trans2.set(new Vector3f(0.0f, 0, 0));
        Map map = canvas.queryProperties();
        canvas.setStereoEnable(true);

      if (canvas.getStereoAvailable()) {
	    System.out.print("stereo support");
      }

        canvas.stopRenderer();
        canvas.setDoubleBufferEnable(true);
        getContentPane().add(canvas, BorderLayout.CENTER);

	u = new SimpleUniverse(canvas);
        u.getViewingPlatform().setNominalViewingTransform();
	new Thread(this).start();
    }

    public static void main(String[] args)
    {
         BrTestGratings win = new BrTestGratings();
         java.awt.Dimension screenSize = java.awt.Toolkit.
                                         getDefaultToolkit().
                                         getScreenSize();
         win.setSize(screenSize.width/2, screenSize.height);
         win.setLocation(0,0);
         win.setVisible(true);
    }
}

