]> git.mxchange.org Git - flightgear.git/commitdiff
The view frustum is defined in plib apps using calls to ssgSetFOV() and
authorcurt <curt>
Fri, 25 Feb 2005 19:41:53 +0000 (19:41 +0000)
committercurt <curt>
Fri, 25 Feb 2005 19:41:53 +0000 (19:41 +0000)
ssgSetNearFar().  This by default creates a symmetric view frustum which is
typically what an application wants.

However, to get control of the view frustum in order to build support for
asymmetric view frustums, we need to wrap these calls with a bit of our own
logic.

This set of changes wraps all calls to ssgSetFOV() and ssgSetNearFar() with
FGRenderer methods.

I also standardized how the FGRenderer class is handled in globals.[ch]xx.
This led to some cascading changes in a variety of source files.

As I was working my way through the changes, I fixed a few warnings along
the way.

14 files changed:
src/Airports/simple.cxx
src/Environment/environment_mgr.cxx
src/GUI/gui_funcs.cxx
src/GUI/gui_local.cxx
src/Main/globals.cxx
src/Main/globals.hxx
src/Main/renderer.cxx
src/Main/renderer.hxx
src/Model/acmodel.cxx
src/Network/ATC-Inputs.cxx
src/Network/ATC-Main.hxx
src/Network/ATC-Outputs.cxx
src/Scenery/hitlist.hxx
src/Time/light.cxx

index 6c1e711947b1afd27a50fc429a0ca9630956c269..5ea71ac06d2899356e1e69a9a88d9c8dda0729fa 100644 (file)
@@ -35,6 +35,9 @@
 #include <algorithm>
 
 #include <simgear/compiler.h>
+
+#include <plib/sg.h>
+
 #include <Environment/environment_mgr.hxx>
 #include <Environment/environment.hxx>
 #include <simgear/misc/sg_path.hxx>
