1 /* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2  *
3  * This library is open source and may be redistributed and/or modified under
4  * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5  * (at your option) any later version.  The full license is in LICENSE file
6  * included with this distribution, and on the openscenegraph.org website.
7  *
8  * This library is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * OpenSceneGraph Public License for more details.
12 */
13 
14 #include <osgTerrain/TerrainTechnique>
15 #include <osgTerrain/TerrainTile>
16 
17 using namespace osgTerrain;
18 
19 /////////////////////////////////////////////////////////////////////////////////////
20 //
21 // TerrainNeighbours
22 //
TerrainNeighbours()23 TerrainNeighbours::TerrainNeighbours()
24 {
25 }
26 
~TerrainNeighbours()27 TerrainNeighbours::~TerrainNeighbours()
28 {
29     clear();
30 }
31 
addNeighbour(TerrainTile * tile)32 void TerrainNeighbours::addNeighbour(TerrainTile* tile)
33 {
34     OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_neighboursMutex);
35     _neighbours.insert(tile);
36 }
37 
removeNeighbour(TerrainTile * tile)38 void TerrainNeighbours::removeNeighbour(TerrainTile* tile)
39 {
40     OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_neighboursMutex);
41     _neighbours.erase(tile);
42 }
43 
clear()44 void TerrainNeighbours::clear()
45 {
46     OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_neighboursMutex);
47     _neighbours.clear();
48 }
49 
50 
containsNeighbour(TerrainTile * tile) const51 bool TerrainNeighbours::containsNeighbour(TerrainTile* tile) const
52 {
53     OpenThreads::ScopedLock<OpenThreads::Mutex> lock(_neighboursMutex);
54     return _neighbours.count(tile)!=0;
55 }
56 
57 /////////////////////////////////////////////////////////////////////////////////////
58 //
59 // TerrainTechnique
60 //
TerrainTechnique()61 TerrainTechnique::TerrainTechnique():
62     _terrainTile(0)
63 {
64     setThreadSafeRefUnref(true);
65 }
66 
TerrainTechnique(const TerrainTechnique & tt,const osg::CopyOp & copyop)67 TerrainTechnique::TerrainTechnique(const TerrainTechnique& tt,const osg::CopyOp& copyop):
68     osg::Object(tt,copyop),
69     _terrainTile(0)
70 {
71 }
72 
~TerrainTechnique()73 TerrainTechnique::~TerrainTechnique()
74 {
75 }
76 
setTerrainTile(TerrainTile * tile)77 void TerrainTechnique::setTerrainTile(TerrainTile* tile)
78 {
79     if (_terrainTile==tile) return;
80 
81     _neighbours.clear();
82 
83     _terrainTile = tile;
84 }
85 
init(int,bool)86 void TerrainTechnique::init(int /*dirtyMask*/, bool /*assumeMultiThreaded*/)
87 {
88     OSG_NOTICE<<className()<<"::init(..) not implemented yet"<<std::endl;
89 }
90 
update(osgUtil::UpdateVisitor * uv)91 void TerrainTechnique::update(osgUtil::UpdateVisitor* uv)
92 {
93     OSG_NOTICE<<className()<<"::update(..) not implemented yet"<<std::endl;
94     if (_terrainTile) _terrainTile->osg::Group::traverse(*uv);
95 }
96 
cull(osgUtil::CullVisitor * cv)97 void TerrainTechnique::cull(osgUtil::CullVisitor* cv)
98 {
99     OSG_NOTICE<<className()<<"::cull(..) not implemented yet"<<std::endl;
100     if (_terrainTile) _terrainTile->osg::Group::traverse(*cv);
101 }
102 
cleanSceneGraph()103 void TerrainTechnique::cleanSceneGraph()
104 {
105     OSG_NOTICE<<className()<<"::cleanSceneGraph(..) not implemented yet"<<std::endl;
106 }
107 
traverse(osg::NodeVisitor & nv)108 void TerrainTechnique::traverse(osg::NodeVisitor& nv)
109 {
110     if (!_terrainTile) return;
111 
112     // if app traversal update the frame count.
113     if (nv.getVisitorType()==osg::NodeVisitor::UPDATE_VISITOR)
114     {
115         if (_terrainTile->getDirty()) _terrainTile->init(_terrainTile->getDirtyMask(), false);
116 
117         osgUtil::UpdateVisitor* uv = nv.asUpdateVisitor();
118         if (uv)
119         {
120             update(uv);
121             return;
122         }
123 
124     }
125     else if (nv.getVisitorType()==osg::NodeVisitor::CULL_VISITOR)
126     {
127         osgUtil::CullVisitor* cv = nv.asCullVisitor();
128         if (cv)
129         {
130             cull(cv);
131             return;
132         }
133     }
134 
135     if (_terrainTile->getDirty())
136     {
137         _terrainTile->init(_terrainTile->getDirtyMask(), false);
138     }
139 
140     // otherwise fallback to the Group::traverse()
141     _terrainTile->osg::Group::traverse(nv);
142 }
143