diff --git a/simgear/scene/material/Effect.hxx b/simgear/scene/material/Effect.hxx index 438533a3..7bd0258f 100644 --- a/simgear/scene/material/Effect.hxx +++ b/simgear/scene/material/Effect.hxx @@ -160,7 +160,8 @@ size_t hash_value(const Effect::Key&); Effect* makeEffect(const std::string& name, bool realizeTechniques, - const SGReaderWriterOptions* options); + const SGReaderWriterOptions* options, + const SGPath& modelPath = SGPath{}); Effect* makeEffect(SGPropertyNode* prop, bool realizeTechniques, diff --git a/simgear/scene/material/makeEffect.cxx b/simgear/scene/material/makeEffect.cxx index 2c67f93e..9855f371 100644 --- a/simgear/scene/material/makeEffect.cxx +++ b/simgear/scene/material/makeEffect.cxx @@ -104,7 +104,8 @@ void mergePropertyTrees(SGPropertyNode* resultNode, Effect* makeEffect(const string& name, bool realizeTechniques, - const SGReaderWriterOptions* options) + const SGReaderWriterOptions* options, + const SGPath& modelPath) { { OpenThreads::ScopedLock lock(effectMutex); @@ -115,8 +116,7 @@ Effect* makeEffect(const string& name, } string effectFileName(name); effectFileName += ".eff"; - string absFileName - = SGModelLib::findDataFile(effectFileName, options); + string absFileName = SGModelLib::findDataFile(effectFileName, options, modelPath); if (absFileName.empty()) { simgear::reportFailure(simgear::LoadFailure::NotFound, simgear::ErrorCode::LoadEffectsShaders, "Couldn't find Effect:" + effectFileName); return nullptr; @@ -187,7 +187,7 @@ Effect* makeEffect(SGPropertyNode* prop, Effect* parent = 0; if (inheritProp) { //prop->removeChild("inherits-from"); - parent = makeEffect(inheritProp->getStringValue(), false, options); + parent = makeEffect(inheritProp->getStringValue(), false, options, filePath); if (parent) { Effect::Key key; key.unmerged = prop; diff --git a/simgear/scene/model/SGReaderWriterXML.cxx b/simgear/scene/model/SGReaderWriterXML.cxx index c9297f26..c92173d4 100644 --- a/simgear/scene/model/SGReaderWriterXML.cxx +++ b/simgear/scene/model/SGReaderWriterXML.cxx @@ -800,8 +800,8 @@ sgLoad3DModel_internal(const SGPath& path, // Some material animations (eventually all) are actually effects. makeEffectAnimations(animation_nodes, effect_nodes); { - ref_ptr modelWithEffects - = instantiateEffects(group.get(), effect_nodes, options.get()); + ref_ptr modelWithEffects = instantiateEffects(group.get(), effect_nodes, options.get(), + path.dirPath()); group = static_cast(modelWithEffects.get()); } diff --git a/simgear/scene/model/model.cxx b/simgear/scene/model/model.cxx index cd2fc8f1..db348f92 100644 --- a/simgear/scene/model/model.cxx +++ b/simgear/scene/model/model.cxx @@ -218,7 +218,7 @@ public: typedef std::map EffectMap; using SplicingVisitor::apply; MakeEffectVisitor(const SGReaderWriterOptions* options = 0) - : _options(options) + : _options(options), _modelPath(SGPath{}) { } virtual void apply(osg::Group& node); @@ -230,10 +230,17 @@ public: _currentEffectParent = effect; } SGPropertyNode* getDefaultEffect() { return _currentEffectParent; } + + void setModelPath(const SGPath& p) + { + _modelPath = p; + } + protected: EffectMap _effectMap; SGPropertyNode_ptr _currentEffectParent; osg::ref_ptr _options; + SGPath _modelPath; }; void MakeEffectVisitor::apply(osg::Group& node) @@ -271,7 +278,7 @@ void MakeEffectVisitor::apply(osg::Geode& geode) makeParametersFromStateSet(ssRoot, ss); SGPropertyNode_ptr effectRoot = new SGPropertyNode; effect::mergePropertyTrees(effectRoot, ssRoot, _currentEffectParent); - Effect* effect = makeEffect(effectRoot, true, _options.get()); + Effect* effect = makeEffect(effectRoot, true, _options.get(), _modelPath); EffectGeode* eg = dynamic_cast(&geode); if (eg) { eg->setEffect(effect); @@ -316,7 +323,8 @@ protected: ref_ptr instantiateEffects(osg::Node* modelGroup, PropertyList& effectProps, - const SGReaderWriterOptions* options) + const SGReaderWriterOptions* options, + const SGPath& modelPath) { SGPropertyNode_ptr defaultEffectPropRoot; MakeEffectVisitor visitor(options); @@ -341,13 +349,15 @@ ref_ptr instantiateEffects(osg::Node* modelGroup, if (!defaultEffectPropRoot) defaultEffectPropRoot = DefaultEffect::instance()->getEffect(); visitor.setDefaultEffect(defaultEffectPropRoot.ptr()); + visitor.setModelPath(modelPath); modelGroup->accept(visitor); osg::NodeList& result = visitor.getResults(); return ref_ptr(result[0].get()); } ref_ptr instantiateMaterialEffects(osg::Node* modelGroup, - const SGReaderWriterOptions* options) + const SGReaderWriterOptions* options, + const SGPath& modelPath) { SGPropertyNode_ptr effect; @@ -373,7 +383,7 @@ ref_ptr instantiateMaterialEffects(osg::Node* modelGroup, effect->addChild("default")->setBoolValue(true); effectProps.push_back(effect); - return instantiateEffects(modelGroup, effectProps, options); + return instantiateEffects(modelGroup, effectProps, options, modelPath); } } diff --git a/simgear/scene/model/model.hxx b/simgear/scene/model/model.hxx index 4e719527..3f747859 100644 --- a/simgear/scene/model/model.hxx +++ b/simgear/scene/model/model.hxx @@ -102,7 +102,8 @@ public: osg::ref_ptr instantiateEffects(osg::Node* model, PropertyList& effectProps, - const SGReaderWriterOptions* options); + const SGReaderWriterOptions* options, + const SGPath& currentDir = SGPath{}); /** * Apply a set of material-defined effects to a model @@ -112,9 +113,10 @@ instantiateEffects(osg::Node* model, * * returns a copy if any nodes are changed */ - osg::ref_ptr - instantiateMaterialEffects(osg::Node* model, - const SGReaderWriterOptions* options); +osg::ref_ptr +instantiateMaterialEffects(osg::Node* model, + const SGReaderWriterOptions* options, + const SGPath& modelPath = SGPath{}); /** * Transform an OSG subgraph by substituting the Effects and @@ -127,10 +129,11 @@ instantiateEffects(osg::Node* model, inline osg::ref_ptr instantiateEffects(osg::Node* model, - const SGReaderWriterOptions* options) + const SGReaderWriterOptions* options, + const SGPath& currentDir = SGPath{}) { PropertyList effectProps; - return instantiateEffects(model, effectProps, options); + return instantiateEffects(model, effectProps, options, currentDir); } } #endif // __MODEL_HXX