{ //reads tokens from stream f_1n (a data member of Scene).
// building lights, getting materials, doing transformations, until it finds a new object // returns NULL if any error occurs, or end of file // читает метки из потока f_1n (элементы данных Scene), //создает источники света, получает материалы. // производит преобразования. // пока не находит новый объект // возвращает NULL, если обнаружена любая ошибка или // конец файла string s:
GeomObj * newShape: mTokenType typ;
while ((typ - (whichtoken( s - nexttokenO ))) !- T NULL) {
if(typ ~ UNION || typ - INTERSECTION || typ - DIFFERENCEa) {
switch(typ) {
case UNION: newShape - new UnionBooK): break:
case INTERSECTION: newShape - new IntersectionBooK): break:
case DIFFERENCEa: newShape - new DifferenceBooK):break:
}
// end of little switch
// конец малого переключателя
GeomObj* p - newShape:
p - getObjectO: // get left child // получаем левого потомка
1f(!p) return NULL: // Error! should always get an object // Ошибка! всегда должен получить объект
((Boolean*)newShape)-^left - р:
// hook it up // подключаем его р - getObjectO: // get right child // получаем правого потомка
if(!p) return NULL:
((Boolean*)newShape)->right - p: // hook it up // подключаем его
return newShape:
}
т
Приложение В. Некоторые полезные классы и служебные подпрограммы
// end of if(typ - UNION etc.... // конец if(typ - UNION etc.... switch(typ) {
case LIGHT: {
Point3 p; СоІогЗ с:
p.x - getFloatO: p.у - getFloatO: p.z - getFloatO:
c. red - getFloatO: c.green - getFloatO: c.blue - getFloatO: Light *1 - new Light:
l->setPosition(p):
l->setColor(c):
1-*next - light: // put it on the list // помещаем его в список
light - 1: break;} case ROTATE: {
float angle:
Vector3 u:
angle « getFloatO: u.x - getFloatO: u.y - getFloatO: u.z - getFloatO: affStk.rotate(angle.u):break:} case TRANSLATE: {
Vector3 d:
d. x - getFloatO: d.y - getFloatO: d.z - getFloatO: affStk.translate(d):break:}
case SCALE: {
float sx. sy. sz:
sx - getFloatO: sy - getFloatO: sz - getFloatO:
affStk.scale(sx. sy. sz):break;} case PUSH: affStk.dupO: break: case POP: affStk.popAndDropO: break; case IDENTITYAFFINE: affStk.setIdentityО:break: case AMBIENT: {