// Written by Curtis Olson, started May 1997.
// This file contains parts of main.cxx prior to october 2004
//
-// Copyright (C) 1997 - 2002 Curtis L. Olson - curt@flightgear.org
+// Copyright (C) 1997 - 2002 Curtis L. Olson - http://www.flightgear.org/~curt
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
#include <simgear/math/sg_random.h>
#include <simgear/scene/model/modellib.hxx>
#include <simgear/scene/model/model.hxx>
-
-#ifdef FG_USE_CLOUDS_3D
-# include <simgear/scene/sky/clouds3d/SkySceneLoader.hpp>
-# include <simgear/scene/sky/clouds3d/SkyUtil.hpp>
+#ifdef FG_JPEG_SERVER
+#include <simgear/screen/jpgfactory.hxx>
#endif
+#include <simgear/environment/visual_enviro.hxx>
+
+#include <simgear/scene/model/shadowvolume.hxx>
+
#include <Scenery/tileentry.hxx>
#include <Time/light.hxx>
#include <Time/light.hxx>
#include <Aircraft/aircraft.hxx>
+// #include <Aircraft/replay.hxx>
#include <Cockpit/panel.hxx>
#include <Cockpit/cockpit.hxx>
-#include <Cockpit/radiostack.hxx>
#include <Cockpit/hud.hxx>
#include <Model/panelnode.hxx>
#include <Model/modelmgr.hxx>
#include <Scenery/scenery.hxx>
#include <Scenery/tilemgr.hxx>
#include <ATC/ATCdisplay.hxx>
-#include <Replay/replay.hxx>
#include <GUI/new_gui.hxx>
#include "splash.hxx"
// Sky structures
SGSky *thesky;
-#ifdef FG_USE_CLOUDS_3D
- SkySceneLoader *sgClouds3d;
- bool _bcloud_orig = true;
-#endif
-
// hack
sgMat4 copy_of_ssgOpenGLAxisSwapMatrix =
{
ssgSimpleState *hud_and_panel;
ssgSimpleState *menus;
+SGShadowVolume *shadows;
+
+FGRenderer::FGRenderer()
+{
+#ifdef FG_JPEG_SERVER
+ jpgRenderFrame = FGRenderer::update;
+#endif
+}
+
+FGRenderer::~FGRenderer()
+{
+#ifdef FG_JPEG_SERVER
+ jpgRenderFrame = NULL;
+#endif
+}
+
void
FGRenderer::build_states( void ) {
menus->disable( GL_CULL_FACE );
menus->disable( GL_TEXTURE_2D );
menus->enable( GL_BLEND );
+
+ shadows = new SGShadowVolume( globals->get_scenery()->get_scene_graph() );
+ shadows->init( fgGetNode("/sim/rendering", true) );
+ shadows->addOccluder( globals->get_scenery()->get_aircraft_branch(), SGShadowVolume::occluderTypeAircraft );
+
}
}
+
// Update all Visuals (redraws anything graphics related)
void
FGRenderer::update( bool refresh_camera_settings ) {
bool scenery_loaded = fgGetBool("sim/sceneryloaded") || fgGetBool("sim/sceneryloaded-override");
+
+ if ( idle_state < 1000 || !scenery_loaded ) {
+ // still initializing, draw the splash screen
+ fgSplashUpdate(1.0);
+
+ // Keep resetting sim time while the sim is initializing
+ globals->set_sim_time_sec( 0.0 );
+ SGAnimation::set_sim_time_sec( 0.0 );
+ return;
+ }
+// return;
+
+ // TODO:TEST only, don't commit that !!
+// sgFXperFrameInit();
+
+ extern void sgShaderFrameInit(double delta_time_sec);
+ sgShaderFrameInit(delta_time_sec);
+
bool draw_otw = fgGetBool("/sim/rendering/draw-otw");
bool skyblend = fgGetBool("/sim/rendering/skyblend");
bool enhanced_lighting = fgGetBool("/sim/rendering/enhanced-lighting");
bool distance_attenuation = fgGetBool("/sim/rendering/distance-attenuation");
+ bool volumetric_clouds = sgEnviro.get_clouds_enable_state();
#ifdef FG_ENABLE_MULTIPASS_CLOUDS
bool multi_pass_clouds = fgGetBool("/sim/rendering/multi-pass-clouds") &&
+ !volumetric_clouds &&
!SGCloudLayer::enable_bump_mapping; // ugly artefact now
#else
bool multi_pass_clouds = false;
// GLfloat mat_shininess[] = { 10.0 };
GLbitfield clear_mask;
- if ( idle_state != 1000 || !scenery_loaded ) {
- // still initializing, draw the splash screen
- if ( fgGetBool("/sim/startup/splash-screen") ) {
- fgSplashUpdate(0.0, 1.0);
- }
- // Keep resetting sim time while the sim is initializing
- globals->set_sim_time_sec( 0.0 );
- SGAnimation::set_sim_time_sec( 0.0 );
- } else {
- // idle_state is now 1000 meaning we've finished all our
- // initializations and are running the main loop, so this will
- // now work without seg faulting the system.
+ // idle_state is now 1000 meaning we've finished all our
+ // initializations and are running the main loop, so this will
+ // now work without seg faulting the system.
- FGViewer *current__view = globals->get_current_view();
+ FGViewer *current__view = globals->get_current_view();
- // calculate our current position in cartesian space
- globals->get_scenery()->set_center( globals->get_scenery()->get_next_center() );
+ // calculate our current position in cartesian space
+ Point3D cntr = globals->get_scenery()->get_next_center();
+ globals->get_scenery()->set_center(cntr);
+ // Force update of center dependent values ...
+ current__view->set_dirty();
- if ( refresh_camera_settings ) {
- // update view port
- resize( fgGetInt("/sim/startup/xsize"),
- fgGetInt("/sim/startup/ysize") );
+ if ( refresh_camera_settings ) {
+ // update view port
+ resize( fgGetInt("/sim/startup/xsize"),
+ fgGetInt("/sim/startup/ysize") );
- // Tell GL we are switching to model view parameters
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- ssgSetCamera( (sgVec4 *)current__view->get_VIEW() );
- }
+ // Tell GL we are switching to model view parameters
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ ssgSetCamera( (sgVec4 *)current__view->get_VIEW() );
+ }
- if ( fgGetBool("/sim/rendering/clouds3d") ) {
- glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT );
- cloud3d_imposter_state->force();
- glDisable( GL_FOG );
- glColor4f( 1.0, 1.0, 1.0, 1.0 );
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_BLEND);
- glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA ) ;
-
-#ifdef FG_USE_CLOUDS_3D
- if ( _bcloud_orig ) {
- Point3D c = globals->get_scenery()->get_center();
- sgClouds3d->Set_Cloud_Orig( &c );
- _bcloud_orig = false;
- }
- sgClouds3d->Update( current__view->get_absolute_view_pos() );
-#endif
- glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
- glDisable(GL_DEPTH_TEST);
- }
+ clear_mask = GL_DEPTH_BUFFER_BIT;
+ if ( fgGetBool("/sim/rendering/wireframe") ) {
+ clear_mask |= GL_COLOR_BUFFER_BIT;
+ }
- clear_mask = GL_DEPTH_BUFFER_BIT;
- if ( fgGetBool("/sim/rendering/wireframe") ) {
- clear_mask |= GL_COLOR_BUFFER_BIT;
+ if ( skyblend ) {
+ if ( fgGetBool("/sim/rendering/textures") ) {
+ // glClearColor(black[0], black[1], black[2], black[3]);
+ glClearColor(l->adj_fog_color()[0], l->adj_fog_color()[1],
+ l->adj_fog_color()[2], l->adj_fog_color()[3]);
+ clear_mask |= GL_COLOR_BUFFER_BIT;
}
+ } else {
+ glClearColor(l->sky_color()[0], l->sky_color()[1],
+ l->sky_color()[2], l->sky_color()[3]);
+ clear_mask |= GL_COLOR_BUFFER_BIT;
+ }
+ if ( multi_pass_clouds && draw_clouds ) {
+ glClearStencil( 0 );
+ clear_mask |= GL_STENCIL_BUFFER_BIT;
+ }
+ glClear( clear_mask );
- if ( skyblend ) {
- if ( fgGetBool("/sim/rendering/textures") ) {
- // glClearColor(black[0], black[1], black[2], black[3]);
- glClearColor(l->adj_fog_color()[0], l->adj_fog_color()[1],
- l->adj_fog_color()[2], l->adj_fog_color()[3]);
- clear_mask |= GL_COLOR_BUFFER_BIT;
- }
+ // set the opengl state to known default values
+ default_state->force();
+
+ // update fog params if visibility has changed
+ double visibility_meters = fgGetDouble("/environment/visibility-m");
+ thesky->set_visibility(visibility_meters);
+
+ thesky->modify_vis( cur_fdm_state->get_Altitude() * SG_FEET_TO_METER,
+ ( global_multi_loop * fgGetInt("/sim/speed-up") )
+ / (double)fgGetInt("/sim/model-hz") );
+
+ // Set correct opengl fog density
+ glFogf (GL_FOG_DENSITY, fog_exp2_density);
+
+ // update the sky dome
+ if ( skyblend ) {
+ /*
+ SG_LOG( SG_GENERAL, SG_BULK, "thesky->repaint() sky_color = "
+ << l->sky_color()[0] << " "
+ << l->sky_color()[1] << " "
+ << l->sky_color()[2] << " "
+ << l->sky_color()[3] );
+ SG_LOG( SG_GENERAL, SG_BULK, " fog = "
+ << l->fog_color()[0] << " "
+ << l->fog_color()[1] << " "
+ << l->fog_color()[2] << " "
+ << l->fog_color()[3] );
+ SG_LOG( SG_GENERAL, SG_BULK,
+ " sun_angle = " << l->sun_angle
+ << " moon_angle = " << l->moon_angle );
+ */
+
+ static SGSkyColor scolor;
+// FGLight *l = (FGLight *)(globals->get_subsystem("lighting"));
+
+ scolor.sky_color = l->sky_color();
+ scolor.fog_color = l->adj_fog_color();
+ scolor.cloud_color = l->cloud_color();
+ scolor.sun_angle = l->get_sun_angle();
+ scolor.moon_angle = l->get_moon_angle();
+ scolor.nplanets = globals->get_ephem()->getNumPlanets();
+ scolor.nstars = globals->get_ephem()->getNumStars();
+ scolor.planet_data = globals->get_ephem()->getPlanets();
+ scolor.star_data = globals->get_ephem()->getStars();
+
+ thesky->repaint( scolor );
+
+ /*
+ SG_LOG( SG_GENERAL, SG_BULK,
+ "thesky->reposition( view_pos = " << view_pos[0] << " "
+ << view_pos[1] << " " << view_pos[2] );
+ SG_LOG( SG_GENERAL, SG_BULK,
+ " zero_elev = " << zero_elev[0] << " "
+ << zero_elev[1] << " " << zero_elev[2]
+ << " lon = " << cur_fdm_state->get_Longitude()
+ << " lat = " << cur_fdm_state->get_Latitude() );
+ SG_LOG( SG_GENERAL, SG_BULK,
+ " sun_rot = " << l->get_sun_rotation
+ << " gst = " << SGTime::cur_time_params->getGst() );
+ SG_LOG( SG_GENERAL, SG_BULK,
+ " sun ra = " << globals->get_ephem()->getSunRightAscension()
+ << " sun dec = " << globals->get_ephem()->getSunDeclination()
+ << " moon ra = " << globals->get_ephem()->getMoonRightAscension()
+ << " moon dec = " << globals->get_ephem()->getMoonDeclination() );
+ */
+
+ // The sun and moon distances are scaled down versions
+ // of the actual distance to get both the moon and the sun
+ // within the range of the far clip plane.
+ // Moon distance: 384,467 kilometers
+ // Sun distance: 150,000,000 kilometers
+ double sun_horiz_eff, moon_horiz_eff;
+ if (fgGetBool("/sim/rendering/horizon-effect")) {
+ sun_horiz_eff = 0.67+pow(0.5+cos(l->get_sun_angle())*2/2, 0.33)/3;
+ moon_horiz_eff = 0.67+pow(0.5+cos(l->get_moon_angle())*2/2, 0.33)/3;
} else {
- glClearColor(l->sky_color()[0], l->sky_color()[1],
- l->sky_color()[2], l->sky_color()[3]);
- clear_mask |= GL_COLOR_BUFFER_BIT;
+ sun_horiz_eff = moon_horiz_eff = 1.0;
}
- if ( multi_pass_clouds && draw_clouds ) {
- glClearStencil( 0 );
- clear_mask |= GL_STENCIL_BUFFER_BIT;
- }
- glClear( clear_mask );
-
- // set the opengl state to known default values
- default_state->force();
-
- // update fog params if visibility has changed
- double visibility_meters = fgGetDouble("/environment/visibility-m");
- thesky->set_visibility(visibility_meters);
-
- thesky->modify_vis( cur_fdm_state->get_Altitude() * SG_FEET_TO_METER,
- ( global_multi_loop * fgGetInt("/sim/speed-up") )
- / (double)fgGetInt("/sim/model-hz") );
-
- // Set correct opengl fog density
- glFogf (GL_FOG_DENSITY, fog_exp2_density);
-
- // update the sky dome
- if ( skyblend ) {
- /*
- SG_LOG( SG_GENERAL, SG_BULK, "thesky->repaint() sky_color = "
- << l->sky_color()[0] << " "
- << l->sky_color()[1] << " "
- << l->sky_color()[2] << " "
- << l->sky_color()[3] );
- SG_LOG( SG_GENERAL, SG_BULK, " fog = "
- << l->fog_color()[0] << " "
- << l->fog_color()[1] << " "
- << l->fog_color()[2] << " "
- << l->fog_color()[3] );
- SG_LOG( SG_GENERAL, SG_BULK,
- " sun_angle = " << l->sun_angle
- << " moon_angle = " << l->moon_angle );
- */
-
- static SGSkyColor scolor;
- FGLight *l = (FGLight *)(globals->get_subsystem("lighting"));
-
- scolor.sky_color = l->sky_color();
- scolor.fog_color = l->adj_fog_color();
- scolor.cloud_color = l->cloud_color();
- scolor.sun_angle = l->get_sun_angle();
- scolor.moon_angle = l->get_moon_angle();
- scolor.nplanets = globals->get_ephem()->getNumPlanets();
- scolor.nstars = globals->get_ephem()->getNumStars();
- scolor.planet_data = globals->get_ephem()->getPlanets();
- scolor.star_data = globals->get_ephem()->getStars();
-
- thesky->repaint( scolor );
-
- /*
- SG_LOG( SG_GENERAL, SG_BULK,
- "thesky->reposition( view_pos = " << view_pos[0] << " "
- << view_pos[1] << " " << view_pos[2] );
- SG_LOG( SG_GENERAL, SG_BULK,
- " zero_elev = " << zero_elev[0] << " "
- << zero_elev[1] << " " << zero_elev[2]
- << " lon = " << cur_fdm_state->get_Longitude()
- << " lat = " << cur_fdm_state->get_Latitude() );
- SG_LOG( SG_GENERAL, SG_BULK,
- " sun_rot = " << l->get_sun_rotation
- << " gst = " << SGTime::cur_time_params->getGst() );
- SG_LOG( SG_GENERAL, SG_BULK,
- " sun ra = " << globals->get_ephem()->getSunRightAscension()
- << " sun dec = " << globals->get_ephem()->getSunDeclination()
- << " moon ra = " << globals->get_ephem()->getMoonRightAscension()
- << " moon dec = " << globals->get_ephem()->getMoonDeclination() );
- */
-
- // The sun and moon distances are scaled down versions
- // of the actual distance to get both the moon and the sun
- // within the range of the far clip plane.
- // Moon distance: 384,467 kilometers
- // Sun distance: 150,000,000 kilometers
- double sun_horiz_eff, moon_horiz_eff;
- if (fgGetBool("/sim/rendering/horizon-effect")) {
- sun_horiz_eff = 0.67+pow(0.5+cos(l->get_sun_angle())*2/2, 0.33)/3;
- moon_horiz_eff = 0.67+pow(0.5+cos(l->get_moon_angle())*2/2, 0.33)/3;
- } else {
- sun_horiz_eff = moon_horiz_eff = 1.0;
- }
- static SGSkyState sstate;
-
- sstate.view_pos = current__view->get_view_pos();
- sstate.zero_elev = 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;
- sstate.spin = l->get_sun_rotation();
- sstate.gst = globals->get_time_params()->getGst();
- sstate.sun_ra = globals->get_ephem()->getSunRightAscension();
- sstate.sun_dec = globals->get_ephem()->getSunDeclination();
- sstate.sun_dist = 50000.0 * sun_horiz_eff;
- sstate.moon_ra = globals->get_ephem()->getMoonRightAscension();
- sstate.moon_dec = globals->get_ephem()->getMoonDeclination();
- sstate.moon_dist = 40000.0 * moon_horiz_eff;
-
- thesky->reposition( sstate, delta_time_sec );
- }
+ static SGSkyState sstate;
+
+ sstate.view_pos = current__view->get_view_pos();
+ sstate.zero_elev = 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;
+ sstate.spin = l->get_sun_rotation();
+ sstate.gst = globals->get_time_params()->getGst();
+ sstate.sun_ra = globals->get_ephem()->getSunRightAscension();
+ sstate.sun_dec = globals->get_ephem()->getSunDeclination();
+ sstate.sun_dist = 50000.0 * sun_horiz_eff;
+ sstate.moon_ra = globals->get_ephem()->getMoonRightAscension();
+ sstate.moon_dec = globals->get_ephem()->getMoonDeclination();
+ sstate.moon_dist = 40000.0 * moon_horiz_eff;
+
+ thesky->reposition( sstate, delta_time_sec );
+
+ shadows->setupShadows(
+ current__view->getLongitude_deg(),
+ current__view->getLatitude_deg(),
+ globals->get_time_params()->getGst(),
+ globals->get_ephem()->getSunRightAscension(),
+ globals->get_ephem()->getSunDeclination(),
+ l->get_sun_angle());
+ }
- glEnable( GL_DEPTH_TEST );
- if ( strcmp(fgGetString("/sim/rendering/fog"), "disabled") ) {
- glEnable( GL_FOG );
- glFogi( GL_FOG_MODE, GL_EXP2 );
- glFogfv( GL_FOG_COLOR, l->adj_fog_color() );
- }
+ glEnable( GL_DEPTH_TEST );
+ if ( strcmp(fgGetString("/sim/rendering/fog"), "disabled") ) {
+ glEnable( GL_FOG );
+ glFogi( GL_FOG_MODE, GL_EXP2 );
+ glFogfv( GL_FOG_COLOR, l->adj_fog_color() );
+ }
+
+ // set sun/lighting parameters
+ ssgGetLight( 0 ) -> setPosition( l->sun_vec() );
- // set sun/lighting parameters
- ssgGetLight( 0 ) -> setPosition( l->sun_vec() );
+ // GL_LIGHT_MODEL_AMBIENT has a default non-zero value so if
+ // we only update GL_AMBIENT for our lights we will never get
+ // a completely dark scene. So, we set GL_LIGHT_MODEL_AMBIENT
+ // explicitely to black.
+ glLightModelfv( GL_LIGHT_MODEL_AMBIENT, black );
- // GL_LIGHT_MODEL_AMBIENT has a default non-zero value so if
- // we only update GL_AMBIENT for our lights we will never get
- // a completely dark scene. So, we set GL_LIGHT_MODEL_AMBIENT
- // explicitely to black.
- glLightModelfv( GL_LIGHT_MODEL_AMBIENT, black );
+ ssgGetLight( 0 ) -> setColour( GL_AMBIENT, l->scene_ambient() );
+ ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, l->scene_diffuse() );
+ ssgGetLight( 0 ) -> setColour( GL_SPECULAR, l->scene_specular() );
- ssgGetLight( 0 ) -> setColour( GL_AMBIENT, l->scene_ambient() );
- ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, l->scene_diffuse() );
- ssgGetLight( 0 ) -> setColour( GL_SPECULAR, l->scene_specular() );
+ sgEnviro.setLight(l->adj_fog_color());
- // texture parameters
- // glEnable( GL_TEXTURE_2D );
- glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ;
- glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ) ;
+ // texture parameters
+ // glEnable( GL_TEXTURE_2D );
+ glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ;
+ glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ) ;
- double agl =
- current_aircraft.fdm_state->get_Altitude() * SG_FEET_TO_METER
- - globals->get_scenery()->get_cur_elev();
+ double agl = current__view->getAltitudeASL_ft()*SG_FEET_TO_METER
+ - current__view->getSGLocation()->get_cur_elev_m();
- if ( agl > 10.0 ) {
- scene_nearplane = 10.0f;
- scene_farplane = 120000.0f;
- } else {
- scene_nearplane = groundlevel_nearplane->getDoubleValue();
- scene_farplane = 120000.0f;
- }
+ if ( agl > 10.0 ) {
+ scene_nearplane = 10.0f;
+ scene_farplane = 120000.0f;
+ } else {
+ scene_nearplane = groundlevel_nearplane->getDoubleValue();
+ scene_farplane = 120000.0f;
+ }
- ssgSetNearFar( scene_nearplane, scene_farplane );
+ setNearFar( scene_nearplane, scene_farplane );
- if ( draw_otw && skyblend ) {
- // draw the sky backdrop
+ sgEnviro.startOfFrame(current__view->get_view_pos(),
+ current__view->get_world_up(),
+ current__view->getLongitude_deg(),
+ current__view->getLatitude_deg(),
+ current__view->getAltitudeASL_ft() * SG_FEET_TO_METER,
+ delta_time_sec);
- // we need a white diffuse light for the phase of the moon
- ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, white );
- thesky->preDraw( cur_fdm_state->get_Altitude() * SG_FEET_TO_METER,
- fog_exp2_density );
- // return to the desired diffuse color
- ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, l->scene_diffuse() );
- }
+ if ( draw_otw && skyblend ) {
+ // draw the sky backdrop
- // draw the ssg scene
- glEnable( GL_DEPTH_TEST );
+ // we need a white diffuse light for the phase of the moon
+ ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, white );
+ thesky->preDraw( cur_fdm_state->get_Altitude() * SG_FEET_TO_METER,
+ fog_exp2_density );
+ // return to the desired diffuse color
+ ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, l->scene_diffuse() );
+ }
- ssgSetNearFar( scene_nearplane, scene_farplane );
+ // draw the ssg scene
+ glEnable( GL_DEPTH_TEST );
- if ( fgGetBool("/sim/rendering/wireframe") ) {
- // draw wire frame
- glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
- }
- if ( draw_otw ) {
- if ( draw_clouds ) {
+ if ( fgGetBool("/sim/rendering/wireframe") ) {
+ // draw wire frame
+ glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
+ }
+ if ( draw_otw ) {
+ if ( draw_clouds ) {
- // Draw the terrain
- FGTileMgr::set_tile_filter( true );
- sgSetModelFilter( false );
- globals->get_aircraft_model()->select( false );
- ssgCullAndDraw( globals->get_scenery()->get_scene_graph() );
+ // Draw the terrain
+ FGTileMgr::set_tile_filter( true );
+ sgSetModelFilter( false );
+ globals->get_aircraft_model()->select( false );
+ ssgCullAndDraw( globals->get_scenery()->get_scene_graph() );
- // Disable depth buffer update, draw the clouds
- glDepthMask( GL_FALSE );
+ // Disable depth buffer update, draw the clouds
+ glDepthMask( GL_FALSE );
+ if( !volumetric_clouds )
thesky->drawUpperClouds();
- if ( multi_pass_clouds ) {
- thesky->drawLowerClouds();
- }
- glDepthMask( GL_TRUE );
-
- if ( multi_pass_clouds ) {
- // Draw the objects except the aircraft
- // and update the stencil buffer with 1
- glEnable( GL_STENCIL_TEST );
- glStencilFunc( GL_ALWAYS, 1, 1 );
- glStencilOp( GL_KEEP, GL_KEEP, GL_REPLACE );
- }
- FGTileMgr::set_tile_filter( false );
- sgSetModelFilter( true );
- ssgCullAndDraw( globals->get_scenery()->get_scene_graph() );
- } else {
- FGTileMgr::set_tile_filter( true );
- sgSetModelFilter( true );
- globals->get_aircraft_model()->select( false );
- ssgCullAndDraw( globals->get_scenery()->get_scene_graph() );
+ if ( multi_pass_clouds ) {
+ thesky->drawLowerClouds();
}
- }
+ glDepthMask( GL_TRUE );
- // This is a bit kludgy. Every 200 frames, do an extra
- // traversal of the scene graph without drawing anything, but
- // with the field-of-view set to 360x360 degrees. This
- // ensures that out-of-range random objects that are not in
- // the current view frustum will still be freed properly.
- static int counter = 0;
- counter++;
- if (counter == 200) {
- sgFrustum f;
- f.setFOV(360, 360);
- // No need to put the near plane too close;
- // this way, at least the aircraft can be
- // culled.
- f.setNearFar(1000, 1000000);
- sgMat4 m;
- ssgGetModelviewMatrix(m);
+ if ( multi_pass_clouds ) {
+ // Draw the objects except the aircraft
+ // and update the stencil buffer with 1
+ glEnable( GL_STENCIL_TEST );
+ glStencilFunc( GL_ALWAYS, 1, 1 );
+ glStencilOp( GL_KEEP, GL_KEEP, GL_REPLACE );
+ }
+ FGTileMgr::set_tile_filter( false );
+ sgSetModelFilter( true );
+ ssgCullAndDraw( globals->get_scenery()->get_scene_graph() );
+ } else {
FGTileMgr::set_tile_filter( true );
sgSetModelFilter( true );
- globals->get_scenery()->get_scene_graph()->cull(&f, m, true);
- counter = 0;
+ globals->get_aircraft_model()->select( false );
+ ssgCullAndDraw( globals->get_scenery()->get_scene_graph() );
}
+ }
- // change state for lighting here
-
- // draw runway lighting
- glFogf (GL_FOG_DENSITY, rwy_exp2_punch_through);
- ssgSetNearFar( scene_nearplane, scene_farplane );
-
- if ( enhanced_lighting ) {
-
- // Enable states for drawing points with GL_extension
- glEnable(GL_POINT_SMOOTH);
+ // This is a bit kludgy. Every 200 frames, do an extra
+ // traversal of the scene graph without drawing anything, but
+ // with the field-of-view set to 360x360 degrees. This
+ // ensures that out-of-range random objects that are not in
+ // the current view frustum will still be freed properly.
+ static int counter = 0;
+ counter++;
+ if (counter >= 200) {
+ sgFrustum f;
+ f.setFOV(360, 360);
+ // No need to put the near plane too close;
+ // this way, at least the aircraft can be
+ // culled.
+ f.setNearFar(1000, 1000000);
+ sgMat4 m;
+ ssgGetModelviewMatrix(m);
+ FGTileMgr::set_tile_filter( true );
+ sgSetModelFilter( true );
+ globals->get_scenery()->get_scene_graph()->cull(&f, m, true);
+ counter = 0;
+ }
- if ( distance_attenuation && glPointParameterIsSupported )
- {
- // Enable states for drawing points with GL_extension
- glEnable(GL_POINT_SMOOTH);
+ // change state for lighting here
- float quadratic[3] = {1.0, 0.001, 0.0000001};
- // makes the points fade as they move away
- glPointParameterfvPtr(GL_DISTANCE_ATTENUATION_EXT, quadratic);
- glPointParameterfPtr(GL_POINT_SIZE_MIN_EXT, 1.0);
- }
+ // draw runway lighting
+ glFogf (GL_FOG_DENSITY, rwy_exp2_punch_through);
- glPointSize(4.0);
+ // CLO - 02/25/2005 - DO WE NEED THIS extra fgSetNearFar()?
+ // fgSetNearFar( scene_nearplane, scene_farplane );
- // blending function for runway lights
- glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
- }
+ if ( enhanced_lighting ) {
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- glPolygonMode(GL_FRONT, GL_POINT);
+ // Enable states for drawing points with GL_extension
+ glEnable(GL_POINT_SMOOTH);
- // draw runway lighting
- if ( draw_otw ) {
- ssgCullAndDraw( globals->get_scenery()->get_vasi_lights_root() );
- ssgCullAndDraw( globals->get_scenery()->get_rwy_lights_root() );
- }
+ if ( distance_attenuation && glPointParameterIsSupported )
+ {
+ // Enable states for drawing points with GL_extension
+ glEnable(GL_POINT_SMOOTH);
- // change punch through and then draw taxi lighting
- glFogf ( GL_FOG_DENSITY, fog_exp2_density );
- // sgVec3 taxi_fog;
- // sgSetVec3( taxi_fog, 0.0, 0.0, 0.0 );
- // glFogfv ( GL_FOG_COLOR, taxi_fog );
- if ( draw_otw ) {
- ssgCullAndDraw( globals->get_scenery()->get_taxi_lights_root() );
+ float quadratic[3] = {1.0, 0.001, 0.0000001};
+ // makes the points fade as they move away
+ glPointParameterfvPtr(GL_DISTANCE_ATTENUATION_EXT, quadratic);
+ glPointParameterfPtr(GL_POINT_SIZE_MIN_EXT, 1.0);
}
- // clean up lighting
- glPolygonMode(GL_FRONT, GL_FILL);
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
-
- //static int _frame_count = 0;
- //if (_frame_count % 30 == 0) {
- // printf("SSG: %s\n", ssgShowStats());
- //}
- //else {
- // ssgShowStats();
- //}
- //_frame_count++;
-
-
- if ( enhanced_lighting ) {
- if ( distance_attenuation && glPointParameterIsSupported ) {
- glPointParameterfvPtr(GL_DISTANCE_ATTENUATION_EXT,
- default_attenuation);
- }
+ glPointSize(4.0);
- glPointSize(1.0);
- glDisable(GL_POINT_SMOOTH);
- }
+ // blending function for runway lights
+ glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
+ }
- // draw ground lighting
- glFogf (GL_FOG_DENSITY, ground_exp2_punch_through);
- if ( draw_otw ) {
- ssgCullAndDraw( globals->get_scenery()->get_gnd_lights_root() );
- }
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ glPolygonMode(GL_FRONT, GL_POINT);
- if ( draw_otw && fgGetBool("/sim/rendering/clouds3d") ) {
- glDisable( GL_FOG );
- glDisable( GL_LIGHTING );
- // cout << "drawing new clouds" << endl;
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_BLEND);
- glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA ) ;
-
- /*
- glEnable( GL_TEXTURE_2D );
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- */
-
-#ifdef FG_USE_CLOUDS_3D
- sgClouds3d->Draw((sgVec4 *)current__view->get_VIEW());
-#endif
- glEnable( GL_FOG );
- glEnable( GL_LIGHTING );
- glEnable( GL_DEPTH_TEST );
- glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
- }
+ // draw runway lighting
+ if ( draw_otw ) {
+ ssgCullAndDraw( globals->get_scenery()->get_vasi_lights_root() );
+ ssgCullAndDraw( globals->get_scenery()->get_rwy_lights_root() );
+ }
- if ( draw_otw && draw_clouds ) {
- if ( multi_pass_clouds ) {
- // Disable depth buffer update, draw the clouds where the
- // objects overwrite the already drawn clouds, by testing
- // the stencil buffer against 1
- glDepthMask( GL_FALSE );
- glStencilFunc( GL_EQUAL, 1, 1 );
- glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
- thesky->drawUpperClouds();
- thesky->drawLowerClouds();
- glDepthMask( GL_TRUE );
- glDisable( GL_STENCIL_TEST );
- } else {
- glDepthMask( GL_FALSE );
- thesky->drawLowerClouds();
- glDepthMask( GL_TRUE );
- }
- }
+ // change punch through and then draw taxi lighting
+ glFogf ( GL_FOG_DENSITY, fog_exp2_density );
+ // sgVec3 taxi_fog;
+ // sgSetVec3( taxi_fog, 0.0, 0.0, 0.0 );
+ // glFogfv ( GL_FOG_COLOR, taxi_fog );
+ if ( draw_otw ) {
+ ssgCullAndDraw( globals->get_scenery()->get_taxi_lights_root() );
+ }
- if ( draw_otw ) {
- FGTileMgr::set_tile_filter( false );
- sgSetModelFilter( false );
- globals->get_aircraft_model()->select( true );
- globals->get_model_mgr()->draw();
- globals->get_aircraft_model()->draw();
- // If the view is internal, the previous line draw the
- // cockpit with modified near/far clip planes and deselect
- // the aircraft in the global scenegraph
- // Otherwise, it just enables the aircraft: The scenegraph
- // must be drawn again to see the plane.
- ssgCullAndDraw( globals->get_scenery()->get_scene_graph() );
- FGTileMgr::set_tile_filter( true );
- sgSetModelFilter( true );
- globals->get_aircraft_model()->select( true );
+ // clean up lighting
+ glPolygonMode(GL_FRONT, GL_FILL);
+ glDisable(GL_TEXTURE_GEN_S);
+ glDisable(GL_TEXTURE_GEN_T);
+
+ //static int _frame_count = 0;
+ //if (_frame_count % 30 == 0) {
+ // printf("SSG: %s\n", ssgShowStats());
+ //}
+ //else {
+ // ssgShowStats();
+ //}
+ //_frame_count++;
+
+
+ if ( enhanced_lighting ) {
+ if ( distance_attenuation && glPointParameterIsSupported ) {
+ glPointParameterfvPtr(GL_DISTANCE_ATTENUATION_EXT,
+ default_attenuation);
}
- // display HUD && Panel
- glDisable( GL_FOG );
- glDisable( GL_DEPTH_TEST );
- // glDisable( GL_CULL_FACE );
- // glDisable( GL_TEXTURE_2D );
-
- // update the controls subsystem
- globals->get_controls()->update(delta_time_sec);
+ glPointSize(1.0);
+ glDisable(GL_POINT_SMOOTH);
+ }
- hud_and_panel->apply();
- fgCockpitUpdate();
+ // draw ground lighting
+ glFogf (GL_FOG_DENSITY, ground_exp2_punch_through);
+ if ( draw_otw ) {
+ ssgCullAndDraw( globals->get_scenery()->get_gnd_lights_root() );
+ }
- // Use the hud_and_panel ssgSimpleState for rendering the ATC output
- // This only works properly if called before the panel call
- if((fgGetBool("/sim/ATC/enabled")) || (fgGetBool("/sim/ai-traffic/enabled")))
- globals->get_ATC_display()->update(delta_time_sec);
+ sgEnviro.drawLightning();
- // update the panel subsystem
- if ( globals->get_current_panel() != NULL ) {
- globals->get_current_panel()->update(delta_time_sec);
+ if ( draw_otw && draw_clouds ) {
+ if ( multi_pass_clouds ) {
+ // Disable depth buffer update, draw the clouds where the
+ // objects overwrite the already drawn clouds, by testing
+ // the stencil buffer against 1
+ glDepthMask( GL_FALSE );
+ glStencilFunc( GL_EQUAL, 1, 1 );
+ glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
+ thesky->drawUpperClouds();
+ thesky->drawLowerClouds();
+ glDepthMask( GL_TRUE );
+ glDisable( GL_STENCIL_TEST );
+ } else {
+ glDepthMask( GL_FALSE );
+ if( volumetric_clouds )
+ thesky->drawUpperClouds();
+ thesky->drawLowerClouds();
+ glDepthMask( GL_TRUE );
}
- fgUpdate3DPanels();
+ }
+ sgEnviro.drawPrecipitation(
+ fgGetDouble("/environment/metar/rain-norm", 0.0),
+ fgGetDouble("/environment/metar/snow-norm", 0.0),
+ fgGetDouble("/environment/metar/hail-norm", 0.0),
+ current__view->getPitch_deg() - current__view->getPitchOffset_deg(),
+ current__view->getRoll_deg() + current__view->getRollOffset_deg(),
+ - current__view->getHeadingOffset_deg(),
+ fgGetDouble("/velocities/airspeed-kt", 0.0));
+
+ // compute shadows and project them on screen
+ bool is_internal = globals->get_current_view()->getInternal();
+ // draw before ac because ac internal rendering clear the depth buffer
+
+ globals->get_aircraft_model()->select( true );
+ if( is_internal )
+ shadows->endOfFrame();
+
+ if ( draw_otw ) {
+ FGTileMgr::set_tile_filter( false );
+ sgSetModelFilter( false );
+ globals->get_aircraft_model()->select( true );
+ globals->get_model_mgr()->draw();
+ globals->get_aircraft_model()->draw();
- // We can do translucent menus, so why not. :-)
- menus->apply();
- glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
- puDisplay();
- // glDisable ( GL_BLEND ) ;
+ FGTileMgr::set_tile_filter( true );
+ sgSetModelFilter( true );
+ globals->get_aircraft_model()->select( true );
+ }
+ // in 'external' view the ac can be culled, so shadows have not been draw in the
+ // posttrav callback, this would be a rare case if the getInternal was acting
+ // as expected (ie in internal view, getExternal returns false)
+ if( !is_internal )
+ shadows->endOfFrame();
+
+ // display HUD && Panel
+ glDisable( GL_FOG );
+ glDisable( GL_DEPTH_TEST );
+ // glDisable( GL_CULL_FACE );
+ // glDisable( GL_TEXTURE_2D );
+
+ // update the controls subsystem
+ globals->get_controls()->update(delta_time_sec);
+
+ hud_and_panel->apply();
+ fgCockpitUpdate();
+
+ // Use the hud_and_panel ssgSimpleState for rendering the ATC output
+ // This only works properly if called before the panel call
+ if((fgGetBool("/sim/atc/enabled")) || (fgGetBool("/sim/ai-traffic/enabled")))
+ globals->get_ATC_display()->update(delta_time_sec);
+
+ // update the panel subsystem
+ if ( globals->get_current_panel() != NULL ) {
+ globals->get_current_panel()->update(delta_time_sec);
+ }
+ fgUpdate3DPanels();
- glEnable( GL_DEPTH_TEST );
- glEnable( GL_FOG );
+ // We can do translucent menus, so why not. :-)
+ menus->apply();
+ glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
+ puDisplay();
+ // glDisable ( GL_BLEND ) ;
- // Fade out the splash screen over the first three seconds.
- double t = globals->get_sim_time_sec();
- if ( t <= 1.0 ) {
- fgSplashUpdate(0.0, 1.0);
- } else if ( t <= 3.0) {
- fgSplashUpdate(0.0, (3.0 - t) / 2.0);
- }
- }
+ glEnable( GL_DEPTH_TEST );
+ glEnable( GL_FOG );
+
+ // Fade out the splash screen over the first three seconds.
+ double t = globals->get_sim_time_sec();
+ if (t <= 2.5)
+ fgSplashUpdate((2.5 - t) / 2.5);
}
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() );
+ // cout << "setFOV(" << viewmgr->get_current_view()->get_h_fov()
+ // << ", " << viewmgr->get_current_view()->get_v_fov() << ")"
+ // << endl;
-#ifdef FG_USE_CLOUDS_3D
- sgClouds3d->Resize( viewmgr->get_current_view()->get_h_fov(),
- viewmgr->get_current_view()->get_v_fov() );
-#endif
}
fgHUDReshape();
}
-// For HiRes screen Dumps using Brian Pauls TR Library
-//
-// Curt writes: Unfortunately, if the jpeg image server code is
-// compiled into simgear and flightgear, this function get's called
-// from simgear which is not the direction we want our dependencies to
-// go, but it's the way things are right now.
-//
-// If I had to guess, I would speculate that this code probably
-// doesn't work, at least not 100% correctly, but I don't have time
-// right now to sort this one out. Also the jpeg server was very
-// experimental and was extremely limited in the resolution images it
-// could serve out for some never debugged reason. It's a novel
-// feature, but I wouldn't be entirely opposed to seeing it go away
-// unless someone wants to fix it so it works right and robustly and
-// can serve full resolution images without crashing ourselves.
-
-void trRenderFrame( void ) {
-#ifdef FG_ENABLE_MULTIPASS_CLOUDS
- bool multi_pass_clouds = fgGetBool("/sim/rendering/multi-pass-clouds") &&
- !SGCloudLayer::enable_bump_mapping; // ugly artefact now
-#else
- bool multi_pass_clouds = false;
-#endif
- bool draw_clouds = fgGetBool("/environment/clouds/status");
-
- if ( fgPanelVisible() ) {
- GLfloat height = fgGetInt("/sim/startup/ysize");
- GLfloat view_h =
- (globals->get_current_panel()->getViewHeight() - globals->get_current_panel()->getYOffset())
- * (height / 768.0) + 1;
- glTranslatef( 0.0, view_h, 0.0 );
- }
+// 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 GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
- static GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
+static void fgHackFrustum() {
- FGLight *l = (FGLight *)(globals->get_subsystem("lighting"));
+ // specify a percent of the configured view frustum to actually
+ // display. This is a bit of a hack to achieve asymmetric view
+ // frustums. For instance, if you want to display two monitors
+ // side by side, you could specify each with a double fov, a 0.5
+ // aspect ratio multiplier, and then the left side monitor would
+ // have a left_pct = 0.0, a right_pct = 0.5, a bottom_pct = 0.0,
+ // and a top_pct = 1.0. The right side monitor would have a
+ // left_pct = 0.5 and a right_pct = 1.0.
- glClearColor(l->adj_fog_color()[0], l->adj_fog_color()[1],
- l->adj_fog_color()[2], l->adj_fog_color()[3]);
+ static SGPropertyNode *left_pct
+ = fgGetNode("/sim/current-view/frustum-left-pct");
+ static SGPropertyNode *right_pct
+ = fgGetNode("/sim/current-view/frustum-right-pct");
+ static SGPropertyNode *bottom_pct
+ = fgGetNode("/sim/current-view/frustum-bottom-pct");
+ static SGPropertyNode *top_pct
+ = fgGetNode("/sim/current-view/frustum-top-pct");
- glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ sgFrustum *f = ssgGetFrustum();
- // set the opengl state to known default values
- default_state->force();
+ // cout << " l = " << f->getLeft()
+ // << " r = " << f->getRight()
+ // << " b = " << f->getBot()
+ // << " t = " << f->getTop()
+ // << " n = " << f->getNear()
+ // << " f = " << f->getFar()
+ // << endl;
- glEnable( GL_FOG );
- glFogf ( GL_FOG_DENSITY, fog_exp2_density);
- glFogi ( GL_FOG_MODE, GL_EXP2 );
- glFogfv ( GL_FOG_COLOR, l->adj_fog_color() );
+ double width = f->getRight() - f->getLeft();
+ double height = f->getTop() - f->getBot();
- // GL_LIGHT_MODEL_AMBIENT has a default non-zero value so if
- // we only update GL_AMBIENT for our lights we will never get
- // a completely dark scene. So, we set GL_LIGHT_MODEL_AMBIENT
- // explicitely to black.
- glLightModelfv( GL_LIGHT_MODEL_AMBIENT, black );
- glLightModeli( GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE );
+ double l, r, t, b;
- ssgGetLight( 0 ) -> setColour( GL_AMBIENT, l->scene_ambient() );
+ if ( left_pct != NULL ) {
+ l = f->getLeft() + width * left_pct->getDoubleValue();
+ } else {
+ l = f->getLeft();
+ }
- // texture parameters
- glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ;
- glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ) ;
+ if ( right_pct != NULL ) {
+ r = f->getLeft() + width * right_pct->getDoubleValue();
+ } else {
+ r = f->getRight();
+ }
- // we need a white diffuse light for the phase of the moon
- ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, white );
- thesky->preDraw( cur_fdm_state->get_Altitude() * SG_FEET_TO_METER,
- fog_exp2_density );
+ if ( bottom_pct != NULL ) {
+ b = f->getBot() + height * bottom_pct->getDoubleValue();
+ } else {
+ b = f->getBot();
+ }
- // draw the ssg scene
- // return to the desired diffuse color
- ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, l->scene_diffuse() );
- glEnable( GL_DEPTH_TEST );
- ssgSetNearFar( scene_nearplane, scene_farplane );
- if ( draw_clouds ) {
- // Draw the terrain
- FGTileMgr::set_tile_filter( true );
- sgSetModelFilter( false );
- globals->get_aircraft_model()->select( false );
- ssgCullAndDraw( globals->get_scenery()->get_scene_graph() );
- // Disable depth buffer update, draw the clouds
- glDepthMask( GL_FALSE );
- thesky->drawUpperClouds();
- if ( multi_pass_clouds ) {
- thesky->drawLowerClouds();
- }
- glDepthMask( GL_TRUE );
- if ( multi_pass_clouds ) {
- // Draw the objects except the aircraft
- // and update the stencil buffer with 1
- glEnable( GL_STENCIL_TEST );
- glStencilFunc( GL_ALWAYS, 1, 1 );
- glStencilOp( GL_KEEP, GL_KEEP, GL_REPLACE );
- }
- FGTileMgr::set_tile_filter( false );
- sgSetModelFilter( true );
- ssgCullAndDraw( globals->get_scenery()->get_scene_graph() );
+ if ( top_pct != NULL ) {
+ t = f->getBot() + height * top_pct->getDoubleValue();
} else {
- FGTileMgr::set_tile_filter( true );
- sgSetModelFilter( true );
- globals->get_aircraft_model()->select( false );
- ssgCullAndDraw( globals->get_scenery()->get_scene_graph() );
+ t = f->getTop();
}
- // draw the lights
- glFogf (GL_FOG_DENSITY, rwy_exp2_punch_through);
- ssgSetNearFar( scene_nearplane, scene_farplane );
- ssgCullAndDraw( globals->get_scenery()->get_vasi_lights_root() );
- ssgCullAndDraw( globals->get_scenery()->get_rwy_lights_root() );
+ ssgSetFrustum(l, r, b, t, f->getNear(), f->getFar());
+}
- ssgCullAndDraw( globals->get_scenery()->get_gnd_lights_root() );
- if ( draw_clouds ) {
- if ( multi_pass_clouds ) {
- // Disable depth buffer update, draw the clouds where the
- // objects overwrite the already drawn clouds, by testing
- // the stencil buffer against 1
- glDepthMask( GL_FALSE );
- glStencilFunc( GL_EQUAL, 1, 1 );
- glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
- thesky->drawUpperClouds();
- thesky->drawLowerClouds();
- glDepthMask( GL_TRUE );
- glDisable( GL_STENCIL_TEST );
- } else {
- glDepthMask( GL_FALSE );
- thesky->drawLowerClouds();
- glDepthMask( GL_TRUE );
- }
- }
+// 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 fov_width = 55.0;
+static float fov_height = 42.0;
+static float fov_near = 1.0;
+static float fov_far = 1000.0;
+
+
+/** FlightGear code should use this routine to set the FOV rather than
+ * calling the ssg routine directly
+ */
+void FGRenderer::setFOV( float w, float h ) {
+ fov_width = w;
+ fov_height = h;
+
+ // fully specify the view frustum before hacking it (so we don't
+ // accumulate hacked effects
+ ssgSetFOV( w, h );
+ ssgSetNearFar( fov_near, fov_far );
+ fgHackFrustum();
+ sgEnviro.setFOV( w, h );
+}
+
+
+/** 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 ) {
+ fov_near = n;
+ fov_far = f;
+
+ // fully specify the view frustum before hacking it (so we don't
+ // accumulate hacked effects
+ ssgSetNearFar( n, f );
+ ssgSetFOV( fov_width, fov_height );
- globals->get_aircraft_model()->select( true );
- globals->get_model_mgr()->draw();
- globals->get_aircraft_model()->draw();
+ fgHackFrustum();
}