# include "config.h"
#endif
-#include <string.h> // strcmp
+#include "viewmgr.hxx"
-#include <plib/sg.h>
+#include <string.h> // strcmp
#include <simgear/compiler.h>
-
+#include <simgear/sound/soundmgr_openal.hxx>
#include <Model/acmodel.hxx>
-
-#include "viewmgr.hxx"
-
+#include <Main/viewer.hxx>
+#include <Main/fg_props.hxx>
// Constructor
FGViewMgr::FGViewMgr( void ) :
axis_long(0),
axis_lat(0),
+ view_number(fgGetNode("/sim/current-view/view-number", true)),
config_list(fgGetNode("/sim", true)->getChildren("view")),
current(0)
{
+ smgr = (SGSoundMgr *)globals->get_subsystem("soundmgr");
}
// Destructor
double z_offset_m = n->getDoubleValue("config/z-offset-m");
double heading_offset_deg = n->getDoubleValue("config/heading-offset-deg");
- n->setDoubleValue(heading_offset_deg);
+ n->setDoubleValue("config/heading-offset-deg", heading_offset_deg);
double pitch_offset_deg = n->getDoubleValue("config/pitch-offset-deg");
- n->setDoubleValue(pitch_offset_deg);
+ n->setDoubleValue("config/pitch-offset-deg", pitch_offset_deg);
double roll_offset_deg = n->getDoubleValue("config/roll-offset-deg");
- n->setDoubleValue(roll_offset_deg);
+ n->setDoubleValue("config/roll-offset-deg", roll_offset_deg);
double fov_deg = n->getDoubleValue("config/default-field-of-view-deg");
double near_m = n->getDoubleValue("config/ground-level-nearplane-m");
fgSetDouble("/sim/current-view/field-of-view", fov_deg);
// target offsets for lookat mode only...
- fgSetDouble("/sim/current-view/target-x-offset-deg",
+ fgSetDouble("/sim/current-view/target-x-offset-m",
n->getDoubleValue("config/target-x-offset-m"));
- fgSetDouble("/sim/current-view/target-y-offset-deg",
+ fgSetDouble("/sim/current-view/target-y-offset-m",
n->getDoubleValue("config/target-y-offset-m"));
- fgSetDouble("/sim/current-view/target-z-offset-deg",
+ fgSetDouble("/sim/current-view/target-z-offset-m",
n->getDoubleValue("config/target-z-offset-m"));
}
setView(0);
&FGViewMgr::getNear_m, &FGViewMgr::setNear_m);
fgSetArchivable("/sim/current-view/ground-level-nearplane-m");
+ SGPropertyNode *n = fgGetNode("/sim/current-view", true);
+ n->tie("viewer-x-m", SGRawValuePointer<double>(&abs_viewer_position[0]));
+ n->tie("viewer-y-m", SGRawValuePointer<double>(&abs_viewer_position[1]));
+ n->tie("viewer-z-m", SGRawValuePointer<double>(&abs_viewer_position[2]));
}
void
fgUntie("/sim/current-view/axes/long");
fgUntie("/sim/current-view/axes/lat");
fgUntie("/sim/current-view/ground-level-nearplane-m");
+ fgUntie("/sim/current-view/viewer-x-m");
+ fgUntie("/sim/current-view/viewer-y-m");
+ fgUntie("/sim/current-view/viewer-z-m");
}
void
// Update the current view
do_axes();
view->update(dt);
+ abs_viewer_position = loop_view->getViewPosition();
+
+ // update audio listener values
+ // set the viewer posotion in Cartesian coordinates in meters
+ smgr->set_position(abs_viewer_position);
+ smgr->set_orientation(loop_view->getViewOrientation());
+ smgr->set_velocity(SGVec3f(0,0,0)); // TODO: in meters per second
}
void
FGViewMgr::copyToCurrent()
{
SGPropertyNode *n = config_list[current];
+ fgSetString("/sim/current-view/name", n->getStringValue("name"));
+ fgSetString("/sim/current-view/type", n->getStringValue("type"));
// copy certain view config data for default values
fgSetDouble("/sim/current-view/config/heading-offset-deg",
get_current_view()->getInternal());
}
+void FGViewMgr::clear()
+{
+ views.clear();
+}
+FGViewer*
+FGViewMgr::get_current_view()
+{
+ if ( current < (int)views.size() ) {
+ return views[current];
+ } else {
+ return NULL;
+ }
+}
+
+const FGViewer*
+FGViewMgr::get_current_view() const
+{
+ if ( current < (int)views.size() ) {
+ return views[current];
+ } else {
+ return NULL;
+ }
+}
+
+
+FGViewer*
+FGViewMgr::get_view( int i )
+{
+ if ( i < 0 ) { i = 0; }
+ if ( i >= (int)views.size() ) { i = views.size() - 1; }
+ return views[i];
+}
+
+const FGViewer*
+FGViewMgr::get_view( int i ) const
+{
+ if ( i < 0 ) { i = 0; }
+ if ( i >= (int)views.size() ) { i = views.size() - 1; }
+ return views[i];
+}
+
+FGViewer*
+FGViewMgr::next_view()
+{
+ setView((current+1 < (int)views.size()) ? (current + 1) : 0);
+ view_number->fireValueChanged();
+ return views[current];
+}
+
+FGViewer*
+FGViewMgr::prev_view()
+{
+ setView((0 < current) ? (current - 1) : (views.size() - 1));
+ view_number->fireValueChanged();
+ return views[current];
+}
+
+void
+FGViewMgr::add_view( FGViewer * v )
+{
+ views.push_back(v);
+ v->init();
+}
+
double
FGViewMgr::getViewHeadingOffset_deg () const
{
// negative numbers -> set view with node index -newview
if (newview < 0) {
for (int i = 0; i < (int)config_list.size(); i++) {
- int index = -config_list[i]->getIndex();
- if (index == newview)
- newview = i;
+ int index = -config_list[i]->getIndex();
+ if (index == newview)
+ newview = i;
}
if (newview < 0)
- return;
+ return;
}
// if newview number too low wrap to last view...
if (newview < 0)
- newview = (int)views.size() -1;
+ newview = (int)views.size() - 1;
// if newview number to high wrap to zero...
- if (newview > ((int)views.size() -1))
+ if (newview >= (int)views.size())
newview = 0;
// set new view