
// SecondViewPanel.java
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th

/* Tento panel zobrazuje zpětnou kameru s výhledem na scénu
   vytvořenou ve třídě WrapMaze3D.
 
   Uzel typu TG pro kameru je spojen s hlavní scénou
   poocí objektu typu WrapMaze3D a odkaz na uzel camera2TG
   získá voláním getCamera2TG().   
*/

import java.awt.*;
import javax.swing.*;

import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.universe.*;


public class SecondViewPanel extends JPanel
{
  private static final int PWIDTH = 256;   // velikost panelu
  private static final int PHEIGHT = 256; 

  private MazeManager mazeMan;
  private TransformGroup camera2TG;  
     // Uzel typu TG pro kameru je spojen s hlavní scénou


  public SecondViewPanel(MazeManager mm)
  {  
    mazeMan = mm;

    setLayout(new BorderLayout());
    setOpaque(false);
    setPreferredSize( new Dimension(PWIDTH, PHEIGHT));
    GraphicsConfiguration config =
					SimpleUniverse.getPreferredConfiguration();
    Canvas3D canvas3D = new Canvas3D(config);
    add("Center", canvas3D);    // panel JPanel obsahuje jeho vlastní objekt typu Canvas3D

    initView(canvas3D);
  } // konec metody: createPanel()


   private void initView(Canvas3D canvas3D)
   // vytvoří výhled pro uzel typu Canvas3D
   {
     ViewPlatform vp = new ViewPlatform();

     // vytvoř uzel typu View pro objekt typu ViewPlatform
     // má stejné atributy, jako výhled hlavní kamery
     View view = new View();
     view.setPhysicalBody( new PhysicalBody() );
     view.setPhysicalEnvironment( new PhysicalEnvironment() );
     view.addCanvas3D(canvas3D);
     view.attachViewPlatform(vp);   // připoj uzel typu ViewPlatform

     view.setFieldOfView( Math.toRadians(90.0));  // širší zorné pole
     // 10 and 0.1; keep ratio between 100-1000
     view.setBackClipDistance(20);      // můžeme vidět hodně daleko
     view.setFrontClipDistance(0.05);   // můžeme vidět blízské objekty

     camera2TG = setCameraPosition();
 	 camera2TG.addChild(vp);     // přidej uzel typu ViewPlatform k uzlu typu TG pro kameru
   }  // konec metody: makeView()


  private TransformGroup setCameraPosition()
  /* Vytvoří uzel typu TG pro kameru, která je umístěna na stejném místě jako
     hlavní kamera, ale která je otočena v opačném směru. Směr dopředu jde
     podél kladné osy z, takže dozadu by měl ukazovat v záporném z-ovém směru. */
  {
    Vector3d startVec = mazeMan.getMazeStartPosn();

    Transform3D t3d = new Transform3D( );
    // argumenty jsou: pozice pozorovatele, kam se dívá, směr nahoru
    t3d.lookAt( new Point3d(startVec.x, startVec.y, startVec.z), 
				new Point3d(startVec.x, startVec.y, -10),  
                           // any -z direction will do
				new Vector3d(0,1,0));
    t3d.invert();

    TransformGroup tg = new TransformGroup(t3d);
    tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);  // will move
	tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
    return tg;
  }  // konec metody: setCameraPosition()


  public TransformGroup getCamera2TG()
  // volá se z objektu typu WrapMaze3D pro připojení tohoto uzlu typu TG do scény
  {  return camera2TG;  }

} // konec třídy: SecondViewPanel