void RenderPartition::pushState(void)
{
    StateOverride *pNewState = _pStatePool->create();

    pNewState->fillFrom(_sStateOverrides.top());

    _sStateOverrides.push(pNewState);

//    fprintf(stderr, "push so size %d\n", _sStateOverrides.size());
}
Ejemplo n.º 2
0
void HDRStage::postProcess(DrawEnv *pEnv)
{
    Window *win = pEnv->getWindow();

    if(win->hasExtension(_uiFramebuffer_object_extension) == false)
    {
        FNOTICE(("Framebuffer objects not supported on Window %p!\n", win));
        return;        
    }

    GLDrawBuffersEXTProcT glDrawBuffersEXTProc =
        reinterpret_cast<GLDrawBuffersEXTProcT>(
            win->getFunction(_uiFuncDrawBuffers));

    glColor3f(1.f, 1.f, 1.f);
    
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();

    glLoadIdentity();

    HDRStageData *pData = pEnv->getData<HDRStageData *>(_iDataSlotId);

    if(pData == NULL)
    {
        return;
    }

    if((pData->getWidth () != pEnv->getPixelWidth() ) ||
       (pData->getHeight() != pEnv->getPixelHeight())  )
    {
        resizeStageData(pData, 
                        pEnv->getPixelWidth(),
                        pEnv->getPixelHeight());
    }
    

    // Shrink to w/2 h/2

    FrameBufferObject *pShrinkTarget = pData->getShrinkRenderTarget();
    ChunkMaterial     *pSHM          = pData->getShrinkMaterial();


    pShrinkTarget->activate(pEnv);

    glViewport(0,
               0, 
               pEnv->getPixelWidth () / 2,
               pEnv->getPixelHeight() / 2);


    State *pShrinkState = pSHM->getState();

    pEnv->activateState(pShrinkState, NULL);
    
    glBegin(GL_QUADS);
    {
        glTexCoord2f(0.00, 0.00);
        glVertex2f  (0.00, 0.00);
        
        glTexCoord2f(1.00, 0.00);
        glVertex2f  (1.00, 0.00);
        
        glTexCoord2f(1.00, 1.00);
        glVertex2f  (1.00, 1.00);
        
        glTexCoord2f(0.00, 1.00);
        glVertex2f  (0.00, 1.00);
    }
    glEnd();

    pShrinkTarget->deactivate(pEnv);


    // Shrink to w/4 h/4

    FrameBufferObject *pBlurTarget = pData->getBlurRenderTarget();

    pBlurTarget->editMFDrawBuffers()->clear();

    pBlurTarget->editMFDrawBuffers()->push_back(GL_COLOR_ATTACHMENT0_EXT);

    pBlurTarget->activate(pEnv);

    glViewport(0,
               0, 
               pEnv->getPixelWidth () / 4,
               pEnv->getPixelHeight() / 4);

    ChunkMaterial    *pBLM       = pData->getBlurMaterial();

    State            *pBlurState = pBLM->getState();

    pEnv->activateState(pBlurState, NULL);

    glBegin(GL_QUADS);
    {
        glTexCoord2f(0.00, 0.00);
        glVertex2f  (0.00, 0.00);
        
        glTexCoord2f(1.00, 0.00);
        glVertex2f  (1.00, 0.00);
        
        glTexCoord2f(1.00, 1.00);
        glVertex2f  (1.00, 1.00);
        
        glTexCoord2f(0.00, 1.00);
        glVertex2f  (0.00, 1.00);
    }
    glEnd();

    // HBlur

    StateOverride oOverride;        

    GLenum aDrawBuffers[] = { GL_COLOR_ATTACHMENT1_EXT };

    oOverride.addOverride(pData->getHBlurShader()->getClassId(), 
                          pData->getHBlurShader());


    pEnv->activateState(pBlurState, &oOverride);
            
    glDrawBuffersEXTProc(1, aDrawBuffers);


    glBegin(GL_QUADS);
    {
        glTexCoord2f(0.00, 0.00);
        glVertex2f  (0.00, 0.00);
        
        glTexCoord2f(1.00, 0.00);
        glVertex2f  (1.00, 0.00);
        
        glTexCoord2f(1.00, 1.00);
        glVertex2f  (1.00, 1.00);
        
        glTexCoord2f(0.00, 1.00);
        glVertex2f  (0.00, 1.00);
    }
    glEnd();



    // VBlur
           
    StateOverride oOverride1;        

    oOverride1.addOverride(pData->getVBlurShader()->getClassId(), 
                           pData->getVBlurShader());
    

    pEnv->activateState(pBlurState, &oOverride1);

    aDrawBuffers[0] = GL_COLOR_ATTACHMENT0_EXT;
    
    glDrawBuffersEXTProc(1, aDrawBuffers);
    
    glBegin(GL_QUADS);
    {
        glTexCoord2f(0.00, 0.00);
        glVertex2f  (0.00, 0.00);
        
        glTexCoord2f(1.00, 0.00);
        glVertex2f  (1.00, 0.00);
        
        glTexCoord2f(1.00, 1.00);
        glVertex2f  (1.00, 1.00);
        
        glTexCoord2f(0.00, 1.00);
        glVertex2f  (0.00, 1.00);
    }
    glEnd();
    
    
    pBlurTarget->deactivate(pEnv);



    // Tonemap pass

    glDisable(GL_DEPTH_TEST);

    glViewport(pEnv->getPixelLeft  (), 
               pEnv->getPixelBottom(),
               pEnv->getPixelWidth (),
               pEnv->getPixelHeight());

    ChunkMaterial *pTCM = pData->getToneMappingMaterial();

    State *pTState = pTCM->getState();
        
    pEnv->activateState(pTState, NULL);
            
    glBegin(GL_QUADS);
    {
        glTexCoord2f(0.00, 0.00);
        glVertex2f  (0.00, 0.00);
        
        glTexCoord2f(1.00, 0.00);
        glVertex2f  (1.00, 0.00);
        
        glTexCoord2f(1.00, 1.00);
        glVertex2f  (1.00, 1.00);
        
        glTexCoord2f(0.00, 1.00);
        glVertex2f  (0.00, 1.00);
    }
    glEnd();

    glEnable(GL_DEPTH_TEST);
            
    pEnv->deactivateState();


    glPopMatrix();
}
void RenderPartition::dropFunctor(DrawFunctor &drawFunc,
                                  State       *pState,
                                  Int32        iSortKey,
                                  bool         bIgnoreOverrides)
{
    if(_eMode == SimpleCallback)
        return;

    RenderAction  *ract    = dynamic_cast<RenderAction *>(_oDrawEnv.getAction());
    Node          *actNode = ract   ->getActNode();
    NodeCore      *actCore = actNode->getCore   ();

    bool           bOverrodeState = false;
    StateOverride *pStateOverride = NULL;

    DrawableStatsAttachment *st = DrawableStatsAttachment::get(actCore);

    if(st == NULL)
    {
        DrawableStatsAttachment::addTo(actCore);

        st = DrawableStatsAttachment::get(actCore);
    }

    st->validate();

    if(_oDrawEnv.getStatCollector() != NULL)
    {
        _oDrawEnv.getStatCollector()->getElem(
            RenderAction::statNTriangles)->add(st->getTriangles());
    }

    _uiNumTriangles += st->getTriangles();

    #ifdef OSG_NEW_SHADER
    bOverrodeState = pushShaderState(pState);
#endif // OSG_NEW_SHADER

    if(_sStateOverrides.top()->empty() == false &&
       bIgnoreOverrides                == false   )
    {
        pStateOverride = _sStateOverrides.top();
    }

    bool bTransparent =
        (pState->isTransparent()                                         ) ||
        (pStateOverride != NULL ? pStateOverride->isTransparent() : false);

    if(_bSortTrans == true && bTransparent == true)
    {
        BuildKeyMapIt mapIt = _mTransMatTrees.lower_bound(iSortKey);

        if(mapIt == _mTransMatTrees.end() || mapIt->first != iSortKey)
        {
            TreeBuilderBase *pBuilder =
                _pTreeBuilderPool->create<DepthSortTreeBuilder>();

            pBuilder->setNodePool(_pNodePool);

            mapIt = _mTransMatTrees.insert(
                mapIt, BuildKeyMap::value_type(iSortKey, pBuilder));
        }

        if(mapIt->second == NULL)
        {
            TreeBuilderBase *pBuilder =
                _pTreeBuilderPool->create<DepthSortTreeBuilder>();

            pBuilder->setNodePool(_pNodePool);
            
            mapIt->second = pBuilder;
        }

        mapIt->second->add(_oDrawEnv.getAction(),
                           this,
                           drawFunc,
                           pState,
                           pStateOverride);
    }
    else if(ract != NULL && ract->getOcclusionCulling() == true)
    {
        BuildKeyMapIt mapIt = _mMatTrees.lower_bound(iSortKey);

        if(mapIt == _mMatTrees.end() || mapIt->first != iSortKey)
        {
            TreeBuilderBase *pBuilder =
                _pTreeBuilderPool->create<OcclusionCullingTreeBuilder>();

            pBuilder->setNodePool(_pNodePool);

            mapIt = _mMatTrees.insert(mapIt,
                                      std::make_pair(iSortKey, pBuilder));
        }

        if(mapIt->second == NULL)
        {
            mapIt->second =
                _pTreeBuilderPool->create<OcclusionCullingTreeBuilder>();

            mapIt->second->setNodePool(_pNodePool);
        }
       
        mapIt->second->add(_oDrawEnv.getAction(),
                           this,
                           drawFunc,
                           pState,
                           pStateOverride);
    }
    else
    {
        BuildKeyMapIt mapIt = _mMatTrees.lower_bound(iSortKey);

        if(mapIt == _mMatTrees.end() || mapIt->first != iSortKey)
        {
            TreeBuilderBase *pBuilder =
                _pTreeBuilderPool->create<StateSortTreeBuilder>();

            pBuilder->setNodePool(_pNodePool);

            mapIt = _mMatTrees.insert(
                mapIt, BuildKeyMap::value_type(iSortKey, pBuilder));
        }

        if(mapIt->second == NULL)
        {
            mapIt->second = 
                _pTreeBuilderPool->create<StateSortTreeBuilder>();

            mapIt->second->setNodePool(_pNodePool);
        }

        mapIt->second->add(_oDrawEnv.getAction(),
                           this,
                           drawFunc,
                           pState,
                           pStateOverride);
    }

#ifdef OSG_NEW_SHADER
    if(bOverrodeState == true)
    {
        this->popState();
    }
#endif
}
Ejemplo n.º 4
0
void HDRStage::postProcess(DrawEnv *pEnv)
{
    UInt32  uiActiveFBO = pEnv->getActiveFBO();
    Window *win         = pEnv->getWindow();

    if(win->hasExtOrVersion(_uiFramebufferObjectExt, 0x0300, 0x0200) == false)
    {
        FNOTICE(("Framebuffer objects not supported on Window %p!\n", 
                 static_cast<void *>(win)));
        return;        
    }

    OSGGETGLFUNCBYID_GL3( glDrawBuffers,
                          osgGlDrawBuffers,
                         _uiFuncDrawBuffers,
                          win);

    glColor3f(1.f, 1.f, 1.f);
    
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();

    glLoadIdentity();

    HDRStageData *pData = pEnv->getData<HDRStageData *>(_iDataSlotId);

    if(pData == NULL)
    {
        return;
    }



    // Shrink to w/2 h/2

    FrameBufferObject *pShrinkTarget = pData->getShrinkRenderTarget();
    ChunkMaterial     *pSHM          = pData->getShrinkMaterial();


    pShrinkTarget->activate(pEnv);

    glViewport(0,
               0, 
               pEnv->getPixelWidth () / 2,
               pEnv->getPixelHeight() / 2);


    State *pShrinkState = pSHM->getState();

    pEnv->activateState(pShrinkState, NULL);
    
    this->renderQuad();

    pShrinkTarget->deactivate(pEnv);




    // Shrink to w/4 h/4

    FrameBufferObject *pBlurTarget = pData->getBlurRenderTarget();

    pBlurTarget->editMFDrawBuffers()->clear();

    pBlurTarget->editMFDrawBuffers()->push_back(GL_COLOR_ATTACHMENT0_EXT);

    pBlurTarget->activate(pEnv);

    glViewport(0,
               0, 
               pEnv->getPixelWidth () / 4,
               pEnv->getPixelHeight() / 4);

    ChunkMaterial    *pBLM       = pData->getBlurMaterial();

    State            *pBlurState = pBLM->getState();

    pEnv->activateState(pBlurState, NULL);

    this->renderQuad();



    GLenum aDrawBuffers[] = { GL_COLOR_ATTACHMENT0_EXT };




    // HBlur

    pBlurTarget->activate(pEnv);

    glViewport(0,
               0, 
               pEnv->getPixelWidth () / 4,
               pEnv->getPixelHeight() / 4);

#define OVERSHADER 1

#if OVERSHADER
    StateOverride oOverride;        

    oOverride.addOverride(pData->getHBlurShader()->getClassId(), 
                          pData->getHBlurShader());


    pEnv->activateState(pBlurState, &oOverride);
#else
    pData->getHBlurShader()->activate(pEnv);
#endif

    aDrawBuffers[0] = GL_COLOR_ATTACHMENT1_EXT;

    osgGlDrawBuffers(1, aDrawBuffers);

    this->renderQuad();

#if !OVERSHADER
    pData->getHBlurShader()->deactivate(pEnv);
#endif

    // VBlur
           
#if OVERSHADER
    StateOverride oOverride1;        

    oOverride1.addOverride(pData->getVBlurShader()->getClassId(), 
                           pData->getVBlurShader());
    

    pEnv->activateState(pBlurState, &oOverride1);
#else
    pData->getVBlurShader()->activate(pEnv);
#endif

    aDrawBuffers[0] = GL_COLOR_ATTACHMENT0_EXT;
    
    osgGlDrawBuffers(1, aDrawBuffers);
    
    this->renderQuad();
    
#if !OVERSHADER
    pData->getVBlurShader()->deactivate(pEnv);
#endif
    
    if(uiActiveFBO == 0)
    {
        pBlurTarget->deactivate(pEnv);
    }
    else
    {
        FrameBufferObject::activateFBOById(pEnv, uiActiveFBO);
    }

    // Tonemap pass

    glDisable(GL_DEPTH_TEST);

    glViewport(pEnv->getPixelLeft  (), 
               pEnv->getPixelBottom(),
               pEnv->getPixelWidth (),
               pEnv->getPixelHeight());

    ChunkMaterial *pTCM = pData->getToneMappingMaterial();

    State *pTState = pTCM->getState();
        
    pEnv->activateState(pTState, NULL);
            
    this->renderQuad();

    glEnable(GL_DEPTH_TEST);
            
    pEnv->deactivateState();

    glPopMatrix();
}