virtual void apply(osg::Geode& geode) { osg::StateSet* stateset = geode.getStateSet(); if (stateset) applyStateSet(stateset); for (unsigned int i=0; i<geode.getNumDrawables(); ++i) { osg::Drawable* drw = geode.getDrawable(i); stateset = drw->getStateSet(); if (stateset) applyStateSet(stateset); } }
virtual void apply(osg::Node& node) { if (osgFX::Effect* effect = dynamic_cast<osgFX::Effect*>(&node)) applyEffect(*effect); osg::StateSet* stateset = node.getStateSet(); if (stateset) applyStateSet(stateset); traverse(node); }
void ShaderVisitor::apply(osg::Node& node) { if (node.getStateSet()) { pushRequirements(); applyStateSet(node.getStateSet(), node); traverse(node); popRequirements(); } else traverse(node); }
void applyEffect(osgFX::Effect& effect) { for (int i =0; i<effect.getNumTechniques(); ++i) { osgFX::Technique* tech = effect.getTechnique(i); for (int pass=0; pass<tech->getNumPasses(); ++pass) { if (tech->getPassStateSet(pass)) applyStateSet(tech->getPassStateSet(pass)); } } }
void ShaderVisitor::apply(osg::Drawable& drawable) { // non-Geometry drawable (e.g. particle system) bool needPop = (drawable.getStateSet() != NULL); if (drawable.getStateSet()) { pushRequirements(); applyStateSet(drawable.getStateSet(), drawable); } if (!mRequirements.empty()) { const ShaderRequirements& reqs = mRequirements.back(); // TODO: find a better place for the stateset if (reqs.mShaderRequired || mForceShaders) createProgram(reqs, drawable); } if (needPop) popRequirements(); }
void ShaderVisitor::apply(osg::Geometry& geometry) { bool needPop = (geometry.getStateSet() != NULL); if (geometry.getStateSet()) { pushRequirements(); applyStateSet(geometry.getStateSet(), geometry); } if (!mRequirements.empty()) { const ShaderRequirements& reqs = mRequirements.back(); if (mAllowedToModifyStateSets) { // make sure that all UV sets are there for (std::map<int, std::string>::const_iterator it = reqs.mTextures.begin(); it != reqs.mTextures.end(); ++it) { if (geometry.getTexCoordArray(it->first) == NULL) geometry.setTexCoordArray(it->first, geometry.getTexCoordArray(0)); } } if (reqs.mTexStageRequiringTangents != -1 && mAllowedToModifyStateSets) { osg::ref_ptr<osgUtil::TangentSpaceGenerator> generator (new osgUtil::TangentSpaceGenerator); generator->generate(&geometry, reqs.mTexStageRequiringTangents); geometry.setTexCoordArray(7, generator->getTangentArray(), osg::Array::BIND_PER_VERTEX); } // TODO: find a better place for the stateset if (reqs.mShaderRequired || mForceShaders) createProgram(reqs, geometry); } if (needPop) popRequirements(); }