X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fmaterial%2FEffectGeode.cxx;h=26eab3852fdf6715864c23581c5a3af359dcee9a;hb=aef8f13290c74359c1a7a54bd5e6e375b3f0c49e;hp=aff9aebc4469c077f69952db4010199d68a49380;hpb=dca07c5634604c18213d08b688e894de354ea335;p=simgear.git diff --git a/simgear/scene/material/EffectGeode.cxx b/simgear/scene/material/EffectGeode.cxx index aff9aebc..26eab385 100644 --- a/simgear/scene/material/EffectGeode.cxx +++ b/simgear/scene/material/EffectGeode.cxx @@ -23,6 +23,7 @@ #include "Technique.hxx" #include +#include #include #include @@ -66,12 +67,40 @@ void EffectGeode::releaseGLObjects(osg::State* state) const Geode::releaseGLObjects(state); } +// Generates tangent space vectors or other data from geom, as defined by effect +void EffectGeode::runGenerators(osg::Geometry *geometry) +{ + if(geometry && _effect.valid()) { + // Generate tangent vectors for the geometry + osg::ref_ptr tsg = new osgUtil::TangentSpaceGenerator; + + // Generating only tangent vector should be enough + // since the binormal is a cross product of normal and tangent + // This saves a bit of memory & memory bandwidth! + int n = _effect->getGenerator(Effect::TANGENT); + tsg->generate(geometry, 0); // 0 is normal_unit, but I have no idea what that is! + if (n != -1 && !geometry->getVertexAttribArray(n)) + geometry->setVertexAttribData(n, osg::Geometry::ArrayData(tsg->getTangentArray(), osg::Geometry::BIND_PER_VERTEX,GL_FALSE)); + + n = _effect->getGenerator(Effect::BINORMAL); + if (n != -1 && !geometry->getVertexAttribArray(n)) + geometry->setVertexAttribData(n, osg::Geometry::ArrayData(tsg->getBinormalArray(), osg::Geometry::BIND_PER_VERTEX,GL_FALSE)); + + n = _effect->getGenerator(Effect::NORMAL); + if (n != -1 && !geometry->getVertexAttribArray(n)) + geometry->setVertexAttribData(n, osg::Geometry::ArrayData(tsg->getNormalArray(), osg::Geometry::BIND_PER_VERTEX,GL_FALSE)); + } +} + bool EffectGeode_writeLocalData(const Object& obj, osgDB::Output& fw) { const EffectGeode& eg = static_cast(obj); - fw.indent() << "effect\n"; - fw.writeObject(*eg.getEffect()); + if (eg.getEffect()) { + fw.indent() << "effect\n"; + fw.writeObject(*eg.getEffect()); + } + return true; }