1
0
Fork 0

NavDisplay: fix many bugs relating to stretched and heading-rotated symbols.

This commit is contained in:
James Turner 2012-01-08 17:47:13 +00:00
parent 5f0066c4c2
commit 975a5202a8
2 changed files with 24 additions and 12 deletions

View file

@ -233,8 +233,8 @@ public:
if (stretchSymbol) { if (stretchSymbol) {
stretchY2 = node->getFloatValue("y2"); stretchY2 = node->getFloatValue("y2");
stretchY3 = node->getFloatValue("y3"); stretchY3 = node->getFloatValue("y3");
stretchV2 = node->getFloatValue("v2"); stretchV2 = node->getFloatValue("v2") / texSize;
stretchV3 = node->getFloatValue("v3"); stretchV3 = node->getFloatValue("v3") / texSize;
} }
return true; return true;
@ -658,7 +658,7 @@ void NavDisplay::addSymbolToScene(SymbolInstance* sym)
verts[3] = osg::Vec2(def->xy0.x(), def->xy1.y()); verts[3] = osg::Vec2(def->xy0.x(), def->xy1.y());
if (def->rotateToHeading) { if (def->rotateToHeading) {
osg::Matrixf m(degRotation(sym->headingDeg)); osg::Matrixf m(degRotation(sym->headingDeg - _view_heading));
for (int i=0; i<4; ++i) { for (int i=0; i<4; ++i) {
verts[i] = mult(verts[i], m); verts[i] = mult(verts[i], m);
} }
@ -686,7 +686,7 @@ void NavDisplay::addSymbolToScene(SymbolInstance* sym)
stretchVerts[2] = osg::Vec2(def->xy1.x(), def->stretchY3); stretchVerts[2] = osg::Vec2(def->xy1.x(), def->stretchY3);
stretchVerts[3] = osg::Vec2(def->xy0.x(), def->stretchY3); stretchVerts[3] = osg::Vec2(def->xy0.x(), def->stretchY3);
osg::Matrixf m(degRotation(sym->headingDeg)); osg::Matrixf m(degRotation(sym->headingDeg - _view_heading));
for (int i=0; i<4; ++i) { for (int i=0; i<4; ++i) {
stretchVerts[i] = mult(stretchVerts[i], m); stretchVerts[i] = mult(stretchVerts[i], m);
} }
@ -1013,8 +1013,17 @@ void NavDisplay::foundPositionedItem(FGPositioned* pos)
computePositionedPropsAndHeading(pos, vars, heading); computePositionedPropsAndHeading(pos, vars, heading);
osg::Vec2 projected = projectGeod(pos->geod()); osg::Vec2 projected = projectGeod(pos->geod());
if (pos->type() == FGPositioned::RUNWAY) {
FGRunway* rwy = (FGRunway*) pos;
projected = projectGeod(rwy->threshold());
}
BOOST_FOREACH(SymbolDef* r, rules) { BOOST_FOREACH(SymbolDef* r, rules) {
addSymbolInstance(projected, heading, r, vars); SymbolInstance* ins = addSymbolInstance(projected, heading, r, vars);
if (pos->type() == FGPositioned::RUNWAY) {
FGRunway* rwy = (FGRunway*) pos;
ins->endPos = projectGeod(rwy->end());
}
} }
} }
@ -1024,6 +1033,7 @@ void NavDisplay::computePositionedPropsAndHeading(FGPositioned* pos, SGPropertyN
nd->setStringValue("name", pos->name()); nd->setStringValue("name", pos->name());
nd->setDoubleValue("elevation-ft", pos->elevation()); nd->setDoubleValue("elevation-ft", pos->elevation());
nd->setIntValue("heading-deg", 0); nd->setIntValue("heading-deg", 0);
heading = 0.0;
switch (pos->type()) { switch (pos->type()) {
case FGPositioned::VOR: case FGPositioned::VOR:
@ -1033,11 +1043,12 @@ void NavDisplay::computePositionedPropsAndHeading(FGPositioned* pos, SGPropertyN
nd->setDoubleValue("frequency-mhz", nav->get_freq()); nd->setDoubleValue("frequency-mhz", nav->get_freq());
if (pos == _nav1Station) { if (pos == _nav1Station) {
nd->setIntValue("heading-deg", _navRadio1Node->getDoubleValue("radials/target-radial-deg")); heading = _navRadio1Node->getDoubleValue("radials/target-radial-deg");
} else if (pos == _nav2Station) { } else if (pos == _nav2Station) {
nd->setIntValue("heading-deg", _navRadio2Node->getDoubleValue("radials/target-radial-deg")); heading = _navRadio2Node->getDoubleValue("radials/target-radial-deg");
} }
nd->setIntValue("heading-deg", heading);
break; break;
} }
@ -1049,7 +1060,8 @@ void NavDisplay::computePositionedPropsAndHeading(FGPositioned* pos, SGPropertyN
case FGPositioned::RUNWAY: { case FGPositioned::RUNWAY: {
FGRunway* rwy = static_cast<FGRunway*>(pos); FGRunway* rwy = static_cast<FGRunway*>(pos);
nd->setDoubleValue("heading-deg", rwy->headingDeg()); heading = rwy->headingDeg();
nd->setDoubleValue("heading-deg", heading);
nd->setIntValue("length-ft", rwy->lengthFt()); nd->setIntValue("length-ft", rwy->lengthFt());
nd->setStringValue("airport", rwy->airport()->ident()); nd->setStringValue("airport", rwy->airport()->ident());
break; break;
@ -1187,15 +1199,15 @@ void NavDisplay::computeAIStates(const SGPropertyNode* ai, string_set& states)
} }
} }
bool NavDisplay::addSymbolInstance(const osg::Vec2& proj, double heading, SymbolDef* def, SGPropertyNode* vars) SymbolInstance* NavDisplay::addSymbolInstance(const osg::Vec2& proj, double heading, SymbolDef* def, SGPropertyNode* vars)
{ {
if (isProjectedClipped(proj)) { if (isProjectedClipped(proj)) {
return false; return NULL;
} }
SymbolInstance* sym = new SymbolInstance(proj, heading, def, vars); SymbolInstance* sym = new SymbolInstance(proj, heading, def, vars);
_symbols.push_back(sym); _symbols.push_back(sym);
return true; return sym;
} }
bool NavDisplay::isProjectedClipped(const osg::Vec2& projected) const bool NavDisplay::isProjectedClipped(const osg::Vec2& projected) const

View file

@ -106,7 +106,7 @@ private:
bool anyRuleMatches(const std::string& type, const string_set& states) const; bool anyRuleMatches(const std::string& type, const string_set& states) const;
void findRules(const std::string& type, const string_set& states, SymbolDefVector& rules); void findRules(const std::string& type, const string_set& states, SymbolDefVector& rules);
bool addSymbolInstance(const osg::Vec2& proj, double heading, SymbolDef* def, SGPropertyNode* vars); SymbolInstance* addSymbolInstance(const osg::Vec2& proj, double heading, SymbolDef* def, SGPropertyNode* vars);
void addLine(osg::Vec2 a, osg::Vec2 b, const osg::Vec4& color); void addLine(osg::Vec2 a, osg::Vec2 b, const osg::Vec4& color);
osg::Vec2 projectBearingRange(double bearingDeg, double rangeNm) const; osg::Vec2 projectBearingRange(double bearingDeg, double rangeNm) const;
osg::Vec2 projectGeod(const SGGeod& geod) const; osg::Vec2 projectGeod(const SGGeod& geod) const;