diff --git a/include/osgTerrain/TerrainNode b/include/osgTerrain/TerrainNode index 737cdccff..d7af7be57 100644 --- a/include/osgTerrain/TerrainNode +++ b/include/osgTerrain/TerrainNode @@ -19,11 +19,12 @@ #include #include +#include namespace osgTerrain { /** Terrain provides a framework for loosly coupling height field data with height rendering algorithms. - * This allows renderer's to be pluged in at runtime.*/ + * This allows TerrainTechnique's to be pluged in at runtime.*/ class OSGTERRAIN_EXPORT TerrainNode : public osg::Group { public: @@ -38,62 +39,30 @@ class OSGTERRAIN_EXPORT TerrainNode : public osg::Group virtual void traverse(osg::NodeVisitor& nv); - /** Set the HeightField for this TerrainNode. - * If a Renderer is attached then this will be notified.*/ - void setHeightField(osg::HeightField* heightField); + /** Set the TerrainTechnique*/ + void setTerrainTechnique(osgTerrain::TerrainTechnique* TerrainTechnique); - /** Get the HeightField.*/ - osg::HeightField* getHeightField() { return _heightField.get(); } + /** Get the TerrainTechnique*/ + TerrainTechnique* getTerrainTechnique() { return _terrainTechnique.get(); } - /** Get the const HeightField.*/ - const osg::HeightField* getHeightField() const { return _heightField.get(); } - - /** Tell the Renderer that the height field has been modified, so - * that any cached data will need updating*/ - void heightFieldHasBeenModified(); - - /** Set the Renderer*/ - void setRenderer(osgTerrain::TerrainTechnique* renderer); + /** Get the const TerrainTechnique*/ + const TerrainTechnique* getTerrainTechnique() const { return _terrainTechnique.get(); } - /** Get the Renderer*/ - TerrainTechnique* getRenderer() { return _renderer.get(); } - - /** Get the const Renderer*/ - const TerrainTechnique* getRenderer() const { return _renderer.get(); } + void setHeightLayer(osgTerrain::Layer* layer); + osgTerrain::Layer* getHeightLayer(); - void setBaseTextureImage(osg::Image* image) { _baseTextureImage = image; } - osg::Image* getBaseTextureImage() { return _baseTextureImage.get(); } - const osg::Image* getBaseTextureImage() const { return _baseTextureImage.get(); } - - void setDetailTextureImage(osg::Image* image) { _detailTextureImage = image; } - osg::Image* getDetailTextureImage() { return _detailTextureImage.get(); } - const osg::Image* getDetailTextureImage() const { return _detailTextureImage.get(); } - - void setCloudShadowTextureImage(osg::Image* image) { _cloudShadowTextureImage = image; } - osg::Image* getCloudShadowTextureImage() { return _cloudShadowTextureImage.get(); } - const osg::Image* getCloudShadowTextureImage() const { return _cloudShadowTextureImage.get(); } - - void setNormalMapImage(osg::Image* image) { _normalMapImage = image ; } - osg::Image* getNormalMapImage() { return _normalMapImage.get(); } - const osg::Image* getNormalMapImage() const { return _normalMapImage.get(); } - - void computeNormalMap(); - + void addColorLayer(osgTerrain::Layer* layer); + void removeColorLayer(osgTerrain::Layer* layer); protected: virtual ~TerrainNode(); - - osg::ref_ptr _heightField; - osg::ref_ptr _renderer; - osg::ref_ptr _baseTextureImage; - osg::ref_ptr _detailTextureImage; - osg::ref_ptr _cloudShadowTextureImage; - osg::ref_ptr _normalMapImage; - + osg::ref_ptr _terrainTechnique; + + osg::ref_ptr _heightLayer; }; } diff --git a/src/osgTerrain/TerrainNode.cpp b/src/osgTerrain/TerrainNode.cpp index a6ef46f88..f424d7b6d 100644 --- a/src/osgTerrain/TerrainNode.cpp +++ b/src/osgTerrain/TerrainNode.cpp @@ -23,10 +23,11 @@ TerrainNode::TerrainNode() TerrainNode::TerrainNode(const TerrainNode& terrain,const osg::CopyOp& copyop): Group(terrain,copyop), - _heightField(terrain._heightField) + _heightLayer(terrain._heightLayer) { setNumChildrenRequiringUpdateTraversal(getNumChildrenRequiringUpdateTraversal()+1); - if (terrain.getRenderer()) setRenderer(dynamic_cast(terrain.getRenderer()->cloneType())); + + if (terrain.getTerrainTechnique()) setTerrainTechnique(dynamic_cast(terrain.getTerrainTechnique()->cloneType())); } TerrainNode::~TerrainNode() @@ -39,9 +40,9 @@ void TerrainNode::traverse(osg::NodeVisitor& nv) if (nv.getVisitorType()==osg::NodeVisitor::UPDATE_VISITOR) { osgUtil::UpdateVisitor* uv = dynamic_cast(&nv); - if (getRenderer() && uv) + if (getTerrainTechnique() && uv) { - getRenderer()->update(uv); + getTerrainTechnique()->update(uv); return; } @@ -49,9 +50,9 @@ void TerrainNode::traverse(osg::NodeVisitor& nv) else if (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR) { osgUtil::CullVisitor* cv = dynamic_cast(&nv); - if (getRenderer() && cv) + if (getTerrainTechnique() && cv) { - getRenderer()->cull(cv); + getTerrainTechnique()->cull(cv); return; } } @@ -60,50 +61,20 @@ void TerrainNode::traverse(osg::NodeVisitor& nv) Group::traverse(nv); } -void TerrainNode::setHeightField(osg::HeightField* heightField) +void TerrainNode::setHeightLayer(osgTerrain::Layer* layer) { - _heightField = heightField; - if (_renderer.valid()) _renderer->initialize(); + _heightLayer = layer; } -void TerrainNode::heightFieldHasBeenModified() +osgTerrain::Layer* TerrainNode::getHeightLayer() { - if (_renderer.valid()) _renderer->heightFieldHasBeenModified(); + return _heightLayer.get(); } -void TerrainNode::setRenderer(osgTerrain::TerrainTechnique* renderer) +void TerrainNode::addColorLayer(osgTerrain::Layer* layer) { - // need to figure out how to ensure that only one renderer is - // used between terrain nodes... issue a warning? - _renderer = renderer; - - if (_renderer.valid()) - { - _renderer->_terrainNode = this; - _renderer->initialize(); - } } -void TerrainNode::computeNormalMap() +void TerrainNode::removeColorLayer(osgTerrain::Layer* layer) { - if (_heightField.valid()) - { - osg::Image* image = new osg::Image; - image->allocateImage(_heightField->getNumColumns(),_heightField->getNumRows(),1,GL_RGB,GL_BYTE); - - char* ptr = (char*) image->data(); - for(unsigned int r=0;r<_heightField->getNumRows();++r) - { - for(unsigned int c=0;c<_heightField->getNumColumns();++c) - { - osg::Vec3 normal = _heightField->getNormal(c,r); - (*ptr++) = (char)((normal.x()+1.0)*0.5*255); - (*ptr++) = (char)((normal.y()+1.0)*0.5*255); - (*ptr++) = (char)((normal.z()+1.0)*0.5*255); - } - } - - setNormalMapImage(image); - - } }