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