X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2Fmodelmgr.cxx;h=3478a68c5c9bf973a7fe8195c1abe64ad43ae5e2;hb=2ea50c63bbb95e143662de2f136c79898236e38d;hp=4359a70b5037740900ad531935c227f1b81547da;hpb=189896a7abea7b3498224be5a65c38b5b2688686;p=flightgear.git diff --git a/src/Model/modelmgr.cxx b/src/Model/modelmgr.cxx index 4359a70b5..3478a68c5 100644 --- a/src/Model/modelmgr.cxx +++ b/src/Model/modelmgr.cxx @@ -3,19 +3,25 @@ // // 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 #include -#include #include #include
@@ -24,15 +30,16 @@ #include "modelmgr.hxx" -SG_USING_STD(vector); +using std::vector; -extern SGShadowVolume *shadows; +using namespace simgear; +// OSGFIXME +// extern SGShadowVolume *shadows; FGModelMgr::FGModelMgr () : _models(fgGetNode("/models", true)), _listener(new Listener(this)) - { _models->addChangeListener(_listener); } @@ -44,7 +51,7 @@ FGModelMgr::~FGModelMgr () for (unsigned int i = 0; i < _instances.size(); i++) { globals->get_scenery()->get_scene_graph() - ->removeKid(_instances[i]->model->getSceneGraph()); + ->removeChild(_instances[i]->model->getSceneGraph()); delete _instances[i]; } } @@ -54,13 +61,8 @@ FGModelMgr::init () { vector model_nodes = _models->getChildren("model"); - for (unsigned int i = 0; i < model_nodes.size(); i++) { - try { + for (unsigned int i = 0; i < model_nodes.size(); i++) add_model(model_nodes[i]); - } catch (const sg_throwable& t) { - SG_LOG(SG_GENERAL, SG_ALERT, t.getFormattedMessage() << t.getOrigin()); - } - } } void @@ -72,17 +74,19 @@ FGModelMgr::add_model (SGPropertyNode * node) SGModelPlacement *model = new SGModelPlacement; instance->model = model; instance->node = node; - SGModelLib *model_lib = globals->get_model_lib(); - ssgBranch *object = (ssgBranch *)model_lib->load_model( - globals->get_fg_root(), - node->getStringValue("path", - "Models/Geometry/glider.ac"), - globals->get_props(), - globals->get_sim_time_sec(), /*cache_object=*/false); + + const char *path = node->getStringValue("path", "Models/Geometry/glider.ac"); + osg::Node *object; + + try { + object = SGModelLib::loadPagedModel(path, globals->get_props()); + } catch (const sg_throwable& t) { + SG_LOG(SG_GENERAL, SG_ALERT, "Error loading " << path << ":\n " + << t.getFormattedMessage() << t.getOrigin()); + return; + } model->init( object ); - if (shadows) - shadows->addOccluder((ssgBranch *)object, SGShadowVolume::occluderTypeTileObject); // Set position and orientation either // indirectly through property refs @@ -124,10 +128,7 @@ FGModelMgr::add_model (SGPropertyNode * node) model->setHeadingDeg(node->getDoubleValue("heading-deg")); // Add this model to the global scene graph - globals->get_scenery()->get_scene_graph()->addKid(model->getSceneGraph()); - - // Register that one at the scenery manager - globals->get_scenery()->register_placement_transform(model->getTransform()); + globals->get_scenery()->get_scene_graph()->addChild(model->getSceneGraph()); // Save this instance for updating @@ -144,31 +145,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(); - } + std::for_each(_instances.begin(), _instances.end(), UpdateFunctor()); } void @@ -190,14 +230,6 @@ FGModelMgr::remove_instance (Instance * instance) } } -void -FGModelMgr::draw () -{ -// ssgSetNearFar(_nearplane, _farplane); -// ssgCullAndDraw(_scene); -} - - //////////////////////////////////////////////////////////////////////// // Implementation of FGModelMgr::Instance @@ -211,15 +243,13 @@ FGModelMgr::Instance::Instance () elev_ft_node(0), roll_deg_node(0), pitch_deg_node(0), - heading_deg_node(0) + heading_deg_node(0), + shadow(false) { } FGModelMgr::Instance::~Instance () { - // Unregister that one at the scenery manager - globals->get_scenery()->unregister_placement_transform(model->getTransform()); - delete model; } @@ -235,11 +265,7 @@ FGModelMgr::Listener::childAdded(SGPropertyNode * parent, SGPropertyNode * child if (strcmp(parent->getName(), "model") || strcmp(child->getName(), "load")) return; - try { - _mgr->add_model(parent); - } catch (const sg_throwable& t) { - SG_LOG(SG_GENERAL, SG_ALERT, t.getFormattedMessage() << t.getOrigin()); - } + _mgr->add_model(parent); } void @@ -258,10 +284,11 @@ FGModelMgr::Listener::childRemoved(SGPropertyNode * parent, SGPropertyNode * chi continue; _mgr->_instances.erase(it); - ssgBranch *branch = (ssgBranch *)instance->model->getSceneGraph(); - if (shadows) - shadows->deleteOccluder(branch); - globals->get_scenery()->get_scene_graph()->removeKid(branch); + osg::Node *branch = instance->model->getSceneGraph(); + // OSGFIXME +// if (shadows && instance->shadow) +// shadows->deleteOccluder(branch); + globals->get_scenery()->get_scene_graph()->removeChild(branch); delete instance; break;