From d479686804fd0149c216e489c135b1913a67533e Mon Sep 17 00:00:00 2001 From: Frederic Bouvier Date: Sun, 20 May 2012 15:42:55 +0200 Subject: [PATCH] Try to exclude unwanted geometry in the additional light pass --- simgear/scene/model/SGReaderWriterXML.cxx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/simgear/scene/model/SGReaderWriterXML.cxx b/simgear/scene/model/SGReaderWriterXML.cxx index 5a4356bb..26a31a45 100644 --- a/simgear/scene/model/SGReaderWriterXML.cxx +++ b/simgear/scene/model/SGReaderWriterXML.cxx @@ -198,6 +198,20 @@ void makeEffectAnimations(PropertyList& animation_nodes, } } +class SGSetNodeMaskVisitor : public osg::NodeVisitor { +public: + SGSetNodeMaskVisitor(osg::Node::NodeMask nms, osg::Node::NodeMask nmc) : + osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN), nodeMaskSet(nms), nodeMaskClear(nmc) + {} + virtual void apply(osg::Geode& node) { + node.setNodeMask((node.getNodeMask() | nodeMaskSet) & ~nodeMaskClear); + traverse(node); + } +private: + osg::Node::NodeMask nodeMaskSet; + osg::Node::NodeMask nodeMaskClear; +}; + static osg::Node * sgLoad3DModel_internal(const SGPath& path, const osgDB::Options* dbOptions, @@ -430,6 +444,7 @@ sgLoad3DModel_internal(const SGPath& path, prop_root, options.get())); } + PropertyList effect_nodes = props->getChildren("effect"); PropertyList animation_nodes = props->getChildren("animation"); PropertyList light_nodes = props->getChildren("light"); @@ -440,6 +455,9 @@ sgLoad3DModel_internal(const SGPath& path, = instantiateEffects(group.get(), effect_nodes, options.get()); group = static_cast(modelWithEffects.get()); } + + SGSetNodeMaskVisitor snmv(0, simgear::MODELLIGHT_BIT); + group->accept(snmv); for (unsigned i = 0; i < animation_nodes.size(); ++i) /// OSGFIXME: duh, why not only model????? SGAnimation::animate(group.get(), animation_nodes[i], prop_root, -- 2.39.5