Improvements to the .terrain file support

This commit is contained in:
Robert Osfield
2007-07-16 15:13:47 +00:00
parent f9fab3c3b0
commit d4aaa31549
2 changed files with 125 additions and 30 deletions

View File

@@ -55,6 +55,7 @@ class ReaderWriterTerrain : public osgDB::ReaderWriter
osg::Node* readTerrainNode(osgDB::Input& fr) const;
osgTerrain::Layer* readLayer(osgDB::Input& fr) const;
osg::TransferFunction* readTransferFunction(osgDB::Input& fr) const;
};
@@ -66,17 +67,14 @@ osgDB::ReaderWriter::ReadResult ReaderWriterTerrain::readNode(std::istream& fin,
fr.attach(&fin);
fr.setOptions(options);
osg::notify(osg::NOTICE)<<"Reading terrain"<<std::endl;
osg::ref_ptr<osg::Group> group = new osg::Group;
while(!fr.eof())
{
osg::notify(osg::NOTICE)<<"Read : "<<fr[0].getStr() << std::endl;
bool itrAdvanced = false;
if (fr.matchSequence("file %s"))
if (fr.matchSequence("file %s") || fr.matchSequence("file %w") )
{
osg::Node* node = osgDB::readNodeFile(fr[1].getStr());
@@ -90,11 +88,17 @@ osgDB::ReaderWriter::ReadResult ReaderWriterTerrain::readNode(std::istream& fin,
{
osg::Node* node = readTerrainNode(fr);
if (node) group->addChild(node);
itrAdvanced = true;
}
if (!itrAdvanced) ++fr;
if (!itrAdvanced)
{
if (fr[0].getStr()) osg::notify(osg::NOTICE)<<"Terrain file - unreconised token : "<<fr[0].getStr() <<""<< std::endl;
++fr;
}
}
if (group->getNumChildren()>0) return group.release();
@@ -111,10 +115,9 @@ osg::Node* ReaderWriterTerrain::readTerrainNode(osgDB::Input& fr) const
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
{
osg::notify(osg::NOTICE)<<"Terrain : "<<fr[0].getStr() << std::endl;
bool itrAdvanced = false;
if (fr.matchSequence("Name %s"))
if (fr.matchSequence("Name %s") || fr.matchSequence("Name %w") ||
fr.matchSequence("name %s") || fr.matchSequence("name %w") )
{
terrain->setName(fr[1].getStr());
@@ -131,34 +134,68 @@ osg::Node* ReaderWriterTerrain::readTerrainNode(osgDB::Input& fr) const
itrAdvanced = true;
}
if (fr.matchSequence("ColorLayer {") || fr.matchSequence("ColourLayer {") )
bool firstMatched = false;
if ((firstMatched = fr.matchSequence("ColorLayer %i {")) || fr.matchSequence("ColorLayer {") )
{
osgTerrain::Layer* layer = readLayer(fr);
if (layer) terrain->setColorLayer(0, layer);
itrAdvanced = true;
}
if (fr.matchSequence("ColorLayer %i {") || fr.matchSequence("ColourLayer %i {") )
{
unsigned int layerNum;
fr[1].getUInt(layerNum);
++fr;
unsigned int layerNum = 0;
if (firstMatched)
{
fr[1].getUInt(layerNum);
++fr;
}
osgTerrain::Layer* layer = readLayer(fr);
if (layer) terrain->setColorLayer(layerNum, layer);
itrAdvanced = true;
}
if ((firstMatched = fr.matchSequence("ColorTransferFunction %i {")) || fr.matchSequence("ColorTransferFunction {") )
{
unsigned int layerNum = 0;
if (firstMatched)
{
fr[1].getUInt(layerNum);
++fr;
}
osg::TransferFunction* tf = readTransferFunction(fr);
if (tf) terrain->setColorTransferFunction(layerNum, tf);
itrAdvanced = true;
}
if (fr[0].matchWord("ColorFilter"))
{
unsigned int layerNum = 0;
if (fr.matchSequence("ColorFilter %i"))
{
fr[1].getUInt(layerNum);
fr += 2;
}
else
{
++fr;
}
if (fr[0].matchWord("NEAREST")) terrain->setColorFilter(layerNum, osgTerrain::TerrainNode::NEAREST);
else if (fr[0].matchWord("LINEAR")) terrain->setColorFilter(layerNum, osgTerrain::TerrainNode::LINEAR);
++fr;
itrAdvanced = true;
}
if (!itrAdvanced)
{
if (fr[0].getStr()) osg::notify(osg::NOTICE)<<"Terrain - unreconised token : ["<<fr[0].getStr() <<"]"<< std::endl;
++fr;
}
}
// step over trailing }
++fr;
terrain->setTerrainTechnique(new osgTerrain::GeometryTechnique);
return terrain.release();
@@ -168,8 +205,6 @@ osgTerrain::Layer* ReaderWriterTerrain::readLayer(osgDB::Input& fr) const
{
osg::ref_ptr<osgTerrain::Layer> layer;
osg::ref_ptr<osgTerrain::Locator> locator;
int entry = fr[0].getNoNestedBrackets();
@@ -177,13 +212,11 @@ osgTerrain::Layer* ReaderWriterTerrain::readLayer(osgDB::Input& fr) const
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
{
osg::notify(osg::NOTICE)<<"Layer : "<<fr[0].getStr() << std::endl;
bool itrAdvanced = false;
if (fr.matchSequence("Image %s") || fr.matchSequence("image %s"))
if (fr.matchSequence("Image %w") || fr.matchSequence("image %w") ||
fr.matchSequence("Image %s") || fr.matchSequence("image %s"))
{
osg::ref_ptr<osg::Image> image = osgDB::readImageFile(fr[1].getStr());
if (image.valid())
{
osg::ref_ptr<osgTerrain::ImageLayer> imagelayer = new osgTerrain::ImageLayer;
@@ -196,6 +229,21 @@ osgTerrain::Layer* ReaderWriterTerrain::readLayer(osgDB::Input& fr) const
itrAdvanced = true;
}
if (fr.matchSequence("HeightField %w") || fr.matchSequence("HeightField %s"))
{
osg::ref_ptr<osg::HeightField> hf = osgDB::readHeightFieldFile(fr[1].getStr());
if (hf.valid())
{
osg::ref_ptr<osgTerrain::HeightFieldLayer> hflayer = new osgTerrain::HeightFieldLayer;
hflayer->setHeightField(hf.get());
layer = hflayer.get();
}
fr += 2;
itrAdvanced = true;
}
if (fr.matchSequence("EllipsoidLocator %f %f %f %f"))
{
double x,y,w,h;
@@ -226,9 +274,13 @@ osgTerrain::Layer* ReaderWriterTerrain::readLayer(osgDB::Input& fr) const
if (!itrAdvanced)
{
if (fr[0].getStr()) osg::notify(osg::NOTICE)<<"Layer - unreconised token : "<<fr[0].getStr() << std::endl;
++fr;
}
}
// step over trailing }
++fr;
if (layer.valid() && locator.valid())
{
@@ -238,6 +290,49 @@ osgTerrain::Layer* ReaderWriterTerrain::readLayer(osgDB::Input& fr) const
return layer.release();
}
osg::TransferFunction* ReaderWriterTerrain::readTransferFunction(osgDB::Input& fr) const
{
osg::ref_ptr<osg::TransferFunction1D> tf = new osg::TransferFunction1D;
tf->allocate(6);
tf->setValue(0, osg::Vec4(1.0,1.0,1.0,1.0));
tf->setValue(1, osg::Vec4(1.0,0.0,1.0,1.0));
tf->setValue(2, osg::Vec4(1.0,0.0,0.0,1.0));
tf->setValue(3, osg::Vec4(1.0,1.0,0.0,1.0));
tf->setValue(4, osg::Vec4(0.0,1.0,1.0,1.0));
tf->setValue(5, osg::Vec4(0.0,1.0,0.0,1.0));
int entry = fr[0].getNoNestedBrackets();
fr += 2;
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
{
bool itrAdvanced = false;
if (fr.matchSequence("range %f %f"))
{
double minValue,maxValue;
fr[1].getFloat(minValue);
fr[2].getFloat(maxValue);
tf->setInputRange(minValue,maxValue);
fr += 3;
itrAdvanced = true;
}
if (!itrAdvanced)
{
if (fr[0].getStr()) osg::notify(osg::NOTICE)<<"TransferFunction - unreconised token : "<<fr[0].getStr() << std::endl;
++fr;
}
}
// step over trailing }
++fr;
return tf.release();
}
// now register with Registry to instantiate the above
// reader/writer.

View File

@@ -216,7 +216,7 @@ int main(int argc, char** argv)
double w = 1.0;
double h = 1.0;
osg::ref_ptr<osg::Node> test = osgDB::readNodeFile("test.terrain");
osg::ref_ptr<osg::Node> test = osgDB::readNodeFiles(arguments);
if (!test.valid()) return 0;