Texture * texture = Application ::instance ->
getResourceManager () -> getTexture ( dir + texName + ".wal" ) ;
float txtWidth = (float)texture -> getWidth ();
float txtHeight = (float)texture -> getHeight ();
Mapping mapping ( texlnfo -> uAxis / txtWidth,
texlnfo -> uOffset / txtWidth,
texlnfo -> vAxis / txtHeight,
texlnfo -> vOffset / txtHeight ) ,-
polys [i] = new Polygon3D ( "", face -> numEdges );
polys [i] -> setTexture ( texture ),-polys [i] -> setMapping ( mapping );
for ( int j = 0; j < face -> numEdges; j++ ) {
int edge = file -> faceEdges [face -> firstEdge + j ] ;
int vertex;
if ( edge < 0 )
vertex = file -> edges [-edge].lastEdge; else
vertex = file -> edges [edge].firstEdge;
polys [i] -> addVertex ( file -> vertices [vertex] );
}
polys [i] -> init ();
setLightmap ( face -> lightmapOf fset, polys [i] ) ,-
//we need to set our plane due to some
// glitches in original QII file
Plane plane ( qPlane -> normal.x, qPlane ->
normal, y, qPlane -> normal, z,
-qPlane -> dist ) ;
if ( face -> planeSide ) plane.flip ();
polys [i] -> setPlane ( plane );
}
return true;
}

Метод render этого класса крайне прост: применяется камера, по положению камеры строится список видимых кластеров (buildClusterTable), по этому списку строится список потенциально видимых граней (buildFaces-Lisi) и грани из этого списка выводятся (drawFaces).

i-'i

од.

void Quake2Level :: render ( Views view,
const Cameras camera )
{
view.apply ( camera );
buildClusterTable ( camera.getPos () );
// build a list of visible clusters buildFacesList ( camera );
// compute a list of all potentially
// visible faces drawFaces ( view, camera ) ,-
// draw potentially visible faces
frameNo++;
}

Процедура построения списка видимых кластеров состоит из двух шагов - определения текущего листа дерева и декодирования RLE-сжатого списка потенциально видимых кластеров.


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