From 557fdacba293631251305a372c3bbaaa186b1d2e Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 11 Apr 2007 11:20:04 +0000 Subject: [PATCH] Added support for multiple colour layers, and fixed handling of elevation and colour layers having different locator --- include/osgTerrain/TerrainNode | 54 ++++++++++++++++++++++------ src/osgTerrain/GeometryTechnique.cpp | 8 ++--- src/osgTerrain/TerrainNode.cpp | 26 +++++++++----- 3 files changed, 66 insertions(+), 22 deletions(-) diff --git a/include/osgTerrain/TerrainNode b/include/osgTerrain/TerrainNode index c34ad69f8..d920deeef 100644 --- a/include/osgTerrain/TerrainNode +++ b/include/osgTerrain/TerrainNode @@ -60,18 +60,43 @@ class OSGTERRAIN_EXPORT TerrainNode : public osg::Group /** Get the coordinate frame locator of the terrain node.*/ const Locator* getLocator() const { return _locator.get(); } - + /** Set the layer to use to define the elevations of the terrain.*/ void setElevationLayer(Layer* layer); + + /** Get the layer to use to define the elevations of the terrain.*/ Layer* getElevationLayer() { return _elevationLayer.get(); } + + /** Get the const layer to use to define the elevations of the terrain.*/ const Layer* getElevationLayer() const { return _elevationLayer.get(); } + + + /** Set a color layer with specified layer number.*/ + void setColorLayer(unsigned int i, osgTerrain::Layer* layer); + + /** Get color layer with specified layer number.*/ + Layer* getColorLayer(unsigned int i) { return i<_colorLayers.size() ? _colorLayers[i].layer.get() : 0; } + + /** Set const color layer with specified layer number.*/ + const Layer* getColorLayer(unsigned int i) const { return i<_colorLayers.size() ? _colorLayers[i].layer.get() : 0; } - void setColorLayer(osgTerrain::Layer* layer); - Layer* getColorLayer() { return _colorLayer.get(); } - const Layer* getColorLayer() const { return _colorLayer.get(); } - - void setColorTransferFunction(osg::TransferFunction* tf); - osg::TransferFunction* getColorTransferFunction() { return _colorTransferFunction.get(); } - const osg::TransferFunction* getColorTransferFunction() const { return _colorTransferFunction.get(); } + /** Set a color transfer function with specified layer number.*/ + void setColorTransferFunction(unsigned int i, osg::TransferFunction* tf); + + /** Get color transfer function with specified layer number.*/ + osg::TransferFunction* getColorTransferFunction(unsigned int i) { return i<_colorLayers.size() ? _colorLayers[i].transferFunction.get() : 0; } + + /** Get const color transfer function with specified layer number.*/ + const osg::TransferFunction* getColorTransferFunction(unsigned int i) const { return i<_colorLayers.size() ? _colorLayers[i].transferFunction.get() : 0; } + + unsigned int getNumColorLayers() const { return _colorLayers.size(); } + + + /** Set whether the TerrainTechnique should create per vertex normals for lighting purposes.*/ + void setRequiresNormals(bool flag) { _requiresNormals = flag; } + + /** Get whether the TerrainTechnique should create per vertex normals for lighting purposes.*/ + bool getRequiresNormals() const { return _requiresNormals; } + /** Compute the bounding volume of the terrain by computing the union of the bounding volumes of all layers.*/ virtual osg::BoundingSphere computeBound() const; @@ -80,13 +105,22 @@ class OSGTERRAIN_EXPORT TerrainNode : public osg::Group virtual ~TerrainNode(); + struct LayerData + { + osg::ref_ptr layer; + osg::ref_ptr transferFunction; + }; + + typedef std::vector Layers; + osg::ref_ptr _terrainTechnique; osg::ref_ptr _locator; osg::ref_ptr _elevationLayer; - osg::ref_ptr _colorLayer; - osg::ref_ptr _colorTransferFunction; + Layers _colorLayers; + + bool _requiresNormals; }; } diff --git a/src/osgTerrain/GeometryTechnique.cpp b/src/osgTerrain/GeometryTechnique.cpp index 75d80b961..01964cebf 100644 --- a/src/osgTerrain/GeometryTechnique.cpp +++ b/src/osgTerrain/GeometryTechnique.cpp @@ -47,8 +47,8 @@ void GeometryTechnique::init() osgTerrain::Layer* elevationLayer = _terrainNode->getElevationLayer(); - osgTerrain::Layer* colorLayer = _terrainNode->getColorLayer(); - osg::TransferFunction* colorTF = _terrainNode->getColorTransferFunction(); + osgTerrain::Layer* colorLayer = _terrainNode->getColorLayer(0); + osg::TransferFunction* colorTF = _terrainNode->getColorTransferFunction(0); // if the elevationLayer and colorLayer are the same, and there is colorTF then // simply assing as a texture coordinate. @@ -182,7 +182,7 @@ void GeometryTechnique::init() for(unsigned int i=0; icomputeLocalBounds(*masterLocator, ndc, color_ndc); + Locator::convertLocalCoordBetween(*masterLocator, ndc, *colorLocator, color_ndc); (*texcoords)[iv].set(color_ndc.x(), color_ndc.y()); } else diff --git a/src/osgTerrain/TerrainNode.cpp b/src/osgTerrain/TerrainNode.cpp index 66fa6c915..6fb8c2690 100644 --- a/src/osgTerrain/TerrainNode.cpp +++ b/src/osgTerrain/TerrainNode.cpp @@ -16,7 +16,8 @@ using namespace osg; using namespace osgTerrain; -TerrainNode::TerrainNode() +TerrainNode::TerrainNode(): + _requiresNormals(true) { setNumChildrenRequiringUpdateTraversal(1); } @@ -24,8 +25,8 @@ TerrainNode::TerrainNode() TerrainNode::TerrainNode(const TerrainNode& terrain,const osg::CopyOp& copyop): Group(terrain,copyop), _elevationLayer(terrain._elevationLayer), - _colorLayer(terrain._colorLayer), - _colorTransferFunction(terrain._colorTransferFunction) + _colorLayers(terrain._colorLayers), + _requiresNormals(terrain._requiresNormals) { setNumChildrenRequiringUpdateTraversal(getNumChildrenRequiringUpdateTraversal()+1); @@ -66,14 +67,18 @@ void TerrainNode::setElevationLayer(osgTerrain::Layer* layer) _elevationLayer = layer; } -void TerrainNode::setColorLayer(osgTerrain::Layer* layer) +void TerrainNode::setColorLayer(unsigned int i, osgTerrain::Layer* layer) { - _colorLayer = layer; + if (_colorLayers.size() <= i) _colorLayers.resize(i+1); + + _colorLayers[i].layer = layer; } -void TerrainNode::setColorTransferFunction(osg::TransferFunction* tf) +void TerrainNode::setColorTransferFunction(unsigned int i, osg::TransferFunction* tf) { - _colorTransferFunction = tf; + if (_colorLayers.size() <= i) _colorLayers.resize(i+1); + + _colorLayers[i].transferFunction = tf; } osg::BoundingSphere TerrainNode::computeBound() const @@ -82,7 +87,12 @@ osg::BoundingSphere TerrainNode::computeBound() const if (_elevationLayer.valid()) bs.expandBy(_elevationLayer->computeBound()); - if (_colorLayer.valid()) bs.expandBy(_colorLayer->computeBound()); + for(Layers::const_iterator itr = _colorLayers.begin(); + itr != _colorLayers.end(); + ++itr) + { + if (itr->layer.valid()) bs.expandBy(itr->layer->computeBound()); + } return bs; }