Add test-mode to NavDisplay, and hence fix bugs in range / scale handling.
This commit is contained in:
parent
596c3e5d03
commit
342140a694
2 changed files with 87 additions and 12 deletions
|
@ -42,6 +42,7 @@
|
||||||
#include <simgear/scene/model/model.hxx>
|
#include <simgear/scene/model/model.hxx>
|
||||||
#include <simgear/structure/exception.hxx>
|
#include <simgear/structure/exception.hxx>
|
||||||
#include <simgear/misc/sg_path.hxx>
|
#include <simgear/misc/sg_path.hxx>
|
||||||
|
#include <simgear/misc/strutils.hxx>
|
||||||
#include <simgear/math/sg_geodesy.hxx>
|
#include <simgear/math/sg_geodesy.hxx>
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
@ -431,6 +432,8 @@ NavDisplay::init ()
|
||||||
|
|
||||||
_excessDataNode = _Instrument->getChild("excess-data", 0, true);
|
_excessDataNode = _Instrument->getChild("excess-data", 0, true);
|
||||||
_excessDataNode->setBoolValue(false);
|
_excessDataNode->setBoolValue(false);
|
||||||
|
_testModeNode = _Instrument->getChild("test-mode", 0, true);
|
||||||
|
_testModeNode->setBoolValue(false);
|
||||||
|
|
||||||
// OSG geometry setup
|
// OSG geometry setup
|
||||||
_radarGeode = new osg::Geode;
|
_radarGeode = new osg::Geode;
|
||||||
|
@ -526,18 +529,32 @@ NavDisplay::update (double delta_time_sec)
|
||||||
_time -= _updateInterval;
|
_time -= _updateInterval;
|
||||||
|
|
||||||
_rangeNm = _rangeNode->getFloatValue();
|
_rangeNm = _rangeNode->getFloatValue();
|
||||||
if (_Instrument->getBoolValue("aircraft-heading-up", true)) {
|
if (_testModeNode->getBoolValue()) {
|
||||||
|
_view_heading = 90;
|
||||||
|
} else if (_Instrument->getBoolValue("aircraft-heading-up", true)) {
|
||||||
_view_heading = fgGetDouble("/orientation/heading-deg");
|
_view_heading = fgGetDouble("/orientation/heading-deg");
|
||||||
} else {
|
} else {
|
||||||
_view_heading = _Instrument->getFloatValue("heading-up-deg", 0.0);
|
_view_heading = _Instrument->getFloatValue("heading-up-deg", 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
_scale = _odg->size() / _rangeNm;
|
|
||||||
|
|
||||||
double xCenterFrac = _Instrument->getDoubleValue("x-center", 0.5);
|
double xCenterFrac = _Instrument->getDoubleValue("x-center", 0.5);
|
||||||
double yCenterFrac = _Instrument->getDoubleValue("y-center", 0.5);
|
double yCenterFrac = _Instrument->getDoubleValue("y-center", 0.5);
|
||||||
_centerTrans = osg::Matrixf::translate(xCenterFrac * _odg->size(),
|
int pixelSize = _odg->size();
|
||||||
yCenterFrac * _odg->size(), 0.0);
|
|
||||||
|
int rangePixels = _Instrument->getIntValue("range-pixels", -1);
|
||||||
|
if (rangePixels < 0) {
|
||||||
|
// hacky - assume (as is very common) that x-frac doesn't vary, and
|
||||||
|
// y-frac is used to position the center at either the top or bottom of
|
||||||
|
// the pixel area. Measure from the center to the furthest edge (top or bottom)
|
||||||
|
rangePixels = pixelSize * std::max(fabs(1.0 - yCenterFrac), fabs(yCenterFrac));
|
||||||
|
}
|
||||||
|
|
||||||
|
_scale = rangePixels / _rangeNm;
|
||||||
|
_Instrument->setDoubleValue("scale", _scale);
|
||||||
|
|
||||||
|
|
||||||
|
_centerTrans = osg::Matrixf::translate(xCenterFrac * pixelSize,
|
||||||
|
yCenterFrac * pixelSize, 0.0);
|
||||||
|
|
||||||
// scale from nm to display units, rotate so aircraft heading is up
|
// scale from nm to display units, rotate so aircraft heading is up
|
||||||
// (as opposed to north), and compensate for centering
|
// (as opposed to north), and compensate for centering
|
||||||
|
@ -576,11 +593,16 @@ NavDisplay::update (double delta_time_sec)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
processRoute();
|
if (_testModeNode->getBoolValue()) {
|
||||||
processNavRadios();
|
addTestSymbols();
|
||||||
processAI();
|
} else {
|
||||||
findItems();
|
processRoute();
|
||||||
limitDisplayedSymbols();
|
processNavRadios();
|
||||||
|
processAI();
|
||||||
|
findItems();
|
||||||
|
limitDisplayedSymbols();
|
||||||
|
}
|
||||||
|
|
||||||
addSymbolsToScene();
|
addSymbolsToScene();
|
||||||
|
|
||||||
_symbolPrimSet->set(osg::PrimitiveSet::QUADS, 0, _vertices->size());
|
_symbolPrimSet->set(osg::PrimitiveSet::QUADS, 0, _vertices->size());
|
||||||
|
@ -1170,6 +1192,55 @@ bool NavDisplay::isProjectedClipped(const osg::Vec2& projected) const
|
||||||
(projected.y() >= size);
|
(projected.y() >= size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NavDisplay::addTestSymbol(const std::string& type, const std::string& states, const SGGeod& pos, double heading, SGPropertyNode* vars)
|
||||||
|
{
|
||||||
|
string_set stateSet;
|
||||||
|
BOOST_FOREACH(std::string s, simgear::strutils::split(states, ",")) {
|
||||||
|
stateSet.insert(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
SymbolDefVector rules;
|
||||||
|
findRules(type, stateSet, rules);
|
||||||
|
if (rules.empty()) {
|
||||||
|
return; // no rules matched, we can skip this item
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::Vec2 projected = projectGeod(pos);
|
||||||
|
BOOST_FOREACH(SymbolDef* r, rules) {
|
||||||
|
addSymbolInstance(projected, heading, r, vars);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void NavDisplay::addTestSymbols()
|
||||||
|
{
|
||||||
|
_pos = SGGeod::fromDeg(-122.3748889, 37.6189722); // KSFO
|
||||||
|
|
||||||
|
SGGeod a1;
|
||||||
|
double dummy;
|
||||||
|
SGGeodesy::direct(_pos, 45.0, 20.0 * SG_NM_TO_METER, a1, dummy);
|
||||||
|
|
||||||
|
addTestSymbol("airport", "", a1, 0.0, NULL);
|
||||||
|
|
||||||
|
SGGeodesy::direct(_pos, 95.0, 40.0 * SG_NM_TO_METER, a1, dummy);
|
||||||
|
|
||||||
|
addTestSymbol("vor", "", a1, 0.0, NULL);
|
||||||
|
|
||||||
|
SGGeodesy::direct(_pos, 120, 80.0 * SG_NM_TO_METER, a1, dummy);
|
||||||
|
|
||||||
|
addTestSymbol("airport", "destination", a1, 0.0, NULL);
|
||||||
|
|
||||||
|
SGGeodesy::direct(_pos, 80.0, 20.0 * SG_NM_TO_METER, a1, dummy);
|
||||||
|
addTestSymbol("fix", "", a1, 0.0, NULL);
|
||||||
|
|
||||||
|
|
||||||
|
SGGeodesy::direct(_pos, 140.0, 20.0 * SG_NM_TO_METER, a1, dummy);
|
||||||
|
addTestSymbol("fix", "", a1, 0.0, NULL);
|
||||||
|
|
||||||
|
SGGeodesy::direct(_pos, 110.0, 10.0 * SG_NM_TO_METER, a1, dummy);
|
||||||
|
addTestSymbol("fix", "", a1, 0.0, NULL);
|
||||||
|
|
||||||
|
SGGeodesy::direct(_pos, 110.0, 5.0 * SG_NM_TO_METER, a1, dummy);
|
||||||
|
addTestSymbol("fix", "", a1, 0.0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,8 @@ protected:
|
||||||
SGPropertyNode_ptr _Instrument;
|
SGPropertyNode_ptr _Instrument;
|
||||||
SGPropertyNode_ptr _radar_mode_control_node;
|
SGPropertyNode_ptr _radar_mode_control_node;
|
||||||
SGPropertyNode_ptr _user_heading_node;
|
SGPropertyNode_ptr _user_heading_node;
|
||||||
|
SGPropertyNode_ptr _testModeNode;
|
||||||
|
|
||||||
FGODGauge *_odg;
|
FGODGauge *_odg;
|
||||||
|
|
||||||
// Convenience function for creating a property node with a
|
// Convenience function for creating a property node with a
|
||||||
|
@ -112,6 +113,9 @@ private:
|
||||||
bool isProjectedClipped(const osg::Vec2& projected) const;
|
bool isProjectedClipped(const osg::Vec2& projected) const;
|
||||||
void updateFont();
|
void updateFont();
|
||||||
|
|
||||||
|
void addTestSymbol(const std::string& type, const std::string& states, const SGGeod& pos, double heading, SGPropertyNode* vars);
|
||||||
|
void addTestSymbols();
|
||||||
|
|
||||||
std::string _texture_path;
|
std::string _texture_path;
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue