From 929601f0702dc4ad60b018328809d1ed8ad2ddfe Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 9 Mar 2005 20:40:31 +0000 Subject: [PATCH] Improvements to MultiTextureControl and texture layer handling in osgTerrain::DataSet. --- src/osgFX/MultiTextureControl.cpp | 29 +++++++++++++++++++----- src/osgTerrain/DataSet.cpp | 37 ++++++++++++++++++++++++------- 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/src/osgFX/MultiTextureControl.cpp b/src/osgFX/MultiTextureControl.cpp index fca15e345..fb273043e 100644 --- a/src/osgFX/MultiTextureControl.cpp +++ b/src/osgFX/MultiTextureControl.cpp @@ -46,12 +46,31 @@ void MultiTextureControl::updateStateSet() stateset->clear(); - if (_textureWeightList.size()==1) + unsigned int numTextureUnitsOn = 0; + unsigned int unit; + for(unit=0;unit<_textureWeightList.size();++unit) { - osg::TexEnv* texenv = new osg::TexEnv(osg::TexEnv::MODULATE); - stateset->setTextureAttribute(0, texenv); + if (_textureWeightList[unit]>0.0f) ++numTextureUnitsOn; } - if (_textureWeightList.size()==2) + + if (numTextureUnitsOn<=1) + { + for(unit=0;unit<_textureWeightList.size();++unit) + { + if (_textureWeightList[unit]>0.0f) + { + osg::TexEnv* texenv = new osg::TexEnv(osg::TexEnv::MODULATE); + stateset->setTextureAttribute(unit, texenv); + stateset->setTextureMode(unit, GL_TEXTURE_2D, osg::StateAttribute::ON); + } + else + { + stateset->setTextureMode(unit, GL_TEXTURE_2D, osg::StateAttribute::OFF | osg::StateAttribute::OVERRIDE); + } + } + + } + else if (_textureWeightList.size()==2) { { osg::TexEnvCombine* texenv = new osg::TexEnvCombine; @@ -80,7 +99,7 @@ void MultiTextureControl::updateStateSet() stateset->setTextureAttribute(1, texenv); } } - if (_textureWeightList.size()==3) + else if (_textureWeightList.size()==3) { float b = (_textureWeightList[0]+_textureWeightList[1])/(_textureWeightList[0]+_textureWeightList[1]+_textureWeightList[2]); float a = _textureWeightList[0]/(_textureWeightList[0]+_textureWeightList[1]); diff --git a/src/osgTerrain/DataSet.cpp b/src/osgTerrain/DataSet.cpp index 551a12cdb..15105496f 100644 --- a/src/osgTerrain/DataSet.cpp +++ b/src/osgTerrain/DataSet.cpp @@ -2833,19 +2833,40 @@ void DataSet::DestinationTile::readFrom(CompositeSource* sourceGraph) { Source* source = itr->get(); - if (source && _level>=source->getMinLevel() && _level<=source->getMaxLevel()) + if (source && + _level>=source->getMinLevel() && _level<=source->getMaxLevel() && + (*itr)->getSourceData()) { - unsigned int layerNum = source->getLayer(); + my_notify(osg::INFO)<<"DataSet::DestinationTile::readFrom -> SourceData::read() "<getMinLevel()<<"\t"<getMaxLevel()<getSourceData(); - if (data) + if (source->getType()==DataSet::Source::IMAGE) { - my_notify(osg::INFO)<<"DataSet::DestinationTile::readFrom -> SourceData::read() "<getMinLevel()<<"\t"<getMaxLevel()<getLayer(); + + if (layerNum==0) { - data->read(*(_imagery[layerNum]._imagery)); + // copy the base layer 0 into layer 0 and all subsequent layers to provide a backdrop. + for(unsigned int i=0;i<_imagery.size();++i) + { + if (_imagery[i]._imagery.valid()) + { + data->read(*(_imagery[i]._imagery)); + } + } } + else + { + // copy specific layer. + if (layerNum<_imagery.size() && _imagery[layerNum]._imagery.valid()) + { + data->read(*(_imagery[layerNum]._imagery)); + } + } + } + else + { if (_terrain.valid()) data->read(*_terrain); } }