Одновременно проверяется, не соответствует какой-либо из видимых граней небо (подробнее о рендеринге неба в следующей главе). Если да, то устанавливается флаг видимости неба в данном кадре.

В

void Quake2Level :: buildFacesList ( const Cameras camera ) {
Quake2BspLeaf * leaf = file -> leaves;
for ( int i = 0; i < file -> numLeaves; i++, leaf++ ) if ( clusterTable [leaf -> cluster] == frameNo ) // cluster is marked as visible
if ( isLeafInFrustrum ( leaf,
camera.getViewFrustrum () ) ) addFacesList ( leaf -> firstLeafFace, leaf -> numLeafFaces, camera.getPos () );
numVisibleFaces = 0; drawSky = false,-
for ( i = 0; i < numFaces; i++ ) if ( isFaceMarked ( i ) ) {
Quake2Face * face = Sfile -> faces [i];
if ( file -> texlnfos [face ->
texlnfo].flags & SURF_SKY ) drawSky = true;

Пишем рендерер уровней Quake 11

else
visPolys [numVisibleFaces++] = polys [i];
}
}
void Quake2Level :: addFacesList ( int firstFace,
int count, const Vector3D& pos )
{
for ( int i = 0; i < count; i++ )
{
int faceNo = file -> leafFaces [firstFace + i]; // add it, if it's a front face
if ( Ipolys [faceNo] -> isOk () )
// check whether plane is defined continue;
if ( polys [faceNo] -> isFrontFacing ( pos ) ) if ( !isFaceMarked ( faceNo ) ) // if not already marked -> mark markFace ( faceNo );
}
}

Наконец, для вывода всех граней из списка видимых служит следующий метод:

void Quake2Level :: drawFaces ( View& view,
const Cameras camera )
{
view.lock ();
view.apply ( camera ) ;
// draw polys for ( int i = 0; i < numVisibleFaces; i++ ) view.draw ( *visPolys [i] );
// draw lightmaps glPushAttrib ( GL_COLOR_BUFFER_BIT | GL_TEXTURE_BIT | GL_DEPTH_BUFFER_BIT );
glDepthFunc ( GL_LEQUAL ); glDepthMask ( GL_FALSE ); glEnable ( GL_BLEND );
glBlendFunc ( GL_ONE, GL_SRC_COLOR ); glColor4f ( 1, 1, 1, 1 );
for ( i = 0; i < numVisibleFaces; i++ ) {

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