void HDRStage::updateData(RenderAction *pAction, Int32 iVPWidth, Int32 iVPHeight) { HDRStageDataUnrecPtr pData = pAction->getData<HDRStageData *>(_iDataSlotId); if(pData == NULL) { initData(pAction, iVPWidth, iVPHeight); pData = pAction->getData<HDRStageData *>(_iDataSlotId); } else if((pData->getWidth () != iVPWidth ) || (pData->getHeight() != iVPHeight) ) { resizeStageData(pData, iVPWidth, iVPHeight); pData->setWidth (iVPWidth ); pData->setHeight(iVPHeight); } ChunkMaterial* pTonemapMat = pData->getToneMappingMaterial(); BlendChunk* pBlendChunk = static_cast<BlendChunk*>( pTonemapMat->find(BlendChunk::getClassType())); if(pBlendChunk != NULL) pBlendChunk->setIgnore(!getCombineBlend()); }
static Action::ResultE modifyMaterial(Node * const node) { MaterialGroup *mg = dynamic_cast<MaterialGroup *>(node->getCore()); if(mg == NULL) return Action::Continue; ChunkMaterial *cmat = dynamic_cast<ChunkMaterial *>(mg->getMaterial()); if(cmat == NULL) return Action::Continue; TextureObjChunk *texc = dynamic_cast<TextureObjChunk *>( cmat->find(TextureObjChunk::getClassType())); if(texc == NULL) return Action::Continue; MaterialChunk *matc = dynamic_cast<MaterialChunk *>( cmat->find(MaterialChunk::getClassType())); TextureEnvChunkUnrecPtr texe = dynamic_cast<TextureEnvChunk *>( cmat->find(TextureEnvChunk::getClassType())); if(texe == NULL) { texe = TextureEnvChunk::create(); cmat->addChunk(texe); } if(matc == NULL) { // no material chunk so we use the replace mode. texe->setEnvMode(GL_REPLACE); return Action::Continue; } if(matc != NULL) { Image *img = texc->getImage(); texe->setEnvMode(GL_MODULATE); if(img != NULL && img->getBpp() > 2) { // for color textures the texture replaces only the diffuse part. matc->setDiffuse(Color4f(1.0f, 1.0f, 1.0f, 1.0f)); } // check for textures with alpha if(!matc->isTransparent() && img != NULL && img->getBpp() == 4 ) { BlendChunkUnrecPtr blendc = dynamic_cast<BlendChunk *>( cmat->find(BlendChunk::getClassType())); if(blendc == NULL) { blendc = OSG::BlendChunk::create(); blendc->setSrcFactor (GL_SRC_ALPHA); blendc->setDestFactor(GL_ONE_MINUS_SRC_ALPHA); cmat->addChunk(blendc); } } } return Action::Continue; }
void TrapezoidalShadowMapEngine::updateLightPassMaterial( TSMEngineData *data, UInt16 faceIdx, const Matrixr &matNT) { if(data->getMFLightPassMaterials()->size() < 6) data->editMFLightPassMaterials()->resize(6, NULL); ChunkMaterial *lightPassMat = data->getLightPassMaterials(faceIdx); if(lightPassMat == NULL) { ColorMaskChunkUnrecPtr newCMaskChunk = ColorMaskChunk::create(); newCMaskChunk->setMaskR(false); newCMaskChunk->setMaskG(false); newCMaskChunk->setMaskB(false); newCMaskChunk->setMaskA(false); #ifdef OSG_TSME_LIGHTPASS_EXACT ShaderProgramUnrecPtr newLightPassVP = ShaderProgram::createLocal(); newLightPassVP->setShaderType(GL_VERTEX_SHADER); newLightPassVP->setProgram (_lightPassVPCode); newLightPassVP->addUniformVariable("TSME_matNT", matNT); ShaderProgramUnrecPtr newLightPassFP = ShaderProgram::createLocal(); newLightPassFP->setShaderType(GL_FRAGMENT_SHADER); newLightPassFP->setProgram (_lightPassFPCode ); newLightPassFP->addUniformVariable("TSME_offsetFactor", getOffsetFactor()); newLightPassFP->addUniformVariable("TSME_offsetBias", getOffsetBias ()); ShaderProgramChunkUnrecPtr newLightPassSHChunk = ShaderProgramChunk::createLocal(); newLightPassSHChunk->addVertexShader (newLightPassVP); newLightPassSHChunk->addFragmentShader(newLightPassFP); ChunkMaterialUnrecPtr newLightPassMat = ChunkMaterial::createLocal(); newLightPassMat->addChunk(newCMaskChunk ); newLightPassMat->addChunk(newLightPassSHChunk); lightPassMat = newLightPassMat; data->editMFLightPassMaterials()->replace(faceIdx, newLightPassMat); #else PolygonChunkUnrecPtr newPolyChunk = PolygonChunk::createLocal(); newPolyChunk->setOffsetFill (true ); newPolyChunk->setOffsetFactor(getOffsetFactor()); newPolyChunk->setOffsetBias (getOffsetBias ()); ShaderProgramUnrecPtr newLightPassVP = ShaderProgram::createLocal(); newLightPassVP->setShaderType (GL_VERTEX_SHADER ); newLightPassVP->setProgram (_lightPassVPCode ); newLightPassVP->addUniformVariable("TSME_matNT", matNT); ShaderProgramChunkUnrecPtr newLightPassSHChunk = ShaderProgramChunk::createLocal(); newLightPassSHChunk->addVertexShader(newLightPassVP); ChunkMaterialUnrecPtr newLightPassMat = ChunkMaterial::createLocal(); newLightPassMat->addChunk(newCMaskChunk ); newLightPassMat->addChunk(newPolyChunk ); newLightPassMat->addChunk(newLightPassSHChunk); lightPassMat = newLightPassMat; (*data->editMFLightPassMaterials())[faceIdx] = newLightPassMat; #endif } else { ShaderProgramChunk *lightPassSHChunk = dynamic_cast<ShaderProgramChunk *>( lightPassMat->find(ShaderProgramChunk::getClassType())); if(lightPassSHChunk != NULL) { ShaderProgram *lightPassVP = lightPassSHChunk->getVertexShader(0); lightPassVP->updateUniformVariable("TSME_matNT", matNT); } } }