XML.
class FGATCDisplay;
class FGAIMgr;
class FGAircraftModel;
+class FGModelMgr;
/**
FGAircraftModel *acmodel;
+ FGModelMgr * model_mgr;
+
// list of serial port-like configurations
string_list *channel_options_list;
acmodel = model;
}
+ inline FGModelMgr *get_model_mgr () { return model_mgr; }
+
+ inline void set_model_mgr (FGModelMgr * mgr)
+ {
+ model_mgr = mgr;
+ }
+
inline string_list *get_channel_options_list () {
return channel_options_list;
}
#include <FDM/UIUCModel/uiuc_aircraftdir.h>
#include <GUI/gui.h>
#include <Model/acmodel.hxx>
+#include <Model/modelmgr.hxx>
#ifdef FG_NETWORK_OLK
#include <NetworkOLK/network.h>
#endif
thesky->postDraw( cur_fdm_state->get_Altitude() * SG_FEET_TO_METER );
+ globals->get_model_mgr()->draw();
globals->get_aircraft_model()->draw();
// need to do this here as hud_and_panel state is static to
thesky->postDraw( cur_fdm_state->get_Altitude() * SG_FEET_TO_METER );
}
+ globals->get_model_mgr()->draw();
globals->get_aircraft_model()->draw();
// display HUD && Panel
}
+ globals->get_model_mgr()->update(multi_loop);
globals->get_aircraft_model()->update(multi_loop);
// update the view angle
SGPath modelpath( globals->get_fg_root() );
ssgModelPath( (char *)modelpath.c_str() );
+ ////////////////////////////////////////////////////////////////////
+ // Initialize the general model subsystem.
+ ////////////////////////////////////////////////////////////////////
+
+ globals->set_model_mgr(new FGModelMgr);
+ globals->get_model_mgr()->init();
+ globals->get_model_mgr()->bind();
+
////////////////////////////////////////////////////////////////////
// Initialize the 3D aircraft model subsystem.
////////////////////////////////////////////////////////////////////
noinst_LIBRARIES = libModel.a
libModel_a_SOURCES = model.cxx model.hxx \
+ modelmgr.cxx modelmgr.hxx \
acmodel.cxx acmodel.hxx
if OLD_AUTOMAKE
_selector->select(visible);
}
+void
+FG3DModel::setLongitudeDeg (double lon_deg)
+{
+ _lon_deg = lon_deg;
+}
+
+void
+FG3DModel::setLatitudeDeg (double lat_deg)
+{
+ _lat_deg = lat_deg;
+}
+
+void
+FG3DModel::setElevationFt (double elev_ft)
+{
+ _elev_ft = elev_ft;
+}
+
void
FG3DModel::setPosition (double lon_deg, double lat_deg, double elev_ft)
{
_elev_ft = elev_ft;
}
+void
+FG3DModel::setRollDeg (double roll_deg)
+{
+ _roll_deg = roll_deg;
+}
+
+void
+FG3DModel::setPitchDeg (double pitch_deg)
+{
+ _pitch_deg = pitch_deg;
+}
+
+void
+FG3DModel::setHeadingDeg (double heading_deg)
+{
+ _heading_deg = heading_deg;
+}
+
void
FG3DModel::setOrientation (double roll_deg, double pitch_deg,
double heading_deg)
virtual double getLatitudeDeg () const { return _lat_deg; }
virtual double getElevationFt () const { return _elev_ft; }
+ virtual void setLongitudeDeg (double lon_deg);
+ virtual void setLatitudeDeg (double lat_deg);
+ virtual void setElevationFt (double elev_ft);
virtual void setPosition (double lon_deg, double lat_deg, double elev_ft);
- virtual double getRoll () const { return _roll_deg; }
- virtual double getPitch () const { return _pitch_deg; }
- virtual double getHeading () const { return _heading_deg; }
+ virtual double getRollDeg () const { return _roll_deg; }
+ virtual double getPitchDeg () const { return _pitch_deg; }
+ virtual double getHeadingDeg () const { return _heading_deg; }
+ virtual void setRollDeg (double roll_deg);
+ virtual void setPitchDeg (double pitch_deg);
+ virtual void setHeadingDeg (double heading_deg);
virtual void setOrientation (double roll_deg, double pitch_deg,
double heading_deg);
--- /dev/null
+// modelmgr.cxx - manage a collection of 3D models.
+// Written by David Megginson, started 2002.
+//
+// This file is in the Public Domain, and comes with no warranty.
+
+#include "modelmgr.hxx"
+
+#include <Main/fg_props.hxx>
+
+
+FGModelMgr::FGModelMgr ()
+ : _scene(new ssgRoot),
+ _nearplane(0.5f),
+ _farplane(120000.0f)
+{
+}
+
+FGModelMgr::~FGModelMgr ()
+{
+ for (int i = 0; i < _instances.size(); i++) {
+ delete _instances[i];
+ }
+ delete _scene;
+}
+
+void
+FGModelMgr::init ()
+{
+ vector<SGPropertyNode *> model_nodes =
+ fgGetNode("/models", true)->getChildren("model");
+ for (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 = child;
+ 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 scene graph
+ _scene->addKid(model->getSceneGraph());
+
+ // Save this instance for updating
+ _instances.push_back(instance);
+ }
+}
+
+void
+FGModelMgr::bind ()
+{
+}
+
+void
+FGModelMgr::unbind ()
+{
+}
+
+void
+FGModelMgr::update (int dt)
+{
+ for (int i = 0; i < _instances.size(); i++) {
+ Instance * instance = _instances[i];
+ FG3DModel * model = instance->model;
+
+ instance->model->update(dt);
+
+ // 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());
+
+ }
+}
+
+void
+FGModelMgr::draw ()
+{
+ ssgSetNearFar(_nearplane, _farplane);
+ ssgCullAndDraw(_scene);
+}
+
+
+\f
+////////////////////////////////////////////////////////////////////////
+// Implementation of FGModelMgr::Instance
+////////////////////////////////////////////////////////////////////////
+
+FGModelMgr::Instance::Instance ()
+ : model(0),
+ lon_deg_node(0),
+ lat_deg_node(0),
+ elev_ft_node(0),
+ roll_deg_node(0),
+ pitch_deg_node(0),
+ heading_deg_node(0)
+{
+}
+
+FGModelMgr::Instance::~Instance ()
+{
+ delete model;
+}
+
+// end of modelmgr.cxx
--- /dev/null
+// model-mgr.hxx - manage user-specified 3D models.
+// Written by David Megginson, started 2002.
+//
+// This file is in the Public Domain, and comes with no warranty.
+
+#ifndef __MODELMGR_HXX
+#define __MODELMGR_HXX 1
+
+#ifndef __cplusplus
+# error This library requires C++
+#endif
+
+#include <vector>
+
+#include <plib/ssg.h>
+
+#include <simgear/compiler.h>
+#include <simgear/misc/props.hxx>
+
+#include <Main/fgfs.hxx>
+
+#include "model.hxx"
+
+SG_USING_STD(vector);
+
+
+/**
+ * Manage a list of user-specified models.
+ */
+class FGModelMgr : public FGSubsystem
+{
+public:
+ FGModelMgr ();
+ virtual ~FGModelMgr ();
+
+ virtual void init ();
+ virtual void bind ();
+ virtual void unbind ();
+ virtual void update (int dt);
+
+ virtual void draw ();
+
+private:
+
+ struct Instance
+ {
+ Instance ();
+ virtual ~Instance ();
+ FG3DModel * model;
+ SGPropertyNode * lon_deg_node;
+ SGPropertyNode * lat_deg_node;
+ SGPropertyNode * elev_ft_node;
+ SGPropertyNode * roll_deg_node;
+ SGPropertyNode * pitch_deg_node;
+ SGPropertyNode * heading_deg_node;
+ };
+
+ vector<Instance *> _instances;
+
+ ssgRoot * _scene;
+ float _nearplane;
+ float _farplane;
+
+};
+
+#endif // __MODELMGR_HXX
+
+
+