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:
parent
13595ce05d
commit
93adb8508e
@ -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,
|
||||
|
@ -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<OpenThreads::ReentrantMutex> 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;
|
||||
|
@ -800,8 +800,8 @@ sgLoad3DModel_internal(const SGPath& path,
|
||||
// Some material animations (eventually all) are actually effects.
|
||||
makeEffectAnimations(animation_nodes, effect_nodes);
|
||||
{
|
||||
ref_ptr<Node> modelWithEffects
|
||||
= instantiateEffects(group.get(), effect_nodes, options.get());
|
||||
ref_ptr<Node> modelWithEffects = instantiateEffects(group.get(), effect_nodes, options.get(),
|
||||
path.dirPath());
|
||||
group = static_cast<Group*>(modelWithEffects.get());
|
||||
}
|
||||
|
||||
|
@ -218,7 +218,7 @@ public:
|
||||
typedef std::map<string, SGPropertyNode_ptr> 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<const SGReaderWriterOptions> _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<EffectGeode*>(&geode);
|
||||
if (eg) {
|
||||
eg->setEffect(effect);
|
||||
@ -316,7 +323,8 @@ protected:
|
||||
|
||||
ref_ptr<Node> 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<Node> 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<Node>(result[0].get());
|
||||
}
|
||||
|
||||
ref_ptr<Node> instantiateMaterialEffects(osg::Node* modelGroup,
|
||||
const SGReaderWriterOptions* options)
|
||||
const SGReaderWriterOptions* options,
|
||||
const SGPath& modelPath)
|
||||
{
|
||||
|
||||
SGPropertyNode_ptr effect;
|
||||
@ -373,7 +383,7 @@ ref_ptr<Node> instantiateMaterialEffects(osg::Node* modelGroup,
|
||||
|
||||
effect->addChild("default")->setBoolValue(true);
|
||||
effectProps.push_back(effect);
|
||||
return instantiateEffects(modelGroup, effectProps, options);
|
||||
return instantiateEffects(modelGroup, effectProps, options, modelPath);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -102,7 +102,8 @@ public:
|
||||
osg::ref_ptr<osg::Node>
|
||||
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
|
||||
@ -114,7 +115,8 @@ instantiateEffects(osg::Node* model,
|
||||
*/
|
||||
osg::ref_ptr<osg::Node>
|
||||
instantiateMaterialEffects(osg::Node* model,
|
||||
const SGReaderWriterOptions* options);
|
||||
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<osg::Node>
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user