- vector<SGPropertyNode_ptr> model_nodes =
- fgGetNode("/models", true)->getChildren("model");
- for (unsigned int i = 0; i < model_nodes.size(); i++) {
- SGPropertyNode * node = model_nodes[i];
- SG_LOG(SG_GENERAL, SG_INFO,
- "Adding model " << node->getStringValue("name", "[unnamed]"));
- Instance * instance = new Instance;
- FG3DModel * model = new FG3DModel;
- instance->model = model;
- model->init(node->getStringValue("path", "Models/Geometry/glider.ac"));
-
- // Set position and orientation either
- // indirectly through property refs
- // or directly with static values.
- SGPropertyNode * child = node->getChild("longitude-deg-prop");
- if (child != 0)
- instance->lon_deg_node = fgGetNode(child->getStringValue(), true);
- else
- model->setLongitudeDeg(node->getDoubleValue("longitude-deg"));
-
- child = node->getChild("latitude-deg-prop");
- if (child != 0)
- instance->lat_deg_node = fgGetNode(child->getStringValue(), true);
- else
- model->setLatitudeDeg(node->getDoubleValue("latitude-deg"));
-
- child = node->getChild("elevation-ft-prop");
- if (child != 0)
- instance->elev_ft_node = fgGetNode(child->getStringValue(), true);
- else
- model->setElevationFt(node->getDoubleValue("elevation-ft"));
-
- child = node->getChild("roll-deg-prop");
- if (child != 0)
- instance->roll_deg_node = fgGetNode(child->getStringValue(), true);
- else
- model->setRollDeg(node->getDoubleValue("roll-deg"));
-
- child = node->getChild("pitch-deg-prop");
- if (child != 0)
- instance->pitch_deg_node = fgGetNode(child->getStringValue(), true);
- else
- model->setPitchDeg(node->getDoubleValue("pitch-deg"));
-
- child = node->getChild("heading-deg-prop");
- if (child != 0)
- instance->heading_deg_node = fgGetNode(child->getStringValue(), true);
- else
- model->setHeadingDeg(node->getDoubleValue("heading-deg"));
-
- // Add this model to the global scene graph
- globals->get_scenery()->get_scene_graph()->addKid(model->getSceneGraph());
-
- // Save this instance for updating
- _instances.push_back(instance);
+ vector<SGPropertyNode_ptr> model_nodes = _models->getChildren("model");
+
+ for (unsigned int i = 0; i < model_nodes.size(); i++)
+ add_model(model_nodes[i]);
+}
+
+void
+FGModelMgr::add_model (SGPropertyNode * node)
+{
+ SG_LOG(SG_AIRCRAFT, SG_INFO,
+ "Adding model " << node->getStringValue("name", "[unnamed]"));
+
+ const char *model_path = node->getStringValue("path", "Models/Geometry/glider.ac");
+ osg::Node *object;
+
+ try {
+ std::string fullPath = simgear::SGModelLib::findDataFile(model_path);
+ object = SGModelLib::loadDeferredModel(fullPath, globals->get_props());
+ } catch (const sg_throwable& t) {
+ SG_LOG(SG_AIRCRAFT, SG_ALERT, "Error loading " << model_path << ":\n "
+ << t.getFormattedMessage() << t.getOrigin());
+ return;