10#include <simgear/constants.h>
11#include <simgear/debug/logstream.hxx>
12#include <simgear/timing/sg_time.hxx>
13#include <simgear/structure/event_mgr.hxx>
24 globals->get_event_mgr()->addTask(
"updateObjects",
25 [
this](){ this->updateObjects(); }, 0.5 );
36 SGPropertyNode *prop =
globals->get_props();
38 _sunAngleRad = prop->getNode(
"/sim/time/sun-angle-rad",
true);
39 _sunAngleRad->setDoubleValue(_sun_angle);
40 _moonAngleRad = prop->getNode(
"/sim/time/moon-angle-rad",
true);
41 _moonAngleRad->setDoubleValue(_moon_angle);
44 tie(prop,
"/ephemeris/sun/local/x", SGRawValuePointer<float>(&_sun_vec[0]));
45 tie(prop,
"/ephemeris/sun/local/y", SGRawValuePointer<float>(&_sun_vec[1]));
46 tie(prop,
"/ephemeris/sun/local/z", SGRawValuePointer<float>(&_sun_vec[2]));
49 tie(prop,
"/ephemeris/moon/local/x", SGRawValuePointer<float>(&_moon_vec[0]));
50 tie(prop,
"/ephemeris/moon/local/y", SGRawValuePointer<float>(&_moon_vec[1]));
51 tie(prop,
"/ephemeris/moon/local/z", SGRawValuePointer<float>(&_moon_vec[2]));
56 _tiedProperties.Untie();
58 _moonAngleRad.reset();
66void FGLight::updateObjects()
69 bool sun_not_moon =
true;
70 updateBodyPos(sun_not_moon, _sun_lon, _sun_lat,
71 _sun_vec, _sun_vec_inv,
72 _sun_angle, _sunAngleRad,
77 updateBodyPos(sun_not_moon, _moon_lon, _moon_gc_lat,
78 _moon_vec, _moon_vec_inv,
79 _moon_angle, _moonAngleRad,
83void FGLight::updateBodyPos(
bool sun_not_moon,
double& lon,
double& lat,
84 SGVec4f& vec, SGVec4f& vec_inv,
85 double& angle, SGPropertyNode_ptr AngleRad,
98 SGVec3d bodypos = SGVec3d::fromGeoc(SGGeoc::fromRadM(lon, lat,
102 vec = SGVec4f(toVec3f(normalize(bodypos)), 0);
107 SGVec3d world_up = hlOr.backTransform( -SGVec3d::e3() );
113 SGVec3d nbody = normalize(bodypos);
114 SGVec3d nup = normalize(world_up);
115 angle = acos( dot( nup, nbody ) );
117 double signedPI = (angle < 0.0) ? -SGD_PI : SGD_PI;
118 angle = fmod(angle+signedPI, SGD_2PI) - signedPI;
121 SGVec3d local_vec = hlOr.transform(nbody);
130 rotation = atan2(local_vec.y(), -local_vec.x());
135 AngleRad->setDoubleValue(angle);
141 SGSubsystemMgr::DISPLAY);
void fgBodyPositionGST(double gst, double &lon, double &lat, bool sun_not_moon)
given a particular time expressed in side real time at prime meridian (GST), compute position on the ...
SGTime * get_time_params() const
SGGeod get_view_position() const
void update(double dt) override
SGSubsystemMgr::Registrant< FGLight > registrantFGLight(SGSubsystemMgr::DISPLAY)