Effects: pass the model XML path through to makeEffects

This gives knowledge of how to resolve relative paths, to makeEffects
invocation of findDataFile, and hence gives a more familiar lookup
ordering, for Aircraft-supplied effects.

SF-ID: https://sourceforge.net/p/flightgear/codetickets/2678/
This commit is contained in:
James Turner 2022-01-10 15:05:03 +00:00
parent 13595ce05d
commit 93adb8508e
5 changed files with 32 additions and 18 deletions

View File

@ -160,7 +160,8 @@ size_t hash_value(const Effect::Key&);
Effect* makeEffect(const std::string& name, Effect* makeEffect(const std::string& name,
bool realizeTechniques, bool realizeTechniques,
const SGReaderWriterOptions* options); const SGReaderWriterOptions* options,
const SGPath& modelPath = SGPath{});
Effect* makeEffect(SGPropertyNode* prop, Effect* makeEffect(SGPropertyNode* prop,
bool realizeTechniques, bool realizeTechniques,

View File

@ -104,7 +104,8 @@ void mergePropertyTrees(SGPropertyNode* resultNode,
Effect* makeEffect(const string& name, Effect* makeEffect(const string& name,
bool realizeTechniques, bool realizeTechniques,
const SGReaderWriterOptions* options) const SGReaderWriterOptions* options,
const SGPath& modelPath)
{ {
{ {
OpenThreads::ScopedLock<OpenThreads::ReentrantMutex> lock(effectMutex); OpenThreads::ScopedLock<OpenThreads::ReentrantMutex> lock(effectMutex);
@ -115,8 +116,7 @@ Effect* makeEffect(const string& name,
} }
string effectFileName(name); string effectFileName(name);
effectFileName += ".eff"; effectFileName += ".eff";
string absFileName string absFileName = SGModelLib::findDataFile(effectFileName, options, modelPath);
= SGModelLib::findDataFile(effectFileName, options);
if (absFileName.empty()) { if (absFileName.empty()) {
simgear::reportFailure(simgear::LoadFailure::NotFound, simgear::ErrorCode::LoadEffectsShaders, "Couldn't find Effect:" + effectFileName); simgear::reportFailure(simgear::LoadFailure::NotFound, simgear::ErrorCode::LoadEffectsShaders, "Couldn't find Effect:" + effectFileName);
return nullptr; return nullptr;
@ -187,7 +187,7 @@ Effect* makeEffect(SGPropertyNode* prop,
Effect* parent = 0; Effect* parent = 0;
if (inheritProp) { if (inheritProp) {
//prop->removeChild("inherits-from"); //prop->removeChild("inherits-from");
parent = makeEffect(inheritProp->getStringValue(), false, options); parent = makeEffect(inheritProp->getStringValue(), false, options, filePath);
if (parent) { if (parent) {
Effect::Key key; Effect::Key key;
key.unmerged = prop; key.unmerged = prop;

View File

@ -800,8 +800,8 @@ sgLoad3DModel_internal(const SGPath& path,
// Some material animations (eventually all) are actually effects. // Some material animations (eventually all) are actually effects.
makeEffectAnimations(animation_nodes, effect_nodes); makeEffectAnimations(animation_nodes, effect_nodes);
{ {
ref_ptr<Node> modelWithEffects ref_ptr<Node> modelWithEffects = instantiateEffects(group.get(), effect_nodes, options.get(),
= instantiateEffects(group.get(), effect_nodes, options.get()); path.dirPath());
group = static_cast<Group*>(modelWithEffects.get()); group = static_cast<Group*>(modelWithEffects.get());
} }

View File

@ -218,7 +218,7 @@ public:
typedef std::map<string, SGPropertyNode_ptr> EffectMap; typedef std::map<string, SGPropertyNode_ptr> EffectMap;
using SplicingVisitor::apply; using SplicingVisitor::apply;
MakeEffectVisitor(const SGReaderWriterOptions* options = 0) MakeEffectVisitor(const SGReaderWriterOptions* options = 0)
: _options(options) : _options(options), _modelPath(SGPath{})
{ {
} }
virtual void apply(osg::Group& node); virtual void apply(osg::Group& node);
@ -230,10 +230,17 @@ public:
_currentEffectParent = effect; _currentEffectParent = effect;
} }
SGPropertyNode* getDefaultEffect() { return _currentEffectParent; } SGPropertyNode* getDefaultEffect() { return _currentEffectParent; }
void setModelPath(const SGPath& p)
{
_modelPath = p;
}
protected: protected:
EffectMap _effectMap; EffectMap _effectMap;
SGPropertyNode_ptr _currentEffectParent; SGPropertyNode_ptr _currentEffectParent;
osg::ref_ptr<const SGReaderWriterOptions> _options; osg::ref_ptr<const SGReaderWriterOptions> _options;
SGPath _modelPath;
}; };
void MakeEffectVisitor::apply(osg::Group& node) void MakeEffectVisitor::apply(osg::Group& node)
@ -271,7 +278,7 @@ void MakeEffectVisitor::apply(osg::Geode& geode)
makeParametersFromStateSet(ssRoot, ss); makeParametersFromStateSet(ssRoot, ss);
SGPropertyNode_ptr effectRoot = new SGPropertyNode; SGPropertyNode_ptr effectRoot = new SGPropertyNode;
effect::mergePropertyTrees(effectRoot, ssRoot, _currentEffectParent); effect::mergePropertyTrees(effectRoot, ssRoot, _currentEffectParent);
Effect* effect = makeEffect(effectRoot, true, _options.get()); Effect* effect = makeEffect(effectRoot, true, _options.get(), _modelPath);
EffectGeode* eg = dynamic_cast<EffectGeode*>(&geode); EffectGeode* eg = dynamic_cast<EffectGeode*>(&geode);
if (eg) { if (eg) {
eg->setEffect(effect); eg->setEffect(effect);
@ -316,7 +323,8 @@ protected:
ref_ptr<Node> instantiateEffects(osg::Node* modelGroup, ref_ptr<Node> instantiateEffects(osg::Node* modelGroup,
PropertyList& effectProps, PropertyList& effectProps,
const SGReaderWriterOptions* options) const SGReaderWriterOptions* options,
const SGPath& modelPath)
{ {
SGPropertyNode_ptr defaultEffectPropRoot; SGPropertyNode_ptr defaultEffectPropRoot;
MakeEffectVisitor visitor(options); MakeEffectVisitor visitor(options);
@ -341,13 +349,15 @@ ref_ptr<Node> instantiateEffects(osg::Node* modelGroup,
if (!defaultEffectPropRoot) if (!defaultEffectPropRoot)
defaultEffectPropRoot = DefaultEffect::instance()->getEffect(); defaultEffectPropRoot = DefaultEffect::instance()->getEffect();
visitor.setDefaultEffect(defaultEffectPropRoot.ptr()); visitor.setDefaultEffect(defaultEffectPropRoot.ptr());
visitor.setModelPath(modelPath);
modelGroup->accept(visitor); modelGroup->accept(visitor);
osg::NodeList& result = visitor.getResults(); osg::NodeList& result = visitor.getResults();
return ref_ptr<Node>(result[0].get()); return ref_ptr<Node>(result[0].get());
} }
ref_ptr<Node> instantiateMaterialEffects(osg::Node* modelGroup, ref_ptr<Node> instantiateMaterialEffects(osg::Node* modelGroup,
const SGReaderWriterOptions* options) const SGReaderWriterOptions* options,
const SGPath& modelPath)
{ {
SGPropertyNode_ptr effect; SGPropertyNode_ptr effect;
@ -373,7 +383,7 @@ ref_ptr<Node> instantiateMaterialEffects(osg::Node* modelGroup,
effect->addChild("default")->setBoolValue(true); effect->addChild("default")->setBoolValue(true);
effectProps.push_back(effect); effectProps.push_back(effect);
return instantiateEffects(modelGroup, effectProps, options); return instantiateEffects(modelGroup, effectProps, options, modelPath);
} }
} }

View File

@ -102,7 +102,8 @@ public:
osg::ref_ptr<osg::Node> osg::ref_ptr<osg::Node>
instantiateEffects(osg::Node* model, instantiateEffects(osg::Node* model,
PropertyList& effectProps, PropertyList& effectProps,
const SGReaderWriterOptions* options); const SGReaderWriterOptions* options,
const SGPath& currentDir = SGPath{});
/** /**
* Apply a set of material-defined effects to a model * 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 * returns a copy if any nodes are changed
*/ */
osg::ref_ptr<osg::Node> osg::ref_ptr<osg::Node>
instantiateMaterialEffects(osg::Node* model, instantiateMaterialEffects(osg::Node* model,
const SGReaderWriterOptions* options); const SGReaderWriterOptions* options,
const SGPath& modelPath = SGPath{});
/** /**
* Transform an OSG subgraph by substituting the Effects and * Transform an OSG subgraph by substituting the Effects and
@ -127,10 +129,11 @@ instantiateEffects(osg::Node* model,
inline osg::ref_ptr<osg::Node> inline osg::ref_ptr<osg::Node>
instantiateEffects(osg::Node* model, instantiateEffects(osg::Node* model,
const SGReaderWriterOptions* options) const SGReaderWriterOptions* options,
const SGPath& currentDir = SGPath{})
{ {
PropertyList effectProps; PropertyList effectProps;
return instantiateEffects(model, effectProps, options); return instantiateEffects(model, effectProps, options, currentDir);
} }
} }
#endif // __MODEL_HXX #endif // __MODEL_HXX