void RenderPartition::pushState(void) { StateOverride *pNewState = _pStatePool->create(); pNewState->fillFrom(_sStateOverrides.top()); _sStateOverrides.push(pNewState); // fprintf(stderr, "push so size %d\n", _sStateOverrides.size()); }
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 }
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(); }