Merge branch 'next' of git@gitorious.org:fg/flightgear into next
This commit is contained in:
commit
a49d553ea8
16 changed files with 108 additions and 76 deletions
|
@ -175,20 +175,12 @@ FGAIFlightPlan::FGAIFlightPlan(FGAIAircraft *ac,
|
||||||
if (wpt->name == "END") wpt->finished = true;
|
if (wpt->name == "END") wpt->finished = true;
|
||||||
else wpt->finished = false;
|
else wpt->finished = false;
|
||||||
waypoints.push_back(wpt);
|
waypoints.push_back(wpt);
|
||||||
}
|
} // of node loop
|
||||||
}
|
} catch (const sg_exception &e) {
|
||||||
catch (const sg_exception &) {
|
SG_LOG(SG_GENERAL, SG_WARN, "Error reading AI flight plan: " <<
|
||||||
SG_LOG(SG_GENERAL, SG_WARN,
|
e.getMessage() << " from " << e.getOrigin());
|
||||||
"Error reading AI flight plan: ");
|
|
||||||
cerr << "Errno = " << errno << endl;
|
|
||||||
if (errno == ENOENT)
|
|
||||||
{
|
|
||||||
SG_LOG(SG_GENERAL, SG_WARN, "Reason: No such file or directory");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
} else {
|
||||||
{
|
|
||||||
// cout << path.str() << endl;
|
// cout << path.str() << endl;
|
||||||
// cout << "Trying to create this plan dynamically" << endl;
|
// cout << "Trying to create this plan dynamically" << endl;
|
||||||
// cout << "Route from " << dep->id << " to " << arr->id << endl;
|
// cout << "Route from " << dep->id << " to " << arr->id << endl;
|
||||||
|
|
|
@ -38,7 +38,6 @@
|
||||||
#include "AIAircraft.hxx"
|
#include "AIAircraft.hxx"
|
||||||
#include "performancedata.hxx"
|
#include "performancedata.hxx"
|
||||||
|
|
||||||
|
|
||||||
using std::iostream;
|
using std::iostream;
|
||||||
|
|
||||||
void FGAIFlightPlan::evaluateRoutePart(double deplat,
|
void FGAIFlightPlan::evaluateRoutePart(double deplat,
|
||||||
|
@ -55,28 +54,18 @@ void FGAIFlightPlan::evaluateRoutePart(double deplat,
|
||||||
SGGeoc arr(SGGeoc::fromDegM(arrlon, arrlat, 100.0));
|
SGGeoc arr(SGGeoc::fromDegM(arrlon, arrlat, 100.0));
|
||||||
|
|
||||||
SGVec3d a = SGVec3d::fromGeoc(dep);
|
SGVec3d a = SGVec3d::fromGeoc(dep);
|
||||||
SGVec3d b = SGVec3d::fromGeoc(arr);
|
SGVec3d nb = normalize(SGVec3d::fromGeoc(arr));
|
||||||
SGVec3d _cross = cross(b, a);
|
SGVec3d na = normalize(a);
|
||||||
|
|
||||||
|
SGVec3d _cross = cross(nb, na);
|
||||||
|
|
||||||
double angle = sgACos(dot(a, b));
|
double angle = acos(dot(na, nb));
|
||||||
|
const double angleStep = 0.05 * SG_DEGREES_TO_RADIANS;
|
||||||
tmpNode = 0;
|
tmpNode = 0;
|
||||||
for (double ang = 0.0; ang < angle; ang += 0.05)
|
for (double ang = 0.0; ang < angle; ang += angleStep)
|
||||||
{
|
{
|
||||||
sgdVec3 newPos;
|
SGQuatd q = SGQuatd::fromAngleAxis(ang, _cross);
|
||||||
sgdMat4 matrix;
|
SGGeod geod = SGGeod::fromCart(q.transform(a));
|
||||||
//cerr << "Angle = " << ang << endl;
|
|
||||||
sgdMakeRotMat4(matrix, ang, _cross.data());
|
|
||||||
for(int j = 0; j < 3; j++)
|
|
||||||
{
|
|
||||||
newPos[j] =0.0;
|
|
||||||
for (int k = 0; k<3; k++)
|
|
||||||
{
|
|
||||||
newPos[j] += matrix[j][k]*a[k];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//cerr << "1"<< endl;
|
|
||||||
SGGeod geod = SGGeod::fromCart(SGVec3d(newPos[0], newPos[1], newPos[2]));
|
|
||||||
|
|
||||||
prevNode = tmpNode;
|
prevNode = tmpNode;
|
||||||
tmpNode = globals->get_airwaynet()->findNearestNode(geod);
|
tmpNode = globals->get_airwaynet()->findNearestNode(geod);
|
||||||
|
|
|
@ -108,6 +108,12 @@ FGAILocalTraffic::FGAILocalTraffic() {
|
||||||
_controlled = false;
|
_controlled = false;
|
||||||
|
|
||||||
_invisible = false;
|
_invisible = false;
|
||||||
|
|
||||||
|
ground = NULL;
|
||||||
|
tower = NULL;
|
||||||
|
ourGate = NULL;
|
||||||
|
nextTaxiNode = NULL;
|
||||||
|
holdShortNode = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
FGAILocalTraffic::~FGAILocalTraffic() {
|
FGAILocalTraffic::~FGAILocalTraffic() {
|
||||||
|
@ -1254,13 +1260,13 @@ void FGAILocalTraffic::ProcessCallback(int code) {
|
||||||
if(code == 1) {
|
if(code == 1) {
|
||||||
ground->RequestDeparture(plane, this);
|
ground->RequestDeparture(plane, this);
|
||||||
} else if(code == 2) {
|
} else if(code == 2) {
|
||||||
tower->ContactAtHoldShort(plane, this, CIRCUIT);
|
if (_controlled) tower->ContactAtHoldShort(plane, this, CIRCUIT);
|
||||||
} else if(code == 3) {
|
} else if(code == 3) {
|
||||||
tower->ReportRunwayVacated(plane.callsign);
|
if (_controlled) tower->ReportRunwayVacated(plane.callsign);
|
||||||
} else if(code == 11) {
|
} else if(code == 11) {
|
||||||
tower->ReportDownwind(plane.callsign);
|
if (_controlled) tower->ReportDownwind(plane.callsign);
|
||||||
} else if(code == 13) {
|
} else if(code == 13) {
|
||||||
tower->ReportFinal(plane.callsign);
|
if (_controlled) tower->ReportFinal(plane.callsign);
|
||||||
} else if(code == 99) { // Flag this instance for deletion
|
} else if(code == 99) { // Flag this instance for deletion
|
||||||
responseCounter = 0;
|
responseCounter = 0;
|
||||||
_removeSelf = true;
|
_removeSelf = true;
|
||||||
|
|
|
@ -273,8 +273,7 @@ typedef map<string,int> MSI;
|
||||||
|
|
||||||
void FGATCMgr::ZapOtherService(const string ncunit, const string svc_name){
|
void FGATCMgr::ZapOtherService(const string ncunit, const string svc_name){
|
||||||
for (atc_list_iterator svc = atc_list->begin(); svc != atc_list->end(); svc++) {
|
for (atc_list_iterator svc = atc_list->begin(); svc != atc_list->end(); svc++) {
|
||||||
//cout << "Zapping " << navcomm
|
|
||||||
// << "[" << unit << "]" << " otherthan: " << svc_name << endl;
|
|
||||||
if (svc->first != svc_name) {
|
if (svc->first != svc_name) {
|
||||||
MSI &actv = svc->second->active_on;
|
MSI &actv = svc->second->active_on;
|
||||||
// OK, we have found some OTHER service;
|
// OK, we have found some OTHER service;
|
||||||
|
@ -286,7 +285,9 @@ void FGATCMgr::ZapOtherService(const string ncunit, const string svc_name){
|
||||||
//cout << "Eradicating service: '" << svc->first << "'" << endl;
|
//cout << "Eradicating service: '" << svc->first << "'" << endl;
|
||||||
svc->second->SetNoDisplay();
|
svc->second->SetNoDisplay();
|
||||||
svc->second->Update(0); // one last update
|
svc->second->Update(0); // one last update
|
||||||
delete svc->second;
|
SG_LOG(SG_GENERAL, SG_INFO, "would have erased ATC service:" << svc->second->get_name()<< "/"
|
||||||
|
<< svc->second->get_ident());
|
||||||
|
// delete svc->second;
|
||||||
atc_list->erase(svc);
|
atc_list->erase(svc);
|
||||||
// ALL pointers into the ATC list are now invalid,
|
// ALL pointers into the ATC list are now invalid,
|
||||||
// so let's reset them:
|
// so let's reset them:
|
||||||
|
|
|
@ -211,20 +211,32 @@ FGEnvironment::read (const SGPropertyNode * node)
|
||||||
maybe_copy_value(this, node, "visibility-m",
|
maybe_copy_value(this, node, "visibility-m",
|
||||||
&FGEnvironment::set_visibility_m);
|
&FGEnvironment::set_visibility_m);
|
||||||
|
|
||||||
|
maybe_copy_value(this, node, "elevation-ft",
|
||||||
|
&FGEnvironment::set_elevation_ft);
|
||||||
|
|
||||||
if (!maybe_copy_value(this, node, "temperature-sea-level-degc",
|
if (!maybe_copy_value(this, node, "temperature-sea-level-degc",
|
||||||
&FGEnvironment::set_temperature_sea_level_degc))
|
&FGEnvironment::set_temperature_sea_level_degc)) {
|
||||||
maybe_copy_value(this, node, "temperature-degc",
|
if( maybe_copy_value(this, node, "temperature-degc",
|
||||||
&FGEnvironment::set_temperature_degc);
|
&FGEnvironment::set_temperature_degc)) {
|
||||||
|
_recalc_sl_temperature();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!maybe_copy_value(this, node, "dewpoint-sea-level-degc",
|
if (!maybe_copy_value(this, node, "dewpoint-sea-level-degc",
|
||||||
&FGEnvironment::set_dewpoint_sea_level_degc))
|
&FGEnvironment::set_dewpoint_sea_level_degc)) {
|
||||||
maybe_copy_value(this, node, "dewpoint-degc",
|
if( maybe_copy_value(this, node, "dewpoint-degc",
|
||||||
&FGEnvironment::set_dewpoint_degc);
|
&FGEnvironment::set_dewpoint_degc)) {
|
||||||
|
_recalc_sl_dewpoint();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!maybe_copy_value(this, node, "pressure-sea-level-inhg",
|
if (!maybe_copy_value(this, node, "pressure-sea-level-inhg",
|
||||||
&FGEnvironment::set_pressure_sea_level_inhg))
|
&FGEnvironment::set_pressure_sea_level_inhg)) {
|
||||||
maybe_copy_value(this, node, "pressure-inhg",
|
if( maybe_copy_value(this, node, "pressure-inhg",
|
||||||
&FGEnvironment::set_pressure_inhg);
|
&FGEnvironment::set_pressure_inhg)) {
|
||||||
|
_recalc_sl_pressure();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
maybe_copy_value(this, node, "wind-from-heading-deg",
|
maybe_copy_value(this, node, "wind-from-heading-deg",
|
||||||
&FGEnvironment::set_wind_from_heading_deg);
|
&FGEnvironment::set_wind_from_heading_deg);
|
||||||
|
@ -232,9 +244,6 @@ FGEnvironment::read (const SGPropertyNode * node)
|
||||||
maybe_copy_value(this, node, "wind-speed-kt",
|
maybe_copy_value(this, node, "wind-speed-kt",
|
||||||
&FGEnvironment::set_wind_speed_kt);
|
&FGEnvironment::set_wind_speed_kt);
|
||||||
|
|
||||||
maybe_copy_value(this, node, "elevation-ft",
|
|
||||||
&FGEnvironment::set_elevation_ft);
|
|
||||||
|
|
||||||
maybe_copy_value(this, node, "turbulence/magnitude-norm",
|
maybe_copy_value(this, node, "turbulence/magnitude-norm",
|
||||||
&FGEnvironment::set_turbulence_magnitude_norm);
|
&FGEnvironment::set_turbulence_magnitude_norm);
|
||||||
|
|
||||||
|
@ -652,7 +661,7 @@ FGEnvironment::_recalc_sl_temperature ()
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (elevation_ft >= ISA_def[1].height) {
|
if (elevation_ft * atmodel::foot >= ISA_def[1].height) {
|
||||||
SG_LOG(SG_GENERAL, SG_ALERT, "recalc_sl_temperature: "
|
SG_LOG(SG_GENERAL, SG_ALERT, "recalc_sl_temperature: "
|
||||||
<< "valid only in troposphere, not " << elevation_ft);
|
<< "valid only in troposphere, not " << elevation_ft);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -132,7 +132,9 @@ void
|
||||||
FGInterpolateEnvironmentCtrl::init ()
|
FGInterpolateEnvironmentCtrl::init ()
|
||||||
{
|
{
|
||||||
read_table( boundary_n, _boundary_table);
|
read_table( boundary_n, _boundary_table);
|
||||||
read_table( aloft_n, _aloft_table);
|
// pass in a pointer to the environment of the last bondary layer as
|
||||||
|
// a starting point
|
||||||
|
read_table( aloft_n, _aloft_table, &(*(_boundary_table.end()-1))->environment);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -142,7 +144,7 @@ FGInterpolateEnvironmentCtrl::reinit ()
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
FGInterpolateEnvironmentCtrl::read_table (const SGPropertyNode * node, vector<bucket *> &table)
|
FGInterpolateEnvironmentCtrl::read_table (const SGPropertyNode * node, vector<bucket *> &table, FGEnvironment * parent )
|
||||||
{
|
{
|
||||||
double last_altitude_ft = 0.0;
|
double last_altitude_ft = 0.0;
|
||||||
double sort_required = false;
|
double sort_required = false;
|
||||||
|
@ -163,8 +165,11 @@ FGInterpolateEnvironmentCtrl::read_table (const SGPropertyNode * node, vector<bu
|
||||||
b = new bucket;
|
b = new bucket;
|
||||||
table.push_back(b);
|
table.push_back(b);
|
||||||
}
|
}
|
||||||
|
if (i == 0 && parent != NULL )
|
||||||
|
b->environment.copy( *parent );
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
b->environment.copy(table[i-1]->environment);
|
b->environment.copy(table[i-1]->environment);
|
||||||
|
|
||||||
b->environment.read(child);
|
b->environment.read(child);
|
||||||
b->altitude_ft = b->environment.get_elevation_ft();
|
b->altitude_ft = b->environment.get_elevation_ft();
|
||||||
|
|
||||||
|
|
|
@ -101,7 +101,7 @@ private:
|
||||||
static bool lessThan(bucket *a, bucket *b);
|
static bool lessThan(bucket *a, bucket *b);
|
||||||
};
|
};
|
||||||
|
|
||||||
void read_table (const SGPropertyNode * node, std::vector<bucket *> &table);
|
void read_table (const SGPropertyNode * node, std::vector<bucket *> &table, FGEnvironment * parent = NULL );
|
||||||
void do_interpolate (std::vector<bucket *> &table, double altitude_ft,
|
void do_interpolate (std::vector<bucket *> &table, double altitude_ft,
|
||||||
FGEnvironment * environment);
|
FGEnvironment * environment);
|
||||||
|
|
||||||
|
|
|
@ -295,7 +295,9 @@ FGEnvironmentMgr::update (double dt)
|
||||||
osg::Vec3 windVec(-_environment->get_wind_from_north_fps(),
|
osg::Vec3 windVec(-_environment->get_wind_from_north_fps(),
|
||||||
-_environment->get_wind_from_east_fps(),
|
-_environment->get_wind_from_east_fps(),
|
||||||
_environment->get_wind_from_down_fps());
|
_environment->get_wind_from_down_fps());
|
||||||
simgear::Particles::setWindVector(windVec * SG_FEET_TO_METER);
|
// simgear::Particles::setWindVector(windVec * SG_FEET_TO_METER);
|
||||||
|
simgear::Particles::setWindFrom( _environment->get_wind_from_heading_deg(),
|
||||||
|
_environment->get_wind_speed_kt() );
|
||||||
}
|
}
|
||||||
|
|
||||||
FGEnvironment
|
FGEnvironment
|
||||||
|
|
|
@ -100,8 +100,7 @@ double FGClouds::buildCloud(SGPropertyNode *cloud_def_root, SGPropertyNode *box_
|
||||||
double y = sg_random() * SGCloudField::fieldSize - (SGCloudField::fieldSize / 2.0);
|
double y = sg_random() * SGCloudField::fieldSize - (SGCloudField::fieldSize / 2.0);
|
||||||
double z = grid_z_rand * (sg_random() - 0.5);
|
double z = grid_z_rand * (sg_random() - 0.5);
|
||||||
|
|
||||||
sgVec3 pos={x,y,z};
|
SGVec3f pos(x,y,z);
|
||||||
|
|
||||||
|
|
||||||
for(int i = 0; i < box_def->nChildren() ; i++) {
|
for(int i = 0; i < box_def->nChildren() ; i++) {
|
||||||
SGPropertyNode *abox = box_def->getChild(i);
|
SGPropertyNode *abox = box_def->getChild(i);
|
||||||
|
|
|
@ -24,11 +24,10 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <simgear/math/vector.hxx>
|
#include <simgear/math/SGGeometry.hxx>
|
||||||
#include <Main/viewer.hxx>
|
#include <Main/viewer.hxx>
|
||||||
#include "HUD.hxx"
|
#include "HUD.hxx"
|
||||||
|
|
||||||
|
|
||||||
// FIXME
|
// FIXME
|
||||||
static float get__heading() { return fgGetFloat("/orientation/heading-deg") * M_PI / 180.0; }
|
static float get__heading() { return fgGetFloat("/orientation/heading-deg") * M_PI / 180.0; }
|
||||||
static float get__throttleval() { return fgGetFloat("/controls/engines/engine/throttle"); }
|
static float get__throttleval() { return fgGetFloat("/controls/engines/engine/throttle"); }
|
||||||
|
@ -424,12 +423,11 @@ void HUD::Ladder::draw(void)
|
||||||
// however the horizon line should always stay on the horizon. We
|
// however the horizon line should always stay on the horizon. We
|
||||||
// project the alpha/beta offset onto the horizon line to get the
|
// project the alpha/beta offset onto the horizon line to get the
|
||||||
// result we want.
|
// result we want.
|
||||||
sgdVec3 p1; // result
|
|
||||||
sgdVec3 p; sgdSetVec3(p, vel_x, vel_y, 0.0);
|
SGVec3d d(cos(roll_value), sin(roll_value), 0.0);
|
||||||
sgdVec3 p0; sgdSetVec3(p0, 0.0, 0.0, 0.0);
|
SGRayd r(SGVec3d::zeros(), d);
|
||||||
sgdVec3 d; sgdSetVec3(d, cos(roll_value), sin(roll_value), 0.0);
|
SGVec3d p = r.getClosestPointTo(SGVec3d(vel_x, vel_y, 0.0));
|
||||||
sgdClosestPointToLine(p1, p, p0, d);
|
glTranslatef(p[0], p[1], 0);
|
||||||
glTranslatef(p1[0], p1[1], 0);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// ladder position is fixed relative to the center of the screen.
|
// ladder position is fixed relative to the center of the screen.
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
|
|
||||||
#include <simgear/sg_inlines.h>
|
#include <simgear/sg_inlines.h>
|
||||||
#include <simgear/timing/sg_time.hxx>
|
#include <simgear/timing/sg_time.hxx>
|
||||||
#include <simgear/math/vector.hxx>
|
|
||||||
#include <simgear/math/sg_random.h>
|
#include <simgear/math/sg_random.h>
|
||||||
#include <simgear/misc/sg_path.hxx>
|
#include <simgear/misc/sg_path.hxx>
|
||||||
#include <simgear/math/sg_geodesy.hxx>
|
#include <simgear/math/sg_geodesy.hxx>
|
||||||
|
|
|
@ -1777,6 +1777,11 @@ private:
|
||||||
int maturity = 0;
|
int maturity = 0;
|
||||||
string descStr(" ");
|
string descStr(" ");
|
||||||
descStr += path.file();
|
descStr += path.file();
|
||||||
|
// trim common suffix from file names
|
||||||
|
int nPos = descStr.rfind("-set.xml");
|
||||||
|
if (nPos == (int)(descStr.size() - 8)) {
|
||||||
|
descStr.resize(nPos);
|
||||||
|
}
|
||||||
|
|
||||||
SGPropertyNode *node = root.getNode("sim");
|
SGPropertyNode *node = root.getNode("sim");
|
||||||
if (node) {
|
if (node) {
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
#include <simgear/debug/logstream.hxx>
|
#include <simgear/debug/logstream.hxx>
|
||||||
#include <simgear/constants.h>
|
#include <simgear/constants.h>
|
||||||
#include <simgear/scene/model/placement.hxx>
|
#include <simgear/scene/model/placement.hxx>
|
||||||
#include <simgear/math/vector.hxx>
|
|
||||||
|
|
||||||
#include <Main/globals.hxx>
|
#include <Main/globals.hxx>
|
||||||
#include <Scenery/scenery.hxx>
|
#include <Scenery/scenery.hxx>
|
||||||
|
|
|
@ -190,7 +190,7 @@ FGViewMgr::bind ()
|
||||||
|
|
||||||
fgTie("/sim/current-view/view-number", this,
|
fgTie("/sim/current-view/view-number", this,
|
||||||
&FGViewMgr::getView, &FGViewMgr::setView);
|
&FGViewMgr::getView, &FGViewMgr::setView);
|
||||||
fgSetArchivable("/sim/current-view/view-number", FALSE);
|
fgSetArchivable("/sim/current-view/view-number", false);
|
||||||
|
|
||||||
fgTie("/sim/current-view/axes/long", this,
|
fgTie("/sim/current-view/axes/long", this,
|
||||||
(double_getter)0, &FGViewMgr::setViewAxisLong);
|
(double_getter)0, &FGViewMgr::setViewAxisLong);
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
|
|
||||||
#include <simgear/constants.h>
|
#include <simgear/constants.h>
|
||||||
#include <simgear/debug/logstream.hxx>
|
#include <simgear/debug/logstream.hxx>
|
||||||
#include <simgear/math/vector.hxx>
|
|
||||||
#include <simgear/structure/exception.hxx>
|
#include <simgear/structure/exception.hxx>
|
||||||
#include <simgear/scene/model/modellib.hxx>
|
#include <simgear/scene/model/modellib.hxx>
|
||||||
#include <simgear/scene/tgdb/SGReaderWriterBTGOptions.hxx>
|
#include <simgear/scene/tgdb/SGReaderWriterBTGOptions.hxx>
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <simgear/math/SGMath.hxx>
|
#include <simgear/math/SGMath.hxx>
|
||||||
#include <simgear/math/vector.hxx>
|
|
||||||
#include <simgear/misc/sg_path.hxx>
|
#include <simgear/misc/sg_path.hxx>
|
||||||
#include <simgear/timing/sg_time.hxx>
|
#include <simgear/timing/sg_time.hxx>
|
||||||
|
|
||||||
|
@ -39,6 +38,37 @@
|
||||||
#include "sunsolver.hxx"
|
#include "sunsolver.hxx"
|
||||||
#include "tmp.hxx"
|
#include "tmp.hxx"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map i.e. project a vector onto a plane.
|
||||||
|
* @param normal (in) normal vector for the plane
|
||||||
|
* @param v0 (in) a point on the plane
|
||||||
|
* @param vec (in) the vector to map onto the plane
|
||||||
|
*/
|
||||||
|
static SGVec3f map_vec_onto_cur_surface_plane(const SGVec3f& normal,
|
||||||
|
const SGVec3f& v0,
|
||||||
|
const SGVec3f& vec)
|
||||||
|
{
|
||||||
|
// calculate a vector "u1" representing the shortest distance from
|
||||||
|
// the plane specified by normal and v0 to a point specified by
|
||||||
|
// "vec". "u1" represents both the direction and magnitude of
|
||||||
|
// this desired distance.
|
||||||
|
|
||||||
|
// u1 = ( (normal <dot> vec) / (normal <dot> normal) ) * normal
|
||||||
|
SGVec3f u1 = (dot(normal, vec) / dot(normal, normal)) * normal;
|
||||||
|
|
||||||
|
// calculate the vector "v" which is the vector "vec" mapped onto
|
||||||
|
// the plane specified by "normal" and "v0".
|
||||||
|
|
||||||
|
// v = v0 + vec - u1
|
||||||
|
SGVec3f v = v0 + vec - u1;
|
||||||
|
|
||||||
|
// Calculate the vector "result" which is "v" - "v0" which is a
|
||||||
|
// directional vector pointing from v0 towards v
|
||||||
|
|
||||||
|
// result = v - v0
|
||||||
|
return v - v0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// periodic time updater wrapper
|
// periodic time updater wrapper
|
||||||
void fgUpdateLocalTime() {
|
void fgUpdateLocalTime() {
|
||||||
|
@ -158,10 +188,9 @@ void fgUpdateSunPos( void ) {
|
||||||
// local plane representing "horizontal".
|
// local plane representing "horizontal".
|
||||||
|
|
||||||
// surface direction to go to head towards sun
|
// surface direction to go to head towards sun
|
||||||
SGVec3f surface_to_sun;
|
|
||||||
SGVec3f view_pos = toVec3f(v->get_view_pos());
|
SGVec3f view_pos = toVec3f(v->get_view_pos());
|
||||||
sgmap_vec_onto_cur_surface_plane( world_up.data(), view_pos.data(),
|
SGVec3f surface_to_sun = map_vec_onto_cur_surface_plane(world_up, view_pos, to_sun);
|
||||||
to_sun.data(), surface_to_sun.data() );
|
|
||||||
surface_to_sun = normalize(surface_to_sun);
|
surface_to_sun = normalize(surface_to_sun);
|
||||||
// cout << "(sg) Surface direction to sun is "
|
// cout << "(sg) Surface direction to sun is "
|
||||||
// << surface_to_sun[0] << ","
|
// << surface_to_sun[0] << ","
|
||||||
|
|
Loading…
Add table
Reference in a new issue