@@ -113,7 +116,7 @@ string ScheduleTime::getName(time_t dayStart)
       //cerr << "Nr of items to process: " << nrItems << endl;
       if (nrItems > 0)
        {
-         for (int i = 0; i < start.size(); i++)
+         for (unsigned int i = 0; i < start.size(); i++)
            {
              //cerr << i << endl;
              if ((dayStart >= start[i]) && (dayStart <= end[i]))
@@ -209,8 +212,8 @@ void RunwayGroup::setActive(string aptId,
   FGRunway rwy;
   int activeRwys = rwyList.size(); // get the number of runways active
   int nrOfPreferences;
-  bool found = true;
-  double heading;
+  // bool found = true;
+  // double heading;
   double hdgDiff;
   double crossWind;
   double tailWind;
@@ -335,7 +338,7 @@ void RunwayGroup::getActive(int i, string *name, string *type)
     {
       return;
     }
-  if (nrActive == rwyList.size())
+  if (nrActive == (int)rwyList.size())
     {
       *name = rwyList[i].getRwyList(active);
       *type = rwyList[i].getType();
@@ -851,14 +854,14 @@ void FGAirport::getParking (int id, double *lat, double* lon, double *heading)
 
 FGParking *FGAirport::getParking(int i) 
 { 
-  if (i < parkings.size()) 
+  if (i < (int)parkings.size()) 
     return &(parkings[i]); 
   else 
     return 0;
 }
 string FGAirport::getParkingName(int i) 
 { 
-  if (i < parkings.size() && i >= 0) 
+  if (i < (int)parkings.size() && i >= 0) 
     return (parkings[i].getName()); 
   else 
     return string("overflow");
@@ -888,7 +891,7 @@ void  FGAirport::endXML () {
 }
 
 void  FGAirport::startElement (const char * name, const XMLAttributes &atts) {
-  const char * attval;
+  // const char *attval;
   FGParking park;
   //cout << "Start element " << name << endl;
   string attname;
index 172c41f1c110e905baa6c236a3a6c0944921b33d..d44d77e8973d94c29bfb041cad9f2fbe135362f0 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <Main/main.hxx>
 #include <Main/fg_props.hxx>
+#include <Main/renderer.hxx>
 #include <Aircraft/aircraft.hxx>
 
 #include "environment.hxx"
index 2764dce3cae3a890d28c482856cd5704cc71b8c9..26a9df4a47f4703896c47c9f5444a622fec7c099 100644 (file)
@@ -79,6 +79,7 @@
 #include <Main/fg_io.hxx>
 #include <Main/globals.hxx>
 #include <Main/fg_props.hxx>
+#include <Main/renderer.hxx>
 #include <Main/viewmgr.hxx>
 
 #if defined( WIN32 ) && !defined( __CYGWIN__ ) && !defined(__MINGW32__)
index adb75f656d2222f7bb40180e8c0614adc53eec12..1ec2b08ed5a24c29bdf8db1dbc67e9a1e7464ab9 100644 (file)
@@ -13,6 +13,7 @@
 #include <Main/globals.hxx>
 #include <Main/fg_init.hxx>
 #include <Main/fg_props.hxx>
+#include <Main/renderer.hxx>
 #include <Scenery/tilemgr.hxx>
 #include <Time/light.hxx>
 
index 487fa8fef3477f5d797d8fe762ffeb48eb671c9a..4a3377ed098447a8a7d901e92436a6d9d703cc56 100644 (file)
@@ -26,6 +26,7 @@
 #include <simgear/misc/sg_path.hxx>
 
 #include "globals.hxx"
+#include "renderer.hxx"
 #include "viewmgr.hxx"
 
 #include "fg_props.hxx"
index 6af7367660fd8d81f043032cd8750f3061c49212..1d81c18b6e47903ef6dd4af68a1ee1b4213648f2 100644 (file)
@@ -42,8 +42,6 @@ SG_USING_STD( string );
 typedef vector<string> string_list;
 
 
-#include "renderer.hxx"
-
 // Forward declarations
 
 // This file is included, directly or indirectly, almost everywhere in
@@ -88,6 +86,7 @@ class FGPanel;
 class FGTileMgr;
 class FGViewMgr;
 class FGViewer;
+class FGRenderer;
 
 
 /**
index 8e9cbe890e17f26b8cb03da3b2b228ce2ad50c98..4ba4649f050fa7c6be8e6334b9f54b416479daaa 100644 (file)
@@ -228,6 +228,7 @@ FGRenderer::init( void ) {
 }
 
 
+
 // Update all Visuals (redraws anything graphics related)
 void
 FGRenderer::update( bool refresh_camera_settings ) {
@@ -501,7 +502,7 @@ FGRenderer::update( bool refresh_camera_settings ) {
             scene_farplane = 120000.0f;
         }
 
-        ssgSetNearFar( scene_nearplane, scene_farplane );
+        setNearFar( scene_nearplane, scene_farplane );
 
         if ( draw_otw && skyblend ) {
             // draw the sky backdrop
@@ -517,8 +518,6 @@ FGRenderer::update( bool refresh_camera_settings ) {
         // draw the ssg scene
         glEnable( GL_DEPTH_TEST );
 
-        ssgSetNearFar( scene_nearplane, scene_farplane );
-
         if ( fgGetBool("/sim/rendering/wireframe") ) {
             // draw wire frame
             glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
@@ -565,7 +564,7 @@ FGRenderer::update( bool refresh_camera_settings ) {
         // the current view frustum will still be freed properly.
         static int counter = 0;
         counter++;
-        if (counter == 200) {
+        if (counter >= 200) {
             sgFrustum f;
             f.setFOV(360, 360);
                     // No need to put the near plane too close;
@@ -584,7 +583,9 @@ FGRenderer::update( bool refresh_camera_settings ) {
 
         // draw runway lighting
         glFogf (GL_FOG_DENSITY, rwy_exp2_punch_through);
-        ssgSetNearFar( scene_nearplane, scene_farplane );
+
+        // CLO - 02/25/2005 - DO WE NEED THIS extra fgSetNearFar()?
+        // fgSetNearFar( scene_nearplane, scene_farplane );
 
         if ( enhanced_lighting ) {
 
@@ -794,8 +795,8 @@ FGRenderer::resize( int width, int height ) {
           set_aspect_ratio((float)view_h / (float)width);
       }
 
-      ssgSetFOV( viewmgr->get_current_view()->get_h_fov(),
-                 viewmgr->get_current_view()->get_v_fov() );
+      setFOV( viewmgr->get_current_view()->get_h_fov(),
+              viewmgr->get_current_view()->get_v_fov() );
 
 #ifdef FG_USE_CLOUDS_3D
       sgClouds3d->Resize( viewmgr->get_current_view()->get_h_fov(),
@@ -808,4 +809,69 @@ FGRenderer::resize( int width, int height ) {
 }
 
 
+// These are wrapper functions around ssgSetNearFar() and ssgSetFOV()
+// which will post process and rewrite the resulting frustum if we
+// want to do asymmetric view frustums.
+
+static void fgHackFrustum() {
+
+    /* experiment in assymetric view frustums */
+    sgFrustum *f = ssgGetFrustum();
+    cout << " l = " << f->getLeft()
+         << " r = " << f->getRight()
+         << " b = " << f->getBot()
+         << " t = " << f->getTop()
+         << " n = " << f->getNear()
+         << " f = " << f->getFar()
+         << endl;
+    static double incr = 0.0;
+    double factor = (sin(incr) + 1.0) / 2.0; // map to [0-1]
+    double w = (f->getRight() - f->getLeft()) / 2.0;
+    double l = f->getLeft() + w * factor;
+    double r = l + w;
+    ssgSetFrustum(l, r, f->getBot(), f->getTop(), f->getNear(), f->getFar());
+    incr += 0.001;
+}
+
+
+// we need some static storage space for these values.  However, we
+// can't store it in a renderer class object because the functions
+// that manipulate these are static.  They are static so they can
+// interface to the display callback system.  There's probably a
+// better way, there has to be a better way, but I'm not seeing it
+// right now.
+static float width, height, near, far;
+
+
+/** FlightGear code should use this routine to set the FOV rather than
+ *  calling the ssg routine directly
+ */
+void FGRenderer::setFOV( float w, float h ) {
+    width = w;
+    height = h;
+
+    // fully specify the view frustum before hacking it (so we don't
+    // accumulate hacked effects
+    ssgSetFOV( w, h );
+    ssgSetNearFar( near, far );
+
+    fgHackFrustum();
+}
+
+
+/** FlightGear code should use this routine to set the Near/Far clip
+ *  planes rather than calling the ssg routine directly
+ */
+void FGRenderer::setNearFar( float n, float f ) {
+    near = n;
+    far = f;
+
+    // fully specify the view frustum before hacking it (so we don't
+    // accumulate hacked effects
+    ssgSetNearFar( n, f );
+    ssgSetFOV( width, height );
+
+    fgHackFrustum();
+}
+
 // end of renderer.cxx
index b19ae79ebca2d968d2d66c4105313b2bf3391540..ed9fe6df2640fa8982264b19d551ea068e6c6f4f 100644 (file)
@@ -18,6 +18,7 @@ extern bool glPointParameterIsSupported;
 class FGRenderer {
 
 public:
+
     FGRenderer();
     ~FGRenderer();
 
@@ -31,6 +32,18 @@ public:
     // renderer which needs to set the view frustum itself.
     static void update( bool refresh_camera_settings );
     inline static void update() { update( true ); }
+
+
+    /** FlightGear code should use this routine to set the FOV rather
+     *  than calling the ssg routine directly
+     */
+    static void setFOV( float w, float h );
+
+
+    /** FlightGear code should use this routine to set the Near/Far
+     *  clip planes rather than calling the ssg routine directly
+     */
+    static void setNearFar( float n, float f );
 };
 
 #endif
index cb96dd7e55b2ad6b56cdce7cd7f76784a2191f44..6bcba3913e8e773155fb39792b5f00d949fbcb18 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <Main/globals.hxx>
 #include <Main/fg_props.hxx>
+#include <Main/renderer.hxx>
 #include <Main/viewmgr.hxx>
 #include <Main/viewer.hxx>
 #include <Scenery/scenery.hxx>
@@ -120,7 +121,7 @@ FGAircraftModel::draw ()
   if (_aircraft->getVisible() && is_internal) {
     glClearDepth(1);
     glClear(GL_DEPTH_BUFFER_BIT);
-    ssgSetNearFar(_nearplane, _farplane);
+    FGRenderer::setNearFar(_nearplane, _farplane);
     ssgCullAndDraw(_scene);
     _selector->select(0);
   } else {
index 2f63b1be462098884fb150f2cc7bb33cfc6337fe..2828863ef4e26487f83792fd4ac6defca91ea632 100644 (file)
 #  include <fcntl.h>
 #endif
 
+#include <errno.h>
+#include <math.h>
+
 #include STL_STRING
 
 #include <simgear/debug/logstream.hxx>
+#include <simgear/misc/sg_path.hxx>
 
 #include <Main/fg_props.hxx>
 
index 538a56dc09195db0d98369fef756916b4c468ddf..64d0606b4a9be6cac7fc34dd95430214dbed3a3f 100644 (file)
@@ -30,6 +30,8 @@
 
 #include <plib/netChat.h>
 
+#include <simgear/misc/sg_path.hxx>
+
 #include <Main/fg_props.hxx>
 
 #include "protocol.hxx"
index 773d57d8265b4e4d8fffed46902a974cc6ae3691..5747a58b7a1a2bf534d5ff7263651d9aea42697a 100644 (file)
 #  include <fcntl.h>
 #endif
 
+#include <errno.h>
+#include <math.h>
+
 #include STL_STRING
 
 #include <simgear/debug/logstream.hxx>
+#include <simgear/misc/sg_path.hxx>
 
 #include <Main/fg_props.hxx>
 
@@ -382,7 +386,6 @@ bool FGATCOutput::open( int lock_fd ) {
 /////////////////////////////////////////////////////////////////////
 
 bool FGATCOutput::do_lamps() {
-
     if ( lamps_out_node != NULL ) {
         for ( int i = 0; i < lamps_out_node->nChildren(); ++i ) {
             // read the next config entry from the property tree
index 3ba8f3ba90602fa961bc5104d4cd6689f8def05c..e1faaac3ddae629e89fac2b03317788d5771005a 100644 (file)
 #include <simgear/compiler.h>
 
 #include <vector>
-
 SG_USING_STD(vector);
 
+#include <plib/ssg.h>
+
 class ssgEntity;
 class ssgBranch;
 
index 33a5a1856f17e347852604c2854f40aa90209120..117e0eb73c08208f7ae4154ee709b34f866908f5 100644 (file)
@@ -58,6 +58,7 @@ SG_USING_STD(string);
 #include <Main/main.hxx>
 #include <Main/globals.hxx>
 #include <Main/fg_props.hxx>
+#include <Main/renderer.hxx>
 #include <Main/viewer.hxx>
 
 #include "light.hxx"