00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifdef HAVE_CONFIG_H
00018 # include <simgear_config.h>
00019 #endif
00020
00021 #include <osg/StateSet>
00022
00023 #include "EffectCullVisitor.hxx"
00024
00025 #include "EffectGeode.hxx"
00026 #include "Effect.hxx"
00027 #include "Technique.hxx"
00028
00029 namespace simgear
00030 {
00031
00032 using osgUtil::CullVisitor;
00033
00034 EffectCullVisitor::EffectCullVisitor()
00035 {
00036 }
00037
00038 EffectCullVisitor::EffectCullVisitor(const EffectCullVisitor& rhs) :
00039 CullVisitor(rhs)
00040 {
00041 }
00042
00043 CullVisitor* EffectCullVisitor::clone() const
00044 {
00045 return new EffectCullVisitor(*this);
00046 }
00047
00048 void EffectCullVisitor::apply(osg::Geode& node)
00049 {
00050 if (isCulled(node))
00051 return;
00052 EffectGeode *eg = dynamic_cast<EffectGeode*>(&node);
00053 if (!eg) {
00054 CullVisitor::apply(node);
00055 return;
00056 }
00057 Effect* effect = eg->getEffect();
00058 Technique* technique = 0;
00059 if (!effect) {
00060 CullVisitor::apply(node);
00061 return;
00062 } else if (!(technique = effect->chooseTechnique(&getRenderInfo()))) {
00063 return;
00064 }
00065
00066 osg::StateSet* node_state = node.getStateSet();
00067 if (node_state)
00068 pushStateSet(node_state);
00069 for (EffectGeode::DrawablesIterator beginItr = eg->drawablesBegin(),
00070 e = eg->drawablesEnd();
00071 beginItr != e;
00072 beginItr = technique->processDrawables(beginItr, e, this,
00073 eg->isCullingActive()))
00074 ;
00075
00076 if (node_state)
00077 popStateSet();
00078
00079 }
00080 }