package tinyray.language;
import java.util.Iterator;
import java.util.List;
import tinyray.frontend.ParseTreeKit;
/**
* Die Klasse LanguageKit ist eine konkrete Fabrik, mit der ein
* Syntaxbaum bestehend aus besuchbaren Knoten erzeugt werden kann.
*/
public class LanguageKit implements ParseTreeKit<Visitable, Tinyray> {
/**
* Erzeugt einen Tinyray-Knoten und gibt diesen Knoten zurück.
* @param arguments Die Kindelemente des Tinyray-Knotens.
* @return Der Tinyray-Knoten.
*/
public Tinyray getTinyray(List<Visitable> arguments) {
Tinyray result = new Tinyray();
Iterator<Visitable> iterator = arguments.listIterator();
while (iterator.hasNext()) {
Visitable next = iterator.next();
if (next instanceof Camera) {
result.camera = (Camera)next;
} else if (next instanceof Background) {
result.background = (Background)next;
} else if (next instanceof Ambience) {
result.ambience = (Ambience)next;
} else if (next instanceof Fog) {
result.fog = (Fog)next;
} else if (next instanceof Sun) {
result.suns.add((Sun)next);
} else {
result.visitables.add(next);
}
}
return result;
}
/**
* Erzeugt einen Camera-Knoten und gibt diesen Knoten zurück.
* @param arguments Die Kindelemente des Camera-Knotens.
* @return Der Camera-Knoten.
*/
public Visitable getCamera(List<Visitable> arguments) {
Camera result = new Camera();
result.location = (Vector)arguments.get(0);
result.lookAt = (Vector)arguments.get(1);
if (arguments.size() > 2) {
result.up = (Vector)arguments.get(2);
} else {
result.up.y = new Real(1.0);
}
return result;
}
/**
* Erzeugt einen Background-Knoten und gibt diesen Knoten zurück.
* @param arguments Die Kindelemente des Background-Knotens.
* @return Der Background-Knoten.
*/
public Visitable getBackground(List<Visitable> arguments) {
Background result = new Background();
result.color = (Vector)arguments.get(0);
return result;
}
/**
* Erzeugt einen Ambience-Knoten und gibt diesen Knoten zurück.
* @param arguments Die Kindelemente des Ambience-Knotens.
* @return Der Ambience-Knoten.
*/
public Visitable getAmbience(List<Visitable> arguments) {
Ambience result = new Ambience();
result.color = (Vector)arguments.get(0);
return result;
}
/**
* Erzeugt einen Fog-Knoten und gibt diesen Knoten zurück.
* @param arguments Die Kindelemente des Fog-Knotens.
* @return Der Fog-Knoten.
*/
public Visitable getFog(List<Visitable> arguments) {
Fog result = new Fog();
result.color = (Vector)arguments.get(0);
result.density = (Real)arguments.get(1);
return result;
}
/**
* Erzeugt einen Defaults-Knoten und gibt diesen Knoten zurück.
* @param arguments Die Kindelemente des Defaults-Knotens.
* @return Der Defaults-Knoten.
*/
public Visitable getDefaults(List<Visitable> arguments) {
Defaults result = new Defaults();
result.parameters = (Parameters)arguments.get(0);
return result;
}
/**
* Erzeugt einen Bounding-Knoten und gibt diesen Knoten zurück.
* @param arguments Die Kindelemente des Bounding-Knotens.
* @return Der Bounding-Knoten.
*/
public Visitable getBounding(List<Visitable> arguments) {
Bounding result = new Bounding();
Iterator<Visitable> visitables = arguments.iterator();
while (visitables.hasNext()) {
result.visitables.add(visitables.next());
}
return result;
}
/**
* Erzeugt einen Triangle-Knoten und gibt diesen Knoten zurück.
* @param arguments Die Kindelemente des Triangle-Knotens.
* @return Der Triangle-Knoten.
*/
public Visitable getTriangle(List<Visitable> arguments) {
Triangle result = new Triangle();
result.x = (Vector)arguments.get(0);
result.y = (Vector)arguments.get(1);
result.z = (Vector)arguments.get(2);
if (arguments.size() > 3) {
result.parameters = (Parameters)arguments.get(3);
}
return result;
}
/**
* Erzeugt einen Sphere-Knoten und gibt diesen Knoten zurück.
* @param arguments Die Kindelemente des Sphere-Knotens.
* @return Der Sphere-Knoten.
*/
public Visitable getSphere(List<Visitable> arguments) {
Sphere result = new Sphere();
result.center = (Vector)arguments.get(0);
result.radius = (Real)arguments.get(1);
if (arguments.size() > 2) {
result.parameters = (Parameters)arguments.get(2);
}
return result;
}
/**
* Erzeugt einen Plane-Knoten und gibt diesen Knoten zurück.
* @param arguments Die Kindelemente des Plane-Knotens.
* @return Der Plane-Knoten.
*/
public Visitable getPlane(List<Visitable> arguments) {
Plane result = new Plane();
result.x = (Vector)arguments.get(0);
result.y = (Vector)arguments.get(1);
result.z = (Vector)arguments.get(2);
if (arguments.size() > 3) {
result.parameters = (Parameters)arguments.get(3);
}
return result;
}
/**
* Erzeugt einen Sun-Knoten und gibt diesen Knoten zurück.
* @param arguments Die Kindelemente des Sun-Knotens.
* @return Der Sun-Knoten.
*/
public Visitable getSun(List<Visitable> arguments) {
Sun result = new Sun();
result.direction = (Vector)arguments.get(0);
result.color = (Vector)arguments.get(1);
return result;
}
/**
* Erzeugt einen Parameters-Knoten und gibt diesen Knoten zurück.
* @param arguments Die Kindelemente des Parameters-Knotens.
* @return Der Parameters-Knoten.
*/
public Visitable getParameters(List<Visitable> arguments) {
Parameters result = new Parameters();
for (int i = 0; i < arguments.size(); i++) {
result.visitables.add(arguments.get(i));
}
return result;
}
/**
* Erzeugt einen Vector-Knoten und gibt diesen Knoten zurück.
* @param arguments Die Kindelemente des Vector-Knotens.
* @return Der Vector-Knoten.
*/
public Visitable getVector(List<Visitable> arguments) {
Vector result = new Vector();
result.x = (Real)arguments.get(0);
result.y = (Real)arguments.get(1);
result.z = (Real)arguments.get(2);
return result;
}
/**
* Erzeugt einen Real-Knoten und gibt diesen Knoten zurück.
* @param arguments Die Kindelemente des Real-Knotens.
* @return Der Real-Knoten.
*/
public Visitable getReal(String real) {
return new Real(Double.parseDouble(real));
}
}