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 }