From: curt Date: Tue, 5 Feb 2002 05:51:11 +0000 (+0000) Subject: 1. Tidies up h-FOV/v-FOV handling and makes window scale depend on X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=f149bcba97323b1ce343f6c66f0d94959f8840da;p=flightgear.git 1. Tidies up h-FOV/v-FOV handling and makes window scale depend on max(width, height) by default (easily changeable) rather than just width. (src/GUI/gui.cxx, src/Main/main.cxx, src/Main/viewer.cxx, src/Main/viewer.hxx) --- diff --git a/src/GUI/gui.cxx b/src/GUI/gui.cxx index abae19663..850423e32 100644 --- a/src/GUI/gui.cxx +++ b/src/GUI/gui.cxx @@ -525,8 +525,8 @@ void fgHiResDump() glMatrixMode(GL_MODELVIEW); glLoadIdentity(); ssgSetCamera( (sgVec4 *)globals->get_current_view()->get_VIEW() ); - float fov = globals->get_current_view()->get_fov(); - ssgSetFOV(fov, fov * globals->get_current_view()->get_fov_ratio()); + ssgSetFOV( globals->get_current_view()->get_h_fov(), + globals->get_current_view()->get_v_fov() ); // ssgSetNearFar( 10.0f, 120000.0f ); ssgSetNearFar( 0.5f, 1200000.0f ); diff --git a/src/Main/main.cxx b/src/Main/main.cxx index 75e9f05fb..291fa049c 100644 --- a/src/Main/main.cxx +++ b/src/Main/main.cxx @@ -668,8 +668,8 @@ void fgRenderFrame( void ) { // glMatrixMode( GL_PROJECTION ); // glLoadIdentity(); - float fov = globals->get_current_view()->get_fov(); - ssgSetFOV(fov, fov * globals->get_current_view()->get_fov_ratio()); + ssgSetFOV( globals->get_current_view()->get_h_fov(), + globals->get_current_view()->get_v_fov() ); double agl = current_aircraft.fdm_state->get_Altitude() * SG_FEET_TO_METER - scenery.get_cur_elev(); @@ -1309,8 +1309,8 @@ void fgReshape( int width, int height ) { fgSetInt("/sim/startup/xsize", width); fgSetInt("/sim/startup/ysize", height); - float fov = globals->get_current_view()->get_fov(); - ssgSetFOV(fov, fov * globals->get_current_view()->get_fov_ratio()); + ssgSetFOV( globals->get_current_view()->get_h_fov(), + globals->get_current_view()->get_v_fov() ); fgHUDReshape(); } diff --git a/src/Main/viewer.cxx b/src/Main/viewer.cxx index aafa39b0c..cf1e9073f 100644 --- a/src/Main/viewer.cxx +++ b/src/Main/viewer.cxx @@ -37,6 +37,7 @@ // Constructor FGViewer::FGViewer( void ): fov(55.0), + scalingType(FG_SCALING_MAX), view_offset(0.0), goal_view_offset(0.0), view_tilt(0.0), @@ -69,6 +70,47 @@ FGViewer::unbind () { } +double +FGViewer::get_h_fov() +{ + switch (scalingType) { + case FG_SCALING_WIDTH: // h_fov == fov + return fov; + case FG_SCALING_MAX: + if (aspect_ratio < 1.0) { + // h_fov == fov + return fov; + } else { + // v_fov == fov + return atan(tan(fov/2 * SG_DEGREES_TO_RADIANS) / aspect_ratio) * + SG_RADIANS_TO_DEGREES * 2; + } + default: + assert(false); + } +} + +double +FGViewer::get_v_fov() +{ + switch (scalingType) { + case FG_SCALING_WIDTH: // h_fov == fov + return atan(tan(fov/2 * SG_DEGREES_TO_RADIANS) * aspect_ratio) * + SG_RADIANS_TO_DEGREES * 2; + case FG_SCALING_MAX: + if (aspect_ratio < 1.0) { + // h_fov == fov + return atan(tan(fov/2 * SG_DEGREES_TO_RADIANS) * aspect_ratio) * + SG_RADIANS_TO_DEGREES * 2; + } else { + // v_fov == fov + return fov; + } + default: + assert(false); + } +} + void FGViewer::update (int dt) { diff --git a/src/Main/viewer.hxx b/src/Main/viewer.hxx index 64cee08de..62b2d6c4e 100644 --- a/src/Main/viewer.hxx +++ b/src/Main/viewer.hxx @@ -52,6 +52,13 @@ public: FG_HPR = 2 }; + enum fgScalingType { // nominal Field Of View actually applies to ... + FG_SCALING_WIDTH, // window width + FG_SCALING_MAX, // max(width, height) + // FG_SCALING_G_MEAN, // geometric_mean(width, height) + // FG_SCALING_INDEPENDENT // whole screen + }; + private: // flag forcing a recalc of derived view parameters @@ -60,13 +67,11 @@ private: protected: fgViewType _type; + fgScalingType scalingType; - // the field of view in the x (width) direction + // the nominal field of view (angle, in degrees) double fov; - // ratio of x and y fov's; fov(y) = fov(x) * fov_ratio - double fov_ratio; - // ratio of window width and height; height = width * aspect_ratio double aspect_ratio; @@ -143,13 +148,13 @@ public: ////////////////////////////////////////////////////////////////////// // setter functions ////////////////////////////////////////////////////////////////////// - inline void set_fov( double amount ) { fov = amount; } - // Don't provide set_fov_ratio explicitely. Use set_aspect_ratio - // instead. + + inline void set_fov( double fov_deg ) { + fov = fov_deg; + } + inline void set_aspect_ratio( double r ) { aspect_ratio = r; - fov_ratio = atan(tan(fov/2 * SG_DEGREES_TO_RADIANS) * aspect_ratio) * - SG_RADIANS_TO_DEGREES / (fov/2); } inline void set_view_offset( double a ) { set_dirty(); @@ -215,7 +220,6 @@ public: inline bool is_dirty() const { return dirty; } inline double get_fov() const { return fov; } inline double get_aspect_ratio() const { return aspect_ratio; } - inline double get_fov_ratio() const { return fov_ratio; } inline double get_view_offset() const { return view_offset; } inline bool get_reverse_view_offset() const { return reverse_view_offset; } inline double get_goal_view_offset() const { return goal_view_offset; } @@ -224,6 +228,10 @@ public: inline double *get_geod_view_pos() { return geod_view_pos; } inline float *get_pilot_offset() { return pilot_offset; } inline double get_sea_level_radius() const { return sea_level_radius; } + // Get horizontal field of view angle, in degrees. + double get_h_fov(); + // Get vertical field of view angle, in degrees. + double get_v_fov(); ////////////////////////////////////////////////////////////////////// // derived values accessor functions diff --git a/src/Sound/soundmgr.cxx b/src/Sound/soundmgr.cxx index 3bf3ea0e8..834632fba 100644 --- a/src/Sound/soundmgr.cxx +++ b/src/Sound/soundmgr.cxx @@ -64,14 +64,18 @@ FGSimpleSound::~FGSimpleSound() { // constructor FGSoundMgr::FGSoundMgr() { audio_sched = new slScheduler( 8000 ); - audio_sched -> setMaxConcurrent ( 6 ); + if ( audio_sched->notWorking() ) { + SG_LOG( SG_GENERAL, SG_ALERT, "Audio initialization failed!" ); + } else { + audio_sched -> setMaxConcurrent ( 6 ); - audio_mixer = new smMixer; + audio_mixer = new smMixer; - SG_LOG( SG_GENERAL, SG_INFO, - "Rate = " << audio_sched->getRate() - << " Bps = " << audio_sched->getBps() - << " Stereo = " << audio_sched->getStereo() ); + SG_LOG( SG_GENERAL, SG_INFO, + "Rate = " << audio_sched->getRate() + << " Bps = " << audio_sched->getBps() + << " Stereo = " << audio_sched->getStereo() ); + } } // destructor