Files
simgear/simgear/scene/util/NodeAndDrawableVisitor.cxx
T
timoore 8f46f2cac8 Rewrite livery texture replacement to copy StateSet objects
Also, add a NodeAndDrawableVisitor that descends into osg::Drawable.

That motivation for this is that it's a bad idea to modify state sets
that the osgDB::SharedStateManager might be keeping.
2008-04-23 18:13:50 +00:00

74 lines
1.9 KiB
C++

/* -*-c++-*-
*
* Copyright (C) 2008 Tim Moore
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*/
#include <osg/Drawable>
#include <osg/Geode>
#include "NodeAndDrawableVisitor.hxx"
namespace simgear
{
using namespace osg;
NodeAndDrawableVisitor::NodeAndDrawableVisitor(NodeVisitor::TraversalMode tm) :
NodeVisitor(tm)
{
}
NodeAndDrawableVisitor::NodeAndDrawableVisitor(NodeVisitor::VisitorType type,
NodeVisitor::TraversalMode tm) :
NodeVisitor(type, tm)
{
}
NodeAndDrawableVisitor::~NodeAndDrawableVisitor()
{
}
void NodeAndDrawableVisitor::apply(Node& node)
{
traverse(node);
}
void NodeAndDrawableVisitor::apply(Drawable& Drawable)
{
}
void NodeAndDrawableVisitor::traverse(Node& node)
{
TraversalMode tm = getTraversalMode();
if (tm == TRAVERSE_NONE) {
return;
} else if (tm == TRAVERSE_PARENTS) {
NodeVisitor::traverse(node);
return;
}
Geode* geode = dynamic_cast<Geode*>(&node);
if (geode) {
unsigned numDrawables = geode->getNumDrawables();
for (unsigned i = 0; i < numDrawables; ++i)
apply(*geode->getDrawable(i));
} else {
NodeVisitor::traverse(node);
}
}
}