Improvements to the .terrain file support
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user