double getNumber(StreamTokenizer st) throws IOException
{
if (st.nextToken() != StreamTokenizer.TT_NUMBER) {
System.err.println("ERROR: number expected in line "+st.lineno());
throw new IOException(st.toString());
}
return st.nval;
}
void ReadInput(InputStream is) throws IOException
{
StreamTokenizer st = new StreamTokenizer(is);
st.commentChar('#');
scan: while (true) {
switch (st.nextToken()) {
default:
break scan;
case StreamTokenizer.TT_WORD:
if (st.sval.equals("sphere")) {
Vector3D v = new Vector3D((float) getNumber(st), (float) getNumber(st), (float) getNumber(st));
float r = (float) getNumber(st);
objectList.addElement(new Sphere(currentSurface, v, r));
} else
if (st.sval.equals("eye")) {
eye = new Vector3D((float) getNumber(st), (float) getNumber(st), (float) getNumber(st));
} else
if (st.sval.equals("lookat")) {
lookat = new Vector3D((float) getNumber(st), (float) getNumber(st), (float) getNumber(st));
} else
if (st.sval.equals("up")) {
up = new Vector3D((float) getNumber(st), (float) getNumber(st), (float) getNumber(st));
} else
if (st.sval.equals("fov")) {
fov = (float) getNumber(st);
} else
if (st.sval.equals("background")) {
background = new Color((float) getNumber(st), (float) getNumber(st), (float) getNumber(st));
} else
if (st.sval.equals("light")) {
float r = (float) getNumber(st);
float g = (float) getNumber(st);
float b = (float) getNumber(st);
if (st.nextToken() != StreamTokenizer.TT_WORD) {
throw new IOException(st.toString());
}
if (st.sval.equals("ambient")) {
lightList.addElement(new Light(Light.AMBIENT, null, r, g, b));
} else
if (st.sval.equals("directional")) {
Vector3D v = new Vector3D((float) getNumber(st), (float) getNumber(st), (float) getNumber(st));
lightList.addElement(new Light(Light.DIRECTIONAL, v, r, g, b));
} else
if (st.sval.equals("point")) {
Vector3D v = new Vector3D((float) getNumber(st), (float) getNumber(st), (float) getNumber(st));
lightList.addElement(new Light(Light.POINT, v, r, g, b));
} else {
System.err.println("ERROR: in line "+st.lineno()+" at "+st.sval);
throw new IOException(st.toString());
}
} else
if (st.sval.equals("surface")) {
float r = (float) getNumber(st);
float g = (float) getNumber(st);
float b = (float) getNumber(st);
float ka = (float) getNumber(st);
float kd = (float) getNumber(st);
float ks = (float) getNumber(st);
float ns = (float) getNumber(st);
float kr = (float) getNumber(st);
float kt = (float) getNumber(st);
float index = (float) getNumber(st);
currentSurface = new Surface(r, g, b, ka, kd, ks, ns, kr, kt, index);
}
break;
}
}
is.close();
if (st.ttype != StreamTokenizer.TT_EOF)
throw new IOException(st.toString());
}
An example input file:
eye 0 3 10
lookat 0 -1 0
up 0 1 0
fov 30
background 0.2 0.8 0.9
light 1 1 1 ambient
light 1 1 1 directional -1 -2 -1
light 0.5 0.5 0.5 point -1 2 -1
surface 0.7 0.2 0.8 0.5 0.4 0.2 10.0 0.0 0.0 1.0
sphere -2 -3 -2 1.5
sphere 0 -3 -2 1.5
sphere 2 -3 -2 1.5
sphere -1 -3 -1 1.5
sphere 1 -3 -1 1.5
sphere -2 -3 0 1.5
sphere 0 -3 0 1.5
sphere 2 -3 0 1.5
sphere -1 -3 1 1.5
sphere 1 -3 1 1.5
sphere -2 -3 2 1.5
sphere 0 -3 2 1.5
sphere 2 -3 2 1.5
surface 0.7 0.2 0.2 0.5 0.4 0.2 3.0 0.0 0.0 1.0
sphere -1 -3 -2 1.5
sphere 1 -3 -2 1.5
sphere -2 -3 -1 1.5
sphere 0 -3 -1 1.5
sphere 2 -3 -1 1.5
sphere -1 -3 0 1.5
sphere 1 -3 0 1.5
sphere -2 -3 1 1.5
sphere 0 -3 1 1.5
sphere 2 -3 1 1.5
sphere -1 -3 2 1.5
sphere 1 -3 2 1.5
surface 0.4 0.4 0.4 0.1 0.1 0.6 100.0 0.8 0.0 1.0
sphere 0 0 0 1