{ //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: {


⇐ Предыдущая| |Следующая ⇒