diff --git a/simgear/scene/model/ModelRegistry.cxx b/simgear/scene/model/ModelRegistry.cxx index 82f1a1c7..a4fb94c9 100644 --- a/simgear/scene/model/ModelRegistry.cxx +++ b/simgear/scene/model/ModelRegistry.cxx @@ -55,6 +55,8 @@ #include #include "BoundingVolumeBuildVisitor.hxx" +#include "model.hxx" +#include "SGReaderWriterXMLOptions.hxx" using namespace std; using namespace osg; @@ -384,7 +386,7 @@ public: static SGReadCallbackInstaller readCallbackInstaller; -// we get optimal geometry from the loader. +// we get optimal geometry from the loader (Hah!). struct ACOptimizePolicy : public OptimizeModelPolicy { ACOptimizePolicy(const string& extension) : OptimizeModelPolicy(extension) @@ -408,6 +410,10 @@ struct ACOptimizePolicy : public OptimizeModelPolicy { && group->getNumChildren() == 1) optimized = static_cast(group->getChild(0)); } + const SGReaderWriterXMLOptions* sgopt + = dynamic_cast(opt); + if (sgopt && sgopt->getInstantiateEffects()) + optimized = instantiateEffects(optimized.get(), sgopt); return optimized.release(); } }; diff --git a/simgear/scene/model/SGReaderWriterXMLOptions.hxx b/simgear/scene/model/SGReaderWriterXMLOptions.hxx index cca34824..674a5590 100644 --- a/simgear/scene/model/SGReaderWriterXMLOptions.hxx +++ b/simgear/scene/model/SGReaderWriterXMLOptions.hxx @@ -34,30 +34,38 @@ public: typedef osg::Node *(*panel_func)(SGPropertyNode *); SGReaderWriterXMLOptions(): - osgDB::ReaderWriter::Options(), - _prop_root(0), - _load_panel(0), - _model_data(0) {} + 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) {} + 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) {} + 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) {} + osgDB::ReaderWriter::Options(options, copyop), + _prop_root(0), + _load_panel(0), + _model_data(0), + _instantiateEffects(false) + {} SGPropertyNode *getPropRoot() const { return _prop_root; @@ -68,6 +76,10 @@ public: SGModelData *getModelData() const { return _model_data.get(); } + bool getInstantiateEffects() const + { + return _instantiateEffects; + } void setPropRoot(SGPropertyNode *p) { _prop_root=p; @@ -78,13 +90,19 @@ public: 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; }; } diff --git a/simgear/scene/model/modellib.cxx b/simgear/scene/model/modellib.cxx index 9e1acbe2..b47c57fd 100644 --- a/simgear/scene/model/modellib.cxx +++ b/simgear/scene/model/modellib.cxx @@ -95,19 +95,16 @@ SGModelLib::~SGModelLib() namespace { -osg::Node* loadFile(const string& path, osgDB::ReaderWriter::Options* options) +osg::Node* loadFile(const string& path, SGReaderWriterXMLOptions* options) { using namespace osg; using namespace osgDB; + if (boost::iends_with(path, ".ac")) + options->setInstantiateEffects(true); ref_ptr model = readRefNodeFile(path, options); if (!model) return 0; - if (boost::iends_with(path, ".ac")) { - ref_ptr sgOptions; - if (options) - sgOptions = new SGReaderWriterXMLOptions(*options); - model = instantiateEffects(model.get(), sgOptions.get()); - } + else return model.release(); } } @@ -130,8 +127,7 @@ SGModelLib::loadModel(const string &path, } osg::Node* -SGModelLib::loadPagedModel(const string &path, - SGPropertyNode *prop_root, +SGModelLib::loadPagedModel(const string &path, SGPropertyNode *prop_root, SGModelData *data) { SGPagedLOD *plod = new SGPagedLOD; @@ -139,11 +135,14 @@ SGModelLib::loadPagedModel(const string &path, plod->setFileName(0, path); plod->setRange(0, 0.0, 50.0*SG_NM_TO_METER); - osg::ref_ptr opt = new SGReaderWriterXMLOptions(*(osgDB::Registry::instance()->getOptions())); + osg::ref_ptr opt + = new SGReaderWriterXMLOptions(*(osgDB::Registry::instance() + ->getOptions())); opt->setPropRoot(prop_root ? prop_root: static_propRoot.get()); opt->setModelData(data); opt->setLoadPanel(static_panelFunc); - + if (boost::iends_with(path, ".ac")) + opt->setInstantiateEffects(true); plod->setReaderWriterOptions(opt.get()); return plod; }