import javax.media.j3d.*;
import javax.vecmath.*;
import java.awt.*;

public class House extends BranchGroup
{
	private double width = 6;
	private double depth = 7;
	private double height1 = 3;
	private double height2 = 2;

	public House()
	{
		createBase();
		createRoof();
	}

	private void createBase()
	{
		IndexedQuadArray houseGeometry = new IndexedQuadArray(8, IndexedQuadArray.COORDINATES, 20);

		double xL = width / -2;
		double xR = width / 2;

		double yB = 0;
		double yT = height1;

		double zB = depth / 2;
		double zF = depth / -2;

		houseGeometry.setCoordinate(0, new Point3d(xL, yB, zB));
		houseGeometry.setCoordinate(1, new Point3d(xR, yB, zB));
		houseGeometry.setCoordinate(2, new Point3d(xR, yT, zB));
		houseGeometry.setCoordinate(3, new Point3d(xL, yT, zB));
		houseGeometry.setCoordinate(4, new Point3d(xL, yB, zF));
		houseGeometry.setCoordinate(5, new Point3d(xR, yB, zF));
		houseGeometry.setCoordinate(6, new Point3d(xR, yT, zF));
		houseGeometry.setCoordinate(7, new Point3d(xL, yT, zF));


		houseGeometry.setCoordinateIndex(0, 0);
		houseGeometry.setCoordinateIndex(1, 1);
		houseGeometry.setCoordinateIndex(2, 2);
		houseGeometry.setCoordinateIndex(3, 3);

		houseGeometry.setCoordinateIndex(4, 1);
		houseGeometry.setCoordinateIndex(5, 5);
		houseGeometry.setCoordinateIndex(6, 6);
		houseGeometry.setCoordinateIndex(7, 2);

		houseGeometry.setCoordinateIndex(8, 5);
		houseGeometry.setCoordinateIndex(9, 4);
		houseGeometry.setCoordinateIndex(10, 7);
		houseGeometry.setCoordinateIndex(11, 6);

		houseGeometry.setCoordinateIndex(12, 4);
		houseGeometry.setCoordinateIndex(13, 0);
		houseGeometry.setCoordinateIndex(14, 3);
		houseGeometry.setCoordinateIndex(15, 7);

		houseGeometry.setCoordinateIndex(16, 0);
		houseGeometry.setCoordinateIndex(17, 4);
		houseGeometry.setCoordinateIndex(18, 5);
		houseGeometry.setCoordinateIndex(19, 1);

		Appearance app = new Appearance();

		PolygonAttributes pa = new PolygonAttributes();
		//pa.setPolygonMode(PolygonAttributes.POLYGON_LINE);
		//pa.setCullFace(PolygonAttributes.CULL_NONE);
		app.setPolygonAttributes(pa);

		ColoringAttributes ca = new ColoringAttributes();
		ca.setColor(new Color3f(new Color(128, 128, 64)));
		app.setColoringAttributes(ca);

		Shape3D houseShape = new Shape3D(houseGeometry, app);

		addChild(houseShape);
	}

	private void createRoof()
	{
		IndexedTriangleArray roofGeometry = new IndexedTriangleArray(6, IndexedTriangleArray.COORDINATES, 18);

		double xL = width / -2;
		double xM = 0;
		double xR = width / 2;

		double yB = height1;
		double yT = height1 + height2;

		double zB = depth / 2;
		double zF = depth / -2;

		roofGeometry.setCoordinate(0, new Point3d(xL, yB, zB));
		roofGeometry.setCoordinate(1, new Point3d(xR, yB, zB));
		roofGeometry.setCoordinate(2, new Point3d(xM, yT, zB));
		roofGeometry.setCoordinate(3, new Point3d(xL, yB, zF));
		roofGeometry.setCoordinate(4, new Point3d(xR, yB, zF));
		roofGeometry.setCoordinate(5, new Point3d(xM, yT, zF));

		roofGeometry.setCoordinateIndex(0, 0);
		roofGeometry.setCoordinateIndex(1, 1);
		roofGeometry.setCoordinateIndex(2, 2);

		roofGeometry.setCoordinateIndex(3, 1);
		roofGeometry.setCoordinateIndex(4, 4);
		roofGeometry.setCoordinateIndex(5, 2);

		roofGeometry.setCoordinateIndex(6, 4);
		roofGeometry.setCoordinateIndex(7, 5);
		roofGeometry.setCoordinateIndex(8, 2);

		roofGeometry.setCoordinateIndex(9, 4);
		roofGeometry.setCoordinateIndex(10, 3);
		roofGeometry.setCoordinateIndex(11, 5);

		roofGeometry.setCoordinateIndex(12, 3);
		roofGeometry.setCoordinateIndex(13, 0);
		roofGeometry.setCoordinateIndex(14, 5);

		roofGeometry.setCoordinateIndex(15, 0);
		roofGeometry.setCoordinateIndex(16, 2);
		roofGeometry.setCoordinateIndex(17, 5);

		Appearance app = new Appearance();

		PolygonAttributes pa = new PolygonAttributes();
		//pa.setPolygonMode(PolygonAttributes.POLYGON_LINE);
		//pa.setCullFace(PolygonAttributes.CULL_NONE);
		app.setPolygonAttributes(pa);

		ColoringAttributes ca = new ColoringAttributes();
		ca.setColor(new Color3f(new Color(255, 128, 64)));
		app.setColoringAttributes(ca);

		Shape3D roofShape = new Shape3D(roofGeometry, app);

		addChild(roofShape);
	}
}

