package tinyray.language;
import java.util.Iterator;
/**
* Die Klasse PrettyPrint implementiert einen Besucher (Visitor),
* der aus einem Syntaxbaum, der mit Hilfe von LanguageKit erzeugt ist,
* wieder einen sauber formatierten Tinyray-Code erzeugt.
*/
public class PrettyPrint implements Visitor<String, String> {
// Der Zeilenumbruch.
private final static String NEWLINE = "\r\n";
// Die Zeileneinrückung.
private final static String INDENT = "\t";
/**
* Initialisiert den PrettyPrint.
*/
public PrettyPrint() {}
/**
* Besucht einen besuchbaren Tinyray-Knoten und generiert einen
* entsprechenden, sauber formatierten "Tinyray"-Code mit einer
* bestimmten Einrückung und gibt diesen Code als Zeichenkette zurück.
* @param tinyray Der besuchbare Knoten.
* @param indent Die Einrückung.
* @return Der generierte "Tinyray"-Code.
*/
public String visit(Tinyray tinyray, String indent) {
String result = "";
result += indent + "Tinyray {";
result += NEWLINE;
result += tinyray.camera.accept(this, indent + INDENT);
result += NEWLINE;
result += tinyray.ambience.accept(this, indent + INDENT);
result += NEWLINE;
result += tinyray.background.accept(this, indent + INDENT);
result += NEWLINE;
result += tinyray.fog.accept(this, indent + INDENT);
result += NEWLINE;
Iterator<Sun> suns = tinyray.suns.iterator();
while (suns.hasNext()) {
result += suns.next().accept(this, indent + INDENT);
result += NEWLINE;
}
Iterator<Visitable> visitables = tinyray.visitables.iterator();
while (visitables.hasNext()) {
result += visitables.next().accept(this, indent + INDENT);
result += NEWLINE;
}
result += indent + "}"; // End of Tinyray
return result;
}
/**
* Besucht einen besuchbaren Camera-Knoten und generiert einen
* entsprechenden, sauber formatierten "Tinyray"-Code mit einer
* bestimmten Einrückung und gibt diesen Code als Zeichenkette zurück.
* @param camera Der besuchbare Knoten.
* @param indent Die Einrückung.
* @return Der generierte "Tinyray"-Code.
*/
public String visit(Camera camera, String indent) {
String result = "";
result += indent + "Camera {";
result += NEWLINE;
result += camera.location.accept(this, indent + INDENT);
result += "; // Location" + NEWLINE;
result += camera.lookAt.accept(this, indent + INDENT);
result += "; // Look At" + NEWLINE;
result += camera.up.accept(this, indent + INDENT);
result += " // Up" + NEWLINE;
result += indent + "}";
return result;
}
/**
* Besucht einen besuchbaren Background-Knoten und generiert einen
* entsprechenden, sauber formatierten "Tinyray"-Code mit einer
* bestimmten Einrückung und gibt diesen Code als Zeichenkette zurück.
* @param background Der besuchbare Knoten.
* @param indent Die Einrückung.
* @return Der generierte "Tinyray"-Code.
*/
public String visit(Background background, String indent) {
String result = "";
result += indent + "Background {";
result += NEWLINE;
result += background.color.accept(this, indent + INDENT);
result += " // Color" + NEWLINE;
result += indent + "}";
return result;
}
/**
* Besucht einen besuchbaren Ambience-Knoten und generiert einen
* entsprechenden, sauber formatierten "Tinyray"-Code mit einer
* bestimmten Einrückung und gibt diesen Code als Zeichenkette zurück.
* @param ambience Der besuchbare Knoten.
* @param indent Die Einrückung.
* @return Der generierte "Tinyray"-Code.
*/
public String visit(Ambience ambience, String indent) {
String result = "";
result += indent + "Ambience {";
result += NEWLINE;
result += ambience.color.accept(this, indent + INDENT);
result += " // Color" + NEWLINE;
result += indent + "}";
return result;
}
/**
* Besucht einen besuchbaren Fog-Knoten und generiert einen
* entsprechenden, sauber formatierten "Tinyray"-Code mit einer
* bestimmten Einrückung und gibt diesen Code als Zeichenkette zurück.
* @param fog Der besuchbare Knoten.
* @param indent Die Einrückung.
* @return Der generierte "Tinyray"-Code.
*/
public String visit(Fog fog, String indent) {
String result = "";
result += indent + "Fog {";
result += NEWLINE;
result += fog.color.accept(this, indent + INDENT);
result += "; // Color" + NEWLINE;
result += fog.density.accept(this, indent + INDENT);
result += " // Density" + NEWLINE;
result += indent + "}";
return result;
}
/**
* Besucht einen besuchbaren Defaults-Knoten und generiert einen
* entsprechenden, sauber formatierten "Tinyray"-Code mit einer
* bestimmten Einrückung und gibt diesen Code als Zeichenkette zurück.
* @param defaults Der besuchbare Knoten.
* @param indent Die Einrückung.
* @return Der generierte "Tinyray"-Code.
*/
public String visit(Defaults defaults, String indent) {
String result = "";
result += indent + "Defaults {";
result += NEWLINE;
result += defaults.parameters.accept(this, indent + INDENT);
result += NEWLINE;
result += indent + "}";
return result;
}
/**
* Besucht einen besuchbaren Sun-Knoten und generiert einen
* entsprechenden, sauber formatierten "Tinyray"-Code mit einer
* bestimmten Einrückung und gibt diesen Code als Zeichenkette zurück.
* @param sun Der besuchbare Knoten.
* @param indent Die Einrückung.
* @return Der generierte "Tinyray"-Code.
*/
public String visit(Sun sun, String indent) {
String result = "";
result += indent + "Sun {";
result += NEWLINE;
result += sun.direction.accept(this, indent + INDENT);
result += "; // Direction" + NEWLINE;
result += sun.color.accept(this, indent + INDENT);
result += " // Color" + NEWLINE;
result += indent + "}";
return result;
}
/**
* Besucht einen besuchbaren Bounding-Knoten und generiert einen
* entsprechenden, sauber formatierten "Tinyray"-Code mit einer
* bestimmten Einrückung und gibt diesen Code als Zeichenkette zurück.
* @param bounding Der besuchbare Knoten.
* @param indent Die Einrückung.
* @return Der generierte "Tinyray"-Code.
*/
public String visit(Bounding bounding, String indent) {
String result = "";
result += indent + "Bounding {";
result += NEWLINE;
Iterator<Visitable> visitables = bounding.visitables.iterator();
while (visitables.hasNext()) {
result += visitables.next().accept(this, indent + INDENT);
result += NEWLINE;
}
result += indent + "}";
return result;
}
/**
* Besucht einen besuchbaren Triangle-Knoten und generiert einen
* entsprechenden, sauber formatierten "Tinyray"-Code mit einer
* bestimmten Einrückung und gibt diesen Code als Zeichenkette zurück.
* @param triangle Der besuchbare Knoten.
* @param indent Die Einrückung.
* @return Der generierte "Tinyray"-Code.
*/
public String visit(Triangle triangle, String indent) {
String result = "";
result += indent + "Triangle {";
result += NEWLINE;
result += triangle.x.accept(this, indent + INDENT);
result += "; // X" + NEWLINE;
result += triangle.y.accept(this, indent + INDENT);
result += "; // Y" + NEWLINE;
result += triangle.z.accept(this, indent + INDENT);
if (triangle.parameters.visitables.size() > 0) {
result += "; // Z" + NEWLINE;
result += triangle.parameters.accept(this, indent + INDENT);
result += NEWLINE;
} else {
result += " // Z" + NEWLINE;
}
result += indent + "}";
return result;
}
/**
* Besucht einen besuchbaren Sphere-Knoten und generiert einen
* entsprechenden, sauber formatierten "Tinyray"-Code mit einer
* bestimmten Einrückung und gibt diesen Code als Zeichenkette zurück.
* @param sphere Der besuchbare Knoten.
* @param indent Die Einrückung.
* @return Der generierte "Tinyray"-Code.
*/
public String visit(Sphere sphere, String indent) {
String result = "";
result += indent + "Sphere {";
result += NEWLINE;
result += sphere.center.accept(this, indent + INDENT);
result += "; // Center" + NEWLINE;
result += sphere.radius.accept(this, indent + INDENT);
if (sphere.parameters.visitables.size() > 0) {
result += "; // Radius" + NEWLINE;
result += sphere.parameters.accept(this, indent + INDENT);
result += NEWLINE;
} else {
result += " // Radius" + NEWLINE;
}
result += indent + "}";
return result;
}
/**
* Besucht einen besuchbaren Plane-Knoten und generiert einen
* entsprechenden, sauber formatierten "Tinyray"-Code mit einer
* bestimmten Einrückung und gibt diesen Code als Zeichenkette zurück.
* @param plane Der besuchbare Knoten.
* @param indent Die Einrückung.
* @return Der generierte "Tinyray"-Code.
*/
public String visit(Plane plane, String indent) {
String result = "";
result += indent + "Plane {";
result += NEWLINE;
result += plane.x.accept(this, indent + INDENT);
result += "; // X" + NEWLINE;
result += plane.y.accept(this, indent + INDENT);
result += "; // Y" + NEWLINE;
result += plane.z.accept(this, indent + INDENT);
if (plane.parameters.visitables.size() > 0) {
result += "; // Z" + NEWLINE;
result += plane.parameters.accept(this, indent + INDENT);
result += NEWLINE;
} else {
result += " // Z" + NEWLINE;
}
result += indent + "}";
return result;
}
/**
* Besucht einen besuchbaren Parameters-Knoten und generiert einen
* entsprechenden, sauber formatierten "Tinyray"-Code mit einer
* bestimmten Einrückung und gibt diesen Code als Zeichenkette zurück.
* @param parameters Der besuchbare Knoten.
* @param indent Die Einrückung.
* @return Der generierte "Tinyray"-Code.
*/
public String visit(Parameters parameters, String indent) {
String result = "";
if (parameters.visitables.size() > 0) {
result += parameters.visitables.get(0).accept(this, indent);
if (parameters.visitables.size() > 1) {
result += ";";
}
result += " // Diffuse Color";
}
if (parameters.visitables.size() > 1) {
result += NEWLINE;
result += parameters.visitables.get(1).accept(this, indent);
if (parameters.visitables.size() > 2) {
result += ";";
}
result += " // Ambient Color";
}
if (parameters.visitables.size() > 2) {
result += NEWLINE;
result += parameters.visitables.get(2).accept(this, indent);
if (parameters.visitables.size() > 3) {
result += ";";
}
result += " // Specular";
}
if (parameters.visitables.size() > 3) {
result += NEWLINE;
result += parameters.visitables.get(3).accept(this, indent);
if (parameters.visitables.size() > 4) {
result += ";";
}
result += " // Shininess";
}
if (parameters.visitables.size() > 4) {
result += NEWLINE;
result += parameters.visitables.get(4).accept(this, indent);
result += " // Mirror";
}
return result;
}
/**
* Besucht einen besuchbaren Vector-Knoten und generiert einen
* entsprechenden, sauber formatierten "Tinyray"-Code mit einer
* bestimmten Einrückung und gibt diesen Code als Zeichenkette zurück.
* @param vector Der besuchbare Knoten.
* @param indent Die Einrückung.
* @return Der generierte "Tinyray"-Code.
*/
public String visit(Vector vector, String indent) {
String result = "";
result += indent + "[";
result += vector.x.accept(this, "");
result += ", ";
result += vector.y.accept(this, "");
result += ", ";
result += vector.z.accept(this, "");
result += "]";
return result;
}
/**
* Besucht einen besuchbaren Real-Knoten und generiert einen
* entsprechenden, sauber formatierten "Tinyray"-Code mit einer
* bestimmten Einrückung und gibt diesen Code als Zeichenkette zurück.
* @param real Der besuchbare Knoten.
* @param indent Die Einrückung.
* @return Der generierte "Tinyray"-Code.
*/
public String visit(Real real, String indent) {
String result = "";
result += indent + real.value;
return result;
}
}