void ViewportBase::onCreate(const Viewport *source)
{
    Inherited::onCreate(source);

    if(source != NULL)
    {
        Viewport *pThis = static_cast<Viewport *>(this);

        pThis->setCamera(source->getCamera());

        pThis->setRoot(source->getRoot());

        pThis->setBackground(source->getBackground());

        MFUnrecForegroundPtr::const_iterator ForegroundsIt  =
            source->_mfForegrounds.begin();
        MFUnrecForegroundPtr::const_iterator ForegroundsEnd =
            source->_mfForegrounds.end  ();

        while(ForegroundsIt != ForegroundsEnd)
        {
            pThis->addForeground(*ForegroundsIt);

            ++ForegroundsIt;
        }

        pThis->setRenderOptions(source->getRenderOptions());
    }
}
void SortLastWindow::serverRender(Window         *serverWindow,
                                  UInt32          id,
                                  DrawActionBase *action      )
{
    Viewport *serverPort  = NULL;
    Viewport *clientPort  = NULL;
    UInt32    sv          = 0;
    UInt32    cv          = 0;
    UInt32    regionStart = 0;

    // duplicate viewports
    for(cv = 0, sv = 0; cv < getPort().size(); ++cv)
    {
        clientPort = getPort()[cv];

        if(serverWindow->getPort().size() <= sv)
        {
            // create new port
            serverPort = Viewport::create();

            serverWindow->addPort(serverPort);
        }
        else
        {
            serverPort = serverWindow->getPort()[sv];
        }

        // duplicate values

        if(getWidth() && getHeight())
        {
           serverPort->setSize(clientPort->getPixelLeft  (),
                               clientPort->getPixelBottom(),
                               clientPort->getPixelRight (),
                               clientPort->getPixelTop   ());
        }
        else
        {
            serverPort->setSize(0,0,0,0); 
        }
  
        serverPort->setCamera    (clientPort->getCamera    ());
        serverPort->setRoot      (clientPort->getRoot      ());
        serverPort->setBackground(clientPort->getBackground());

        // ignore statistics foreground
        serverPort->clearForegrounds();

        for(UInt32 f = 0 ; f < serverPort->getForegrounds().size(); ++f)
        {
            Foreground *fg = clientPort->getForegrounds()[f];

            StatisticsForeground *sfg = 
                dynamic_cast<StatisticsForeground *>(fg);

            if(sfg == NULL)
            {
                serverPort->addForeground(fg);
            }
        }

        serverPort->setTravMask(clientPort->getTravMask());

        sv++;
    }

    // remove unused ports
    while(serverWindow->getPort().size() > sv)
    {
        serverWindow->subPort(sv);
    }

    // setup visible nodes
    setupNodes(id);

    // render the viewports
    serverWindow->activate();
    serverWindow->frameInit();

    action->setWindow(serverWindow);

    if(getComposer() != NULL)
        getComposer()->startFrame();

    for(sv = 0; sv < serverWindow->getPort().size(); ++sv)
    {
        Viewport *vp         = serverWindow->getPort()[sv];
        Node     *root       = vp->getRoot();

        if(getComposer() != NULL)
            getComposer()->startViewport(vp);

        // render
        vp->render(action);

        // compose single viewport
        if(getComposer() != NULL)
            getComposer()->composeViewport(vp);
    }

    // compose whole window
    if(getComposer() != NULL)
        getComposer()->composeWindow();
}