X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2Fmodelmgr.cxx;h=139cf2d4f2441eb00e5c7fff7a1694d5c0abd32c;hb=9ab41ea15809c02ba46bf9e6911fbb1aa808b8b1;hp=0ec617b0b4b9486976681f82292b7346613c50d8;hpb=8380fb4463fee4260499960fd68fd076830c38a6;p=flightgear.git diff --git a/src/Model/modelmgr.cxx b/src/Model/modelmgr.cxx index 0ec617b0b..139cf2d4f 100644 --- a/src/Model/modelmgr.cxx +++ b/src/Model/modelmgr.cxx @@ -3,13 +3,22 @@ // // This file is in the Public Domain, and comes with no warranty. +#ifdef _MSC_VER +# pragma warning( disable: 4355 ) +#endif + #ifdef HAVE_CONFIG_H # include #endif #include +#include +#include #include +#include + +#include #include #include @@ -21,12 +30,13 @@ #include "modelmgr.hxx" -SG_USING_STD(vector); +using std::vector; + +using namespace simgear; // OSGFIXME // extern SGShadowVolume *shadows; - FGModelMgr::FGModelMgr () : _models(fgGetNode("/models", true)), _listener(new Listener(this)) @@ -60,26 +70,22 @@ FGModelMgr::add_model (SGPropertyNode * node) { SG_LOG(SG_GENERAL, SG_INFO, "Adding model " << node->getStringValue("name", "[unnamed]")); - Instance * instance = new Instance; - SGModelPlacement *model = new SGModelPlacement; - instance->model = model; - instance->node = node; - SGModelLib *model_lib = globals->get_model_lib(); const char *path = node->getStringValue("path", "Models/Geometry/glider.ac"); osg::Node *object; try { - object = model_lib->load_model( - globals->get_fg_root(), - path, - globals->get_props(), - globals->get_sim_time_sec(), /*cache_object=*/false); + object = SGModelLib::loadDeferredModel(path, globals->get_props()); } catch (const sg_throwable& t) { SG_LOG(SG_GENERAL, SG_ALERT, "Error loading " << path << ":\n " << t.getFormattedMessage() << t.getOrigin()); return; } + + Instance * instance = new Instance; + SGModelPlacement *model = new SGModelPlacement; + instance->model = model; + instance->node = node; model->init( object ); @@ -140,38 +146,70 @@ FGModelMgr::unbind () { } +namespace +{ +double testNan(double val) throw (sg_range_exception) +{ + if (osg::isNaN(val)) + throw sg_range_exception("value is nan"); + return val; +} + +struct UpdateFunctor : public std::unary_function +{ + void operator()(FGModelMgr::Instance* instance) const + { + SGModelPlacement* model = instance->model; + double lon, lat, elev, roll, pitch, heading; + + try { + // Optionally set position from properties + if (instance->lon_deg_node != 0) + lon = testNan(instance->lon_deg_node->getDoubleValue()); + if (instance->lat_deg_node != 0) + lat = testNan(instance->lat_deg_node->getDoubleValue()); + if (instance->elev_ft_node != 0) + elev = testNan(instance->elev_ft_node->getDoubleValue()); + + // Optionally set orientation from properties + if (instance->roll_deg_node != 0) + roll = testNan(instance->roll_deg_node->getDoubleValue()); + if (instance->pitch_deg_node != 0) + pitch = testNan(instance->pitch_deg_node->getDoubleValue()); + if (instance->heading_deg_node != 0) + heading = testNan(instance->heading_deg_node->getDoubleValue()); + } catch (const sg_range_exception&) { + const char *path = instance->node->getStringValue("path", + "unknown"); + SG_LOG(SG_GENERAL, SG_INFO, "Instance of model " << path + << " has invalid values"); + return; + } + // Optionally set position from properties + if (instance->lon_deg_node != 0) + model->setLongitudeDeg(lon); + if (instance->lat_deg_node != 0) + model->setLatitudeDeg(lat); + if (instance->elev_ft_node != 0) + model->setElevationFt(elev); + + // Optionally set orientation from properties + if (instance->roll_deg_node != 0) + model->setRollDeg(roll); + if (instance->pitch_deg_node != 0) + model->setPitchDeg(pitch); + if (instance->heading_deg_node != 0) + model->setHeadingDeg(heading); + + instance->model->update(); + } +}; +} + void FGModelMgr::update (double dt) { - for (unsigned int i = 0; i < _instances.size(); i++) { - Instance * instance = _instances[i]; - SGModelPlacement * model = instance->model; - - // Optionally set position from properties - if (instance->lon_deg_node != 0) - model->setLongitudeDeg(instance->lon_deg_node->getDoubleValue()); - if (instance->lat_deg_node != 0) - model->setLatitudeDeg(instance->lat_deg_node->getDoubleValue()); - if (instance->elev_ft_node != 0) - model->setElevationFt(instance->elev_ft_node->getDoubleValue()); - - // Optionally set orientation from properties - if (instance->roll_deg_node != 0) - model->setRollDeg(instance->roll_deg_node->getDoubleValue()); - if (instance->pitch_deg_node != 0) - model->setPitchDeg(instance->pitch_deg_node->getDoubleValue()); - if (instance->heading_deg_node != 0) - model->setHeadingDeg(instance->heading_deg_node->getDoubleValue()); - - instance->model->update(); - - // OSGFIXME -// if (shadows && !instance->shadow) { -// osg::Node *branch = instance->model->getSceneGraph(); -// shadows->addOccluder(branch, SGShadowVolume::occluderTypeTileObject); -// instance->shadow = true; -// } - } + std::for_each(_instances.begin(), _instances.end(), UpdateFunctor()); } void