}

Чтобы произвести отсечение, нужен временный многоугольник (temp Poly), который сразу создается (один раз на каждый вызов render для каж дой комнаты) для уменьшения затрат на его создание и уничтожение.

Процедура вывода как обычных граней, так и порталов вынесена в от дельный метод renderPoly, приводимый ниже.

void SubScene :: renderPoly ( View& view, const Camera&
camera, Polygon3D * poly, Polygon3D& tempPoly, const Frustrum& viewFrustrum ) const
{
if ( poly -> testFlag ( PF_PORTAL ) ) // this is a portal
{
Frustrum newFrustrum; Camera newCamera ( camera );
Portal * portal = (Portal *) poly;
SubScene * adjScene = portal ->
getAdjacentSubScene ( this );
tempPoly = *poly; // copy current poly to temp poly
// clip against view frustrum if ( !tempPoly.c]ipByFrustrum ( viewFrustrum ) ) return;
// build frustrum, corresponding to // clipped portal buildFrustrum ( camera.getPos (), tempPoly, newFrustrum );
// render through portal adjScene -> render ( view, newCamera, newFrustrum ) ;
}
view.draw ( *poly );
}

Данный метод проверяет, не является ли переданный многоугольник порталом (при помощи проверки флага PF_PORTAL), и если да, то строится многоугольник, являющийся видимой частью данного портала. Следующим шагом является построение области видимости по камере и видимой части портала. Далее соседней комнате по данным параметрам передается запрос на рендеринг ее видимой части.

После этого осуществляется рендеринг самого многоугольника. Это позволяет строить порталы с полупрозрачной текстурой или маской видимости.

Конечно, явный вызов метода renderPoly для каждой грани сцены не очень эффективен с точки зрения быстродействия, но вопросы оптимизации мы оставим до второй части работы.

Также нам понадобится объект, описывающий всю сцену целиком. Такой объект (очевидно, что он должен быть унаследован от класса Model) должен содержать в себе список всех комнат, поддерживать поиск комнаты по заданным координатам наблюдателя(заметим, что данная операция не всегда бывает однозначной - при использовании порталов с преобразованиями, о которых речь пойдет далее, возможна ситуация, когда несколько различных комнат соответствуют одной и той же части пространства). Ниже приводится описание такого класса.


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