1
0
Fork 0

The view frustum is defined in plib apps using calls to ssgSetFOV() and

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.
This commit is contained in:
curt 2005-02-25 19:41:53 +00:00
parent 7cc58da6a9
commit 40170cb722
14 changed files with 116 additions and 19 deletions

View 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;

View 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"

View 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__)

View 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>

View file

@ -26,6 +26,7 @@
#include <simgear/misc/sg_path.hxx>
#include "globals.hxx"
#include "renderer.hxx"
#include "viewmgr.hxx"
#include "fg_props.hxx"

View 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;
/**

View 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

View 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

View 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 {

View file

@ -33,9 +33,13 @@
# 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>

View file

@ -30,6 +30,8 @@
#include <plib/netChat.h>
#include <simgear/misc/sg_path.hxx>
#include <Main/fg_props.hxx>
#include "protocol.hxx"

View file

@ -33,9 +33,13 @@
# 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

View file

@ -12,9 +12,10 @@
#include <simgear/compiler.h>
#include <vector>
SG_USING_STD(vector);
#include <plib/ssg.h>
class ssgEntity;
class ssgBranch;

View 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"