]> git.mxchange.org Git - flightgear.git/blob - src/Model/modelmgr.cxx
90fd78cc229aa04f76a07b4046062226b449d1ef
[flightgear.git] / src / Model / modelmgr.cxx
1 // modelmgr.cxx - manage a collection of 3D models.
2 // Written by David Megginson, started 2002.
3 //
4 // This file is in the Public Domain, and comes with no warranty.
5
6 #include "modelmgr.hxx"
7
8 #include <Main/fg_props.hxx>
9
10
11 FGModelMgr::FGModelMgr ()
12   : _scene(new ssgRoot),
13     _nearplane(0.5f),
14     _farplane(120000.0f)
15 {
16 }
17
18 FGModelMgr::~FGModelMgr ()
19 {
20   for (int i = 0; i < _instances.size(); i++) {
21     delete _instances[i];
22   }
23   delete _scene;
24 }
25
26 void
27 FGModelMgr::init ()
28 {
29   vector<SGPropertyNode *> model_nodes =
30     fgGetNode("/models", true)->getChildren("model");
31   for (int i = 0; i < model_nodes.size(); i++) {
32     SGPropertyNode * node = model_nodes[i];
33     SG_LOG(SG_GENERAL, SG_INFO,
34            "Adding model " << node->getStringValue("name", "[unnamed]"));
35     Instance * instance = new Instance;
36     FG3DModel * model = new FG3DModel;
37     instance->model = model;
38     model->init(node->getStringValue("path", "Models/Geometry/glider.ac"));
39
40                                 // Set position and orientation either
41                                 // indirectly through property refs
42                                 // or directly with static values.
43     SGPropertyNode * child = node->getChild("longitude-deg-prop");
44     if (child != 0)
45       instance->lon_deg_node = fgGetNode(child->getStringValue(), true);
46     else
47       model->setLongitudeDeg(node->getDoubleValue("longitude-deg"));
48
49     child = node->getChild("latitude-deg-prop");
50     if (child != 0)
51       instance->lat_deg_node = fgGetNode(child->getStringValue(), true);
52     else
53       model->setLatitudeDeg(node->getDoubleValue("latitude-deg"));
54
55     child = node->getChild("elevation-ft-prop");
56     if (child != 0)
57       instance->elev_ft_node = fgGetNode(child->getStringValue(), true);
58     else
59       model->setElevationFt(node->getDoubleValue("elevation-ft"));
60
61     child = node->getChild("roll-deg-prop");
62     if (child != 0)
63       instance->roll_deg_node = fgGetNode(child->getStringValue(), true);
64     else
65       model->setRollDeg(node->getDoubleValue("roll-deg"));
66
67     child = node->getChild("pitch-deg-prop");
68     if (child != 0)
69       instance->pitch_deg_node = fgGetNode(child->getStringValue(), true);
70     else
71       model->setPitchDeg(node->getDoubleValue("pitch-deg"));
72
73     child = node->getChild("heading-deg-prop");
74     if (child != 0)
75       instance->heading_deg_node = fgGetNode(child->getStringValue(), true);
76     else
77       model->setHeadingDeg(node->getDoubleValue("heading-deg"));
78
79                                 // Add this model to the scene graph
80     _scene->addKid(model->getSceneGraph());
81
82                                 // Save this instance for updating
83     _instances.push_back(instance);
84   }
85 }
86
87 void
88 FGModelMgr::bind ()
89 {
90 }
91
92 void
93 FGModelMgr::unbind ()
94 {
95 }
96
97 void
98 FGModelMgr::update (int dt)
99 {
100   for (int i = 0; i < _instances.size(); i++) {
101     Instance * instance = _instances[i];
102     FG3DModel * model = instance->model;
103
104                                 // Optionally set position from properties
105     if (instance->lon_deg_node != 0)
106       model->setLongitudeDeg(instance->lon_deg_node->getDoubleValue());
107     if (instance->lat_deg_node != 0)
108       model->setLatitudeDeg(instance->lat_deg_node->getDoubleValue());
109     if (instance->elev_ft_node != 0)
110       model->setElevationFt(instance->elev_ft_node->getDoubleValue());
111
112                                 // Optionally set orientation from properties
113     if (instance->roll_deg_node != 0)
114       model->setRollDeg(instance->roll_deg_node->getDoubleValue());
115     if (instance->pitch_deg_node != 0)
116       model->setPitchDeg(instance->pitch_deg_node->getDoubleValue());
117     if (instance->heading_deg_node != 0)
118       model->setHeadingDeg(instance->heading_deg_node->getDoubleValue());
119
120     instance->model->update(dt);
121   }
122 }
123
124 void
125 FGModelMgr::draw ()
126 {
127   ssgSetNearFar(_nearplane, _farplane);
128   ssgCullAndDraw(_scene);
129 }
130
131
132 \f
133 ////////////////////////////////////////////////////////////////////////
134 // Implementation of FGModelMgr::Instance
135 ////////////////////////////////////////////////////////////////////////
136
137 FGModelMgr::Instance::Instance ()
138   : model(0),
139     lon_deg_node(0),
140     lat_deg_node(0),
141     elev_ft_node(0),
142     roll_deg_node(0),
143     pitch_deg_node(0),
144     heading_deg_node(0)
145 {
146 }
147
148 FGModelMgr::Instance::~Instance ()
149 {
150   delete model;
151 }
152
153 // end of modelmgr.cxx