]> git.mxchange.org Git - simgear.git/blob - simgear/scene/model/modellib.hxx
Add preliminary spot light animation
[simgear.git] / simgear / scene / model / modellib.hxx
1 // Copyright (C) 2008 Till Busch buti@bux.at
2 //
3 // This program is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU General Public License as
5 // published by the Free Software Foundation; either version 2 of the
6 // License, or (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful, but
9 // WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
16 //
17
18 #ifndef _SG_MODEL_LIB_HXX
19 #define _SG_MODEL_LIB_HXX 1
20
21 #ifndef __cplusplus
22 # error This library requires C++
23 #endif
24
25 #include <simgear/compiler.h>   // for SG_USING_STD
26
27 #include <string>
28
29 #include <osg/Node>
30 #include <osgDB/ReaderWriter>
31
32 #include <simgear/props/props.hxx>
33 #include <simgear/misc/sg_path.hxx>
34
35 namespace simgear {
36
37 class SGModelData; // defined below
38
39 /**
40  * Class for loading and managing models with XML wrappers.
41  */
42 class SGModelLib
43 {
44 public:
45     typedef osg::Node *(*panel_func)(SGPropertyNode *);
46
47     static void init(const std::string &root_dir, SGPropertyNode* root);
48
49     static void setPanelFunc(panel_func pf);
50     
51     // Load a 3D model (any format)
52     // data->modelLoaded() will be called after the model is loaded
53     static osg::Node* loadModel(const std::string &path,
54                                 SGPropertyNode *prop_root = NULL,
55                                 SGModelData *data=0, bool load2DPanels=false);
56
57     // Load a 3D model (any format) through the DatabasePager.
58     // This function initially just returns a proxy node that refers to
59     // the model file. Once the viewer steps onto that node the
60     // model will be loaded.
61     static osg::Node* loadDeferredModel(const std::string &path,
62                                         SGPropertyNode *prop_root = NULL,
63                                         SGModelData *data=0);
64     // Load a 3D model (any format) through the DatabasePager.
65     // This function initially just returns a PagedLOD node that refers to
66     // the model file. Once the viewer steps onto that node the
67     // model will be loaded. When the viewer does no longer reference this
68     // node for a long time the node is unloaded again.
69     static osg::Node* loadPagedModel(const std::string &path,
70                                      SGPropertyNode *prop_root = NULL,
71                                      SGModelData *data=0);
72
73     static std::string findDataFile(const std::string& file, 
74       const osgDB::Options* opts = NULL,
75       SGPath currentDir = SGPath()); 
76 protected:
77     SGModelLib();
78     ~SGModelLib ();
79     
80 private:
81   static SGPropertyNode_ptr static_propRoot;
82   static panel_func static_panelFunc;
83 };
84
85
86 /**
87  * Abstract class for adding data to the scene graph.  modelLoaded() is
88  * called after the model was loaded, and the destructor when the branch
89  * is removed from the scene graph.
90  */
91 class SGModelData : public osg::Referenced {
92 public:
93     virtual ~SGModelData() {}
94     virtual void modelLoaded(const std::string& path, SGPropertyNode *prop,
95                              osg::Node* branch) = 0;
96 };
97
98 }
99
100 #endif // _SG_MODEL_LIB_HXX