- setNearFar( scene_nearplane, scene_farplane );
-
- 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);
-
- if ( draw_otw && skyblend ) {
- // draw the sky backdrop
-
- // 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() );
- }
-
- // 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 ) {
-
- // 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 );
- 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() );
- }
- }
-
- // 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;
- }
-
- // change state for lighting here
-
- // draw runway lighting
- glFogf (GL_FOG_DENSITY, rwy_exp2_punch_through);
-
- // CLO - 02/25/2005 - DO WE NEED THIS extra fgSetNearFar()?
- // fgSetNearFar( scene_nearplane, scene_farplane );
-
- if ( enhanced_lighting ) {
-
- // Enable states for drawing points with GL_extension
- glEnable(GL_POINT_SMOOTH);
-
- if ( distance_attenuation && glPointParameterIsSupported )
- {
- // Enable states for drawing points with GL_extension
- glEnable(GL_POINT_SMOOTH);
-
- 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);
- }
-
- glPointSize(4.0);
-
- // blending function for runway lights
- glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
- }
-
- 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);
-
- // draw runway lighting
- if ( draw_otw ) {
- ssgCullAndDraw( globals->get_scenery()->get_vasi_lights_root() );
- ssgCullAndDraw( globals->get_scenery()->get_rwy_lights_root() );
- }
-
- // 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() );
- }
-
- // 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(1.0);
- glDisable(GL_POINT_SMOOTH);
- }
-
- // draw ground lighting
- glFogf (GL_FOG_DENSITY, ground_exp2_punch_through);
- if ( draw_otw ) {
- ssgCullAndDraw( globals->get_scenery()->get_gnd_lights_root() );
- }
-
- sgEnviro.drawLightning();
-
- 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 );
- }
- }
- 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();
-
- 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();
-
- // We can do translucent menus, so why not. :-)
- menus->apply();
- glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
- puDisplay();
- // glDisable ( GL_BLEND ) ;
-
- 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);
+// sgEnviro.setLight(l->adj_fog_color());
+// 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);
+
+ // OSGFIXME
+// sgEnviro.drawLightning();
+
+// double current_view_origin_airspeed_horiz_kt =
+// fgGetDouble("/velocities/airspeed-kt", 0.0)
+// * cos( fgGetDouble("/orientation/pitch-deg", 0.0)
+// * SGD_DEGREES_TO_RADIANS);
+
+ // OSGFIXME
+// if( is_internal )
+// shadows->endOfFrame();
+
+ // need to call the update visitor once
+ mFrameStamp->setCalendarTime(*globals->get_time_params()->getGmt());
+ mUpdateVisitor->setViewData(current__view->getViewPosition(),
+ current__view->getViewOrientation());
+ SGVec3f direction(l->sun_vec()[0], l->sun_vec()[1], l->sun_vec()[2]);
+ mUpdateVisitor->setLight(direction, l->scene_ambient(),
+ l->scene_diffuse(), l->scene_specular(),
+ l->adj_fog_color(),
+ l->get_sun_angle()*SGD_RADIANS_TO_DEGREES);
+ mUpdateVisitor->setVisibility(actual_visibility);
+ viewPartition->setVisibility(actual_visibility);
+ simgear::GroundLightManager::instance()->update(mUpdateVisitor.get());
+ bool hotspots = fgGetBool("/sim/panel-hotspots");
+ osg::Node::NodeMask cullMask = ~simgear::LIGHTS_BITS & ~simgear::PICK_BIT;
+ cullMask |= simgear::GroundLightManager::instance()
+ ->getLightNodeMask(mUpdateVisitor.get());
+ if (hotspots)
+ cullMask |= simgear::PICK_BIT;
+ camera->setCullMask(cullMask);
+ // XXX
+ for (int i = 0; i < viewer->getNumSlaves(); ++i)
+ viewer->getSlave(i)._camera->setCullMask(cullMask);