getAdjacentSubScene ( this );
tempPoly = *poly; // copy current poly to temp poly
// clip against view frustrum if ( !tempPoly.clipByFrustrum ( viewFrustrum ) ) return;
// apply transform if ( portal -> getTransform () != NULL ) {
newCamera.transform ( *portal -> getTransform () ); tempPoly.transform ( *portal -> getTransform () );
}
// build frustrum, corresponding // to clipped portal buildFrustrum ( newCamera.getPos (), tempPoly, newFrustrum );
// render through portal adjScene -> render ( view, newCamera, newFrustrum,
post, ob );
view.apply ( camera ); // restore camera
}
else
if ( poly -> testFlag ( PF_MIRROR ) ) {
Frustrum newFrustrum; Camera mirroredCamera ( camera );
Transform3Dtr ( Transform3D :: getMirror (*poly -> getPlane ()));
// build mirrored camera mirroredCamera. transf orm ( tr ) ,-
// build corresponding // view frustrum tempPoly = *poly; // copy current poly to temp poly

Пишем портальный рендерер (часть III)

// clip against view frustrum if ( ! tempPoly.сlipByFrustrum ( viewFrustrum ) ) return;

// build frustrum, corresponding // to clipped portal buildFrustrum ( mirroredCamera.getPos (), tempPoly, newFrustrum );
// render with mirrored camera if ( mirrorDepth < World :: maxMirrorDepth ) {
mirrorDepth++;
render ( view, mirroredCamera, newFrustrum, post, ob ) ,-mirrorDepth--;
}
// restore camera view.apply ( camera ) ;
}
// do not draw portals without // texture
if ( poly -> getTexture () != NULL || Ipoly -> testFlag ( PF_PORTAL ) ) view.draw ( *poly );
polysRendered++;
}
view.draw ( *poly ) ; polysRendered++;
}

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

Обратите внимание на использование переменной mirrorDepth. Она служит для прекращения бесконечной рекурсии, которая может возникнуть при обработке отражений и порталов с преобразованиями. Позволяется только не более заданного числа отражений и порталов с преобразованием.


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