X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fmodel%2Fmodellib.hxx;h=cdd6d820440a50f6c337d0c04f79f4b45b42b5fe;hb=32a6bd78d8bf143f40922f1a0bc7a88ea7706a7d;hp=73866f206fe5460b589bcb7a13e3ac758b338659;hpb=359a8c4a81323544180b7ccec3d6df45e4b4c8b8;p=simgear.git diff --git a/simgear/scene/model/modellib.hxx b/simgear/scene/model/modellib.hxx index 73866f20..cdd6d820 100644 --- a/simgear/scene/model/modellib.hxx +++ b/simgear/scene/model/modellib.hxx @@ -1,4 +1,19 @@ -// modellib.cxx - implement an SSG model library. +// 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 _SG_MODEL_LIB_HXX #define _SG_MODEL_LIB_HXX 1 @@ -9,41 +24,84 @@ #include // for SG_USING_STD -#include -#include STL_STRING +#include -#include +#include +#include -#include #include -#include "model.hxx" +#include -SG_USING_STD(map); -SG_USING_STD(string); +namespace osg { + class PagedLOD; +} +namespace simgear { + +class SGModelData; // defined below /** * Class for loading and managing models with XML wrappers. */ class SGModelLib { - public: + typedef osg::Node *(*panel_func)(SGPropertyNode *); + + static void init(const std::string &root_dir, SGPropertyNode* root); - SGModelLib (); - virtual ~SGModelLib (); - virtual void flush1(); + static void resetPropertyRoot(); + + static void setPanelFunc(panel_func pf); + + // Load a 3D model (any format) + // data->modelLoaded() will be called after the model is loaded + static osg::Node* loadModel(const std::string &path, + SGPropertyNode *prop_root = NULL, + SGModelData *data=0, bool load2DPanels=false); - virtual ssgEntity *load_model( const string &fg_root, - const string &path, - SGPropertyNode *prop_root, - double sim_time_sec, - bool cache_object, - SGModelData *data = 0 ); + // Load a 3D model (any format) through the DatabasePager. + // 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* 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 + // model will be loaded. When the viewer does no longer reference this + // node for a long time the node is unloaded again. + static osg::PagedLOD* loadPagedModel(const std::string &path, + SGPropertyNode *prop_root = NULL, + SGModelData *data=0); + + static std::string findDataFile(const std::string& file, + const osgDB::Options* opts = NULL, + SGPath currentDir = SGPath()); protected: + SGModelLib(); + ~SGModelLib (); + +private: + static SGPropertyNode_ptr static_propRoot; + static panel_func static_panelFunc; +}; - map > _table; + +/** + * Abstract class for adding data to the scene graph. modelLoaded() is + * called after the model was loaded, and the destructor when the branch + * is removed from the scene graph. + */ +class SGModelData : public osg::Referenced { +public: + virtual ~SGModelData() {} + virtual void modelLoaded(const std::string& path, SGPropertyNode *prop, + osg::Node* branch) = 0; + virtual SGModelData* clone() const = 0; }; +} #endif // _SG_MODEL_LIB_HXX