float phase; public:
RotationAnimator ( const char * theName, const Vector3D& theAxis, float theSpeed, float thePhase = 0 ) : Animator ( theName )
{
axis = theAxis;
speed = theSpeed;
phase = thePhase; metaClass = &classlnstance;
}
-RotationAnimator ();
virtual void animate ( VisualObject * object,
float curTime );
static MetaClass classlnstance;
};

Ниже приводится реализация метода animate для этого класса.

ом.

void RotationAnimator :: animate ( VisualObject * object,
float curTime )
{
object -> animate (Transform3D :: getRotate ( axis, phase + speed * curTime ));
}

В результате этого появляется возможность легко задавать как сами объекты, так и способы их анимации прямо в sc-файле. Вместо явного задания всех параметров модели (координаты вершин, текстурные координаты для каждой из вершин и т. п.) удобнее будет прямо в sc-файле добавить поддержку нескольких стандартных типов моделей. Тогда в sc-файле можно будет просто задать имя файла с моделью и по нему будет построен объект, содержащий данную модель. На компакт-диске находятся загрузчики для следующих форматов: ase, md2 и md3.

Шейдеры

Еще одной полезной функциональностью, которую мы сейчас добавим, является поддержка шейдеров.

Шейдер (shader) - это процедура, управляющая закрашиванием объекта. В данной главе мы рассмотрим простые многопроходные шейдеры, аналогичные применяющимся в игре Quake HI Arena. Шейдеры, действующие на уровне отдельных пикселов (per-pixel shaders), будут рассматриваться во второй части работы.

Работа такого шейдера заключается в последовательном наложении текстур на объект с заданным законом наложения. Каждую операцию наложения мы будем называть проходом (pass). Отдельный проход характеризуется текстурой, способом вычисления текстурных координат (environment mapping или аффинная модификация существующих координат), цветом и способом наложения текстуры (blending mode). Суммируя все это вместе, мы получаем следующий класс:


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