#include <plib/ssg.h>
#include <plib/pu.h>
+#include <plib/netSocket.h>
#include <simgear/screen/extensions.hxx>
#include <simgear/scene/material/matlib.hxx>
#include <Include/general.hxx>
#include <Scenery/tileentry.hxx>
-#include <Time/FGEventMgr.hxx>
#include <Time/light.hxx>
#include <Time/light.hxx>
#include <Aircraft/aircraft.hxx>
#include "splash.hxx"
#include "fg_commands.hxx"
#include "fg_io.hxx"
-
-
-glPointParameterfProc glPointParameterfPtr = 0;
-glPointParameterfvProc glPointParameterfvPtr = 0;
-bool glPointParameterIsSupported = false;
+#include "main.hxx"
float default_attenuation[3] = {1.0, 0.0, 0.0};
-//Required for using GL_extensions
-void fgLoadDCS (void);
-void fgUpdateDCS (void);
ssgSelector *ship_sel=NULL;
// upto 32 instances of a same object can be loaded.
ssgTransform *ship_pos[32];
static double delta_time_sec = 0.0;
+glPointParameterfProc glPointParameterfPtr = 0;
+glPointParameterfvProc glPointParameterfvPtr = 0;
+bool glPointParameterIsSupported = false;
+
#ifdef FG_WEATHERCM
# include <WeatherCM/FGLocalWeatherDatabase.h>
# include <console.h> // -dw- for command line dialog
#endif
-FGEventMgr global_events;
-
// This is a record containing a bit of global housekeeping information
FGGeneral general;
// fgInitVisuals() -- Initialize various GL/view parameters
void fgInitVisuals( void ) {
- fgLIGHT *l;
- l = &cur_light_params;
+ FGLight *l = (FGLight *)(globals->get_subsystem("lighting"));
#ifndef GLUT_WRONG_VERSION
// Go full screen if requested ...
// glLightfv( GL_LIGHT0, GL_POSITION, l->sun_vec ); // done later with ssg
sgVec3 sunpos;
- sgSetVec3( sunpos, l->sun_vec[0], l->sun_vec[1], l->sun_vec[2] );
+ sgSetVec3( sunpos, l->sun_vec()[0], l->sun_vec()[1], l->sun_vec()[2] );
ssgGetLight( 0 ) -> setPosition( sunpos );
glFogi (GL_FOG_MODE, GL_EXP2);
static GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
static GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
- fgLIGHT *l = &cur_light_params;
+ FGLight *l = (FGLight *)(globals->get_subsystem("lighting"));
- glClearColor(l->adj_fog_color[0], l->adj_fog_color[1],
- l->adj_fog_color[2], l->adj_fog_color[3]);
+ glClearColor(l->adj_fog_color()[0], l->adj_fog_color()[1],
+ l->adj_fog_color()[2], l->adj_fog_color()[3]);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glEnable( GL_FOG );
glFogf ( GL_FOG_DENSITY, fog_exp2_density);
glFogi ( GL_FOG_MODE, GL_EXP2 );
- glFogfv ( GL_FOG_COLOR, l->adj_fog_color );
+ glFogfv ( GL_FOG_COLOR, l->adj_fog_color() );
// GL_LIGHT_MODEL_AMBIENT has a default non-zero value so if
// we only update GL_AMBIENT for our lights we will never get
glLightModelfv( GL_LIGHT_MODEL_AMBIENT, black );
glLightModeli( GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE );
- ssgGetLight( 0 ) -> setColour( GL_AMBIENT, l->scene_ambient );
+ ssgGetLight( 0 ) -> setColour( GL_AMBIENT, l->scene_ambient() );
// texture parameters
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ;
// 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 );
+ thesky->preDraw( cur_fdm_state->get_Altitude() * SG_FEET_TO_METER, fog_exp2_density );
// draw the ssg scene
// return to the desired diffuse color
- ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, l->scene_diffuse );
+ ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, l->scene_diffuse() );
glEnable( GL_DEPTH_TEST );
ssgSetNearFar( scene_nearplane, scene_farplane );
ssgCullAndDraw( globals->get_scenery()->get_scene_graph() );
GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
- // Process/manage pending events
- global_events.update( delta_time_sec );
-
// static const SGPropertyNode *longitude
// = fgGetNode("/position/longitude-deg");
// static const SGPropertyNode *latitude
FGViewer *current__view = globals->get_current_view();
- fgLIGHT *l = &cur_light_params;
+ FGLight *l = (FGLight *)(globals->get_subsystem("lighting"));
static double last_visibility = -9999;
// update fog params
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]);
+ 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]);
+ glClearColor(l->sky_color()[0], l->sky_color()[1],
+ l->sky_color()[2], l->sky_color()[3]);
clear_mask |= GL_COLOR_BUFFER_BIT;
}
glClear( clear_mask );
if ( skyblend ) {
/*
SG_LOG( SG_GENERAL, SG_BULK, "thesky->repaint() sky_color = "
- << cur_light_params.sky_color[0] << " "
- << cur_light_params.sky_color[1] << " "
- << cur_light_params.sky_color[2] << " "
- << cur_light_params.sky_color[3] );
+ << l->sky_color()[0] << " "
+ << l->sky_color()[1] << " "
+ << l->sky_color()[2] << " "
+ << l->sky_color()[3] );
SG_LOG( SG_GENERAL, SG_BULK, " fog = "
- << cur_light_params.fog_color[0] << " "
- << cur_light_params.fog_color[1] << " "
- << cur_light_params.fog_color[2] << " "
- << cur_light_params.fog_color[3] );
+ << l->fog_color()[0] << " "
+ << l->fog_color()[1] << " "
+ << l->fog_color()[2] << " "
+ << l->fog_color()[3] );
SG_LOG( SG_GENERAL, SG_BULK,
- " sun_angle = " << cur_light_params.sun_angle
- << " moon_angle = " << cur_light_params.moon_angle );
+ " sun_angle = " << l->sun_angle
+ << " moon_angle = " << l->moon_angle );
*/
static SGSkyColor scolor;
+ FGLight *l = (FGLight *)(globals->get_subsystem("lighting"));
- scolor.sky_color = cur_light_params.sky_color;
- scolor.fog_color = cur_light_params.adj_fog_color;
- scolor.cloud_color = cur_light_params.cloud_color;
- scolor.sun_angle = cur_light_params.sun_angle;
- scolor.moon_angle = cur_light_params.moon_angle;
+ 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();
<< " lon = " << cur_fdm_state->get_Longitude()
<< " lat = " << cur_fdm_state->get_Latitude() );
SG_LOG( SG_GENERAL, SG_BULK,
- " sun_rot = " << cur_light_params.sun_rotation
+ " 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 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(cur_light_params.sun_angle*2)/2,0.33)/3;
- moon_horiz_eff = 0.67+pow(0.5+cos(cur_light_params.moon_angle*2)/2,0.33)/3;
+ 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;
}
* SGD_DEGREES_TO_RADIANS;
sstate.alt = current__view->getAltitudeASL_ft()
* SG_FEET_TO_METER;
- sstate.spin = cur_light_params.sun_rotation;
+ 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();
if ( strcmp(fgGetString("/sim/rendering/fog"), "disabled") ) {
glEnable( GL_FOG );
glFogi( GL_FOG_MODE, GL_EXP2 );
- glFogfv( GL_FOG_COLOR, l->adj_fog_color );
+ glFogfv( GL_FOG_COLOR, l->adj_fog_color() );
}
// set sun/lighting parameters
- ssgGetLight( 0 ) -> setPosition( l->sun_vec );
+ 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
// 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() );
// texture parameters
// glEnable( GL_TEXTURE_2D );
// 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 );
+ 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 );
-
- // FIXME: This should not be needed, but at this time (08/15/2003)
- // certain NVidia drivers don't seem to implement
- // fgPushAttrib(FG_FOG_BIT) properly. The result is that
- // there is not fog when looking at the sun.
- glFogf ( GL_FOG_DENSITY, fog_exp2_density );
+ ssgGetLight( 0 ) -> setColour( GL_DIFFUSE, l->scene_diffuse() );
}
// draw the ssg scene
//SG_LOG(SG_FLIGHT,SG_INFO, "Updating time dep calcs()");
- fgLIGHT *l = &cur_light_params;
-
// Initialize the FDM here if it hasn't been and if we have a
// scenery elevation hit.
// update the view angle
globals->get_viewmgr()->update(delta_time_sec);
- l->UpdateAdjFog();
-
// Update solar system
globals->get_ephem()->update( globals->get_time_params()->getMjd(),
- globals->get_time_params()->getLst(),
- cur_fdm_state->get_Latitude() );
+ globals->get_time_params()->getLst(),
+ cur_fdm_state->get_Latitude() );
// Update radio stack model
current_radiostack->update(delta_time_sec);
SGTime *t = globals->get_time_params();
- sglog().setLogLevels( SG_ALL, (sgDebugPriority)fgGetInt("/sim/log-level") );
- sglog().setLogLevels( SG_ALL, SG_INFO );
+ globals->get_event_mgr()->update(delta_time_sec);
SGLocation * acmodel_location = 0;
if(cur_fdm_state->getACModel() != 0) {
cur_fdm_state->get_Runway_altitude() * SG_FEET_TO_METER,
cur_fdm_state->get_Altitude() * SG_FEET_TO_METER); */
-#if 0
-// This code is used by LaRCsim/UIUC to position the aircraft at a proper
-// place. This code should eventually go into the LaRCsim directory.
-// Commented out at Jul 27 2003 because tests show it is not needed.
-// Can probbaly be safely removed after Spet. 2003 - EMH
-
- if ( acmodel_location != 0 ) {
- if ( acmodel_location->get_cur_elev_m() > -9990 && cur_fdm_state->get_inited() ) {
- if ( cur_fdm_state->get_Altitude() * SG_FEET_TO_METER <
- (acmodel_location->get_cur_elev_m() + alt_adjust_m - 130.0) ) {
- // now set aircraft altitude above ground
- printf("(*) Current Altitude = %.2f < %.2f forcing to %.2f\n",
- cur_fdm_state->get_Altitude() * SG_FEET_TO_METER,
- acmodel_location->get_cur_elev_m() + alt_adjust_m - 130.0,
- acmodel_location->get_cur_elev_m() + alt_adjust_m );
- cur_fdm_state->set_Altitude( (acmodel_location->get_cur_elev_m()
- + alt_adjust_m) * SG_METER_TO_FEET );
- SG_LOG( SG_ALL, SG_DEBUG,
- "<*> resetting altitude to "
- << cur_fdm_state->get_Altitude() * SG_FEET_TO_METER
- << " meters" );
- }
- }
- }
-// End of code in question. (see Curt is this code used? above)
-#endif
-
/* printf("Adjustment - ground = %.2f runway = %.2f alt = %.2f\n",
scenery.get_cur_elev(),
cur_fdm_state->get_Runway_altitude() * SG_FEET_TO_METER,
cur_time_override->getLongValue(),
globals->get_warp() );
- if ( globals->get_warp_delta() != 0 ) {
- fgUpdateSkyAndLightingParams();
+ if (globals->get_warp_delta() != 0) {
+ FGLight *l = (FGLight *)(globals->get_subsystem("lighting"));
+ l->update( 0.5 );
}
// update magvar model
// END Tile Manager udpates
+ if (fgGetBool("/sim/rendering/specular-highlight")) {
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
+ } else {
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
+ }
+
// redraw display
fgRenderFrame();
idle_state++;
} else if ( idle_state == 4 ) {
+ // Initialize the time offset (warp) after fgInitSubsystem
+ // (which initializes the lighting interpolation tables.)
+ fgInitTimeOffset();
+
// setup OpenGL view parameters
fgInitVisuals();
idle_state++;
} else if ( idle_state == 6 ) {
// sleep(1);
+
idle_state = 1000;
SG_LOG( SG_GENERAL, SG_INFO, "Panel visible = " << fgPanelVisible() );
fgReshape( fgGetInt("/sim/startup/xsize"),
fgGetInt("/sim/startup/ysize") );
+
}
if ( idle_state == 1000 ) {
fgInitFGRoot(argc, argv);
// Check for the correct base package version
- static char required_version[] = "0.9.2";
+ static char required_version[] = "0.9.3";
string base_version = fgBasePackageVersion();
if ( !(base_version == required_version) ) {
// tell the operator how to use this application
exit(-1);
}
- SGPath modelpath( globals->get_fg_root() );
- ssgModelPath( (char *)modelpath.c_str() );
-
////////////////////////////////////////////////////////////////////
// Initialize the property-based built-in commands
////////////////////////////////////////////////////////////////////
ephem_data_path.append( "Astro" );
SGEphemeris *ephem = new SGEphemeris( ephem_data_path.c_str() );
ephem->update( globals->get_time_params()->getMjd(),
- globals->get_time_params()->getLst(),
- 0.0 );
+ globals->get_time_params()->getLst(),
+ 0.0 );
globals->set_ephem( ephem );
- // TODO: move to environment mgr
+ // TODO: move to environment mgr
thesky = new SGSky;
SGPath texture_path(globals->get_fg_root());
texture_path.append("Textures");
thesky->add_cloud_layer(layer);
}
-
SGPath sky_tex_path( globals->get_fg_root() );
sky_tex_path.append( "Textures" );
sky_tex_path.append( "Sky" );
// temporary hack for deck lights - ultimately should move to PLib (when ??)
if (m == 1) {
if (lightpoints_transform) {
- lightpoints_transform->setTransform( &shippos );
- float sun_angle = cur_light_params.sun_angle * SGD_RADIANS_TO_DEGREES;
- if ( sun_angle > 89 ) {
- lightpoints_brightness->select(0x01);
- } else {
- lightpoints_brightness->select(0x00);
- }
+ lightpoints_transform->setTransform( &shippos );
+ FGLight *l = (FGLight *)(globals->get_subsystem("lighting"));
+ float sun_angle = l->get_sun_angle() * SGD_RADIANS_TO_DEGREES;
+ if ( sun_angle > 89 ) {
+ lightpoints_brightness->select(0x01);
+ } else {
+ lightpoints_brightness->select(0x00);
+ }
}
float elev;