diff --git a/projects/VC90/SimGear.vcproj b/projects/VC90/SimGear.vcproj index 7517d1cb..cb653c75 100644 --- a/projects/VC90/SimGear.vcproj +++ b/projects/VC90/SimGear.vcproj @@ -439,6 +439,22 @@ + + + + + + + + @@ -527,10 +543,6 @@ RelativePath="..\..\simgear\io\sg_socket_udp.hxx" > - - - - - - @@ -1031,6 +1039,10 @@ RelativePath="..\..\simgear\props\props_io.hxx" > + + - - @@ -1395,10 +1403,6 @@ RelativePath="..\..\simgear\scene\tgdb\SGReaderWriterBTG.hxx" > - - @@ -1447,7 +1451,7 @@ RelativePath="..\..\simgear\scene\tgdb\userdata.hxx" > - + @@ -1472,25 +1476,17 @@ > - - - - @@ -1555,6 +1551,14 @@ RelativePath="..\..\simgear\structure\OSGVersion.hxx" > + + + + @@ -1571,6 +1575,14 @@ RelativePath="..\..\simgear\structure\SGExpression.hxx" > + + + + diff --git a/simgear/io/sg_binobj.cxx b/simgear/io/sg_binobj.cxx index 54f3b8de..a4fbc8ff 100644 --- a/simgear/io/sg_binobj.cxx +++ b/simgear/io/sg_binobj.cxx @@ -461,7 +461,7 @@ bool SGBinObject::read_bin( const string& file ) { //cout << "Total objects to read = " << nobjects << endl; if ( sgReadError() ) { - cout << "We detected an error while reading the file header" << endl; + cout << "Error while reading header of file " << file << "(.gz)" << endl; return false; } @@ -612,7 +612,7 @@ bool SGBinObject::read_bin( const string& file ) { } if ( sgReadError() ) { - cout << "We detected an error while reading object:" << i << endl; + cout << "Error while reading object:" << i << " in file " << file << "(.gz)" << endl; return false; } } @@ -621,7 +621,7 @@ bool SGBinObject::read_bin( const string& file ) { gzclose(fp); if ( sgReadError() ) { - cout << "We detected an error while reading the file." << endl; + cout << "Error while reading file " << file << "(.gz)" << endl; return false; } @@ -829,7 +829,7 @@ bool SGBinObject::write_bin_file(const SGPath& file) gzclose(fp); if ( sgWriteError() ) { - cout << "We detected an error while writing the file." << endl; + cout << "Error while writing file " << file.str() << endl; return false; } 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..0c141c47 100644 --- a/simgear/scene/material/TextureBuilder.cxx +++ b/simgear/scene/material/TextureBuilder.cxx @@ -32,12 +32,13 @@ #include #include #include +#include #include #include #include -#include +#include #include #include #include @@ -54,13 +55,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 +103,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 +184,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,14 +235,14 @@ 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()) { throw BuilderException("no image file"); } else { - osgDB::ReaderWriter::ReadResult result - = osgDB::Registry::instance()->readImage(imageName, options); + osgDB::ReaderWriter::ReadResult result; + result = osgDB::readImageFile(imageName, options); if (result.success()) { osg::ref_ptr image = result.getImage(); image = computeMipmap( image.get(), attrs.get<7>() ); @@ -275,7 +276,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 +285,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 +309,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 +327,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 +391,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 +459,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 +482,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"); @@ -511,33 +512,33 @@ Texture* CubeMapBuilder::build(Effect* effect, const SGPropertyNode* props, cubeTexture->setWrap(osg::Texture3D::WRAP_T, osg::Texture::CLAMP_TO_EDGE); cubeTexture->setWrap(osg::Texture3D::WRAP_R, osg::Texture::CLAMP_TO_EDGE); - osgDB::ReaderWriter::ReadResult result = - osgDB::Registry::instance()->readImage(_tuple.get<0>(), options); + osgDB::ReaderWriter::ReadResult result; + result = osgDB::readImageFile(_tuple.get<0>(), options); if(result.success()) { osg::Image* image = result.getImage(); cubeTexture->setImage(TextureCubeMap::POSITIVE_X, image); } - result = osgDB::Registry::instance()->readImage(_tuple.get<1>(), options); + result = osgDB::readImageFile(_tuple.get<1>(), options); if(result.success()) { osg::Image* image = result.getImage(); cubeTexture->setImage(TextureCubeMap::NEGATIVE_X, image); } - result = osgDB::Registry::instance()->readImage(_tuple.get<2>(), options); + result = osgDB::readImageFile(_tuple.get<2>(), options); if(result.success()) { osg::Image* image = result.getImage(); cubeTexture->setImage(TextureCubeMap::POSITIVE_Y, image); } - result = osgDB::Registry::instance()->readImage(_tuple.get<3>(), options); + result = osgDB::readImageFile(_tuple.get<3>(), options); if(result.success()) { osg::Image* image = result.getImage(); cubeTexture->setImage(TextureCubeMap::NEGATIVE_Y, image); } - result = osgDB::Registry::instance()->readImage(_tuple.get<4>(), options); + result = osgDB::readImageFile(_tuple.get<4>(), options); if(result.success()) { osg::Image* image = result.getImage(); cubeTexture->setImage(TextureCubeMap::POSITIVE_Z, image); } - result = osgDB::Registry::instance()->readImage(_tuple.get<5>(), options); + result = osgDB::readImageFile(_tuple.get<5>(), options); if(result.success()) { osg::Image* image = result.getImage(); cubeTexture->setImage(TextureCubeMap::NEGATIVE_Z, image); @@ -560,8 +561,8 @@ Texture* CubeMapBuilder::build(Effect* effect, const SGPropertyNode* props, if (itr != _crossmaps.end()) return itr->second.get(); - osgDB::ReaderWriter::ReadResult result = - osgDB::Registry::instance()->readImage(texname, options); + osgDB::ReaderWriter::ReadResult result; + result = osgDB::readImageFile(texname, options); if(result.success()) { osg::Image* image = result.getImage(); image->flipVertical(); // Seems like the image coordinates are somewhat funny, flip to get better ones @@ -690,7 +691,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..2fafbcfa 100644 --- a/simgear/scene/model/SGReaderWriterXML.cxx +++ b/simgear/scene/model/SGReaderWriterXML.cxx @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -40,10 +41,10 @@ #include #include #include +#include #include "modellib.hxx" #include "SGReaderWriterXML.hxx" -#include "SGReaderWriterXMLOptions.hxx" #include "animation.hxx" #include "particles.hxx" @@ -207,8 +208,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 +219,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 +269,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 @@ -280,9 +281,8 @@ sgLoad3DModel_internal(const SGPath& path, texturepath = texturepath.dir(); options->setDatabasePath(texturepath.str()); - osgDB::ReaderWriter::ReadResult modelResult - = osgDB::Registry::instance()->readNode(modelpath.str(), - options.get()); + osgDB::ReaderWriter::ReadResult modelResult; + modelResult = osgDB::readNodeFile(modelpath.str(), options.get()); if (!modelResult.validNode()) throw sg_io_exception("Failed to load 3D model:" + modelResult.message(), modelpath.str()); @@ -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 413d1734..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) { @@ -123,17 +123,17 @@ SGModelLib::loadModel(const string &path, } osg::Node* -SGModelLib::loadDeferedModel(const string &path, SGPropertyNode *prop_root, +SGModelLib::loadDeferredModel(const string &path, SGPropertyNode *prop_root, SGModelData *data) { osg::ProxyNode* proxyNode = new osg::ProxyNode; 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/model/modellib.hxx b/simgear/scene/model/modellib.hxx index cdcbd7dd..a9a3eb0d 100644 --- a/simgear/scene/model/modellib.hxx +++ b/simgear/scene/model/modellib.hxx @@ -58,9 +58,9 @@ public: // This function initially just returns a proxy node that refers to // the model file. Once the viewer steps onto that node the // model will be loaded. - static osg::Node* loadDeferedModel(const std::string &path, - SGPropertyNode *prop_root = NULL, - SGModelData *data=0); + static osg::Node* loadDeferredModel(const std::string &path, + SGPropertyNode *prop_root = NULL, + SGModelData *data=0); // Load a 3D model (any format) through the DatabasePager. // This function initially just returns a PagedLOD node that refers to // the model file. Once the viewer steps onto that node the 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/sky/sky.hxx b/simgear/scene/sky/sky.hxx index 33673ca6..c4924100 100644 --- a/simgear/scene/sky/sky.hxx +++ b/simgear/scene/sky/sky.hxx @@ -53,14 +53,11 @@ #include #include -using std::vector; - - typedef struct { - SGVec3d pos; - SGGeod pos_geod; - SGQuatd ori; - double spin; + SGVec3d pos; + SGGeod pos_geod; + SGQuatd ori; + double spin; double gst; double sun_dist; double moon_dist; @@ -69,8 +66,8 @@ typedef struct { typedef struct { SGVec3f sky_color; - SGVec3f adj_sky_color; - SGVec3f fog_color; + SGVec3f adj_sky_color; + SGVec3f fog_color; SGVec3f cloud_color; double sun_angle, moon_angle; } SGSkyColor; 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..a3a0fe5c 100644 --- a/simgear/scene/tgdb/SGReaderWriterBTG.cxx +++ b/simgear/scene/tgdb/SGReaderWriterBTG.cxx @@ -15,12 +15,17 @@ // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // +#ifdef HAVE_CONFIG_H +# include +#endif + #include #include #include +#include +#include -#include "SGReaderWriterBTGOptions.hxx" #include "SGReaderWriterBTG.hxx" #include "obj.hxx" @@ -29,6 +34,7 @@ using namespace simgear; SGReaderWriterBTG::SGReaderWriterBTG() { supportsExtension("btg", "SimGear btg database format"); + // supportsExtension("btg.gz", "SimGear btg database format"); } SGReaderWriterBTG::~SGReaderWriterBTG() @@ -43,8 +49,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 +60,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); + // 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.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/tgdb/pt_lights.cxx b/simgear/scene/tgdb/pt_lights.cxx index 74c696ed..d07a805f 100644 --- a/simgear/scene/tgdb/pt_lights.cxx +++ b/simgear/scene/tgdb/pt_lights.cxx @@ -407,8 +407,21 @@ buildVasi(const SGDirectionalLightBin& lights, const SGVec3f& up, drawable->addLight(lights.getLight(3).position, lights.getLight(3).normal, up, 2.5); return drawable; - } - else if (count == 12) { + + } else if (count == 6) { + SGVasiDrawable* drawable = new SGVasiDrawable(red, white); + + // probably vasi, first 3 are downwind bar (2.5 deg) + for (unsigned i = 0; i < 3; ++i) + drawable->addLight(lights.getLight(i).position, + lights.getLight(i).normal, up, 2.5); + // last 3 are upwind bar (3.0 deg) + for (unsigned i = 3; i < 6; ++i) + drawable->addLight(lights.getLight(i).position, + lights.getLight(i).normal, up, 3.0); + return drawable; + + } else if (count == 12) { SGVasiDrawable* drawable = new SGVasiDrawable(red, white); // probably vasi, first 6 are downwind bar (2.5 deg) @@ -419,8 +432,8 @@ buildVasi(const SGDirectionalLightBin& lights, const SGVec3f& up, for (unsigned i = 6; i < 12; ++i) drawable->addLight(lights.getLight(i).position, lights.getLight(i).normal, up, 3.0); - return drawable; + } else { // fail safe SG_LOG(SG_TERRAIN, SG_ALERT, diff --git a/simgear/scene/tsync/terrasync.cxx b/simgear/scene/tsync/terrasync.cxx index 800f278a..70fd13cc 100644 --- a/simgear/scene/tsync/terrasync.cxx +++ b/simgear/scene/tsync/terrasync.cxx @@ -59,9 +59,7 @@ #include #include #include -#include #include -#include #ifdef HAVE_SVN_CLIENT_H # ifdef HAVE_LIBSVN_CLIENT_1 @@ -141,7 +139,7 @@ public: /////////////////////////////////////////////////////////////////////////////// // SGTerraSync::SvnThread ///////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// -class SGTerraSync::SvnThread : public OpenThreads::Thread +class SGTerraSync::SvnThread : public SGThread { public: SvnThread(); @@ -162,6 +160,7 @@ public: void setLocalDir(string dir) { _local_dir = stripPath(dir);} string getLocalDir() { return _local_dir;} void setUseSvn(bool use_svn) { _use_svn = use_svn;} + void setAllowedErrorCount(int errors) {_allowed_errors = errors;} #ifdef HAVE_SVN_CLIENT_H void setUseBuiltin(bool built_in) { _use_built_in = built_in;} @@ -175,6 +174,7 @@ public: volatile int _updated_tile_count; volatile int _success_count; volatile int _consecutive_errors; + volatile int _allowed_errors; private: virtual void run(); @@ -222,6 +222,7 @@ SGTerraSync::SvnThread::SvnThread() : _updated_tile_count(0), _success_count(0), _consecutive_errors(0), + _allowed_errors(6), #ifdef HAVE_SVN_CLIENT_H _use_built_in(true), #endif @@ -344,7 +345,7 @@ bool SGTerraSync::SvnThread::start() << status << "Directory: '" << _local_dir << "'."); - OpenThreads::Thread::start(); + SGThread::start(); return true; } @@ -556,7 +557,8 @@ void SGTerraSync::SvnThread::run() _busy = false; } - if (_consecutive_errors >= 5) + if ((_allowed_errors >= 0)&& + (_consecutive_errors >= _allowed_errors)) { _stalled = true; _stop = true; @@ -670,7 +672,8 @@ SGTerraSync::SGTerraSync(SGPropertyNode_ptr root) : last_lat(NOWHERE), last_lon(NOWHERE), _terraRoot(root->getNode("/sim/terrasync",true)), - _tile_cache(NULL) + _refreshCb(NULL), + _userCbData(NULL) { _svnThread = new SvnThread(); } @@ -684,7 +687,7 @@ SGTerraSync::~SGTerraSync() void SGTerraSync::init() { - _refresh_display = _terraRoot->getNode("refresh-display",true); + _refreshDisplay = _terraRoot->getNode("refresh-display",true); _terraRoot->getNode("built-in-svn-available",true)->setBoolValue(svn_built_in_available); reinit(); } @@ -703,6 +706,7 @@ void SGTerraSync::reinit() _svnThread->setSvnServer(_terraRoot->getStringValue("svn-server","")); _svnThread->setRsyncServer(_terraRoot->getStringValue("rsync-server","")); _svnThread->setLocalDir(_terraRoot->getStringValue("scenery-dir","")); + _svnThread->setAllowedErrorCount(_terraRoot->getIntValue("max-errors",5)); #ifdef HAVE_SVN_CLIENT_H _svnThread->setUseBuiltin(_terraRoot->getBoolValue("use-built-in-svn",true)); @@ -727,7 +731,7 @@ void SGTerraSync::reinit() } } - _stalled_node->setBoolValue(_svnThread->_stalled); + _stalledNode->setBoolValue(_svnThread->_stalled); } void SGTerraSync::bind() @@ -745,9 +749,9 @@ void SGTerraSync::bind() _terraRoot->getNode("use-built-in-svn", true)->setAttribute(SGPropertyNode::USERARCHIVE,false); _terraRoot->getNode("use-svn", true)->setAttribute(SGPropertyNode::USERARCHIVE,false); // stalled is used as a signal handler (to connect listeners triggering GUI pop-ups) - _stalled_node = _terraRoot->getNode("stalled", true); - _stalled_node->setBoolValue(_svnThread->_stalled); - _stalled_node->setAttribute(SGPropertyNode::PRESERVE,true); + _stalledNode = _terraRoot->getNode("stalled", true); + _stalledNode->setBoolValue(_svnThread->_stalled); + _stalledNode->setAttribute(SGPropertyNode::PRESERVE,true); } void SGTerraSync::unbind() @@ -774,10 +778,10 @@ void SGTerraSync::update(double) SG_LOG(SG_TERRAIN,SG_ALERT, "Automatic scenery download/synchronization has stopped."); } - _stalled_node->setBoolValue(_svnThread->_stalled); + _stalledNode->setBoolValue(_svnThread->_stalled); } - if (!_refresh_display->getBoolValue()) + if (!_refreshDisplay->getBoolValue()) return; while (_svnThread->hasNewTiles()) @@ -794,7 +798,7 @@ void SGTerraSync::update(double) void SGTerraSync::refreshScenery(SGPath path,const string& relativeDir) { // find tiles to be refreshed - if (_tile_cache) + if (_refreshCb) { path.append(relativeDir); if (path.exists()) @@ -808,7 +812,7 @@ void SGTerraSync::refreshScenery(SGPath path,const string& relativeDir) { // reload scenery tile long index = atoi(tileList[i].file().c_str()); - _tile_cache->refresh_tile(index); + _refreshCb(_userCbData, index); } } } @@ -816,9 +820,10 @@ void SGTerraSync::refreshScenery(SGPath path,const string& relativeDir) bool SGTerraSync::isIdle() {return _svnThread->isIdle();} -void SGTerraSync::setTileCache(TileCache* tile_cache) +void SGTerraSync::setTileRefreshCb(SGTerraSyncCallback refreshCb, void* userCbData) { - _tile_cache = tile_cache; + _refreshCb = refreshCb; + _userCbData = userCbData; } void SGTerraSync::syncAirportsModels() diff --git a/simgear/scene/tsync/terrasync.hxx b/simgear/scene/tsync/terrasync.hxx index 7e6e0cb1..62ae9511 100644 --- a/simgear/scene/tsync/terrasync.hxx +++ b/simgear/scene/tsync/terrasync.hxx @@ -24,7 +24,6 @@ #include #include #include -#include class SGPath; @@ -32,7 +31,7 @@ namespace simgear { const int NOWHERE = -9999; -class TileCache; +typedef void (*SGTerraSyncCallback)(void* userData, long tileIndex); class SGTerraSync : public SGSubsystem { @@ -48,7 +47,7 @@ public: bool isIdle(); bool schedulePosition(int lat, int lon); - void setTileCache(TileCache* tile_cache); + void setTileRefreshCb(SGTerraSyncCallback refreshCb, void* userData = NULL); protected: void syncAirportsModels(); @@ -63,9 +62,10 @@ private: int last_lat; int last_lon; SGPropertyNode_ptr _terraRoot; - SGPropertyNode_ptr _refresh_display; - SGPropertyNode_ptr _stalled_node; - TileCache* _tile_cache; + SGPropertyNode_ptr _refreshDisplay; + SGPropertyNode_ptr _stalledNode; + SGTerraSyncCallback _refreshCb; + void* _userCbData; simgear::TiedPropertyList _tiedProperties; }; 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 diff --git a/simgear/sound/soundmgr_openal.cxx b/simgear/sound/soundmgr_openal.cxx index 0e34717b..10da0ac2 100644 --- a/simgear/sound/soundmgr_openal.cxx +++ b/simgear/sound/soundmgr_openal.cxx @@ -605,7 +605,7 @@ bool SGSoundMgr::load(string &samplepath, void **dbuf, int *fmt, // occurs: e.g. -43 on Mac when file is not found. // In this case, alGetString() sets 'Invalid Enum' error, so // showing with the original error number is helpful. - stringstream ss; + std::stringstream ss; ss << alGetString(alGetError()) << "(" << error << ")"; msg.append(ss.str()); } diff --git a/simgear/structure/CMakeLists.txt b/simgear/structure/CMakeLists.txt index 4bb969c7..e5ff687a 100644 --- a/simgear/structure/CMakeLists.txt +++ b/simgear/structure/CMakeLists.txt @@ -13,6 +13,7 @@ set(HEADERS SGSmplstat.hxx SGWeakPtr.hxx SGWeakReferenced.hxx + SGPerfMon.hxx Singleton.hxx StringTable.hxx callback.hxx @@ -29,6 +30,7 @@ set(SOURCES SGExpression.cxx SGSmplhist.cxx SGSmplstat.cxx + SGPerfMon.cxx StringTable.cxx commands.cxx event_mgr.cxx diff --git a/simgear/structure/SGPerfMon.cxx b/simgear/structure/SGPerfMon.cxx new file mode 100644 index 00000000..806ebe98 --- /dev/null +++ b/simgear/structure/SGPerfMon.cxx @@ -0,0 +1,130 @@ +// SGPerfMon.cxx -- Performance Monitoring +// +// Written by Thorsten Brehm, started November 2011. +// +// Copyright (C) 2011 Thorsten Brehm - brehmt (at) gmail 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., 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "SGPerfMon.hxx" +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +using std::string; + +SGPerformanceMonitor::SGPerformanceMonitor(SGSubsystemMgr* subSysMgr, SGPropertyNode_ptr root) : + _isEnabled(false), + _count(0) +{ + _root = root; + _subSysMgr = subSysMgr; +} + +void +SGPerformanceMonitor::bind(void) +{ + _statiticsSubsystems = _root->getChild("subsystems", 0, true); + _statisticsFlag = _root->getChild("enabled", 0, true); + _statisticsInterval = _root->getChild("interval-s", 0, true); +// _statiticsMinJitter = _root->getChild("min-jitter-ms", 0, true); +// _statiticsMinTime = _root->getChild("min-time-ms", 0, true); +} + +void +SGPerformanceMonitor::unbind(void) +{ + _statiticsSubsystems = 0; + _statisticsFlag = 0; + _statisticsInterval = 0; +// _statiticsMinJitter = 0; +// _statiticsMinTime = 0; +} + +void +SGPerformanceMonitor::init(void) +{ + +} + +void +SGPerformanceMonitor::update(double dt) +{ + if (_isEnabled != _statisticsFlag->getBoolValue()) + { + // flag has changed, update subsystem manager + _isEnabled = _statisticsFlag->getBoolValue(); + if (_isEnabled) + _subSysMgr->setReportTimingCb(this,&subSystemMgrHook); + else + _subSysMgr->setReportTimingCb(this,0); + } + + if (!_isEnabled) + return; + + if (_lastUpdate.elapsedMSec() > 1000 * _statisticsInterval->getDoubleValue()) + { + _count = 0; + // grab timing statistics + _subSysMgr->reportTiming(); + _lastUpdate.stamp(); + } +} + +/** Callback hooked into the subsystem manager. */ +void +SGPerformanceMonitor::subSystemMgrHook(void* userData, const std::string& name, SampleStatistic* timeStat) +{ + ((SGPerformanceMonitor*) userData)->reportTiming(name, timeStat); +} + +/** Grabs and exposes timing information to properties */ +void +SGPerformanceMonitor::reportTiming(const string& name, SampleStatistic* timeStat) +{ + SGPropertyNode* node = _statiticsSubsystems->getChild("subsystem",_count++,true); + + double minMs = timeStat->min() / 1000; + double maxMs = timeStat->max() / 1000; + double meanMs = timeStat->mean() / 1000; + double stdDevMs = timeStat->stdDev() / 1000; + double totalMs = timeStat->total() / 1000; + int samples = timeStat->samples(); + + node->setStringValue("name", name); + node->setDoubleValue("min-ms", minMs); + node->setDoubleValue("max-ms", maxMs); + node->setDoubleValue("mean-ms", meanMs); + node->setDoubleValue("stddev-ms", stdDevMs); + node->setDoubleValue("total-ms", totalMs); + node->setDoubleValue("count",samples); + + timeStat->reset(); +} diff --git a/simgear/structure/SGPerfMon.hxx b/simgear/structure/SGPerfMon.hxx new file mode 100644 index 00000000..d3009702 --- /dev/null +++ b/simgear/structure/SGPerfMon.hxx @@ -0,0 +1,64 @@ +// SGPerfMon.hxx -- Performance Tracing +// +// Written by Thorsten Brehm, started November 2011. +// +// Copyright (C) 2011 Thorsten Brehm - brehmt (at) gmail 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., 675 Mass Ave, Cambridge, MA 02139, USA. +// + +#ifndef __SGPERFMON_HXX +#define __SGPERFMON_HXX + +#include +#include +#include + +class SampleStatistic; + +/////////////////////////////////////////////////////////////////////////////// +// SG Performance Monitor //////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +class SGPerformanceMonitor : public SGSubsystem +{ + +public: + SGPerformanceMonitor(SGSubsystemMgr* subSysMgr, SGPropertyNode_ptr root); + + virtual void bind (void); + virtual void unbind (void); + virtual void init (void); + virtual void update (double dt); + +private: + static void subSystemMgrHook(void* userData, const std::string& name, SampleStatistic* timeStat); + + void reportTiming(const std::string& name, SampleStatistic* timeStat); + + SGTimeStamp _lastUpdate; + SGSubsystemMgr* _subSysMgr; + SGPropertyNode_ptr _root; + SGPropertyNode_ptr _statiticsSubsystems; + SGPropertyNode_ptr _statisticsFlag; + SGPropertyNode_ptr _statisticsInterval; +// SGPropertyNode_ptr _statiticsMinJitter; +// SGPropertyNode_ptr _statiticsMinTime; + + bool _isEnabled; + int _count; +}; + +#endif // __SGPERFMON_HXX diff --git a/simgear/structure/SGSmplhist.cxx b/simgear/structure/SGSmplhist.cxx index 73b3f553..760704b3 100644 --- a/simgear/structure/SGSmplhist.cxx +++ b/simgear/structure/SGSmplhist.cxx @@ -15,9 +15,11 @@ You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifdef __GNUG__ -#pragma implementation + +#ifdef HAVE_CONFIG_H +#include #endif + #include #include #include "SGSmplhist.hxx" @@ -94,7 +96,7 @@ int SampleHistogram::similarSamples (double d) return (0); } -void SampleHistogram::printBuckets (ostream & s) +void SampleHistogram::printBuckets (std::ostream & s) { for (int i = 0; i < howManyBuckets; i++) { diff --git a/simgear/structure/SGSmplhist.hxx b/simgear/structure/SGSmplhist.hxx index 36ddc502..67a9928c 100644 --- a/simgear/structure/SGSmplhist.hxx +++ b/simgear/structure/SGSmplhist.hxx @@ -16,13 +16,7 @@ License along with this library; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifdef HAVE_CONFIG_H -#include -#endif #ifndef SampleHistogram_h -#ifdef __GNUG__ -#pragma interface -#endif #define SampleHistogram_h 1 #include diff --git a/simgear/structure/SGSmplstat.cxx b/simgear/structure/SGSmplstat.cxx index 6c1afde7..3135cf0b 100644 --- a/simgear/structure/SGSmplstat.cxx +++ b/simgear/structure/SGSmplstat.cxx @@ -15,9 +15,6 @@ You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifdef __GNUG__ -#pragma implementation -#endif #include @@ -84,6 +81,7 @@ void SampleStatistic::operator += (double value) { n += 1; x += value; + allTimeTotal += value; x2 += (value * value); if (minValue > value) minValue = value; diff --git a/simgear/structure/SGSmplstat.hxx b/simgear/structure/SGSmplstat.hxx index 1d1e8d57..d8e29b3f 100644 --- a/simgear/structure/SGSmplstat.hxx +++ b/simgear/structure/SGSmplstat.hxx @@ -16,17 +16,13 @@ License along with this library; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef SampleStatistic_h -#ifdef __GNUG__ -#pragma interface -#endif + #define SampleStatistic_h 1 #undef min #undef max -using namespace std; - class SampleStatistic { protected: @@ -34,6 +30,7 @@ protected: double x; double x2; double minValue, maxValue; + double allTimeTotal; public: SampleStatistic (); inline virtual ~ SampleStatistic (); @@ -46,6 +43,7 @@ public: SampleStatistic (); double var () const; double min () const; double max () const; + double total () const; double confidence (int p_percentage) const; double confidence (double p_value) const; @@ -62,6 +60,7 @@ public: SampleStatistic (); inline SampleStatistic::SampleStatistic () { + allTimeTotal = 0; reset (); } inline int SampleStatistic::samples () const @@ -76,6 +75,10 @@ inline double SampleStatistic::max () const { return (maxValue); } +inline double SampleStatistic::total () const +{ + return (allTimeTotal); +} inline SampleStatistic::~SampleStatistic () { diff --git a/simgear/structure/subsystem_mgr.cxx b/simgear/structure/subsystem_mgr.cxx index a59d6ef0..6bd7b394 100644 --- a/simgear/structure/subsystem_mgr.cxx +++ b/simgear/structure/subsystem_mgr.cxx @@ -29,13 +29,16 @@ #include "subsystem_mgr.hxx" #include +#include "SGSmplstat.hxx" +const int SG_MAX_SUBSYSTEM_EXCEPTIONS = 4; -const int SG_MAX_SUBSYSTEM_EXCEPTIONS = 4; //////////////////////////////////////////////////////////////////////// // Implementation of SGSubsystem //////////////////////////////////////////////////////////////////////// +SGSubsystemTimingCb SGSubsystem::reportTimingCb = NULL; +void* SGSubsystem::reportTimingUserData = NULL; SGSubsystem::SGSubsystem () : _suspended(false) @@ -100,28 +103,6 @@ SGSubsystem::is_suspended () const return _suspended; } - -void -SGSubsystem::printTimingInformation () -{ - SGTimeStamp startTime; - for ( eventTimeVecIterator i = timingInfo.begin(); - i != timingInfo.end(); - ++i) { - if (i == timingInfo.begin()) { - startTime = i->getTime(); - } else { - SGTimeStamp endTime = i->getTime(); - SG_LOG(SG_GENERAL, SG_ALERT, "- Getting to timestamp : " - << i->getName() << " takes " << endTime - startTime - << " sec."); - startTime = endTime; - } - } -} - - - void SGSubsystem::stamp(const string& name) { timingInfo.push_back(TimingInfo(name, SGTimeStamp::now())); @@ -132,6 +113,30 @@ void SGSubsystem::stamp(const string& name) // Implementation of SGSubsystemGroup. //////////////////////////////////////////////////////////////////////// +class SGSubsystemGroup::Member +{ +private: + Member (const Member &member); +public: + Member (); + virtual ~Member (); + + virtual void update (double delta_time_sec); + + void reportTiming(void) { if (reportTimingCb) reportTimingCb(reportTimingUserData, name, &timeStat); } + void updateExecutionTime(double time) { timeStat += time;} + + SampleStatistic timeStat; + std::string name; + SGSubsystem * subsystem; + double min_step_sec; + double elapsed_sec; + bool collectTimeStats; + int exceptionCount; +}; + + + SGSubsystemGroup::SGSubsystemGroup () : _fixedUpdateTime(-1.0), _updateTimeRemainder(0.0) @@ -140,8 +145,6 @@ SGSubsystemGroup::SGSubsystemGroup () : SGSubsystemGroup::~SGSubsystemGroup () { - printTimingStatistics(); - // reverse order to prevent order dependency problems for (unsigned int i = _members.size(); i > 0; i--) { @@ -207,38 +210,31 @@ SGSubsystemGroup::update (double delta_time_sec) delta_time_sec = _fixedUpdateTime; } + SGTimeStamp timeStamp; while (loopCount-- > 0) { for (unsigned int i = 0; i < _members.size(); i++) { - SGTimeStamp timeStamp = SGTimeStamp::now(); - _members[i]->update(delta_time_sec); // indirect call - timeStamp = SGTimeStamp::now() - timeStamp; - double b = timeStamp.toUSecs(); - _members[i]->updateExecutionTime(b); - double threshold = _members[i]->getTimeWarningThreshold(); - if (( b > threshold ) && (b > 10000)) { - _members[i]->printTimingInformation(b); - } + bool recordTime = (reportTimingCb != NULL); + if (recordTime) + timeStamp = SGTimeStamp::now(); + + _members[i]->update(delta_time_sec); // indirect call + + if ((recordTime)&&(reportTimingCb)) + { + timeStamp = SGTimeStamp::now() - timeStamp; + _members[i]->updateExecutionTime(timeStamp.toUSecs()); + } } } // of multiple update loop } -void -SGSubsystemGroup::collectDebugTiming(bool collect) -{ - for (unsigned int i = 0; i < _members.size(); i++) - { - _members[i]->collectDebugTiming(collect); - } -} - -void -SGSubsystemGroup::printTimingStatistics(double minMaxTime,double minJitter) +void +SGSubsystemGroup::reportTiming(void) { for (unsigned int i = _members.size(); i > 0; i--) { - _members[i-1]->printTimingStatistics(minMaxTime, minJitter); - _members[i-1]->timeStat.reset(); + _members[i-1]->reportTiming(); } } @@ -301,35 +297,6 @@ SGSubsystemGroup::set_fixed_update_time(double dt) _fixedUpdateTime = dt; } -/** - * Print timing statistics. - * Only show data if jitter exceeds minJitter or - * maximum time exceeds minMaxTime. - */ -void -SGSubsystemGroup::Member::printTimingStatistics(double minMaxTime,double minJitter) -{ - if (collectTimeStats) { - double minTime = timeStat.min() / 1000; - double maxTime = timeStat.max() / 1000; - double meanTime = timeStat.mean() / 1000; - double stddev = timeStat.stdDev() / 1000; - - if ((maxTime - minTime >= minJitter)|| - (maxTime >= minMaxTime)) - { - char buffer[256]; - snprintf(buffer, 256, "Timing summary for %20s.\n" - "- mean time: %04.2f ms.\n" - "- min time : %04.2f ms.\n" - "- max time : %04.2f ms.\n" - "- stddev : %04.2f ms.\n", name.c_str(), meanTime, minTime, maxTime, stddev); - SG_LOG(SG_GENERAL, SG_ALERT, buffer); - } - } -} - - bool SGSubsystemGroup::has_subsystem (const string &name) const { @@ -364,7 +331,6 @@ SGSubsystemGroup::Member::Member () subsystem(0), min_step_sec(0), elapsed_sec(0), - collectTimeStats(false), exceptionCount(0) { } @@ -407,31 +373,6 @@ SGSubsystemGroup::Member::update (double delta_time_sec) } -void -SGSubsystemGroup::Member::printTimingInformation(double time) -{ - if (collectTimeStats) { - SG_LOG(SG_GENERAL, SG_ALERT, "Subsystem Timing Alert, subsystem \"" << name << "\": " << time/1000.0 << "ms"); - subsystem->printTimingInformation(); - } -} - -double SGSubsystemGroup::Member::getTimeWarningThreshold() -{ - return (timeStat.mean() + 3 * timeStat.stdDev()); -} - -void SGSubsystemGroup::Member::updateExecutionTime(double time) -{ - if (collectTimeStats) { - timeStat += time; - } -} - - - - - //////////////////////////////////////////////////////////////////////// // Implementation of SGSubsystemMgr. //////////////////////////////////////////////////////////////////////// @@ -508,14 +449,6 @@ SGSubsystemMgr::update (double delta_time_sec) } } -void -SGSubsystemMgr::collectDebugTiming(bool collect) -{ - for (int i = 0; i < MAX_GROUPS; i++) { - _groups[i]->collectDebugTiming(collect); - } -} - void SGSubsystemMgr::suspend () { @@ -590,11 +523,12 @@ SGSubsystemMgr::get_subsystem (const string &name) const return s->second; } +/** Trigger the timing callback to report data for all subsystems. */ void -SGSubsystemMgr::printTimingStatistics(double minMaxTime,double minJitter) +SGSubsystemMgr::reportTiming() { for (int i = 0; i < MAX_GROUPS; i++) { - _groups[i]->printTimingStatistics(minMaxTime, minJitter); + _groups[i]->reportTiming(); } // of groups iteration } diff --git a/simgear/structure/subsystem_mgr.hxx b/simgear/structure/subsystem_mgr.hxx index 60313fd4..f5f918f6 100644 --- a/simgear/structure/subsystem_mgr.hxx +++ b/simgear/structure/subsystem_mgr.hxx @@ -1,3 +1,4 @@ + // Written by David Megginson, started 2000-12 // // Copyright (C) 2000 David Megginson, david@megginson.com @@ -31,7 +32,6 @@ #include #include -#include "SGSmplstat.hxx" class TimingInfo @@ -48,9 +48,12 @@ public: const SGTimeStamp& getTime() const { return time; } }; +class SampleStatistic; + typedef std::vector eventTimeVec; typedef std::vector::iterator eventTimeVecIterator; +typedef void (*SGSubsystemTimingCb)(void* userData, const std::string& name, SampleStatistic* pStatistic); /** @@ -227,7 +230,7 @@ public: /** - * Suspend or resum operation of this subsystem. + * Suspend or resume operation of this subsystem. * * @param suspended true if the subsystem should be suspended, false * otherwise. @@ -253,43 +256,25 @@ public: */ virtual bool is_suspended () const; - /** - * Keep track of execution time. - * - *

This method keeps track of timing statistics for each subsystem.

- * - * @param time execution time in ms of last call. + * Trigger the callback to report timing information for all subsystems. */ - void updateExecutionTime(double time); - - /** - * Print details of execution time. - * - *

For debugging purposes, developers can place stamp() calls - * at strategic points in the update() function of each subsystem, which - * record the time between the successive calls to stamp. This method, - * printExecutionTime() is called after exectution of the subsystem - * update function itself to conduct a post-hoc analysis of excecution - * time

- */ - void printTimingInformation(); + void reportTiming(void); /** * Place time stamps at strategic points in the execution of subsystems * update() member functions. Predominantly for debugging purposes. */ void stamp(const std::string& name); - - protected: bool _suspended; eventTimeVec timingInfo; - //int test; + static SGSubsystemTimingCb reportTimingCb; + static void* reportTimingUserData; }; @@ -322,40 +307,16 @@ public: virtual void remove_subsystem (const std::string &name); virtual bool has_subsystem (const std::string &name) const; - void collectDebugTiming(bool collect); - void printTimingStatistics(double minMaxTime=0.0,double minJitter=0.0); + void reportTiming(void); /** - * + * */ void set_fixed_update_time(double fixed_dt); private: - class Member { - - private: - Member (const Member &member); - public: - Member (); - virtual ~Member (); - - virtual void update (double delta_time_sec); - void printTimingInformation(double time); - void printTimingStatistics(double minMaxTime=0.0,double minJitter=0.0); - void updateExecutionTime(double time); - double getTimeWarningThreshold(); - void collectDebugTiming (bool collect) { collectTimeStats = collect; }; - - SampleStatistic timeStat; - std::string name; - SGSubsystem * subsystem; - double min_step_sec; - double elapsed_sec; - bool collectTimeStats; - int exceptionCount; - }; - - Member * get_member (const std::string &name, bool create = false); + class Member; + Member* get_member (const std::string &name, bool create = false); std::vector _members; @@ -427,16 +388,15 @@ public: virtual SGSubsystem * get_subsystem(const std::string &name) const; - void collectDebugTiming(bool collect); - void printTimingStatistics(double minMaxTime=0.0,double minJitter=0.0); + void reportTiming(); + void setReportTimingCb(void* userData,SGSubsystemTimingCb cb) {reportTimingCb = cb;reportTimingUserData = userData;} private: SGSubsystemGroup* _groups[MAX_GROUPS]; - + typedef std::map SubsystemDict; SubsystemDict _subsystem_map; - };