}

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

-AccSubScene ()
{
if ( root != NULL )
deleteBspTree ( root );
}
virtual bool isOk () const (
return opagueFaces.isOk () && SubScene :: isOk () ,-
}
virtual intinit ( ) ;
virtual void render ( View& view,
const Camera& camera, const Frustrum& frustrum ) const;
virtual bool shouldBeSorted ( const Polygon3D *
poly ) const;
void collectPolys ( BspNode * node );
static MetaClass classlnstance,-
};

Метод init этого класса строит списки прозрачных и непрозрачных граней и по полупрозрачным граням строит BSP-дерево.

он.

int AccSubScene : : init ( ) {
SubScene :: init (); // prepare floating info
Array transpFaces ( "transparent facets" );
// collect transparent faces for ( Array :: Iterator it = polys.getlterator () ; !it.end(); ++it )
{
Polygon3D * poly = (Polygon3D *) it.value ();
if ( shouldBeSorted ( poly ) )
transpFaces.insert ( poly );
else
opagueFaces.insert ( poly );
}
II combine them into the bsp-tree root = buildBspTree ( transpFaces ) ,-
return 1;
}

Обратите внимание, что массив polys хранит полный список всех граней, прозрачных и непрозрачных. Даже если грань будет разбита при построении дерева, то в массиве polys сохранится неразбитая копия.

Метод render этого класса отличается от аналогичного метода класса SubScene только добавлением вывода полупрозрачных граней из BSP-дерева после вывода всех непрозрачных граней и выглядит следующим образом:

vim.
void AccSubScene :: render ( View& view,
const Cameras camera, const Frustrums viewFrustrum ) const
{
Polygon3D tempPoly ( "tempPoly", MAX_VERTICES ) ;
view.lock () ;
view.apply ( camera );
// render opaque facets for ( Array :: Iterator it = polys.getlterator () ; !it.end(); ++it )
{
Polygon3D * poly = (Polygon3D *) it.value ();
if ( ipoly -> isFrontFacing ( camera.getPos () ) ) continue;
// check against view frustrum if ( !viewFrustrum.contains ( poly ->

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