From d4aaa31549f076e6a3a58999cf8c7c48f75238aa Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Mon, 16 Jul 2007 15:13:47 +0000 Subject: [PATCH] Improvements to the .terrain file support --- examples/osgterrain/ReaderWriterTerrain.cpp | 153 ++++++++++++++++---- examples/osgterrain/osgterrain.cpp | 2 +- 2 files changed, 125 insertions(+), 30 deletions(-) diff --git a/examples/osgterrain/ReaderWriterTerrain.cpp b/examples/osgterrain/ReaderWriterTerrain.cpp index a86472f83..7974bf2c7 100644 --- a/examples/osgterrain/ReaderWriterTerrain.cpp +++ b/examples/osgterrain/ReaderWriterTerrain.cpp @@ -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"< group = new osg::Group; while(!fr.eof()) { - osg::notify(osg::NOTICE)<<"Read : "<addChild(node); + itrAdvanced = true; } - if (!itrAdvanced) ++fr; + if (!itrAdvanced) + { + if (fr[0].getStr()) osg::notify(osg::NOTICE)<<"Terrain file - unreconised token : "<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 : "<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 : ["<setTerrainTechnique(new osgTerrain::GeometryTechnique); return terrain.release(); @@ -168,8 +205,6 @@ osgTerrain::Layer* ReaderWriterTerrain::readLayer(osgDB::Input& fr) const { osg::ref_ptr layer; osg::ref_ptr 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 : "< image = osgDB::readImageFile(fr[1].getStr()); - if (image.valid()) { osg::ref_ptr 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 hf = osgDB::readHeightFieldFile(fr[1].getStr()); + if (hf.valid()) + { + osg::ref_ptr 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 : "< 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 : "< test = osgDB::readNodeFile("test.terrain"); + osg::ref_ptr test = osgDB::readNodeFiles(arguments); if (!test.valid()) return 0;