From: timoore Date: Wed, 15 Jul 2009 23:10:32 +0000 (+0000) Subject: materials use only simgear::Effect X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=c3b1802e956db11c2b06d354d90bca3ca9622a7b;p=simgear.git materials use only simgear::Effect Eliminate SGMaterial::get_state function. Use Effect in BVH visitor, ocean tile generation, and airport signs. --- diff --git a/simgear/scene/material/mat.cxx b/simgear/scene/material/mat.cxx index dddec02d..7a0628f0 100644 --- a/simgear/scene/material/mat.cxx +++ b/simgear/scene/material/mat.cxx @@ -231,31 +231,6 @@ SGMaterial::init () } } -osg::StateSet * -SGMaterial::get_state (int n) -{ - if (_status.size() == 0) { - SG_LOG( SG_GENERAL, SG_WARN, "No state available."); - return NULL; - } - - int i = n >= 0 ? n : _current_ptr; - - if(!_status[i].texture_loaded) - { - assignTexture(_status[i].state.get(), _status[i].texture_path, - wrapu, wrapv, mipmap); - _status[i].texture_loaded = true; - } - osg::StateSet *st = _status[i].state.get(); - - _current_ptr += 1; - if (_current_ptr >= _status.size()) - _current_ptr = 0; - - return st; -} - Effect* SGMaterial::get_effect(int n) { if (_status.size() == 0) { diff --git a/simgear/scene/material/mat.hxx b/simgear/scene/material/mat.hxx index faccaf6b..e041b698 100644 --- a/simgear/scene/material/mat.hxx +++ b/simgear/scene/material/mat.hxx @@ -120,7 +120,6 @@ public: /** * Get the textured state. */ - osg::StateSet *get_state (int n = -1); simgear::Effect *get_effect(int n = -1); /** diff --git a/simgear/scene/material/matlib.cxx b/simgear/scene/material/matlib.cxx index 6f5d10bf..4f135770 100644 --- a/simgear/scene/material/matlib.cxx +++ b/simgear/scene/material/matlib.cxx @@ -135,19 +135,15 @@ SGMaterialLib::~SGMaterialLib ( void ) { } const SGMaterial* -SGMaterialLib::findMaterial(const osg::StateSet* stateSet) +SGMaterialLib::findMaterial(const simgear::Effect* effect) { - if (!stateSet) - return 0; - - const osg::Referenced* base = stateSet->getUserData(); - if (!base) + if (!effect) return 0; const SGMaterialUserData* matUserData - = dynamic_cast(base); + = dynamic_cast(effect->getUserData()); if (!matUserData) return 0; - - return matUserData->getMaterial(); + else + return matUserData->getMaterial(); } diff --git a/simgear/scene/material/matlib.hxx b/simgear/scene/material/matlib.hxx index 145225b9..373ae83d 100644 --- a/simgear/scene/material/matlib.hxx +++ b/simgear/scene/material/matlib.hxx @@ -48,6 +48,11 @@ using std::map; using std::vector; using std::less; +namespace simgear +{ +class Effect; +} + // Material management class class SGMaterialLib { @@ -77,7 +82,7 @@ public: material_map_iterator end() { return matlib.end(); } const_material_map_iterator end() const { return matlib.end(); } - static const SGMaterial* findMaterial(const osg::StateSet* stateSet); + static const SGMaterial* findMaterial(const simgear::Effect* effect); // Destructor ~SGMaterialLib ( void ); diff --git a/simgear/scene/model/BoundingVolumeBuildVisitor.hxx b/simgear/scene/model/BoundingVolumeBuildVisitor.hxx index 80587ff0..0489f827 100644 --- a/simgear/scene/model/BoundingVolumeBuildVisitor.hxx +++ b/simgear/scene/model/BoundingVolumeBuildVisitor.hxx @@ -27,6 +27,8 @@ #include #include +#include +#include #include #include #include @@ -384,10 +386,10 @@ public: { } - const SGMaterial* pushMaterial(osg::StateSet* stateSet) + const SGMaterial* pushMaterial(Effect* effect) { const SGMaterial* oldMaterial = _primitiveFunctor.getCurrentMaterial(); - const SGMaterial* material = SGMaterialLib::findMaterial(stateSet); + const SGMaterial* material = SGMaterialLib::findMaterial(effect); if (material) _primitiveFunctor.setCurrentMaterial(material); return oldMaterial; @@ -395,9 +397,7 @@ public: void fillWith(osg::Drawable* drawable) { - const SGMaterial* oldMaterial = pushMaterial(drawable->getStateSet()); drawable->accept(_primitiveFunctor); - _primitiveFunctor.setCurrentMaterial(oldMaterial); } virtual void apply(osg::Geode& geode) @@ -405,7 +405,11 @@ public: if (hasBoundingVolumeTree(geode)) return; - const SGMaterial* oldMaterial = pushMaterial(geode.getStateSet()); + const SGMaterial* oldMaterial = 0; + + EffectGeode *eg = dynamic_cast(&geode); + if (eg) + oldMaterial = pushMaterial(eg->getEffect()); bool flushHere = getNodePath().size() <= 1 || _dumpIntoLeafs; if (flushHere) { @@ -426,8 +430,8 @@ public: for(unsigned i = 0; i < geode.getNumDrawables(); ++i) fillWith(geode.getDrawable(i)); } - - _primitiveFunctor.setCurrentMaterial(oldMaterial); + if (eg) + _primitiveFunctor.setCurrentMaterial(oldMaterial); } virtual void apply(osg::Group& group) @@ -453,8 +457,6 @@ public: if (hasBoundingVolumeTree(node)) return; - const SGMaterial* oldMaterial = pushMaterial(node.getStateSet()); - // push the current active primitive list PFunctor previousPrimitives; _primitiveFunctor.swap(previousPrimitives); @@ -469,8 +471,6 @@ public: // pop the current active primitive list _primitiveFunctor.swap(previousPrimitives); - - _primitiveFunctor.setCurrentMaterial(oldMaterial); } void traverseAndCollect(osg::Node& node) @@ -488,12 +488,8 @@ public: // Note that we do not need to push the already collected list of // primitives, since we are now in the topmost node ... - const SGMaterial* oldMaterial = pushMaterial(node.getStateSet()); - // walk the children traverse(node); - - _primitiveFunctor.setCurrentMaterial(oldMaterial); } void addBoundingVolumeTreeToNode(osg::Node& node) diff --git a/simgear/scene/tgdb/SGOceanTile.cxx b/simgear/scene/tgdb/SGOceanTile.cxx index 0fcb16f8..9ff60f3e 100644 --- a/simgear/scene/tgdb/SGOceanTile.cxx +++ b/simgear/scene/tgdb/SGOceanTile.cxx @@ -37,8 +37,11 @@ #include #include #include +#include +#include #include #include + #include using namespace simgear; @@ -254,7 +257,7 @@ void fillDrawElementsWithApron(short height, short width, osg::Node* SGOceanTile(const SGBucket& b, SGMaterialLib *matlib) { - osg::StateSet *stateSet = 0; + Effect *effect = 0; double tex_width = 1000.0; @@ -266,7 +269,7 @@ osg::Node* SGOceanTile(const SGBucket& b, SGMaterialLib *matlib) tex_width = mat->get_xsize(); // set OSG State - stateSet = mat->get_state(); + effect = mat->get_effect(); } else { SG_LOG( SG_TERRAIN, SG_ALERT, "Ack! unknown use material name = Ocean"); } @@ -302,10 +305,10 @@ osg::Node* SGOceanTile(const SGBucket& b, SGMaterialLib *matlib) + 2 * (latPoints - 1))); fillDrawElementsWithApron(latPoints, lonPoints, drawElements->begin()); geometry->addPrimitiveSet(drawElements); - geometry->setStateSet(stateSet); - osg::Geode* geode = new osg::Geode; + EffectGeode* geode = new EffectGeode; geode->setName("Ocean tile"); + geode->setEffect(effect); geode->addDrawable(geometry); osg::MatrixTransform* transform = new osg::MatrixTransform; diff --git a/simgear/scene/tgdb/apt_signs.cxx b/simgear/scene/tgdb/apt_signs.cxx index 4053dda1..34d61c12 100644 --- a/simgear/scene/tgdb/apt_signs.cxx +++ b/simgear/scene/tgdb/apt_signs.cxx @@ -33,6 +33,8 @@ #include #include +#include +#include #include #include @@ -42,17 +44,18 @@ #define RWY "OBJECT_RUNWAY_SIGN: " using std::vector; +using namespace simgear; // for temporary storage of sign elements struct element_info { - element_info(SGMaterial *m, osg::StateSet *s, SGMaterialGlyph *g, double h) + element_info(SGMaterial *m, Effect *s, SGMaterialGlyph *g, double h) : material(m), state(s), glyph(g), height(h) { scale = h * m->get_xsize() / (m->get_ysize() < 0.001 ? 1.0 : m->get_ysize()); } SGMaterial *material; - osg::StateSet *state; + Effect *state; SGMaterialGlyph *glyph; double height; double scale; @@ -104,8 +107,8 @@ SGMakeSign(SGMaterialLib *matlib, const string& path, const string& content) object->setName(content); SGMaterial *material; - osg::StateSet *lighted_state; - osg::StateSet *unlighted_state; + Effect *lighted_state; + Effect *unlighted_state; // Part I: parse & measure for (const char *s = content.data(); *s; s++) { @@ -224,12 +227,12 @@ SGMakeSign(SGMaterialLib *matlib, const string& path, const string& content) } // set material states (lighted & unlighted) - lighted_state = material->get_state(); + lighted_state = material->get_effect(); string u = newmat + ".unlighted"; SGMaterial *m = matlib->find(u); if (m) { - unlighted_state = m->get_state(); + unlighted_state = m->get_effect(); } else { SG_LOG(SG_TERRAIN, SG_ALERT, SIGN "ignoring unknown material `" << u << '\''); unlighted_state = lighted_state; @@ -244,7 +247,7 @@ SGMakeSign(SGMaterialLib *matlib, const string& path, const string& content) } // in managed mode push frame stop and frame start first - osg::StateSet *state = lighted ? lighted_state : unlighted_state; + Effect *state = lighted ? lighted_state : unlighted_state; element_info *e; if (newtype && newtype != oldtype) { if (close) { @@ -319,9 +322,9 @@ SGMakeSign(SGMaterialLib *matlib, const string& path, const string& content) geometry->setColorBinding(osg::Geometry::BIND_OVERALL); geometry->setTexCoordArray(0, tl); geometry->addPrimitiveSet(new osg::DrawArrays(GL_TRIANGLE_STRIP, 0, vl->size())); - osg::Geode* geode = new osg::Geode; + EffectGeode* geode = new EffectGeode; geode->addDrawable(geometry); - geode->setStateSet(element->state); + geode->setEffect(element->state); object->addChild(geode); hpos += abswidth; @@ -344,11 +347,11 @@ SGMakeSign(SGMaterialLib *matlib, const string& path, const string& content) geometry->setNormalArray(nl); geometry->setNormalBinding(osg::Geometry::BIND_OVERALL); geometry->addPrimitiveSet(new osg::DrawArrays(GL_TRIANGLE_STRIP, 0, vl->size())); - osg::Geode* geode = new osg::Geode; + EffectGeode* geode = new EffectGeode; geode->addDrawable(geometry); SGMaterial *mat = matlib->find("BlackSign"); if (mat) - geode->setStateSet(mat->get_state()); + geode->setEffect(mat->get_effect()); object->addChild(geode); return object; @@ -367,14 +370,12 @@ SGMakeRunwaySign(SGMaterialLib *matlib, const string& path, const string& name) osg::Vec3 heightVec(0, 0, 1); osg::Geometry* geometry; geometry = osg::createTexturedQuadGeometry(corner, widthVec, heightVec); - - SGMaterial *mat = matlib->find(name); - if (mat) - geometry->setStateSet(mat->get_state()); - - osg::Geode* geode = new osg::Geode; + EffectGeode* geode = new EffectGeode; geode->setName(name); geode->addDrawable(geometry); + SGMaterial *mat = matlib->find(name); + if (mat) + geode->setEffect(mat->get_effect()); return geode; }