Lazy caching of magvar on waypoints. Not used yet, but soon.
This commit is contained in:
parent
7cbb3a10ed
commit
d227258b3b
3 changed files with 30 additions and 2 deletions
src/Navaids
|
@ -36,8 +36,11 @@
|
||||||
#include <simgear/structure/exception.hxx>
|
#include <simgear/structure/exception.hxx>
|
||||||
#include <simgear/xml/easyxml.hxx>
|
#include <simgear/xml/easyxml.hxx>
|
||||||
#include <simgear/misc/sg_path.hxx>
|
#include <simgear/misc/sg_path.hxx>
|
||||||
|
#include <simgear/magvar/magvar.hxx>
|
||||||
|
#include <simgear/timing/sg_time.hxx>
|
||||||
|
|
||||||
// FlightGear
|
// FlightGear
|
||||||
|
#include <Main/globals.hxx>
|
||||||
#include <Navaids/procedure.hxx>
|
#include <Navaids/procedure.hxx>
|
||||||
#include <Navaids/waypoint.hxx>
|
#include <Navaids/waypoint.hxx>
|
||||||
#include <Airports/simple.hxx>
|
#include <Airports/simple.hxx>
|
||||||
|
@ -49,13 +52,16 @@ using std::fstream;
|
||||||
|
|
||||||
namespace flightgear {
|
namespace flightgear {
|
||||||
|
|
||||||
|
const double NO_MAG_VAR = -1000.0; // an impossible mag-var value
|
||||||
|
|
||||||
Waypt::Waypt(Route* aOwner) :
|
Waypt::Waypt(Route* aOwner) :
|
||||||
_altitudeFt(0.0),
|
_altitudeFt(0.0),
|
||||||
_speed(0.0),
|
_speed(0.0),
|
||||||
_altRestrict(RESTRICT_NONE),
|
_altRestrict(RESTRICT_NONE),
|
||||||
_speedRestrict(RESTRICT_NONE),
|
_speedRestrict(RESTRICT_NONE),
|
||||||
_owner(aOwner),
|
_owner(aOwner),
|
||||||
_flags(0)
|
_flags(0),
|
||||||
|
_magVarDeg(NO_MAG_VAR)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,6 +133,19 @@ Waypt::courseAndDistanceFrom(const SGGeod& aPos) const
|
||||||
SGGeodesy::inverse(aPos, position(), course, az2, distance);
|
SGGeodesy::inverse(aPos, position(), course, az2, distance);
|
||||||
return std::make_pair(course, distance);
|
return std::make_pair(course, distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double Waypt::magvarDeg() const
|
||||||
|
{
|
||||||
|
if (_magVarDeg == NO_MAG_VAR) {
|
||||||
|
// derived classes with a default pos must override this method
|
||||||
|
assert(!(position() == SGGeod()));
|
||||||
|
|
||||||
|
double jd = globals->get_time_params()->getJD();
|
||||||
|
_magVarDeg = sgGetMagVar(position(), jd);
|
||||||
|
}
|
||||||
|
|
||||||
|
return _magVarDeg;
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// persistence
|
// persistence
|
||||||
|
|
|
@ -156,6 +156,12 @@ public:
|
||||||
bool matches(const SGGeod& aPos) const;
|
bool matches(const SGGeod& aPos) const;
|
||||||
|
|
||||||
virtual std::string type() const = 0;
|
virtual std::string type() const = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Magentic variation at/in the vicinity of the waypoint.
|
||||||
|
* For some waypoint types this will always return 0.
|
||||||
|
*/
|
||||||
|
virtual double magvarDeg() const;
|
||||||
protected:
|
protected:
|
||||||
friend class NavdataVisitor;
|
friend class NavdataVisitor;
|
||||||
|
|
||||||
|
@ -187,7 +193,7 @@ private:
|
||||||
|
|
||||||
Route* _owner;
|
Route* _owner;
|
||||||
unsigned short _flags;
|
unsigned short _flags;
|
||||||
|
mutable double _magVarDeg;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::vector<WayptRef> WayptVec;
|
typedef std::vector<WayptRef> WayptVec;
|
||||||
|
|
|
@ -206,6 +206,9 @@ public:
|
||||||
double headingDegMagnetic() const
|
double headingDegMagnetic() const
|
||||||
{ return _magHeading; }
|
{ return _magHeading; }
|
||||||
|
|
||||||
|
virtual double magvarDeg() const
|
||||||
|
{ return 0.0; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string _ident;
|
std::string _ident;
|
||||||
double _magHeading;
|
double _magHeading;
|
||||||
|
|
Loading…
Add table
Reference in a new issue