bool PolygonChunk::operator ==(const StateChunk &other) const { PolygonChunk const *tother = dynamic_cast<PolygonChunk const*>(&other); if(!tother) return false; if(tother == this) return true; if(getCullFace() != tother->getCullFace() || getFrontFace() != tother->getFrontFace() || getSmooth() != tother->getSmooth() || getFrontMode() != tother->getFrontMode() || getBackMode() != tother->getBackMode() || getOffsetPoint() != tother->getOffsetPoint() || getOffsetLine() != tother->getOffsetLine() || getOffsetFill() != tother->getOffsetFill() || getOffsetFactor() != tother->getOffsetFactor() || getOffsetBias() != tother->getOffsetBias() || getMFStipple()->size() != tother->getMFStipple()->size() ) return false; // would need to compare the whole stipple data // cheap trick: if != 0 take as different if( getMFStipple()->size() != 0 || tother->getMFStipple()->size() != 0 ) return false; return true; }
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); } } }