sen.makeLi ghtsOpenGL():
sen.drawSceneOpenGL():
// render the scene using OpenGL
// визуализируем сцену с использованием OpenGL
Первая команда передает в OpenGL описание источников света. Вторая команда использует метод drawSceneOpenGL( ) для рисования каждого объекта из списка объектов. Код этого метода очень прост:
void Scene :: drawSceneOpenGLО {
forCGeomObj* р - obj: р : р =p->next) p->drawOpenGL():
// draw it // рисуем зто }
Листинг 5.7. Методы drawOpenGL() для двух форм
void Sphere :: drawOpenGLO {
tellMaterialsGLO: // pass material data to OpenGL // передаем в OpenGL данные по материалу
glPushMatrixO;
glMultMatrixfCtransf.m): // load this object's matrix // загружаем матрицу данного объекта
glutSolidSphere(1.0.10.12): // draw a sphere // рисуем сферу
glPopMatrixO:
}
void Cone :: drawOpenGLO {
tellMaterialsGLO: // pass T^terial data to OpenGL // передаем в OPenGL данные по материалу
продолжением
Преобразования объектов
Листинг 5.7 (продолжение)
glPushMatrixO:
glMultMatrixf(transf.m); // load this object's matrix // загружаем матрицу данного объекта
glutSolidConeCl.0.1.0.10.12): // draw a cone // рисуем конус
glPopMatrixO:
}
Эта функция перемещает по списку объектов указатель и вызывает метод drawOpenGLO для каждого объекта поочередно. Это хороший пример применения полиморфизма, который является краеугольным камнем объектно-ориентированного программирования: каждая форма «знает», как нарисовать саму себя; она имеет метод drawOpenGLO, который вызывает соответствующую подпрограмму для этой формы. Поэтому когда указатель р указывает на сферу, то автоматически вызывается подпрограмма drawOpenGLO для сферы, а когда р указывает на конус, то вызывается подпрограмма drawOpenGLO для конуса и т. д. В листинге 5.7 приведены такие методы для классов Sphere и Cone; они отличаются друг от друга только вызываемой в конце OpenGL-подпрограммой рисования. Каждый метод вначале передает в OpenGL свойства материала объекта и затем обновляет матрицу моделирования-вида с помощью специфического для данного объекта аффинного преобразования. Исходная матрица моделирования-вида вталкивается в стек и впоследствии восстанавливается для защиты ее от изменений после окончания рисования объекта.