1
0
Fork 0

ompute some vectors from the current view when they are used.

Simplifies the update hell in the viewer a bit.

Modified Files:
	src/Main/renderer.cxx src/Main/viewer.cxx src/Main/viewer.hxx
	src/Time/tmp.cxx
This commit is contained in:
frohlich 2009-03-07 13:32:41 +00:00 committed by Tim Moore
parent 85be5659a7
commit 30b05ee7a3
4 changed files with 19 additions and 45 deletions

View file

@ -623,15 +623,16 @@ FGRenderer::update( bool refresh_camera_settings ) {
static SGSkyState sstate;
sstate.view_pos = toVec3f(current__view->get_view_pos());
sstate.zero_elev = toVec3f(current__view->get_zero_elev());
sstate.view_up = current__view->get_world_up();
sstate.lon = current__view->getLongitude_deg()
* SGD_DEGREES_TO_RADIANS;
sstate.lat = current__view->getLatitude_deg()
* SGD_DEGREES_TO_RADIANS;
sstate.alt = current__view->getAltitudeASL_ft()
* SG_FEET_TO_METER;
SGVec3d viewPos = current__view->getViewPosition();
sstate.view_pos = toVec3f(viewPos);
SGGeod geodViewPos = SGGeod::fromCart(viewPos);
SGGeod geodZeroViewPos = SGGeod::fromGeodM(geodViewPos, 0);
sstate.zero_elev = toVec3f(SGVec3d::fromGeod(geodZeroViewPos));
SGQuatd hlOr = SGQuatd::fromLonLat(geodViewPos);
sstate.view_up = toVec3f(hlOr.backTransform(-SGVec3d::e3()));
sstate.lon = geodViewPos.getLongitudeRad();
sstate.lat = geodViewPos.getLatitudeRad();
sstate.alt = geodViewPos.getElevationM();
sstate.spin = l->get_sun_rotation();
sstate.gst = globals->get_time_params()->getGst();
sstate.sun_ra = globals->get_ephem()->getSunRightAscension();

View file

@ -417,15 +417,6 @@ FGViewer::recalc ()
recalcLookAt();
}
SGGeod geodEyePoint = SGGeod::fromCart(_absolute_view_pos);
geodEyePoint.setElevationM(0);
_zero_elev = SGVec3d::fromGeod(geodEyePoint);
SGQuatd hlOr = SGQuatd::fromLonLat(geodEyePoint);
_surface_south = toVec3f(hlOr.backTransform(-SGVec3d::e1()));
_surface_east = toVec3f(hlOr.backTransform(SGVec3d::e2()));
_world_up = toVec3f(hlOr.backTransform(-SGVec3d::e3()));
// Update viewer's postion data for the eye location...
_lon_deg = _location->getLongitude_deg();
_lat_deg = _location->getLatitude_deg();

View file

@ -216,15 +216,6 @@ public:
// Vectors and positions...
// Get zero elev
const SGVec3d& get_zero_elev() {if ( _dirty ) { recalc(); } return _zero_elev; }
// Get world up vector
const SGVec3f& get_world_up() {if ( _dirty ) { recalc(); } return _world_up; }
// Get surface east vector
const SGVec3f& get_surface_east() { if ( _dirty ) { recalc(); } return _surface_east; }
// Get surface south vector
const SGVec3f& get_surface_south() {if ( _dirty ) { recalc(); } return _surface_south; }
const SGVec3d& get_view_pos() { if ( _dirty ) { recalc(); } return _absolute_view_pos; }
const SGVec3d& getViewPosition() { if ( _dirty ) { recalc(); } return _absolute_view_pos; }
const SGQuatd& getViewOrientation() { if ( _dirty ) { recalc(); } return mViewOrientation; }
@ -354,20 +345,6 @@ private:
// multiplied into the aspect_ratio to get the actual vertical fov
double _aspect_ratio_multiplier;
// cartesion coordinates of current lon/lat if at sea level
SGVec3d _zero_elev;
// surface vector heading south
SGVec3f _surface_south;
// surface vector heading east (used to unambiguously align sky
// with sun)
SGVec3f _surface_east;
// world up vector (normal to the plane tangent to the earth's
// surface at the spot we are directly above
SGVec3f _world_up;
// camera group controled by this view
osg::ref_ptr<flightgear::CameraGroup> _cameraGroup;
//////////////////////////////////////////////////////////////////

View file

@ -89,7 +89,10 @@ void fgUpdateSunPos( void ) {
l->sun_vec_inv() = - l->sun_vec();
// calculate the sun's relative angle to local up
SGVec3f nup(normalize(v->get_world_up()));
SGVec3d viewPos = v->get_view_pos();
SGQuatd hlOr = SGQuatd::fromLonLat(SGGeod::fromCart(viewPos));
SGVec3f nup(toVec3f(hlOr.backTransform(-SGVec3d::e3())));
SGVec3f nsun(toVec3f(normalize(l->get_sunpos())));
// cout << "nup = " << nup[0] << "," << nup[1] << ","
// << nup[2] << endl;
@ -112,7 +115,7 @@ void fgUpdateSunPos( void ) {
// earth's surface the sun is directly over, map into onto the
// local plane representing "horizontal".
SGVec3f world_up = v->get_world_up();
SGVec3f world_up = toVec3f(hlOr.backTransform(-SGVec3d::e3()));
SGVec3f view_pos = toVec3f(v->get_view_pos());
// surface direction to go to head towards sun
SGVec3f surface_to_sun;
@ -130,13 +133,15 @@ void fgUpdateSunPos( void ) {
// v->get_surface_east(). We do this so we can sort out the
// acos() ambiguity. I wish I could think of a more efficient
// way. :-(
float east_dot = dot( surface_to_sun, v->get_surface_east() );
SGVec3f surface_east(toVec3f(hlOr.backTransform(SGVec3d::e2())));
float east_dot = dot( surface_to_sun, surface_east );
// cout << " East dot product = " << east_dot << endl;
// calculate the angle between v->surface_to_sun and
// v->surface_south. this is how much we have to rotate the sky
// for it to align with the sun
float dot_ = dot( surface_to_sun, v->get_surface_south() );
SGVec3f surface_south(toVec3f(hlOr.backTransform(-SGVec3d::e1())));
float dot_ = dot( surface_to_sun, surface_south );
// cout << " Dot product = " << dot << endl;
if (dot_ > 1.0) {