diff --git a/src/osgPlugins/osgTerrain/Terrain.cpp b/src/osgPlugins/osgTerrain/Terrain.cpp index 9c5268ed4..3567e0eb7 100644 --- a/src/osgPlugins/osgTerrain/Terrain.cpp +++ b/src/osgPlugins/osgTerrain/Terrain.cpp @@ -199,17 +199,35 @@ osgTerrain::Layer* readLayer(osgDB::Input& fr) localAdvanced = true; } - if (fr.matchSequence("Transform %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f")) + if (fr.matchSequence("Transform {")) { + int tansform_entry = fr[0].getNoNestedBrackets(); + + fr += 2; + + int row=0; + int col=0; + double v; osg::Matrixd matrix; - for(unsigned int i=1; i<=16; ++i) + while (!fr.eof() && fr[0].getNoNestedBrackets()>tansform_entry) { - fr[i].getFloat(matrix(i%4,i/4)); + if (fr[0].getFloat(v)) + { + matrix(row,col)=v; + ++col; + if (col>=4) + { + col = 0; + ++row; + } + ++fr; + } + else fr.advanceOverCurrentFieldOrBlock(); } - + locator->setTransform(matrix); - fr += 17; + ++fr; localAdvanced = true; } @@ -439,12 +457,17 @@ bool Terrain_readLocalData(osg::Object& obj, osgDB::Input &fr) itrAdvanced = true; } -#if 1 - if (!(terrain.getTerrainTechnique())) + if (fr.matchSequence("TerrainTechnique %w") || fr.matchSequence("TerrainTechnique %s")) { - terrain.setTerrainTechnique(new osgTerrain::GeometryTechnique); + if (fr[1].matchWord("GeometryTechnique")) + { + terrain.setTerrainTechnique(new osgTerrain::GeometryTechnique); + } + + fr += 2; + itrAdvanced = true; } -#endif + return itrAdvanced; } @@ -472,12 +495,20 @@ bool writeLocator(const osgTerrain::Locator& locator, osgDB::Output& fw) } case(osgTerrain::Locator::PROJECTED): { - fw<<"PROJECTED"<(&layer); + if (proxyLayer) + { + fw.indent()<<"ProxyLayer "<getFileName()<getFileName()<(&layer); if (hfLayer) { @@ -581,7 +619,12 @@ bool Terrain_writeLocalData(const osg::Object& obj, osgDB::Output& fw) fw.indent()<<"}"<className()<