} ;
Каждый такой объект имеет положение в пространстве (pos), базовый цвет (color) и преобразование (transform), применяемое перед выводом объекта. Также удобно сразу добавить ограничивающее тело (ААВВ).
Добавляем эффекты
Здесь метод draw служит для рисования объекта с заданными параметрами - объектом, в который осуществляется рисование, камерой, областью видимости и туманом.
Метод update служит для обновления состояния объекта и получает на вход ссылку на контроллер и на время, прошедшее с момента запуска программы.
Метод isTransparent служит для определения прозрачности объекта, поскольку прозрачные объекты должны выводиться в определенном порядке.
Защищенные (protected) методы doDraw, preDraw и postDraw реализуют основные этапы рендеринга объекта. Эти методы и сам метод draw выглядят следующим образом: о] ок.
void VisualObject :: draw ( Views view, const Cameras
camera, const FrustrumS frustrum, Fog * fog )
{
preDraw ( view );
doDraw ( view, camera, frustrum , fog ) ,-postDraw ( view );
}
void VisualObject :: preDraw ( Views view ) {
if ( saveFlags )
glPushAttrib ( saveFlags );
glMatrixMode ( GL_MODELVIEW ); glPushMatrix ();
glTranslatef ( pos.x, pos.y, pos.z ); view.apply ( curTransform );
}
void VisualObject :: postDraw ( Views view ) {
glPopMatrix ();
if ( saveFlags ) glPopAttrib ();
}
Как видно из приведенного кода, метод preDraw осуществляет сохранение состояния OpenGL, после чего применяет необходимые преобразования. Метод postDraw служит для восстановления состояния OpenGL
по завершении вывода. Для задания того, какие именно параметры OpenGL требуют сохранения, используется переменная saveFlags, задающая биты состояния OpenGL.
Для поддержки таких объектов необходимо ввести определенные изменения в классах SubScene и StencilSubScene, а именно добавить массив неполигональных объектов, методы по их добавлению и удалению, а также их рисование и анимацию.
В случае полупрозрачных объектов VisualObject (систем частиц, полупрозрачных моделей и т. п.) и полупрозрачных граней возникает вопрос об их правильном взаимном упорядочении. Заметим, что метод, используемый для упорядочения полупрозрачных граней, здесь малоприменим, поскольку в общем случае по объекту VisualObject нельзя построить плоскость, а разбивать его вдоль какой-либо плоскости также не всегда удобно. Ниже предлагается упрощенная модель, когда каждый такой объект представляется как точка. Тогда их можно упорядочить между собой и по отношению к BSP-дереву, построенному по полупрозрачным граням и "плавающим" порталам и зеркалам. Однако такой подход в некоторых сценах может работать некорректно.