void PCSSShadowMap::render(DrawEnv *pEnv) { Window *win = pEnv->getWindow(); initialize(win); if(!_useGLSL || !_useShadowExt) _shadowVP->Viewport::render(pEnv->getAction()); else { glPushAttrib(GL_ENABLE_BIT); if(!_initTexturesDone) initTextures(win); if(_useFBO) { if(!initFBO(pEnv)) printf("ERROR with FBOBJECT\n"); } GLfloat globalAmbient[] = { 0.0, 0.0, 0.0, 1.0 }; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, globalAmbient); _firstRun = 1; #if 0 for(UInt32 i = 0;i < _shadowVP->_lights.size();i++) { { _shadowVP->_texChunks[i]->setMinFilter(GL_NEAREST); _shadowVP->_texChunks[i]->setMagFilter(GL_NEAREST); } } #endif if(_shadowVP->getPixelWidth() != _width || _shadowVP->getPixelHeight() != _height) { _width = _shadowVP->getPixelWidth(); _height = _shadowVP->getPixelHeight(); if(_useNPOTTextures) { _colorMapImage->set(GL_RGB, _width, _height); _shadowFactorMapImage->set(GL_RGB, _width, _height); reInit(pEnv); } else { if(_width > _height) _widthHeightPOT = osgNextPower2(_width - 1); else _widthHeightPOT = osgNextPower2(_height - 1); _colorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT); _shadowFactorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT); } } commitChanges(); if(_shadowVP->getMapAutoUpdate()) { #ifdef USE_FBO_FOR_COLOR_AND_FACTOR_MAP if(_useFBO && _useNPOTTextures) createColorMapFBO(pEnv); else #endif createColorMap(pEnv); //deactivate transparent Nodes for(UInt32 t = 0;t < _shadowVP->_transparent.size();++t) _shadowVP->_transparent[t]->setTravMask(0); if(_useFBO) createShadowMapsFBO(pEnv); else createShadowMaps(pEnv); // switch on all transparent geos for(UInt32 t = 0;t < _shadowVP->_transparent.size();++t) _shadowVP->_transparent[t]->setTravMask(TypeTraits<UInt32>::BitsSet); for(UInt32 i = 0;i < _shadowVP->_lights.size();i++) { if(_shadowVP->_lightStates[i] != 0) { if(_shadowVP->getGlobalShadowIntensity() != 0.0 || _shadowVP->_lights[i].second->getShadowIntensity() != 0.0) { #ifdef USE_FBO_FOR_COLOR_AND_FACTOR_MAP if(_useFBO && _useNPOTTextures) createShadowFactorMapFBO(pEnv, i); else #endif createShadowFactorMap(pEnv, i); //_firstRun = 0; } } } } else { if(_shadowVP->_trigger_update) { #ifdef USE_FBO_FOR_COLOR_AND_FACTOR_MAP if(_useFBO && _useNPOTTextures) createColorMapFBO(pEnv); else #endif createColorMap(pEnv); //deactivate transparent Nodes for(UInt32 t = 0;t < _shadowVP->_transparent.size();++t) _shadowVP->_transparent[t]->setTravMask(0); if(_useFBO) createShadowMapsFBO(pEnv); else createShadowMaps(pEnv); // switch on all transparent geos for(UInt32 t = 0;t < _shadowVP->_transparent.size();++t) _shadowVP->_transparent[t]->setTravMask(TypeTraits<UInt32>::BitsSet); for(UInt32 i = 0;i < _shadowVP->_lights.size();i++) { if(_shadowVP->_lightStates[i] != 0) { if(_shadowVP->getGlobalShadowIntensity() != 0.0 || _shadowVP->_lights[i].second->getShadowIntensity() != 0.0) { #ifdef USE_FBO_FOR_COLOR_AND_FACTOR_MAP if(_useFBO && _useNPOTTextures) createShadowFactorMapFBO(pEnv, i); else #endif createShadowFactorMap(pEnv, i); } } } _shadowVP->_trigger_update = false; } } drawCombineMap(pEnv); glPopAttrib(); // render the foregrounds. for(UInt16 i = 0;i < _shadowVP->getMFForegrounds()->size();++i) { _shadowVP->getForegrounds(i)->draw(pEnv, _shadowVP); } } }
void VarianceShadowMapHandler::render(RenderAction *a, DrawEnv *pEnv) { const ShadowStageData::LightStore &vLights = _pStageData->getLights(); const ShadowStageData::NodeStore &vTransparents = _pStageData->getTransparents(); const ShadowStageData::LStateStore &vLightStates = _pStageData->getLightStates(); if(_pStageData->getShadowMaps().size() != vLights.size()) { initShadowMaps(); } if(_bShadowMapsConfigured == false) { configureShadowMaps(); } if(_uiMapSize != _pStage->getMapSize()) { updateShadowMapSize(); } if(_pSceneFBO == NULL) initSceneFBO(pEnv, false); if(_width != pEnv->getPixelWidth () || _height != pEnv->getPixelHeight() ) { updateSceneFBOSize(pEnv, false); } commitChanges(); //Used for ShadowFactorMap _firstRun = 1; if(_pStage->getMapAutoUpdate() == true || _pStage->_trigger_update == true ) { createColorMapFBO(a, pEnv); //deactivate transparent Nodes for(UInt32 t = 0;t < vTransparents.size();++t) { vTransparents[t]->setTravMask(0); } createShadowMapsFBO(a, pEnv); // switch on all transparent geos for(UInt32 t = 0;t < vTransparents.size();++t) { vTransparents[t]->setTravMask(TypeTraits<UInt32>::BitsSet); } //filterShadowMaps(pEnv); UInt32 uiActiveLightCount = 0; for(UInt32 i = 0;i < vLights.size();i++) { if(vLightStates[i] != 0) { if(_pStage->getGlobalShadowIntensity() != 0.0 || vLights[i].second->getShadowIntensity() != 0.0) { createShadowFactorMapFBO(a, pEnv, i, uiActiveLightCount); ++uiActiveLightCount; } } } _pStage->_trigger_update = false; } setupDrawCombineMap1(a); }
void PCSSShadowMap::render(RenderActionBase *action) { Window *win = action->getWindow(); initialize(win); if(!_useGLSL || !_useShadowExt) _shadowVP->Viewport::render(action); else { glPushAttrib(GL_ENABLE_BIT | GL_LIGHTING_BIT); if(!_initTexturesDone) initTextures(win); if(_useFBO) { if(!initFBO(win)) printf("ERROR with FBOBJECT\n"); } GLfloat globalAmbient[] = { 0.0, 0.0, 0.0, 1.0 }; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, globalAmbient); _firstRun = 1; for(UInt32 i = 0;i < _shadowVP->_lights.size();i++) { beginEditCP(_shadowVP->_texChunks[i]); { _shadowVP->_texChunks[i]->setMinFilter(GL_NEAREST); _shadowVP->_texChunks[i]->setMagFilter(GL_NEAREST); } endEditCP(_shadowVP->_texChunks[i]); } if(_shadowVP->getPixelWidth() != _width || _shadowVP->getPixelHeight() != _height) { _width = _shadowVP->getPixelWidth(); _height = _shadowVP->getPixelHeight(); if(_useNPOTTextures) { beginEditCP(_colorMap); beginEditCP(_colorMapImage); _colorMapImage->set(COLORMAP_FORMAT, _width, _height); endEditCP(_colorMapImage); endEditCP(_colorMap); beginEditCP(_shadowFactorMap); beginEditCP(_shadowFactorMapImage); _shadowFactorMapImage->set(GL_RGB, _width, _height); endEditCP(_shadowFactorMapImage); endEditCP(_shadowFactorMap); reInit(win); } else { if(_width > _height) _widthHeightPOT = osgnextpower2(_width - 1); else _widthHeightPOT = osgnextpower2(_height - 1); beginEditCP(_colorMap); beginEditCP(_colorMapImage); _colorMapImage->set(COLORMAP_FORMAT, _widthHeightPOT, _widthHeightPOT); endEditCP(_colorMapImage); endEditCP(_colorMap); beginEditCP(_shadowFactorMap); beginEditCP(_shadowFactorMapImage); _shadowFactorMapImage->set(GL_RGB, _widthHeightPOT, _widthHeightPOT); endEditCP(_shadowFactorMapImage); endEditCP(_shadowFactorMap); } } // need possibility to tell cores like billboard not to change state RenderAction *rAct = dynamic_cast<RenderAction*>(action); bool effectsPassSave = rAct ? rAct->getEffectsPass() : false; if(_shadowVP->getMapAutoUpdate()) { #ifdef USE_FBO_FOR_COLOR_AND_FACTOR_MAP if(_useFBO && _useNPOTTextures) createColorMapFBO(action); else #endif createColorMap(action); //deactivate transparent Nodes for(UInt32 t = 0;t < _shadowVP->_transparent.size();++t) _shadowVP->_transparent[t]->setActive(false); rAct->setEffectsPass(true); if(_useFBO) createShadowMapsFBO(action); else createShadowMaps(action); // switch on all transparent geos for(UInt32 t = 0;t < _shadowVP->_transparent.size();++t) _shadowVP->_transparent[t]->setActive(true); for(UInt32 i = 0;i < _shadowVP->_lights.size();i++) { if(_shadowVP->_lightStates[i] != 0) { if(_shadowVP->getGlobalShadowIntensity() != 0.0 || _shadowVP->_lights[i].second->getShadowIntensity() != 0.0) { #ifdef USE_FBO_FOR_COLOR_AND_FACTOR_MAP if(_useFBO && _useNPOTTextures) createShadowFactorMapFBO(action, i); else #endif createShadowFactorMap(action, i); //_firstRun = 0; } } } } else { if(_shadowVP->_trigger_update) { #ifdef USE_FBO_FOR_COLOR_AND_FACTOR_MAP if(_useFBO && _useNPOTTextures) createColorMapFBO(action); else #endif createColorMap(action); //deactivate transparent Nodes for(UInt32 t = 0;t < _shadowVP->_transparent.size();++t) _shadowVP->_transparent[t]->setActive(false); rAct->setEffectsPass(true); if(_useFBO) createShadowMapsFBO(action); else createShadowMaps(action); // switch on all transparent geos for(UInt32 t = 0;t < _shadowVP->_transparent.size();++t) _shadowVP->_transparent[t]->setActive(true); for(UInt32 i = 0;i < _shadowVP->_lights.size();i++) { if(_shadowVP->_lightStates[i] != 0) { if(_shadowVP->getGlobalShadowIntensity() != 0.0 || _shadowVP->_lights[i].second->getShadowIntensity() != 0.0) { #ifdef USE_FBO_FOR_COLOR_AND_FACTOR_MAP if(_useFBO && _useNPOTTextures) createShadowFactorMapFBO(action, i); else #endif createShadowFactorMap(action, i); } } } _shadowVP->_trigger_update = false; } } rAct->setEffectsPass(effectsPassSave); drawCombineMap(action); glPopAttrib(); // render the foregrounds. for(UInt16 i = 0;i < _shadowVP->getMFForegrounds()->size();++i) { _shadowVP->getForegrounds(i)->draw(action, _shadowVP); } } }