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

/* Podlaha je tvořena modro-zelenou šachovnicí s malým červeným
   čtverečkem na pozici (0,0) v rovině (X,Z) a čísly podél
   os x a z.
*/

import java.awt.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.geometry.Text2D;
import javax.vecmath.*;


public class CheckerFloor
{
  private final static int FLOOR_LEN = 20;  // mělo by být sudé

  // barvy podlahy
  private final static Color3f blue = new Color3f(0.0f, 0.1f, 0.4f);
  private final static Color3f green = new Color3f(0.0f, 0.5f, 0.1f);
  private final static Color3f medRed = new Color3f(0.8f, 0.4f, 0.3f);
  private final static Color3f white = new Color3f(1.0f, 1.0f, 1.0f);


  private BranchGroup floorBG;


  public CheckerFloor()
  // vytvoří dlaždice, přidá označení počátku a značky na osách
  {
    floorBG = new BranchGroup();

    boolean isBlue;
    for(int z=-FLOOR_LEN/2; z <= (FLOOR_LEN/2)-1; z++) {
      isBlue = (z%2 == 0)? true : false;    // nastav barvu nového řádku
      for(int x=-FLOOR_LEN/2; x <= (FLOOR_LEN/2)-1; x++) {
        createTile(x, z, isBlue);
        isBlue = !isBlue;
      }
    }
    addOriginMarker();
    labelAxes();
  }  // konec metody: CheckerFloor()


  private void createTile(int x, int z, boolean isBlue)
  // Vytvoří souřadnice pro jedinou modrou nebo zelenou dlaždici,
  // jejíž levý roh se nachází v bodu (x,0,z)
  {
    // body vytváříme proti směru hodinových ručiček
    Point3f p4 = new Point3f(x, 0.0f, z);   
    Point3f p3 = new Point3f(x+1.0f, 0.0f, z);
    Point3f p2 = new Point3f(x+1.0f, 0.0f, z+1.0f);
    Point3f p1 = new Point3f(x, 0.0f, z+1.0f);
    Color3f col = (isBlue) ? blue : green;
    floorBG.addChild( new ColouredTile(p1, p2, p3, p4, col) );
  }  // konec metody: createTile()


  private void addOriginMarker()
  // červený čtvereček se středem v bodu (0,0,0) o délce 0,5
  { // body vytváříme proti směru hodinových ručiček a kousek nad podlahou
    Point3f p4 = new Point3f(-0.25f, 0.01f, -0.25f);   
    Point3f p3 = new Point3f(0.25f, 0.01f, -0.25f);    
    Point3f p2 = new Point3f(0.25f, 0.01f, 0.25f);
    Point3f p1 = new Point3f(-0.25f, 0.01f, 0.25f);
    floorBG.addChild( new ColouredTile(p1, p2, p3, p4, medRed) );
  } // konec metody: addOriginMarker();


  private void labelAxes()
  // Umístí čísla podél os x a z do celočíselných pozic
  {
    Vector3d pt = new Vector3d();
    for (int i=-FLOOR_LEN/2; i <= FLOOR_LEN/2; i++) {
      pt.x = i;
      floorBG.addChild( makeText(pt,""+i) );   // podél osy x
    }

    pt.x = 0;
    for (int i=-FLOOR_LEN/2; i <= FLOOR_LEN/2; i++) {
      pt.z = i;
      floorBG.addChild( makeText(pt,""+i) );   // podél osy z
    }
  }  // konec metody: labelAxes()


  private TransformGroup makeText(Vector3d vertex, String text)
  // Ve stanoveném vrcholu vytvoří objekt typu Text2D
  {
    Text2D message = new Text2D(text, white, "SansSerif", 36, Font.BOLD );
       // font Sans Serif velikosti 36, tučně

    TransformGroup tg = new TransformGroup();
    Transform3D t3d = new Transform3D();
    t3d.setTranslation(vertex);
    tg.setTransform(t3d);
    tg.addChild(message);
    return tg;
  } // konec metody: getTG()



  public BranchGroup getBG()
  {  return floorBG;  }


}  // konec třídy: CheckerFloor

