From f61fe80f6096bff9f7061849f713fdf9204aa945 Mon Sep 17 00:00:00 2001 From: Mathias Froehlich Date: Sat, 12 Nov 2011 19:39:48 +0100 Subject: [PATCH] Consolidate the different ReaderWriterOptions classes. --- projects/VC90/SimGear.vcproj | 8 -- simgear/scene/material/Effect.cxx | 50 ++++---- simgear/scene/material/Effect.hxx | 10 +- simgear/scene/material/EffectBuilder.cxx | 6 +- simgear/scene/material/EffectBuilder.hxx | 24 ++-- simgear/scene/material/TextureBuilder.cxx | 34 +++--- simgear/scene/material/TextureBuilder.hxx | 4 +- simgear/scene/material/makeEffect.cxx | 6 +- simgear/scene/material/mat.cxx | 20 ++-- simgear/scene/material/mat.hxx | 14 +-- simgear/scene/material/mipmap.cxx | 2 +- simgear/scene/material/mipmap.hxx | 4 +- simgear/scene/model/CMakeLists.txt | 1 - simgear/scene/model/ModelRegistry.cxx | 6 +- simgear/scene/model/SGReaderWriterXML.cxx | 20 ++-- .../scene/model/SGReaderWriterXMLOptions.hxx | 110 ------------------ simgear/scene/model/model.cxx | 9 +- simgear/scene/model/model.hxx | 6 +- simgear/scene/model/modellib.cxx | 20 ++-- simgear/scene/sky/newcloud.cxx | 6 +- simgear/scene/tgdb/CMakeLists.txt | 1 - simgear/scene/tgdb/SGReaderWriterBTG.cxx | 31 +++-- .../scene/tgdb/SGReaderWriterBTGOptions.hxx | 62 ---------- simgear/scene/tgdb/TileEntry.cxx | 20 ++-- simgear/scene/tgdb/obj.cxx | 64 +++++----- simgear/scene/tgdb/obj.hxx | 2 +- simgear/scene/util/CMakeLists.txt | 1 + simgear/scene/util/SGReaderWriterOptions.hxx | 108 +++++++++++++++++ 28 files changed, 289 insertions(+), 360 deletions(-) delete mode 100644 simgear/scene/model/SGReaderWriterXMLOptions.hxx delete mode 100644 simgear/scene/tgdb/SGReaderWriterBTGOptions.hxx create mode 100644 simgear/scene/util/SGReaderWriterOptions.hxx diff --git a/projects/VC90/SimGear.vcproj b/projects/VC90/SimGear.vcproj index 7517d1cb..7c2eed04 100644 --- a/projects/VC90/SimGear.vcproj +++ b/projects/VC90/SimGear.vcproj @@ -1147,10 +1147,6 @@ RelativePath="..\..\simgear\scene\model\SGReaderWriterXML.hxx" > - - @@ -1395,10 +1391,6 @@ RelativePath="..\..\simgear\scene\tgdb\SGReaderWriterBTG.hxx" > - - diff --git a/simgear/scene/material/Effect.cxx b/simgear/scene/material/Effect.cxx index 1a52c659..aa221fcc 100644 --- a/simgear/scene/material/Effect.cxx +++ b/simgear/scene/material/Effect.cxx @@ -67,7 +67,7 @@ #include #include -#include +#include #include #include #include @@ -154,7 +154,7 @@ Effect::~Effect() } void buildPass(Effect* effect, Technique* tniq, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { Pass* pass = new Pass; tniq->passes.push_back(pass); @@ -203,12 +203,12 @@ osg::Vec4f getColor(const SGPropertyNode* prop) struct LightingBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options); + const SGReaderWriterOptions* options); }; void LightingBuilder::buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -222,7 +222,7 @@ InstallAttributeBuilder installLighting("lighting"); struct ShadeModelBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -244,7 +244,7 @@ InstallAttributeBuilder installShadeModel("shade-model"); struct CullFaceBuilder : PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) { @@ -272,7 +272,7 @@ InstallAttributeBuilder installCullFace("cull-face"); struct ColorMaskBuilder : PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -299,7 +299,7 @@ EffectPropertyMap renderingHints(renderingHintInit); struct HintBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -315,7 +315,7 @@ InstallAttributeBuilder installHint("rendering-hint"); struct RenderBinBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -342,7 +342,7 @@ InstallAttributeBuilder installRenderBin("render-bin"); struct MaterialBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options); + const SGReaderWriterOptions* options); }; EffectNameValue colorModeInit[] = @@ -358,7 +358,7 @@ EffectPropertyMap colorModes(colorModeInit); void MaterialBuilder::buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -428,7 +428,7 @@ EffectPropertyMap blendFuncModes(blendFuncModesInit); struct BlendBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -541,7 +541,7 @@ EffectPropertyMap stencilOperation(stencilOperationInit); struct StencilBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -619,7 +619,7 @@ alphaComparison(alphaComparisonInit); struct AlphaTestBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -736,7 +736,7 @@ void reload_shaders() struct ShaderProgramBuilder : PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options); + const SGReaderWriterOptions* options); }; @@ -763,7 +763,7 @@ geometryOutputType(geometryOutputTypeInit); void ShaderProgramBuilder::buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* + const SGReaderWriterOptions* options) { using namespace boost; @@ -899,7 +899,7 @@ ref_ptr colorMode[3]; struct UniformBuilder :public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { if (!texture0.valid()) { texture0 = new Uniform(Uniform::SAMPLER_2D, "texture"); @@ -1013,7 +1013,7 @@ InstallAttributeBuilder installUniform("uniform"); struct NameBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { // name can't use string name = prop->getStringValue(); @@ -1035,7 +1035,7 @@ EffectPropertyMap polygonModeModes(polygonModeModesInit); struct PolygonModeBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -1063,7 +1063,7 @@ InstallAttributeBuilder installPolygonMode("polygon-mode"); struct PolygonOffsetBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -1091,7 +1091,7 @@ InstallAttributeBuilder installPolygonOffset("polygon-offs struct VertexProgramTwoSideBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -1108,7 +1108,7 @@ installTwoSide("vertex-program-two-side"); struct VertexProgramPointSizeBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { const SGPropertyNode* realProp = getEffectPropertyNode(effect, prop); if (!realProp) @@ -1138,7 +1138,7 @@ EffectPropertyMap depthFunction(depthFunctionInit); struct DepthBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -1169,7 +1169,7 @@ struct DepthBuilder : public PassAttributeBuilder InstallAttributeBuilder installDepth("depth"); void buildTechnique(Effect* effect, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { Technique* tniq = new Technique; effect->techniques.push_back(tniq); @@ -1278,7 +1278,7 @@ bool makeParametersFromStateSet(SGPropertyNode* effectRoot, const StateSet* ss) // Walk the techniques property tree, building techniques and // passes. -bool Effect::realizeTechniques(const SGReaderWriterXMLOptions* options) +bool Effect::realizeTechniques(const SGReaderWriterOptions* options) { if (_isRealized) return true; diff --git a/simgear/scene/material/Effect.hxx b/simgear/scene/material/Effect.hxx index 59eea81d..5187c5bb 100644 --- a/simgear/scene/material/Effect.hxx +++ b/simgear/scene/material/Effect.hxx @@ -45,7 +45,7 @@ namespace simgear { class Technique; class Effect; -class SGReaderWriterXMLOptions; +class SGReaderWriterOptions; /** * Object to be initialized at some point after an effect -- and its @@ -102,7 +102,7 @@ public: /** * Build the techniques from the effect properties. */ - bool realizeTechniques(const SGReaderWriterXMLOptions* options = 0); + bool realizeTechniques(const SGReaderWriterOptions* options = 0); /** * Updaters that should be derefed when the effect is * deleted. Updaters arrange to be run by listening on properties @@ -157,7 +157,7 @@ protected: Cache* _cache; friend size_t hash_value(const Key& key); friend Effect* makeEffect(SGPropertyNode* prop, bool realizeTechniques, - const SGReaderWriterXMLOptions* options); + const SGReaderWriterOptions* options); bool _isRealized; }; // Automatic support for boost hash function @@ -166,11 +166,11 @@ size_t hash_value(const Effect::Key&); Effect* makeEffect(const std::string& name, bool realizeTechniques, - const SGReaderWriterXMLOptions* options = 0); + const SGReaderWriterOptions* options = 0); Effect* makeEffect(SGPropertyNode* prop, bool realizeTechniques, - const SGReaderWriterXMLOptions* options = 0); + const SGReaderWriterOptions* 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 79ebb248..635fde36 100644 --- a/simgear/scene/material/EffectBuilder.cxx +++ b/simgear/scene/material/EffectBuilder.cxx @@ -2,7 +2,7 @@ # include #endif -#include +#include #include #include @@ -43,7 +43,7 @@ const SGPropertyNode* getEffectPropertyChild(Effect* effect, } string getGlobalProperty(const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { if (!prop) return string(); @@ -54,7 +54,7 @@ string getGlobalProperty(const SGPropertyNode* prop, SGPropertyNode_ptr propRoot; if (propName[0] == '/') { return propName; - } else if ((propRoot = options->getPropRoot())) { + } else if ((propRoot = options->getPropertyNode())) { string result = propRoot->getPath(); result.append("/"); result.append(propName); diff --git a/simgear/scene/material/EffectBuilder.hxx b/simgear/scene/material/EffectBuilder.hxx index 3165ae18..a464071f 100644 --- a/simgear/scene/material/EffectBuilder.hxx +++ b/simgear/scene/material/EffectBuilder.hxx @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include #include #include @@ -48,7 +48,7 @@ namespace simgear { class Effect; class Pass; -class SGReaderWriterXMLOptions; +class SGReaderWriterOptions; /** * Builder that returns an object, probably an OSG object. @@ -59,10 +59,10 @@ class EffectBuilder : public SGReferenced public: virtual ~EffectBuilder() {} virtual T* build(Effect* effect, const SGPropertyNode*, - const SGReaderWriterXMLOptions* options) = 0; + const SGReaderWriterOptions* options) = 0; static T* buildFromType(Effect* effect, const std::string& type, const SGPropertyNode*props, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { BuilderMap& builderMap = getMap(); typename BuilderMap::iterator iter = builderMap.find(type); @@ -302,12 +302,12 @@ const SGPropertyNode* getEffectPropertyChild(Effect* effect, * mentioned node name. */ std::string getGlobalProperty(const SGPropertyNode* prop, - const SGReaderWriterXMLOptions *); + const SGReaderWriterOptions *); template std::vector getVectorProperties(const SGPropertyNode* prop, - const SGReaderWriterXMLOptions *options, size_t vecSize, + const SGReaderWriterOptions *options, size_t vecSize, NameItr defaultNames) { using namespace std; @@ -318,7 +318,7 @@ getVectorProperties(const SGPropertyNode* prop, if (useProps.size() == 1) { string parentName = useProps[0]->getStringValue(); if (parentName.size() == 0 || parentName[0] != '/') - parentName = options->getPropRoot()->getPath() + "/" + parentName; + parentName = options->getPropertyNode()->getPath() + "/" + parentName; if (parentName[parentName.size() - 1] != '/') parentName.append("/"); NameItr itr = defaultNames; @@ -357,7 +357,7 @@ public: virtual void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) = 0; static PassAttributeBuilder* find(const std::string& str) { @@ -610,7 +610,7 @@ inline void setDynamicVariance(osg::Object* obj) template void initFromParameters(Effect* effect, const SGPropertyNode* prop, ObjType* obj, - const F& setter, const SGReaderWriterXMLOptions* options) + const F& setter, const SGReaderWriterOptions* options) { const SGPropertyNode* valProp = getEffectPropertyNode(effect, prop); if (!valProp) @@ -631,7 +631,7 @@ template inline void initFromParameters(Effect* effect, const SGPropertyNode* prop, ObjType* obj, SetterReturn (ObjType::*setter)(const OSGParamType), - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { initFromParameters(effect, prop, obj, boost::bind(setter, _1, _2), options); @@ -661,7 +661,7 @@ template::sg_type sg_type; const int numComponents = props::NumComponents::num_components; @@ -690,7 +690,7 @@ template(effect, prop, obj, boost::bind(setter, _1, _2), nameItr, diff --git a/simgear/scene/material/TextureBuilder.cxx b/simgear/scene/material/TextureBuilder.cxx index f53fe526..69630b31 100644 --- a/simgear/scene/material/TextureBuilder.cxx +++ b/simgear/scene/material/TextureBuilder.cxx @@ -37,7 +37,7 @@ #include #include -#include +#include #include #include #include @@ -54,13 +54,13 @@ using namespace effect; TexEnvCombine* buildTexEnvCombine(Effect* effect, const SGPropertyNode* envProp, - const SGReaderWriterXMLOptions* options); + const SGReaderWriterOptions* options); 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 SGReaderWriterXMLOptions* + const SGReaderWriterOptions* options) { return EffectBuilder::buildFromType(effect, type, props, options); @@ -102,7 +102,7 @@ TexEnv* buildTexEnv(Effect* effect, const SGPropertyNode* prop) void TextureUnitBuilder::buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { if (!isAttributeActive(effect, prop)) return; @@ -183,7 +183,7 @@ EffectNameValue wrapModesInit[] = EffectPropertyMap wrapModes(wrapModesInit); TexTuple makeTexTuple(Effect* effect, const SGPropertyNode* props, - const SGReaderWriterXMLOptions* options, + const SGReaderWriterOptions* options, const string& texType) { Texture::FilterMode minFilter = Texture::LINEAR_MIPMAP_LINEAR; @@ -234,7 +234,7 @@ TexTuple makeTexTuple(Effect* effect, const SGPropertyNode* props, } void setAttrs(const TexTuple& attrs, Texture* tex, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { const string& imageName = attrs.get<0>(); if (imageName.empty()) { @@ -275,7 +275,7 @@ class TexBuilder : public TextureBuilder public: TexBuilder(const string& texType) : _type(texType) {} Texture* build(Effect* effect, const SGPropertyNode*, - const SGReaderWriterXMLOptions* options); + const SGReaderWriterOptions* options); protected: typedef map > TexMap; TexMap texMap; @@ -284,7 +284,7 @@ protected: template Texture* TexBuilder::build(Effect* effect, const SGPropertyNode* props, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { TexTuple attrs = makeTexTuple(effect, props, options, _type); typename TexMap::iterator itr = texMap.find(attrs); @@ -308,11 +308,11 @@ class WhiteTextureBuilder : public TextureBuilder { public: Texture* build(Effect* effect, const SGPropertyNode*, - const SGReaderWriterXMLOptions* options); + const SGReaderWriterOptions* options); }; Texture* WhiteTextureBuilder::build(Effect* effect, const SGPropertyNode*, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { return StateAttributeFactory::instance()->getWhiteTexture(); } @@ -326,11 +326,11 @@ class TransparentTextureBuilder : public TextureBuilder { public: Texture* build(Effect* effect, const SGPropertyNode*, - const SGReaderWriterXMLOptions* options); + const SGReaderWriterOptions* options); }; Texture* TransparentTextureBuilder::build(Effect* effect, const SGPropertyNode*, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { return StateAttributeFactory::instance()->getTransparentTexture(); } @@ -390,14 +390,14 @@ class NoiseBuilder : public TextureBuilder { public: Texture* build(Effect* effect, const SGPropertyNode*, - const SGReaderWriterXMLOptions* options); + const SGReaderWriterOptions* options); protected: typedef map > NoiseMap; NoiseMap _noises; }; Texture* NoiseBuilder::build(Effect* effect, const SGPropertyNode* props, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { int texSize = 64; const SGPropertyNode* sizeProp = getEffectPropertyChild(effect, props, @@ -458,7 +458,7 @@ class CubeMapBuilder : public TextureBuilder { public: Texture* build(Effect* effect, const SGPropertyNode*, - const SGReaderWriterXMLOptions* options); + const SGReaderWriterOptions* options); protected: typedef map > CubeMap; typedef map > CrossCubeMap; @@ -481,7 +481,7 @@ void copySubImage(const osg::Image* srcImage, int src_s, int src_t, int width, i Texture* CubeMapBuilder::build(Effect* effect, const SGPropertyNode* props, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { // First check that there is a tag const SGPropertyNode* texturesProp = getEffectPropertyChild(effect, props, "images"); @@ -690,7 +690,7 @@ EffectNameValue opParamInit[] = EffectPropertyMap operandParams(opParamInit); TexEnvCombine* buildTexEnvCombine(Effect* effect, const SGPropertyNode* envProp, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { if (!isAttributeActive(effect, envProp)) return 0; diff --git a/simgear/scene/material/TextureBuilder.hxx b/simgear/scene/material/TextureBuilder.hxx index 55df2736..c8105e75 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 SGReaderWriterXMLOptions* options); + const SGReaderWriterOptions* options); }; struct TextureUnitBuilder : public PassAttributeBuilder { void buildAttribute(Effect* effect, Pass* pass, const SGPropertyNode* prop, - const SGReaderWriterXMLOptions* options); + const SGReaderWriterOptions* options); }; diff --git a/simgear/scene/material/makeEffect.cxx b/simgear/scene/material/makeEffect.cxx index 02ac244f..477328ff 100644 --- a/simgear/scene/material/makeEffect.cxx +++ b/simgear/scene/material/makeEffect.cxx @@ -31,7 +31,7 @@ #include #include -#include +#include #include #include #include @@ -117,7 +117,7 @@ void mergePropertyTrees(SGPropertyNode* resultNode, Effect* makeEffect(const string& name, bool realizeTechniques, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { { OpenThreads::ScopedLock lock(effectMutex); @@ -160,7 +160,7 @@ Effect* makeEffect(const string& name, Effect* makeEffect(SGPropertyNode* prop, bool realizeTechniques, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* 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 fcd95da3..f70a9a3b 100644 --- a/simgear/scene/material/mat.cxx +++ b/simgear/scene/material/mat.cxx @@ -49,7 +49,7 @@ #include #include #include -#include +#include #include #include #include @@ -69,13 +69,13 @@ using namespace simgear; //////////////////////////////////////////////////////////////////////// SGMaterial::_internal_state::_internal_state(Effect *e, bool l, - const SGReaderWriterXMLOptions* o) + const SGReaderWriterOptions* o) : effect(e), effect_realized(l), options(o) { } SGMaterial::_internal_state::_internal_state(Effect *e, const string &t, bool l, - const SGReaderWriterXMLOptions* o) + const SGReaderWriterOptions* o) : effect(e), effect_realized(l), options(o) { texture_paths.push_back(std::make_pair(t,0)); @@ -86,7 +86,7 @@ void SGMaterial::_internal_state::add_texture(const std::string &t, int i) texture_paths.push_back(std::make_pair(t,i)); } -SGMaterial::SGMaterial( const SGReaderWriterXMLOptions* options, +SGMaterial::SGMaterial( const SGReaderWriterOptions* options, const SGPropertyNode *props ) { init(); @@ -97,9 +97,9 @@ SGMaterial::SGMaterial( const SGReaderWriterXMLOptions* options, SGMaterial::SGMaterial( const osgDB::ReaderWriter::Options* options, const SGPropertyNode *props ) { - osg::ref_ptr sgOptions; + osg::ref_ptr sgOptions; if (options) - sgOptions = new SGReaderWriterXMLOptions(*options); + sgOptions = new SGReaderWriterOptions(*options); init(); read_properties( sgOptions.get(), props ); buildEffectProperties(sgOptions.get()); @@ -115,7 +115,7 @@ SGMaterial::~SGMaterial (void) //////////////////////////////////////////////////////////////////////// void -SGMaterial::read_properties(const SGReaderWriterXMLOptions* options, +SGMaterial::read_properties(const SGReaderWriterOptions* options, const SGPropertyNode *props) { // Gather the path(s) to the texture(s) @@ -296,12 +296,12 @@ Effect* SGMaterial::get_effect(int n) return _status[i].effect.get(); } -void SGMaterial::buildEffectProperties(const SGReaderWriterXMLOptions* options) +void SGMaterial::buildEffectProperties(const SGReaderWriterOptions* options) { using namespace osg; - ref_ptr xmlOptions; + ref_ptr xmlOptions; if (options) - xmlOptions = new SGReaderWriterXMLOptions(*options); + xmlOptions = new SGReaderWriterOptions(*options); ref_ptr user = new SGMaterialUserData(this); SGPropertyNode_ptr propRoot = new SGPropertyNode(); makeChild(propRoot, "inherits-from")->setStringValue(effect); diff --git a/simgear/scene/material/mat.hxx b/simgear/scene/material/mat.hxx index 9e2d06e4..06e72b72 100644 --- a/simgear/scene/material/mat.hxx +++ b/simgear/scene/material/mat.hxx @@ -45,7 +45,7 @@ namespace osg class StateSet; } -#include +#include #include #include #include @@ -87,7 +87,7 @@ public: */ SGMaterial( const osgDB::ReaderWriter::Options*, const SGPropertyNode *props); - SGMaterial(const simgear::SGReaderWriterXMLOptions*, + SGMaterial(const simgear::SGReaderWriterOptions*, const SGPropertyNode *props); /** * Destructor. @@ -273,14 +273,14 @@ protected: struct _internal_state { _internal_state(simgear::Effect *e, bool l, - const simgear::SGReaderWriterXMLOptions *o); + const simgear::SGReaderWriterOptions *o); _internal_state(simgear::Effect *e, const std::string &t, bool l, - const simgear::SGReaderWriterXMLOptions *o); + const simgear::SGReaderWriterOptions *o); void add_texture(const std::string &t, int i); osg::ref_ptr effect; std::vector > texture_paths; bool effect_realized; - osg::ref_ptr options; + osg::ref_ptr options; }; private: @@ -366,9 +366,9 @@ private: // Internal constructors and methods. //////////////////////////////////////////////////////////////////// - void read_properties(const simgear::SGReaderWriterXMLOptions* options, + void read_properties(const simgear::SGReaderWriterOptions* options, const SGPropertyNode *props); - void buildEffectProperties(const simgear::SGReaderWriterXMLOptions* options); + void buildEffectProperties(const simgear::SGReaderWriterOptions* options); }; diff --git a/simgear/scene/material/mipmap.cxx b/simgear/scene/material/mipmap.cxx index b3ddd02d..59a800da 100644 --- a/simgear/scene/material/mipmap.cxx +++ b/simgear/scene/material/mipmap.cxx @@ -44,7 +44,7 @@ EffectNameValue mipmapFunctionsInit[] = EffectPropertyMap mipmapFunctions(mipmapFunctionsInit); MipMapTuple makeMipMapTuple(Effect* effect, const SGPropertyNode* props, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { const SGPropertyNode* pMipmapR = getEffectPropertyChild(effect, props, "function-r"); diff --git a/simgear/scene/material/mipmap.hxx b/simgear/scene/material/mipmap.hxx index 747592e7..0a908c59 100644 --- a/simgear/scene/material/mipmap.hxx +++ b/simgear/scene/material/mipmap.hxx @@ -28,7 +28,7 @@ namespace osg { namespace simgear { class Effect; -class SGReaderWriterXMLOptions; +class SGReaderWriterOptions; namespace effect { enum MipMapFunction { @@ -43,7 +43,7 @@ enum MipMapFunction { typedef boost::tuple MipMapTuple; MipMapTuple makeMipMapTuple(Effect* effect, const SGPropertyNode* props, - const SGReaderWriterXMLOptions* options); + const SGReaderWriterOptions* options); osg::Image* computeMipmap( osg::Image* image, MipMapTuple attrs ); } } diff --git a/simgear/scene/model/CMakeLists.txt b/simgear/scene/model/CMakeLists.txt index 37ca27ff..8977a7f9 100644 --- a/simgear/scene/model/CMakeLists.txt +++ b/simgear/scene/model/CMakeLists.txt @@ -10,7 +10,6 @@ set(HEADERS SGMaterialAnimation.hxx SGOffsetTransform.hxx SGReaderWriterXML.hxx - SGReaderWriterXMLOptions.hxx SGRotateTransform.hxx SGScaleTransform.hxx SGText.hxx diff --git a/simgear/scene/model/ModelRegistry.cxx b/simgear/scene/model/ModelRegistry.cxx index a4fb94c9..4cb710f4 100644 --- a/simgear/scene/model/ModelRegistry.cxx +++ b/simgear/scene/model/ModelRegistry.cxx @@ -47,6 +47,7 @@ #include #include #include +#include #include #include @@ -56,7 +57,6 @@ #include "BoundingVolumeBuildVisitor.hxx" #include "model.hxx" -#include "SGReaderWriterXMLOptions.hxx" using namespace std; using namespace osg; @@ -410,8 +410,8 @@ struct ACOptimizePolicy : public OptimizeModelPolicy { && group->getNumChildren() == 1) optimized = static_cast(group->getChild(0)); } - const SGReaderWriterXMLOptions* sgopt - = dynamic_cast(opt); + const SGReaderWriterOptions* sgopt + = dynamic_cast(opt); if (sgopt && sgopt->getInstantiateEffects()) optimized = instantiateEffects(optimized.get(), sgopt); return optimized.release(); diff --git a/simgear/scene/model/SGReaderWriterXML.cxx b/simgear/scene/model/SGReaderWriterXML.cxx index ab128df9..81ccd85a 100644 --- a/simgear/scene/model/SGReaderWriterXML.cxx +++ b/simgear/scene/model/SGReaderWriterXML.cxx @@ -40,10 +40,10 @@ #include #include #include +#include #include "modellib.hxx" #include "SGReaderWriterXML.hxx" -#include "SGReaderWriterXMLOptions.hxx" #include "animation.hxx" #include "particles.hxx" @@ -207,8 +207,8 @@ sgLoad3DModel_internal(const SGPath& path, return NULL; } - const SGReaderWriterXMLOptions* xmlOptions; - xmlOptions = dynamic_cast(options_); + const SGReaderWriterOptions* xmlOptions; + xmlOptions = dynamic_cast(options_); SGSharedPtr prop_root; osg::Node *(*load_panel)(SGPropertyNode *)=0; @@ -218,7 +218,7 @@ sgLoad3DModel_internal(const SGPath& path, SGPath modelDir(modelpath.dir()); if (xmlOptions) { - prop_root = xmlOptions->getPropRoot(); + prop_root = xmlOptions->getPropertyNode(); load_panel = xmlOptions->getLoadPanel(); data = xmlOptions->getModelData(); } @@ -268,9 +268,9 @@ sgLoad3DModel_internal(const SGPath& path, // model without wrapper } - osg::ref_ptr options - = new SGReaderWriterXMLOptions(*options_); - options->setPropRoot(prop_root); + osg::ref_ptr options + = new SGReaderWriterOptions(*options_); + options->setPropertyNode(prop_root); options->setLoadPanel(load_panel); // Assume that textures are in @@ -353,9 +353,9 @@ sgLoad3DModel_internal(const SGPath& path, continue; } - osg::ref_ptr options; - options = new SGReaderWriterXMLOptions(*options_); - options->setPropRoot(prop_root); + osg::ref_ptr options; + options = new SGReaderWriterOptions(*options_); + options->setPropertyNode(prop_root); options->setLoadPanel(load_panel); try { diff --git a/simgear/scene/model/SGReaderWriterXMLOptions.hxx b/simgear/scene/model/SGReaderWriterXMLOptions.hxx deleted file mode 100644 index 9c203616..00000000 --- a/simgear/scene/model/SGReaderWriterXMLOptions.hxx +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (C) 2007 Tim Moore timoore@redhat.com -// Copyright (C) 2008 Till Busch buti@bux.at -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -// -#ifndef SGREADERWRITERXMLOPTIONS_HXX -#define SGREADERWRITERXMLOPTIONS_HXX 1 - -#include -#include -#include - -class SGPropertyNode; - -namespace simgear -{ -class SGModelData; - -class SGReaderWriterXMLOptions : public osgDB::ReaderWriter::Options -{ -public: - typedef osg::Node *(*panel_func)(SGPropertyNode *); - META_Object(simgear, SGReaderWriterXMLOptions); - - SGReaderWriterXMLOptions(): - osgDB::ReaderWriter::Options(), - _prop_root(0), - _load_panel(0), - _model_data(0), - _instantiateEffects(false) - {} - - SGReaderWriterXMLOptions(const std::string& str): - osgDB::ReaderWriter::Options(str), - _prop_root(0), - _load_panel(0), - _model_data(0), - _instantiateEffects(false) - {} - - SGReaderWriterXMLOptions(const SGReaderWriterXMLOptions& options, - const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY): - osgDB::ReaderWriter::Options(options, copyop), - _prop_root(options._prop_root), - _load_panel(options._load_panel), - _model_data(options._model_data), - _instantiateEffects(options._instantiateEffects) - {} - - SGReaderWriterXMLOptions(const osgDB::ReaderWriter::Options& options, - const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY): - osgDB::ReaderWriter::Options(options, copyop), - _prop_root(0), - _load_panel(0), - _model_data(0), - _instantiateEffects(false) - {} - - SGPropertyNode *getPropRoot() const { - return _prop_root; - } - panel_func getLoadPanel() const { - return _load_panel; - } - SGModelData *getModelData() const { - return _model_data.get(); - } - bool getInstantiateEffects() const - { - return _instantiateEffects; - } - - void setPropRoot(SGPropertyNode *p) { - _prop_root=p; - } - void setLoadPanel(panel_func pf) { - _load_panel=pf; - } - void setModelData(SGModelData *d) { - _model_data=d; - } - void setInstantiateEffects(bool doit) - { - _instantiateEffects = doit; - } - - -protected: - virtual ~SGReaderWriterXMLOptions() {} - - SGPropertyNode_ptr _prop_root; - osg::Node *(*_load_panel)(SGPropertyNode *); - osg::ref_ptr _model_data; - bool _instantiateEffects; -}; - -} -#endif diff --git a/simgear/scene/model/model.cxx b/simgear/scene/model/model.cxx index 648b670a..ef9e11c6 100644 --- a/simgear/scene/model/model.cxx +++ b/simgear/scene/model/model.cxx @@ -25,7 +25,7 @@ #include #include #include - +#include #include #include @@ -33,7 +33,6 @@ #include #include -#include "SGReaderWriterXMLOptions.hxx" #include "model.hxx" using std::vector; @@ -210,7 +209,7 @@ class MakeEffectVisitor : public SplicingVisitor public: typedef std::map EffectMap; using SplicingVisitor::apply; - MakeEffectVisitor(const SGReaderWriterXMLOptions* options = 0) + MakeEffectVisitor(const SGReaderWriterOptions* options = 0) : _options(options) { } @@ -226,7 +225,7 @@ public: protected: EffectMap _effectMap; SGPropertyNode_ptr _currentEffectParent; - osg::ref_ptr _options; + osg::ref_ptr _options; }; void MakeEffectVisitor::apply(osg::Group& node) @@ -309,7 +308,7 @@ protected: ref_ptr instantiateEffects(osg::Node* modelGroup, PropertyList& effectProps, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { SGPropertyNode_ptr defaultEffectPropRoot; MakeEffectVisitor visitor(options); diff --git a/simgear/scene/model/model.hxx b/simgear/scene/model/model.hxx index c2097fdc..2761d09e 100644 --- a/simgear/scene/model/model.hxx +++ b/simgear/scene/model/model.hxx @@ -25,7 +25,7 @@ namespace simgear { -class SGReaderWriterXMLOptions; +class SGReaderWriterOptions; } osg::Texture2D* @@ -102,7 +102,7 @@ public: osg::ref_ptr instantiateEffects(osg::Node* model, PropertyList& effectProps, - const SGReaderWriterXMLOptions* options); + const SGReaderWriterOptions* options); /** * Transform an OSG subgraph by substituting the Effects and @@ -115,7 +115,7 @@ instantiateEffects(osg::Node* model, inline osg::ref_ptr instantiateEffects(osg::Node* model, - const SGReaderWriterXMLOptions* options) + const SGReaderWriterOptions* options) { PropertyList effectProps; return instantiateEffects(model, effectProps, options); diff --git a/simgear/scene/model/modellib.cxx b/simgear/scene/model/modellib.cxx index 7bf6ce0f..5fa40fca 100644 --- a/simgear/scene/model/modellib.cxx +++ b/simgear/scene/model/modellib.cxx @@ -32,10 +32,10 @@ #include #include #include +#include #include #include "SGReaderWriterXML.hxx" -#include "SGReaderWriterXMLOptions.hxx" #include "modellib.hxx" @@ -87,7 +87,7 @@ SGModelLib::~SGModelLib() namespace { -osg::Node* loadFile(const string& path, SGReaderWriterXMLOptions* options) +osg::Node* loadFile(const string& path, SGReaderWriterOptions* options) { using namespace osg; using namespace osgDB; @@ -107,8 +107,8 @@ SGModelLib::loadModel(const string &path, SGModelData *data, bool load2DPanels) { - osg::ref_ptr opt = new SGReaderWriterXMLOptions(*(osgDB::Registry::instance()->getOptions())); - opt->setPropRoot(prop_root ? prop_root: static_propRoot.get()); + osg::ref_ptr opt = new SGReaderWriterOptions(*(osgDB::Registry::instance()->getOptions())); + opt->setPropertyNode(prop_root ? prop_root: static_propRoot.get()); opt->setModelData(data); if (load2DPanels) { @@ -130,10 +130,10 @@ SGModelLib::loadDeferredModel(const string &path, SGPropertyNode *prop_root, proxyNode->setLoadingExternalReferenceMode(osg::ProxyNode::DEFER_LOADING_TO_DATABASE_PAGER); proxyNode->setFileName(0, path); - osg::ref_ptr opt - = new SGReaderWriterXMLOptions(*(osgDB::Registry::instance() + osg::ref_ptr opt + = new SGReaderWriterOptions(*(osgDB::Registry::instance() ->getOptions())); - opt->setPropRoot(prop_root ? prop_root: static_propRoot.get()); + opt->setPropertyNode(prop_root ? prop_root: static_propRoot.get()); opt->setModelData(data); opt->setLoadPanel(static_panelFunc); if (SGPath(path).lower_extension() == "ac") @@ -156,10 +156,10 @@ SGModelLib::loadPagedModel(const string &path, SGPropertyNode *prop_root, plod->setFileName(0, path); plod->setRange(0, 0.0, 50.0*SG_NM_TO_METER); - osg::ref_ptr opt - = new SGReaderWriterXMLOptions(*(osgDB::Registry::instance() + osg::ref_ptr opt + = new SGReaderWriterOptions(*(osgDB::Registry::instance() ->getOptions())); - opt->setPropRoot(prop_root ? prop_root: static_propRoot.get()); + opt->setPropertyNode(prop_root ? prop_root: static_propRoot.get()); opt->setModelData(data); opt->setLoadPanel(static_panelFunc); if (SGPath(path).lower_extension() == "ac") diff --git a/simgear/scene/sky/newcloud.cxx b/simgear/scene/sky/newcloud.cxx index 6cd0a93c..e05301af 100644 --- a/simgear/scene/sky/newcloud.cxx +++ b/simgear/scene/sky/newcloud.cxx @@ -45,7 +45,7 @@ #include #include #include -#include +#include #include #include @@ -112,8 +112,8 @@ SGNewCloud::SGNewCloud(const SGPath &texture_root, const SGPropertyNode *cld_def texture); ref_ptr options = makeOptionsFromPath(texture_root); - ref_ptr sgOptions - = new SGReaderWriterXMLOptions(*options.get()); + ref_ptr sgOptions + = new SGReaderWriterOptions(*options.get()); if ((effect = makeEffect(pcloudEffect, true, sgOptions.get()))) effectMap.insert(EffectMap::value_type(texture, effect)); } else { diff --git a/simgear/scene/tgdb/CMakeLists.txt b/simgear/scene/tgdb/CMakeLists.txt index e9fa8359..635eb954 100644 --- a/simgear/scene/tgdb/CMakeLists.txt +++ b/simgear/scene/tgdb/CMakeLists.txt @@ -8,7 +8,6 @@ set(HEADERS SGModelBin.hxx SGOceanTile.hxx SGReaderWriterBTG.hxx - SGReaderWriterBTGOptions.hxx SGTexturedTriangleBin.hxx SGTriangleBin.hxx SGVasiDrawable.hxx diff --git a/simgear/scene/tgdb/SGReaderWriterBTG.cxx b/simgear/scene/tgdb/SGReaderWriterBTG.cxx index ad3a6774..05f6d74f 100644 --- a/simgear/scene/tgdb/SGReaderWriterBTG.cxx +++ b/simgear/scene/tgdb/SGReaderWriterBTG.cxx @@ -19,8 +19,8 @@ #include #include +#include -#include "SGReaderWriterBTGOptions.hxx" #include "SGReaderWriterBTG.hxx" #include "obj.hxx" @@ -29,6 +29,7 @@ using namespace simgear; SGReaderWriterBTG::SGReaderWriterBTG() { supportsExtension("btg", "SimGear btg database format"); + // supportsExtension("btg.gz", "SimGear btg database format"); } SGReaderWriterBTG::~SGReaderWriterBTG() @@ -43,8 +44,8 @@ const char* SGReaderWriterBTG::className() const bool SGReaderWriterBTG::acceptsExtension(const std::string& extension) const { - std::string lowercase_ext = osgDB::convertToLowerCase(extension); - if (lowercase_ext == "gz") + // trick the osg extensions match algorithm to accept btg.gz files. + if (osgDB::convertToLowerCase(extension) == "gz") return true; return osgDB::ReaderWriter::acceptsExtension(extension); } @@ -54,18 +55,24 @@ SGReaderWriterBTG::readNode(const std::string& fileName, const osgDB::ReaderWriter::Options* options) const { SGMaterialLib* matlib = 0; - bool calcLights = false; bool useRandomObjects = false; bool useRandomVegetation = false; - const SGReaderWriterBTGOptions* btgOptions - = dynamic_cast(options); - if (btgOptions) { - matlib = btgOptions->getMatlib(); - calcLights = btgOptions->getCalcLights(); - useRandomObjects = btgOptions->getUseRandomObjects(); - useRandomVegetation = btgOptions->getUseRandomVegetation(); + const SGReaderWriterOptions* sgOptions; + sgOptions = dynamic_cast(options); + if (sgOptions) { + matlib = sgOptions->getMaterialLib(); + SGPropertyNode* propertyNode = sgOptions->getPropertyNode().get(); + if (propertyNode) { + useRandomObjects + = propertyNode->getBoolValue("/sim/rendering/random-objects", + useRandomObjects); + useRandomVegetation + = propertyNode->getBoolValue("/sim/rendering/random-vegetation", + useRandomVegetation); + } } - osg::Node* result = SGLoadBTG(fileName, matlib, calcLights, + + osg::Node* result = SGLoadBTG(fileName, matlib, useRandomObjects, useRandomVegetation); if (result) diff --git a/simgear/scene/tgdb/SGReaderWriterBTGOptions.hxx b/simgear/scene/tgdb/SGReaderWriterBTGOptions.hxx deleted file mode 100644 index 097d3fcd..00000000 --- a/simgear/scene/tgdb/SGReaderWriterBTGOptions.hxx +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (C) 2007 Tim Moore timoore@redhat.com -// -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License as -// published by the Free Software Foundation; either version 2 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -// -#ifndef SGREADERWRITERBTGOPTIONS_HXX -#define SGREADERWRITERBTGOPTIONS_HXX - -#include -#include -class SGReaderWriterBTGOptions : public osgDB::ReaderWriter::Options { -public: - META_Object(simgear,SGReaderWriterBTGOptions); - SGReaderWriterBTGOptions(const std::string& str = std::string()) : - osgDB::ReaderWriter::Options(str), - _matlib(0), _calcLights(true), - _useRandomObjects(false), - _useRandomVegetation(false) - {} - - SGReaderWriterBTGOptions(const SGReaderWriterBTGOptions& options, - const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY): - osgDB::ReaderWriter::Options(options, copyop), - _matlib(options._matlib), _calcLights(options._calcLights), - _useRandomObjects(options._useRandomObjects), - _useRandomVegetation(options._useRandomVegetation) - { - } - SGMaterialLib* getMatlib() const { return _matlib; } - void setMatlib (SGMaterialLib* matlib) { _matlib = matlib; } - bool getCalcLights() const { return _calcLights; } - void setCalcLights(bool calcLights) { _calcLights = calcLights; } - bool getUseRandomObjects() const { return _useRandomObjects; } - bool getUseRandomVegetation() const { return _useRandomVegetation; } - void setUseRandomObjects(bool useRandomObjects) - { - _useRandomObjects = useRandomObjects; - } - void setUseRandomVegetation(bool useRandomVegetation) - { - _useRandomVegetation = useRandomVegetation; - } - -protected: - virtual ~SGReaderWriterBTGOptions() {} - SGMaterialLib* _matlib; - bool _calcLights; - bool _useRandomObjects; - bool _useRandomVegetation; -}; -#endif diff --git a/simgear/scene/tgdb/TileEntry.cxx b/simgear/scene/tgdb/TileEntry.cxx index 6c7c54c2..1c219bfb 100644 --- a/simgear/scene/tgdb/TileEntry.cxx +++ b/simgear/scene/tgdb/TileEntry.cxx @@ -49,7 +49,7 @@ #include #include #include -#include +#include #include "ReaderWriterSTG.hxx" #include "TileEntry.hxx" @@ -288,27 +288,26 @@ TileEntry::loadTileByFileName(const string& fileName, } } - const SGReaderWriterBTGOptions* btgOpt; - btgOpt = dynamic_cast(options); - osg::ref_ptr opt; + const SGReaderWriterOptions* btgOpt; + btgOpt = dynamic_cast(options); + osg::ref_ptr opt; if (btgOpt) - opt = new SGReaderWriterBTGOptions(*btgOpt); + opt = new SGReaderWriterOptions(*btgOpt); else - opt = new SGReaderWriterBTGOptions; + opt = new SGReaderWriterOptions; // obj_load() will generate ground lighting for us ... osg::Group* new_tile = new osg::Group; if (found_tile_base) { // load tile if found ... - opt->setCalcLights(true); obj_load( object_base.str(), new_tile, true, opt.get()); } else { // ... or generate an ocean tile on the fly SG_LOG(SG_TERRAIN, SG_INFO, " Generating ocean tile"); if ( !SGGenTile( path_list[0], tile_bucket, - opt->getMatlib(), new_tile ) ) { + opt->getMaterialLib(), new_tile ) ) { SG_LOG( SG_TERRAIN, SG_ALERT, "Warning: failed to generate ocean tile!" ); } @@ -322,7 +321,6 @@ TileEntry::loadTileByFileName(const string& fileName, if (obj->type == OBJECT) { SGPath custom_path = obj->path; custom_path.append( obj->name ); - opt->setCalcLights(true); obj_load( custom_path.str(), new_tile, false, opt.get()); } else if (obj->type == OBJECT_SHARED || obj->type == OBJECT_STATIC) { @@ -366,9 +364,9 @@ TileEntry::loadTileByFileName(const string& fileName, osg::Node *custom_obj = 0; if (obj->type == OBJECT_SIGN) - custom_obj = SGMakeSign(opt->getMatlib(), custom_path.str(), obj->name); + custom_obj = SGMakeSign(opt->getMaterialLib(), custom_path.str(), obj->name); else - custom_obj = SGMakeRunwaySign(opt->getMatlib(), custom_path.str(), obj->name); + custom_obj = SGMakeRunwaySign(opt->getMaterialLib(), custom_path.str(), obj->name); // wire the pieces together if ( custom_obj != NULL ) { diff --git a/simgear/scene/tgdb/obj.cxx b/simgear/scene/tgdb/obj.cxx index 6e16dc70..d080ff33 100644 --- a/simgear/scene/tgdb/obj.cxx +++ b/simgear/scene/tgdb/obj.cxx @@ -579,7 +579,7 @@ typedef QuadTreeBuilder RandomObjectsQuadtree; osg::Node* -SGLoadBTG(const std::string& path, SGMaterialLib *matlib, bool calc_lights, bool use_random_objects, bool use_random_vegetation) +SGLoadBTG(const std::string& path, SGMaterialLib *matlib, bool use_random_objects, bool use_random_vegetation) { SGBinObject tile; if (!tile.read_bin(path)) @@ -669,38 +669,36 @@ SGLoadBTG(const std::string& path, SGMaterialLib *matlib, bool calc_lights, bool } } - if (calc_lights) { - // FIXME: ugly, has a side effect - if (matlib) - tileGeometryBin.computeRandomSurfaceLights(matlib); - - if (tileGeometryBin.tileLights.getNumLights() > 0 - || tileGeometryBin.randomTileLights.getNumLights() > 0) { - osg::Group* groundLights0 = new osg::Group; - groundLights0->setStateSet(lightManager->getGroundLightStateSet()); - groundLights0->setNodeMask(GROUNDLIGHTS0_BIT); - osg::Geode* geode = new osg::Geode; - geode->addDrawable(SGLightFactory::getLights(tileGeometryBin.tileLights)); - geode->addDrawable(SGLightFactory::getLights(tileGeometryBin.randomTileLights, 4, -0.3f)); - groundLights0->addChild(geode); - lightGroup->addChild(groundLights0); - } - if (tileGeometryBin.randomTileLights.getNumLights() > 0) { - osg::Group* groundLights1 = new osg::Group; - groundLights1->setStateSet(lightManager->getGroundLightStateSet()); - groundLights1->setNodeMask(GROUNDLIGHTS1_BIT); - osg::Group* groundLights2 = new osg::Group; - groundLights2->setStateSet(lightManager->getGroundLightStateSet()); - groundLights2->setNodeMask(GROUNDLIGHTS2_BIT); - osg::Geode* geode = new osg::Geode; - geode->addDrawable(SGLightFactory::getLights(tileGeometryBin.randomTileLights, 2, -0.15f)); - groundLights1->addChild(geode); - lightGroup->addChild(groundLights1); - geode = new osg::Geode; - geode->addDrawable(SGLightFactory::getLights(tileGeometryBin.randomTileLights)); - groundLights2->addChild(geode); - lightGroup->addChild(groundLights2); - } + // FIXME: ugly, has a side effect + if (matlib) + tileGeometryBin.computeRandomSurfaceLights(matlib); + + if (tileGeometryBin.tileLights.getNumLights() > 0 + || tileGeometryBin.randomTileLights.getNumLights() > 0) { + osg::Group* groundLights0 = new osg::Group; + groundLights0->setStateSet(lightManager->getGroundLightStateSet()); + groundLights0->setNodeMask(GROUNDLIGHTS0_BIT); + osg::Geode* geode = new osg::Geode; + geode->addDrawable(SGLightFactory::getLights(tileGeometryBin.tileLights)); + geode->addDrawable(SGLightFactory::getLights(tileGeometryBin.randomTileLights, 4, -0.3f)); + groundLights0->addChild(geode); + lightGroup->addChild(groundLights0); + } + if (tileGeometryBin.randomTileLights.getNumLights() > 0) { + osg::Group* groundLights1 = new osg::Group; + groundLights1->setStateSet(lightManager->getGroundLightStateSet()); + groundLights1->setNodeMask(GROUNDLIGHTS1_BIT); + osg::Group* groundLights2 = new osg::Group; + groundLights2->setStateSet(lightManager->getGroundLightStateSet()); + groundLights2->setNodeMask(GROUNDLIGHTS2_BIT); + osg::Geode* geode = new osg::Geode; + geode->addDrawable(SGLightFactory::getLights(tileGeometryBin.randomTileLights, 2, -0.15f)); + groundLights1->addChild(geode); + lightGroup->addChild(groundLights1); + geode = new osg::Geode; + geode->addDrawable(SGLightFactory::getLights(tileGeometryBin.randomTileLights)); + groundLights2->addChild(geode); + lightGroup->addChild(groundLights2); } if (!tileGeometryBin.vasiLights.empty()) { diff --git a/simgear/scene/tgdb/obj.hxx b/simgear/scene/tgdb/obj.hxx index 126ed6cc..cdced8b6 100644 --- a/simgear/scene/tgdb/obj.hxx +++ b/simgear/scene/tgdb/obj.hxx @@ -56,6 +56,6 @@ inline bool SGGenTile( const std::string&, const SGBucket& b, } osg::Node* -SGLoadBTG(const std::string& path, SGMaterialLib *matlib, bool calc_lights, bool use_random_objects, bool use_random_vegetation); +SGLoadBTG(const std::string& path, SGMaterialLib *matlib, bool use_random_objects, bool use_random_vegetation); #endif // _SG_OBJ_HXX diff --git a/simgear/scene/util/CMakeLists.txt b/simgear/scene/util/CMakeLists.txt index 84f0b556..6f9193a5 100644 --- a/simgear/scene/util/CMakeLists.txt +++ b/simgear/scene/util/CMakeLists.txt @@ -10,6 +10,7 @@ set(HEADERS SGEnlargeBoundingBox.hxx SGNodeMasks.hxx SGPickCallback.hxx + SGReaderWriterOptions.hxx SGSceneFeatures.hxx SGSceneUserData.hxx SGStateAttributeVisitor.hxx diff --git a/simgear/scene/util/SGReaderWriterOptions.hxx b/simgear/scene/util/SGReaderWriterOptions.hxx new file mode 100644 index 00000000..29ff31eb --- /dev/null +++ b/simgear/scene/util/SGReaderWriterOptions.hxx @@ -0,0 +1,108 @@ +// Copyright (C) 2007 Tim Moore timoore@redhat.com +// Copyright (C) 2008 Till Busch buti@bux.at +// Copyright (C) 2011 Mathias Froehlich +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// + +#ifndef SGREADERWRITEROPTIONS_HXX +#define SGREADERWRITEROPTIONS_HXX 1 + +#include +#include +#include + +class SGPropertyNode; +class SGMaterialLib; + +namespace simgear +{ + +class SGReaderWriterOptions : public osgDB::Options { +public: + SGReaderWriterOptions() : + _materialLib(0), + _load_panel(0), + _model_data(0), + _instantiateEffects(false) + { } + SGReaderWriterOptions(const std::string& str) : + osgDB::ReaderWriter::Options(str), + _materialLib(0), + _load_panel(0), + _model_data(0), + _instantiateEffects(false) + { } + SGReaderWriterOptions(const osgDB::Options& options, + const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY) : + osgDB::ReaderWriter::Options(options, copyop), + _materialLib(0), + _load_panel(0), + _model_data(0), + _instantiateEffects(false) + { } + SGReaderWriterOptions(const SGReaderWriterOptions& options, + const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY) : + osgDB::ReaderWriter::Options(options, copyop), + _propertyNode(options._propertyNode), + _materialLib(options._materialLib), + _load_panel(options._load_panel), + _model_data(options._model_data), + _instantiateEffects(options._instantiateEffects) + { } + + META_Object(simgear, SGReaderWriterOptions); + + const SGSharedPtr& getPropertyNode() const + { return _propertyNode; } + void setPropertyNode(const SGSharedPtr& propertyNode) + { _propertyNode = propertyNode; } + + SGMaterialLib* getMaterialLib() const + { return _materialLib; } + void setMaterialLib(SGMaterialLib* materialLib) + { _materialLib = materialLib; } + + typedef osg::Node *(*panel_func)(SGPropertyNode *); + + panel_func getLoadPanel() const + { return _load_panel; } + void setLoadPanel(panel_func pf) + { _load_panel=pf; } + + SGModelData *getModelData() const + { return _model_data.get(); } + void setModelData(SGModelData *modelData) + { _model_data=modelData; } + + bool getInstantiateEffects() const + { return _instantiateEffects; } + void setInstantiateEffects(bool instantiateEffects) + { _instantiateEffects = instantiateEffects; } + +protected: + virtual ~SGReaderWriterOptions() {} + +private: + SGSharedPtr _propertyNode; + SGMaterialLib* _materialLib; + osg::Node *(*_load_panel)(SGPropertyNode *); + osg::ref_ptr _model_data; + bool _instantiateEffects; +}; + +} + +#endif -- 2.39.5