#include <FDM/UIUCModel/uiuc_aircraftdir.h>
#include <GUI/gui.h>
+#include <GUI/sgVec3Slider.hxx>
#include <Joystick/joystick.hxx>
#ifdef FG_NETWORK_OLK
#include <NetworkOLK/network.h>
// our initializations out of the glutIdleLoop() so that we can get a
// splash screen up and running right away.
static int idle_state = 0;
-static int global_multi_loop;
+static long global_multi_loop;
// attempt to avoid a large bounce at startup
static bool initial_freeze = true;
-// Another hack
-int use_signals = 0;
-
// forward declaration
void fgReshape( int width, int height );
cur_fdm_state->get_Psi() * RAD_TO_DEG,
wup );
sgVec3 npo; // new pilot offset after rotation
- sgXformVec3( po, po, pilot_view->get_UP() );
+ sgVec3 *pPO = PilotOffsetGet();
+ sgXformVec3( po, *pPO, pilot_view->get_UP() );
sgXformVec3( npo, po, CXFM );
chase_view->set_geod_view_pos( cur_fdm_state->get_Longitude(),
#endif
thesky->modify_vis( cur_fdm_state->get_Altitude() * FEET_TO_METER,
-
( global_multi_loop *
fgGetInt("/sim/speed-up") ) /
(double)fgGetInt("/sim/model-hz") );
// position tile nodes and update range selectors
global_tile_mgr.prep_ssg_nodes();
- // draw the sky backdrop
- thesky->preDraw();
+ if ( fgGetBool("/sim/rendering/skyblend") ) {
+ // draw the sky backdrop
+ thesky->preDraw();
+ }
// draw the ssg scene
glEnable( GL_DEPTH_TEST );
ssgCullAndDraw( lighting );
- // draw the sky cloud layers
- thesky->postDraw( cur_fdm_state->get_Altitude() * FEET_TO_METER );
+ if ( fgGetBool("/sim/rendering/skyblend") ) {
+ // draw the sky cloud layers
+ thesky->postDraw( cur_fdm_state->get_Altitude() * FEET_TO_METER );
+ }
// display HUD && Panel
glDisable( GL_FOG );
// Update internal time dependent calculations (i.e. flight model)
-void fgUpdateTimeDepCalcs(int multi_loop, int remainder) {
- static fdm_state_list fdm_list;
+void fgUpdateTimeDepCalcs() {
+ static bool inited = false;
+
fgLIGHT *l = &cur_light_params;
int i;
- // update the flight model
- if ( multi_loop < 0 ) {
- multi_loop = 1;
- }
+ long multi_loop = 1;
if ( !globals->get_freeze() && !initial_freeze ) {
- // run Autopilot system
- current_autopilot->run();
+ // conceptually, this could be done for each fdm instance ...
+
+ if ( !inited ) {
+ cur_fdm_state->stamp();
+ inited = true;
+ }
+
+ SGTimeStamp current;
+ current.stamp();
+ long elapsed = current - cur_fdm_state->get_time_stamp();
+ cur_fdm_state->set_time_stamp( current );
+ elapsed += cur_fdm_state->get_remainder();
+ // cout << "elapsed = " << elapsed << endl;
+ // cout << "dt = " << cur_fdm_state->get_delta_t() << endl;
+ multi_loop = (long)(((double)elapsed * 0.000001) /
+ cur_fdm_state->get_delta_t() );
+ cur_fdm_state->set_multi_loop( multi_loop );
+ long remainder = elapsed - ( (multi_loop*1000000) *
+ cur_fdm_state->get_delta_t() );
+ cur_fdm_state->set_remainder( remainder );
+ // cout << "remainder = " << remainder << endl;
+
+ // chop max interations to something reasonable if the sim was
+ // delayed for an excesive amount of time
+ if ( multi_loop > 2.0 / cur_fdm_state->get_delta_t() ) {
+ multi_loop = (int)(2.0 / cur_fdm_state->get_delta_t());
+ cur_fdm_state->set_remainder( 0 );
+ }
+
+ // cout << "multi_loop = " << multi_loop << endl;
+ for ( i = 0; i < multi_loop * fgGetInt("/sim/speed-up"); ++i ) {
+ // run Autopilot system
+ current_autopilot->run();
- cur_fdm_state->update( multi_loop *
- fgGetInt("/sim/speed-up") );
+ // update autopilot
+ cur_fdm_state->update( 1 );
+ }
FGSteam::update( multi_loop * fgGetInt("/sim/speed-up") );
} else {
cur_fdm_state->update( 0 );
}
}
- fdm_list.push_back( *cur_fdm_state );
- while ( fdm_list.size() > 15 ) {
- fdm_list.pop_front();
- }
-
if ( fgGetString("/sim/view-mode") == "pilot" ) {
cur_view_fdm = *cur_fdm_state;
// do nothing
- } else if ( fgGetString("/sim/view-mode") == "follow" )
- {
- cur_view_fdm = fdm_list.front();
}
// update the view angle
#endif
// Run flight model
- if ( ! use_signals ) {
- // Calculate model iterations needed for next frame
- elapsed += remainder;
-
- global_multi_loop = (int)(((double)elapsed * 0.000001) *
- fgGetInt("/sim/model-hz"));
- remainder = elapsed - ( (global_multi_loop*1000000) /
- fgGetInt("/sim/model-hz") );
- FG_LOG( FG_ALL, FG_DEBUG,
- "Model iterations needed = " << global_multi_loop
- << ", new remainder = " << remainder );
+
+ // Calculate model iterations needed for next frame
+ elapsed += remainder;
+
+ global_multi_loop = (long)(((double)elapsed * 0.000001) *
+ fgGetInt("/sim/model-hz"));
+ remainder = elapsed - ( (global_multi_loop*1000000) /
+ fgGetInt("/sim/model-hz") );
+ FG_LOG( FG_ALL, FG_DEBUG,
+ "Model iterations needed = " << global_multi_loop
+ << ", new remainder = " << remainder );
- // flight model
- if ( global_multi_loop > 0 ) {
- fgUpdateTimeDepCalcs(global_multi_loop, remainder);
- } else {
- FG_LOG( FG_ALL, FG_DEBUG,
- "Elapsed time is zero ... we're zinging" );
- }
+ // chop max interations to something reasonable if the sim was
+ // delayed for an excesive amount of time
+ if ( global_multi_loop > 2.0 * fgGetInt("/sim/model-hz") ) {
+ global_multi_loop = (int)(2.0 * fgGetInt("/sim/model-hz") );
+ remainder = 0;
+ }
+
+ // flight model
+ if ( global_multi_loop > 0 ) {
+ fgUpdateTimeDepCalcs();
+ } else {
+ FG_LOG( FG_ALL, FG_DEBUG,
+ "Elapsed time is zero ... we're zinging" );
}
#if ! defined( macintosh )
double mp_factor;
if ( cur_fdm_state->get_engine(0) != NULL ) {
mp_factor =
- cur_fdm_state->get_engine(0)->get_Manifold_Pressure() / 28;
+ cur_fdm_state->get_engine(0)->get_Manifold_Pressure() / 100;
} else {
- mp_factor = 1.0;
+ mp_factor = 0.3;
}
- // cout << "mp = "
- // << cur_fdm_state->get_engine(0)->get_Manifold_Pressure()
- // << endl;
+ /* cout << "mp = "
+ << cur_fdm_state->get_engine(0)->get_Manifold_Pressure()
+ << endl; */
- double volume = mp_factor;
+ double volume = 0.3 + mp_factor;
if ( volume < 0.3 ) { volume = 0.3; }
- if ( volume > 2.0 ) { volume = 2.0; }
+ if ( volume > 1.0 ) { volume = 1.0; }
// cout << "volume = " << volume << endl;
pitch_envelope.setStep ( 0, 0.01, pitch );
// setup OpenGL view parameters
fgInitVisuals();
- if ( use_signals ) {
- // init timer routines, signals, etc. Arrange for an alarm
- // signal to be generated, etc.
- fgInitTimeDepCalcs();
- }
-
idle_state++;
} else if ( idle_state == 5 ) {
FGViewerLookAt *chase = new FGViewerLookAt;
globals->get_viewmgr()->add_view( chase );
+ string_list *col = new string_list;
+ globals->set_channel_options_list( col );
+
// set current view to 0 (first) which is our main pilot view
globals->set_current_view( globals->get_viewmgr()->get_view( 0 ) );
void fgLoadDCS(void) {
- ssgEntity *ship_obj;
- double bz[3];
- int j=0;
+ ssgEntity *ship_obj = NULL;
+ // double bz[3];
+ // int j=0;
char obj_filename[25];
for (int k=0;k<32;k++)
void fgUpdateDCS (void) {
- double eye_lat,eye_lon,eye_alt;
- static double obj_head;
+ // double eye_lat,eye_lon,eye_alt;
+ // static double obj_head;
double sl_radius,obj_latgc;
- float nresultmat[4][4];
- sgMat4 Trans,rothead,rotlon,rot180,rotlat,resultmat1,resultmat2,resultmat3;
+ // float nresultmat[4][4];
+ // sgMat4 Trans,rothead,rotlon,rot180,rotlat,resultmat1,resultmat2,resultmat3;
double bz[3];
// Instantaneous Geodetic Lat/Lon/Alt of moving object