X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Fviewer.cxx;h=ef142a1a0e09f2caf2bdf27b49c38941ecf20f28;hb=4606f96e139204d5b2d76ee93c3b0c66885b5f5f;hp=b32e93d2d5b8a76727be50745a47986571e44ec3;hpb=3c7bdc31d9b0556430d75d75dffe780e5be96daa;p=flightgear.git diff --git a/src/Main/viewer.cxx b/src/Main/viewer.cxx index b32e93d2d..ef142a1a0 100644 --- a/src/Main/viewer.cxx +++ b/src/Main/viewer.cxx @@ -131,13 +131,14 @@ static void MakeVIEW_OFFSET( sgMat4 dst, //////////////////////////////////////////////////////////////////////// // Constructor... -FGViewer::FGViewer( fgViewType Type, bool from_model, int from_model_index, +FGViewer::FGViewer( fgViewType Type, bool from_model, int from_model_index, bool at_model, int at_model_index, - double x_offset_m, double y_offset_m, double z_offset_m, + double damp_roll, double damp_pitch, double damp_heading, + double x_offset_m, double y_offset_m, double z_offset_m, double heading_offset_deg, double pitch_offset_deg, double roll_offset_deg, double fov_deg, double target_x_offset_m, double target_y_offset_m, - double target_z_offset_m, double near_m ): + double target_z_offset_m, double near_m, bool internal ): _dirty(true), _lon_deg(0), _lat_deg(0), @@ -148,6 +149,10 @@ FGViewer::FGViewer( fgViewType Type, bool from_model, int from_model_index, _roll_deg(0), _pitch_deg(0), _heading_deg(0), + _damp_sync(0), + _damp_roll(0), + _damp_pitch(0), + _damp_heading(0), _scaling_type(FG_SCALING_MAX) { sgdZeroVec3(_absolute_view_pos); @@ -156,6 +161,16 @@ FGViewer::FGViewer( fgViewType Type, bool from_model, int from_model_index, _from_model_index = from_model_index; _at_model = at_model; _at_model_index = at_model_index; + + _internal = internal; + + if (damp_roll > 0.0) + _damp_roll = 1.0 / pow(10, fabs(damp_roll)); + if (damp_pitch > 0.0) + _damp_pitch = 1.0 / pow(10, fabs(damp_pitch)); + if (damp_heading > 0.0) + _damp_heading = 1.0 / pow(10, fabs(damp_heading)); + _x_offset_m = x_offset_m; _y_offset_m = y_offset_m; _z_offset_m = z_offset_m; @@ -217,6 +232,12 @@ FGViewer::setType ( int type ) _type = FG_LOOKAT; } +void +FGViewer::setInternal ( bool internal ) +{ + _internal = internal; +} + void FGViewer::setLongitude_deg (double lon_deg) { @@ -494,6 +515,7 @@ FGViewer::recalcOurOwnLocation (SGLocation * location, double lon_deg, double la double roll_deg, double pitch_deg, double heading_deg) { // update from our own data... + dampEyeData(roll_deg, pitch_deg, heading_deg); location->setPosition( lon_deg, lat_deg, alt_ft ); location->setOrientation( roll_deg, pitch_deg, heading_deg ); sgCopyMat4(LOCAL, @@ -706,6 +728,64 @@ FGViewer::copyLocationData() sgCopyVec3(_view_pos, _relative_view_pos); } +void +FGViewer::dampEyeData (double &roll_deg, double &pitch_deg, double &heading_deg) +{ + const double interval = 0.01; + + static FGViewer *last_view = 0; + if (last_view != this) { + _damp_sync = 0.0; + _damped_roll_deg = roll_deg; + _damped_pitch_deg = pitch_deg; + _damped_heading_deg = heading_deg; + last_view = this; + return; + } + + if (_damp_sync < interval) { + if (_damp_roll > 0.0) + roll_deg = _damped_roll_deg; + if (_damp_pitch > 0.0) + pitch_deg = _damped_pitch_deg; + if (_damp_heading > 0.0) + heading_deg = _damped_heading_deg; + return; + } + + while (_damp_sync >= interval) { + _damp_sync -= interval; + + double d; + if (_damp_roll > 0.0) { + d = _damped_roll_deg - roll_deg; + if (d >= 180.0) + _damped_roll_deg -= 360.0; + else if (d < -180.0) + _damped_roll_deg += 360.0; + roll_deg = _damped_roll_deg = roll_deg * _damp_roll + _damped_roll_deg * (1 - _damp_roll); + } + + if (_damp_pitch > 0.0) { + d = _damped_pitch_deg - pitch_deg; + if (d >= 180.0) + _damped_pitch_deg -= 360.0; + else if (d < -180.0) + _damped_pitch_deg += 360.0; + pitch_deg = _damped_pitch_deg = pitch_deg * _damp_pitch + _damped_pitch_deg * (1 - _damp_pitch); + } + + if (_damp_heading > 0.0) { + d = _damped_heading_deg - heading_deg; + if (d >= 180.0) + _damped_heading_deg -= 360.0; + else if (d < -180.0) + _damped_heading_deg += 360.0; + heading_deg = _damped_heading_deg = heading_deg * _damp_heading + _damped_heading_deg * (1 - _damp_heading); + } + } +} + double FGViewer::get_h_fov() { @@ -754,6 +834,8 @@ FGViewer::get_v_fov() void FGViewer::update (double dt) { + _damp_sync += dt; + int i; int dt_ms = int(dt * 1000); for ( i = 0; i < dt_ms; i++ ) {