From d04cf4d8978866eb80a1639b6d4ddfe387338c77 Mon Sep 17 00:00:00 2001 From: Tim Moore Date: Wed, 16 Dec 2009 20:11:04 +0100 Subject: [PATCH] pass SGReaderWriterXMLOptions to effects This will allow parameters to refer to properties in models, though that doesn't work yet. --- simgear/scene/material/Effect.cxx | 47 ++++++++++--------- simgear/scene/material/Effect.hxx | 9 ++-- simgear/scene/material/EffectBuilder.cxx | 1 + simgear/scene/material/EffectBuilder.hxx | 6 +-- simgear/scene/material/TextureBuilder.cxx | 25 +++++----- simgear/scene/material/TextureBuilder.hxx | 4 +- simgear/scene/material/makeEffect.cxx | 5 +- simgear/scene/material/mat.cxx | 28 ++++++++--- simgear/scene/material/mat.hxx | 12 +++-- .../scene/model/SGReaderWriterXMLOptions.hxx | 2 +- simgear/scene/model/model.cxx | 7 +-- simgear/scene/model/model.hxx | 9 +++- simgear/scene/model/modellib.cxx | 8 +++- simgear/scene/sky/newcloud.cxx | 7 ++- 14 files changed, 102 insertions(+), 68 deletions(-) diff --git a/simgear/scene/material/Effect.cxx b/simgear/scene/material/Effect.cxx index 9da202f7..3ad93162 100644 --- a/simgear/scene/material/Effect.cxx +++ b/simgear/scene/material/Effect.cxx @@ -66,6 +66,7 @@ #include #include +#include #include #include #include @@ -143,7 +144,7 @@ Effect::~Effect() } void buildPass(Effect* effect, Technique* tniq, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { Pass* pass = new Pass; tniq->passes.push_back(pass); @@ -188,12 +189,12 @@ osg::Vec4f getColor(const SGPropertyNode* prop) struct LightingBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options); + const SGReaderWriterXMLOptions* options); }; void LightingBuilder::buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -207,7 +208,7 @@ InstallAttributeBuilder installLighting("lighting"); struct ShadeModelBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -229,7 +230,7 @@ InstallAttributeBuilder installShadeModel("shade-model"); struct CullFaceBuilder : PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) { @@ -257,7 +258,7 @@ InstallAttributeBuilder installCullFace("cull-face"); struct ColorMaskBuilder : PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -284,7 +285,7 @@ EffectPropertyMap renderingHints(renderingHintInit); struct HintBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -300,7 +301,7 @@ InstallAttributeBuilder installHint("rendering-hint"); struct RenderBinBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -327,7 +328,7 @@ InstallAttributeBuilder installRenderBin("render-bin"); struct MaterialBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options); + const SGReaderWriterXMLOptions* options); }; EffectNameValue colorModeInit[] = @@ -343,7 +344,7 @@ EffectPropertyMap colorModes(colorModeInit); void MaterialBuilder::buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -413,7 +414,7 @@ EffectPropertyMap blendFuncModes(blendFuncModesInit); struct BlendBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -526,7 +527,7 @@ EffectPropertyMap stencilOperation(stencilOperationInit); struct StencilBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -604,7 +605,7 @@ alphaComparison(alphaComparisonInit); struct AlphaTestBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -715,12 +716,12 @@ void reload_shaders() struct ShaderProgramBuilder : PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options); + const SGReaderWriterXMLOptions* options); }; void ShaderProgramBuilder::buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* + const SGReaderWriterXMLOptions* options) { using namespace boost; @@ -815,7 +816,7 @@ EffectPropertyMap uniformTypes(uniformTypesInit); struct UniformBuilder :public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -889,7 +890,7 @@ InstallAttributeBuilder installUniform("uniform"); struct NameBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { // name can't use string name = prop->getStringValue(); @@ -911,7 +912,7 @@ EffectPropertyMap polygonModeModes(polygonModeModesInit); struct PolygonModeBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -939,7 +940,7 @@ InstallAttributeBuilder installPolygonMode("polygon-mode"); struct VertexProgramTwoSideBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -956,7 +957,7 @@ installTwoSide("vertex-program-two-side"); struct VertexProgramPointSizeBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -986,7 +987,7 @@ EffectPropertyMap depthFunction(depthFunctionInit); struct DepthBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -1017,7 +1018,7 @@ struct DepthBuilder : public PassAttributeBuilder InstallAttributeBuilder installDepth("depth"); void buildTechnique(Effect* effect, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { Technique* tniq = new Technique; effect->techniques.push_back(tniq); @@ -1123,7 +1124,7 @@ bool makeParametersFromStateSet(SGPropertyNode* effectRoot, const StateSet* ss) // Walk the techniques property tree, building techniques and // passes. -bool Effect::realizeTechniques(const osgDB::ReaderWriter::Options* options) +bool Effect::realizeTechniques(const SGReaderWriterXMLOptions* options) { if (_isRealized) return true; diff --git a/simgear/scene/material/Effect.hxx b/simgear/scene/material/Effect.hxx index 1f33b9e8..0690db3a 100644 --- a/simgear/scene/material/Effect.hxx +++ b/simgear/scene/material/Effect.hxx @@ -45,6 +45,7 @@ namespace simgear { class Technique; class Effect; +class SGReaderWriterXMLOptions; /** * Object to be initialized at some point after an effect -- and its @@ -89,7 +90,7 @@ public: /** * Build the techniques from the effect properties. */ - bool realizeTechniques(const osgDB::ReaderWriter::Options* options = 0); + bool realizeTechniques(const SGReaderWriterXMLOptions* options = 0); /** * Updaters that should be derefed when the effect is * deleted. Updaters arrange to be run by listening on properties @@ -144,7 +145,7 @@ protected: Cache* _cache; friend size_t hash_value(const Key& key); friend Effect* makeEffect(SGPropertyNode* prop, bool realizeTechniques, - const osgDB::ReaderWriter::Options* options); + const SGReaderWriterXMLOptions* options); bool _isRealized; }; // Automatic support for boost hash function @@ -153,11 +154,11 @@ size_t hash_value(const Effect::Key&); Effect* makeEffect(const std::string& name, bool realizeTechniques, - const osgDB::ReaderWriter::Options* options = 0); + const SGReaderWriterXMLOptions* options = 0); Effect* makeEffect(SGPropertyNode* prop, bool realizeTechniques, - const osgDB::ReaderWriter::Options* options = 0); + const SGReaderWriterXMLOptions* options = 0); bool makeParametersFromStateSet(SGPropertyNode* paramRoot, const osg::StateSet* ss); diff --git a/simgear/scene/material/EffectBuilder.cxx b/simgear/scene/material/EffectBuilder.cxx index 34f14ac8..65ba71db 100644 --- a/simgear/scene/material/EffectBuilder.cxx +++ b/simgear/scene/material/EffectBuilder.cxx @@ -2,6 +2,7 @@ # include #endif +#include #include #include diff --git a/simgear/scene/material/EffectBuilder.hxx b/simgear/scene/material/EffectBuilder.hxx index be4b0345..d16e3347 100644 --- a/simgear/scene/material/EffectBuilder.hxx +++ b/simgear/scene/material/EffectBuilder.hxx @@ -56,10 +56,10 @@ class EffectBuilder : public SGReferenced public: virtual ~EffectBuilder() {} virtual T* build(Effect* effect, const SGPropertyNode*, - const osgDB::ReaderWriter::Options* options) = 0; + const SGReaderWriterXMLOptions* options) = 0; static T* buildFromType(Effect* effect, const std::string& type, const SGPropertyNode*props, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { BuilderMap& builderMap = getMap(); typename BuilderMap::iterator iter = builderMap.find(type); @@ -255,7 +255,7 @@ protected: public: virtual void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) = 0; static PassAttributeBuilder* find(const std::string& str) { diff --git a/simgear/scene/material/TextureBuilder.cxx b/simgear/scene/material/TextureBuilder.cxx index a924b955..f81f2b9b 100644 --- a/simgear/scene/material/TextureBuilder.cxx +++ b/simgear/scene/material/TextureBuilder.cxx @@ -35,6 +35,7 @@ #include #include +#include #include #include #include @@ -56,7 +57,7 @@ TexGen* buildTexGen(Effect* Effect, const SGPropertyNode* tgenProp); // Hack to force inclusion of TextureBuilder.cxx in library osg::Texture* TextureBuilder::buildFromType(Effect* effect, const string& type, const SGPropertyNode*props, - const osgDB::ReaderWriter::Options* + const SGReaderWriterXMLOptions* options) { return EffectBuilder::buildFromType(effect, type, props, options); @@ -98,7 +99,7 @@ TexEnv* buildTexEnv(Effect* effect, const SGPropertyNode* prop) void TextureUnitBuilder::buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -177,7 +178,7 @@ EffectPropertyMap wrapModes(wrapModesInit); TexTuple makeTexTuple(Effect* effect, const SGPropertyNode* props, - const osgDB::ReaderWriter::Options* options, + const SGReaderWriterXMLOptions* options, const string& texType) { Texture::FilterMode minFilter = Texture::LINEAR_MIPMAP_LINEAR; @@ -213,7 +214,7 @@ TexTuple makeTexTuple(Effect* effect, const SGPropertyNode* props, } void setAttrs(const TexTuple& attrs, Texture* tex, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { const string& imageName = attrs.get<0>(); if (imageName.empty()) { @@ -253,7 +254,7 @@ class TexBuilder : public TextureBuilder public: TexBuilder(const string& texType) : _type(texType) {} Texture* build(Effect* effect, const SGPropertyNode*, - const osgDB::ReaderWriter::Options* options); + const SGReaderWriterXMLOptions* options); protected: typedef map > TexMap; TexMap texMap; @@ -262,7 +263,7 @@ protected: template Texture* TexBuilder::build(Effect* effect, const SGPropertyNode* props, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { TexTuple attrs = makeTexTuple(effect, props, options, _type); typename TexMap::iterator itr = texMap.find(attrs); @@ -286,11 +287,11 @@ class WhiteTextureBuilder : public TextureBuilder { public: Texture* build(Effect* effect, const SGPropertyNode*, - const osgDB::ReaderWriter::Options* options); + const SGReaderWriterXMLOptions* options); }; Texture* WhiteTextureBuilder::build(Effect* effect, const SGPropertyNode*, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { return StateAttributeFactory::instance()->getWhiteTexture(); } @@ -304,11 +305,11 @@ class TransparentTextureBuilder : public TextureBuilder { public: Texture* build(Effect* effect, const SGPropertyNode*, - const osgDB::ReaderWriter::Options* options); + const SGReaderWriterXMLOptions* options); }; Texture* TransparentTextureBuilder::build(Effect* effect, const SGPropertyNode*, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { return StateAttributeFactory::instance()->getTransparentTexture(); } @@ -368,14 +369,14 @@ class NoiseBuilder : public TextureBuilder { public: Texture* build(Effect* effect, const SGPropertyNode*, - const osgDB::ReaderWriter::Options* options); + const SGReaderWriterXMLOptions* options); protected: typedef map > NoiseMap; NoiseMap _noises; }; Texture* NoiseBuilder::build(Effect* effect, const SGPropertyNode* props, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { int texSize = 64; const SGPropertyNode* sizeProp = getEffectPropertyChild(effect, props, diff --git a/simgear/scene/material/TextureBuilder.hxx b/simgear/scene/material/TextureBuilder.hxx index ca6c5494..55df2736 100644 --- a/simgear/scene/material/TextureBuilder.hxx +++ b/simgear/scene/material/TextureBuilder.hxx @@ -29,13 +29,13 @@ public: // Hack to force inclusion of TextureBuilder.cxx in library static osg::Texture* buildFromType(Effect* effect, const std::string& type, const SGPropertyNode*props, - const osgDB::ReaderWriter::Options* options); + const SGReaderWriterXMLOptions* options); }; struct TextureUnitBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const osgDB::ReaderWriter::Options* options); + const SGReaderWriterXMLOptions* options); }; diff --git a/simgear/scene/material/makeEffect.cxx b/simgear/scene/material/makeEffect.cxx index 1a8efcdb..4ce5841f 100644 --- a/simgear/scene/material/makeEffect.cxx +++ b/simgear/scene/material/makeEffect.cxx @@ -31,6 +31,7 @@ #include #include +#include #include #include #include @@ -116,7 +117,7 @@ void mergePropertyTrees(SGPropertyNode* resultNode, Effect* makeEffect(const string& name, bool realizeTechniques, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { { OpenThreads::ScopedLock lock(effectMutex); @@ -159,7 +160,7 @@ Effect* makeEffect(const string& name, Effect* makeEffect(SGPropertyNode* prop, bool realizeTechniques, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { // Give default names to techniques and passes vector techniques = prop->getChildren("technique"); diff --git a/simgear/scene/material/mat.cxx b/simgear/scene/material/mat.cxx index 2fc7e9c8..5947579e 100644 --- a/simgear/scene/material/mat.cxx +++ b/simgear/scene/material/mat.cxx @@ -49,6 +49,7 @@ #include #include #include +#include #include #include #include @@ -68,12 +69,12 @@ using namespace simgear; //////////////////////////////////////////////////////////////////////// SGMaterial::_internal_state::_internal_state(Effect *e, const string &t, bool l, - const osgDB::ReaderWriter::Options* o ) : - effect(e), texture_path(t), effect_realized(l), options(o) + const SGReaderWriterXMLOptions* o) + : effect(e), texture_path(t), effect_realized(l), options(o) { } -SGMaterial::SGMaterial( const osgDB::ReaderWriter::Options* options, +SGMaterial::SGMaterial( const SGReaderWriterXMLOptions* options, const SGPropertyNode *props ) { init(); @@ -81,6 +82,17 @@ SGMaterial::SGMaterial( const osgDB::ReaderWriter::Options* options, buildEffectProperties(options); } +SGMaterial::SGMaterial( const osgDB::ReaderWriter::Options* options, + const SGPropertyNode *props ) +{ + osg::ref_ptr sgOptions; + if (options) + sgOptions = new SGReaderWriterXMLOptions(*options); + init(); + read_properties( sgOptions.get(), props ); + buildEffectProperties(sgOptions.get()); +} + SGMaterial::~SGMaterial (void) { } @@ -91,7 +103,7 @@ SGMaterial::~SGMaterial (void) //////////////////////////////////////////////////////////////////////// void -SGMaterial::read_properties(const osgDB::ReaderWriter::Options* options, +SGMaterial::read_properties(const SGReaderWriterXMLOptions* options, const SGPropertyNode *props) { // Gather the path(s) to the texture(s) @@ -245,10 +257,12 @@ Effect* SGMaterial::get_effect(int n) return _status[i].effect.get(); } -void SGMaterial::buildEffectProperties(const osgDB::ReaderWriter::Options* - options) +void SGMaterial::buildEffectProperties(const SGReaderWriterXMLOptions* options) { using namespace osg; + ref_ptr xmlOptions; + if (options) + xmlOptions = new SGReaderWriterXMLOptions(*options); ref_ptr user = new SGMaterialUserData(this); SGPropertyNode_ptr propRoot = new SGPropertyNode(); makeChild(propRoot, "inherits-from")->setStringValue(effect); @@ -279,7 +293,7 @@ void SGMaterial::buildEffectProperties(const osgDB::ReaderWriter::Options* ->setStringValue(wrapu ? "repeat" : "clamp"); makeChild(texProp, "wrap-t") ->setStringValue(wrapv ? "repeat" : "clamp"); - matState.effect = makeEffect(effectProp, false, options); + matState.effect = makeEffect(effectProp, false, xmlOptions.get()); matState.effect->setUserData(user.get()); } } diff --git a/simgear/scene/material/mat.hxx b/simgear/scene/material/mat.hxx index ac2e5f1b..619ae8da 100644 --- a/simgear/scene/material/mat.hxx +++ b/simgear/scene/material/mat.hxx @@ -39,13 +39,13 @@ #include #include -#include namespace osg { class StateSet; } +#include #include #include #include @@ -87,6 +87,8 @@ public: */ SGMaterial( const osgDB::ReaderWriter::Options*, const SGPropertyNode *props); + SGMaterial(const simgear::SGReaderWriterXMLOptions*, + const SGPropertyNode *props); /** * Destructor. */ @@ -271,11 +273,11 @@ protected: struct _internal_state { _internal_state(simgear::Effect *e, const std::string &t, bool l, - const osgDB::ReaderWriter::Options *o); + const simgear::SGReaderWriterXMLOptions *o); osg::ref_ptr effect; std::string texture_path; bool effect_realized; - osg::ref_ptr options; + osg::ref_ptr options; }; private: @@ -361,9 +363,9 @@ private: // Internal constructors and methods. //////////////////////////////////////////////////////////////////// - void read_properties(const osgDB::ReaderWriter::Options* options, + void read_properties(const simgear::SGReaderWriterXMLOptions* options, const SGPropertyNode *props); - void buildEffectProperties(const osgDB::ReaderWriter::Options* options); + void buildEffectProperties(const simgear::SGReaderWriterXMLOptions* options); }; diff --git a/simgear/scene/model/SGReaderWriterXMLOptions.hxx b/simgear/scene/model/SGReaderWriterXMLOptions.hxx index 17532aee..cca34824 100644 --- a/simgear/scene/model/SGReaderWriterXMLOptions.hxx +++ b/simgear/scene/model/SGReaderWriterXMLOptions.hxx @@ -18,7 +18,7 @@ #ifndef SGREADERWRITERXMLOPTIONS_HXX #define SGREADERWRITERXMLOPTIONS_HXX 1 -#include +#include #include #include diff --git a/simgear/scene/model/model.cxx b/simgear/scene/model/model.cxx index 59f33694..1ea486f0 100644 --- a/simgear/scene/model/model.cxx +++ b/simgear/scene/model/model.cxx @@ -33,6 +33,7 @@ #include #include +#include "SGReaderWriterXMLOptions.hxx" #include "model.hxx" using std::vector; @@ -209,7 +210,7 @@ class MakeEffectVisitor : public SplicingVisitor public: typedef std::map EffectMap; using SplicingVisitor::apply; - MakeEffectVisitor(const osgDB::ReaderWriter::Options* options = 0) + MakeEffectVisitor(const SGReaderWriterXMLOptions* options = 0) : _options(options) { } @@ -225,7 +226,7 @@ public: protected: EffectMap _effectMap; SGPropertyNode_ptr _currentEffectParent; - osg::ref_ptr _options; + osg::ref_ptr _options; }; void MakeEffectVisitor::apply(osg::Group& node) @@ -302,7 +303,7 @@ protected: ref_ptr instantiateEffects(osg::Node* modelGroup, PropertyList& effectProps, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { SGPropertyNode_ptr defaultEffectPropRoot; MakeEffectVisitor visitor(options); diff --git a/simgear/scene/model/model.hxx b/simgear/scene/model/model.hxx index 49dc0666..c2097fdc 100644 --- a/simgear/scene/model/model.hxx +++ b/simgear/scene/model/model.hxx @@ -23,6 +23,11 @@ #include #include +namespace simgear +{ +class SGReaderWriterXMLOptions; +} + osg::Texture2D* SGLoadTexture2D(bool staticTexture, const std::string& path, const osgDB::ReaderWriter::Options* options = 0, @@ -97,7 +102,7 @@ public: osg::ref_ptr instantiateEffects(osg::Node* model, PropertyList& effectProps, - const osgDB::ReaderWriter::Options* options); + const SGReaderWriterXMLOptions* options); /** * Transform an OSG subgraph by substituting the Effects and @@ -110,7 +115,7 @@ instantiateEffects(osg::Node* model, inline osg::ref_ptr instantiateEffects(osg::Node* model, - const osgDB::ReaderWriter::Options* options) + const SGReaderWriterXMLOptions* options) { PropertyList effectProps; return instantiateEffects(model, effectProps, options); diff --git a/simgear/scene/model/modellib.cxx b/simgear/scene/model/modellib.cxx index 6a13c516..4b457f5e 100644 --- a/simgear/scene/model/modellib.cxx +++ b/simgear/scene/model/modellib.cxx @@ -71,8 +71,12 @@ osg::Node* loadFile(const string& path, osgDB::ReaderWriter::Options* options) ref_ptr model = readRefNodeFile(path, options); if (!model) return 0; - if (boost::iends_with(path, ".ac")) - model = instantiateEffects(model.get(), options); + if (boost::iends_with(path, ".ac")) { + ref_ptr sgOptions; + if (options) + sgOptions = new SGReaderWriterXMLOptions(*options); + model = instantiateEffects(model.get(), sgOptions.get()); + } return model.release(); } } diff --git a/simgear/scene/sky/newcloud.cxx b/simgear/scene/sky/newcloud.cxx index 162f137a..6d35ad99 100644 --- a/simgear/scene/sky/newcloud.cxx +++ b/simgear/scene/sky/newcloud.cxx @@ -46,6 +46,7 @@ #include #include #include +#include #include #include @@ -108,9 +109,11 @@ SGNewCloud::SGNewCloud(string type, "texture"), "image"), texture); - osg::ref_ptr options + ref_ptr options = makeOptionsFromPath(tex_path); - if ((effect = makeEffect(pcloudEffect, true, options))) + ref_ptr sgOptions + = new SGReaderWriterXMLOptions(*options.get()); + if ((effect = makeEffect(pcloudEffect, true, sgOptions.get()))) effectMap.insert(EffectMap::value_type(texture, effect)); } else { effect = iter->second.get(); -- 2.39.2