X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fmodel%2Fmodellib.cxx;h=af72e363d65d7a02e25dbad561b6ccf04b120d66;hb=5a96b283f63cfacd3a3a90a82246defb038242d3;hp=4b457f5e48bc2aeece69d10e7e44acbfb07bd882;hpb=1f37095087fa7aa3d210ba134058b86c3bd6d69e;p=simgear.git diff --git a/simgear/scene/model/modellib.cxx b/simgear/scene/model/modellib.cxx index 4b457f5e..af72e363 100644 --- a/simgear/scene/model/modellib.cxx +++ b/simgear/scene/model/modellib.cxx @@ -21,6 +21,8 @@ #include +#include +#include #include #include #include @@ -30,28 +32,51 @@ #include #include #include +#include +#include -#include "SGPagedLOD.hxx" #include "SGReaderWriterXML.hxx" -#include "SGReaderWriterXMLOptions.hxx" #include "modellib.hxx" #include - +using std::string; using namespace simgear; osgDB::RegisterReaderWriterProxy g_readerWriter_XML_Proxy; ModelRegistryCallbackProxy g_xmlCallbackProxy("xml"); - +SGPropertyNode_ptr SGModelLib::static_propRoot; +SGModelLib::panel_func SGModelLib::static_panelFunc = NULL; + //////////////////////////////////////////////////////////////////////// // Implementation of SGModelLib. //////////////////////////////////////////////////////////////////////// -void SGModelLib::init(const string &root_dir) +void SGModelLib::init(const string &root_dir, SGPropertyNode* root) { osgDB::Registry::instance()->getDataFilePathList().push_front(root_dir); + static_propRoot = root; +} + +void SGModelLib::setPanelFunc(panel_func pf) +{ + static_panelFunc = pf; +} + +std::string SGModelLib::findDataFile(const std::string& file, + const osgDB::Options* opts, + SGPath currentPath) +{ + if (file.empty()) + return file; + SGPath p = ResourceManager::instance()->findPath(file, currentPath); + if (p.exists()) { + return p.str(); + } + + // finally hand on to standard OSG behaviour + return osgDB::findDataFile(file, opts); } SGModelLib::SGModelLib() @@ -64,19 +89,16 @@ SGModelLib::~SGModelLib() namespace { -osg::Node* loadFile(const string& path, osgDB::ReaderWriter::Options* options) +osg::Node* loadFile(const string& path, SGReaderWriterOptions* 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(); } } @@ -84,11 +106,18 @@ osg::Node* loadFile(const string& path, osgDB::ReaderWriter::Options* options) osg::Node* SGModelLib::loadModel(const string &path, SGPropertyNode *prop_root, - SGModelData *data) + SGModelData *data, + bool load2DPanels) { - osg::ref_ptr opt = new SGReaderWriterXMLOptions(*(osgDB::Registry::instance()->getOptions())); - opt->setPropRoot(prop_root); + osg::ref_ptr opt; + opt = SGReaderWriterOptions::copyOrCreate(osgDB::Registry::instance()->getOptions()); + opt->setPropertyNode(prop_root ? prop_root: static_propRoot.get()); opt->setModelData(data); + + if (load2DPanels) { + opt->setLoadPanel(static_panelFunc); + } + osg::Node *n = loadFile(path, opt.get()); if (n && n->getName().empty()) n->setName("Direct loaded model \"" + path + "\""); @@ -97,30 +126,50 @@ SGModelLib::loadModel(const string &path, } osg::Node* -SGModelLib::loadModel(const string &path, - SGPropertyNode *prop_root, - panel_func pf) +SGModelLib::loadDeferredModel(const string &path, SGPropertyNode *prop_root, + SGModelData *data) { - osg::ref_ptr opt = new SGReaderWriterXMLOptions(*(osgDB::Registry::instance()->getOptions())); - opt->setPropRoot(prop_root); - opt->setLoadPanel(pf); - return loadFile(path, opt.get()); + osg::ProxyNode* proxyNode = new osg::ProxyNode; + proxyNode->setLoadingExternalReferenceMode(osg::ProxyNode::DEFER_LOADING_TO_DATABASE_PAGER); + proxyNode->setFileName(0, path); + + osg::ref_ptr opt; + opt = SGReaderWriterOptions::copyOrCreate(osgDB::Registry::instance()->getOptions()); + opt->setPropertyNode(prop_root ? prop_root: static_propRoot.get()); + opt->setModelData(data); + opt->setLoadPanel(static_panelFunc); + if (SGPath(path).lower_extension() == "ac") + opt->setInstantiateEffects(true); + if (!prop_root || prop_root->getBoolValue("/sim/rendering/cache", true)) + opt->setObjectCacheHint(osgDB::Options::CACHE_ALL); + else + opt->setObjectCacheHint(osgDB::Options::CACHE_NONE); + proxyNode->setDatabaseOptions(opt.get()); + + return proxyNode; } osg::Node* -SGModelLib::loadPagedModel(const string &path, - SGPropertyNode *prop_root, +SGModelLib::loadPagedModel(const string &path, SGPropertyNode *prop_root, SGModelData *data) { - SGPagedLOD *plod = new SGPagedLOD; + osg::PagedLOD *plod = new osg::PagedLOD; plod->setName("Paged LOD for \"" + 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())); - opt->setPropRoot(prop_root); + osg::ref_ptr opt; + opt = SGReaderWriterOptions::copyOrCreate(osgDB::Registry::instance()->getOptions()); + opt->setPropertyNode(prop_root ? prop_root: static_propRoot.get()); opt->setModelData(data); - plod->setReaderWriterOptions(opt.get()); + opt->setLoadPanel(static_panelFunc); + if (SGPath(path).lower_extension() == "ac") + opt->setInstantiateEffects(true); + if (!prop_root || prop_root->getBoolValue("/sim/rendering/cache", true)) + opt->setObjectCacheHint(osgDB::Options::CACHE_ALL); + else + opt->setObjectCacheHint(osgDB::Options::CACHE_NONE); + plod->setDatabaseOptions(opt.get()); return plod; }