1999-06-18 03:42:54 +00:00
|
|
|
// main.cxx -- top level sim routines
|
1998-04-21 17:02:27 +00:00
|
|
|
//
|
|
|
|
// Written by Curtis Olson for OpenGL, started May 1997.
|
|
|
|
//
|
1999-06-18 03:42:54 +00:00
|
|
|
// Copyright (C) 1997 - 1999 Curtis L. Olson - curt@flightgear.org
|
1998-04-21 17:02:27 +00:00
|
|
|
//
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU General Public License as
|
|
|
|
// published by the Free Software Foundation; either version 2 of the
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful, but
|
|
|
|
// WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program; if not, write to the Free Software
|
|
|
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
//
|
|
|
|
// $Id$
|
|
|
|
|
1999-06-18 03:42:54 +00:00
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include <config.h>
|
|
|
|
#endif
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1999-05-08 02:33:13 +00:00
|
|
|
#ifdef FG_MATH_EXCEPTION_CLASH
|
|
|
|
# include <math.h>
|
|
|
|
#endif
|
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
#ifdef HAVE_WINDOWS_H
|
|
|
|
# include <windows.h>
|
1998-05-07 23:14:14 +00:00
|
|
|
# include <float.h>
|
1998-04-21 17:02:27 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <GL/glut.h>
|
2000-02-16 23:01:03 +00:00
|
|
|
#include <simgear/xgl/xgl.h>
|
2000-02-15 03:30:01 +00:00
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
#include <stdio.h>
|
1998-05-20 20:51:33 +00:00
|
|
|
#include <string.h>
|
1998-08-27 17:01:55 +00:00
|
|
|
#include <string>
|
1998-04-21 17:02:27 +00:00
|
|
|
|
|
|
|
#ifdef HAVE_STDLIB_H
|
|
|
|
# include <stdlib.h>
|
|
|
|
#endif
|
|
|
|
|
1999-01-19 20:57:00 +00:00
|
|
|
#ifdef HAVE_SYS_STAT_H
|
2000-11-01 02:30:10 +00:00
|
|
|
# include <sys/stat.h> // for stat()
|
1999-01-19 20:57:00 +00:00
|
|
|
#endif
|
1998-07-06 02:42:02 +00:00
|
|
|
|
|
|
|
#ifdef HAVE_UNISTD_H
|
2000-11-01 02:30:10 +00:00
|
|
|
# include <unistd.h> // for stat()
|
1998-07-06 02:42:02 +00:00
|
|
|
#endif
|
|
|
|
|
2000-11-01 02:30:10 +00:00
|
|
|
#include <plib/pu.h>
|
|
|
|
#include <plib/ssg.h>
|
1999-06-18 03:42:54 +00:00
|
|
|
|
|
|
|
#ifdef ENABLE_AUDIO_SUPPORT
|
2000-11-01 02:30:10 +00:00
|
|
|
# include <plib/sl.h>
|
|
|
|
# include <plib/sm.h>
|
1999-06-18 03:42:54 +00:00
|
|
|
#endif
|
|
|
|
|
2000-02-15 03:30:01 +00:00
|
|
|
#include <simgear/constants.h> // for VERSION
|
2000-02-16 23:01:03 +00:00
|
|
|
#include <simgear/debug/logstream.hxx>
|
|
|
|
#include <simgear/math/polar3d.hxx>
|
|
|
|
#include <simgear/math/fg_random.h>
|
|
|
|
#include <simgear/misc/fgpath.hxx>
|
2000-07-03 20:09:56 +00:00
|
|
|
#include <simgear/sky/sky.hxx>
|
2000-07-06 22:13:24 +00:00
|
|
|
#include <simgear/timing/sg_time.hxx>
|
2000-07-07 17:27:37 +00:00
|
|
|
#include <simgear/timing/lowleveltime.h>
|
2000-02-15 03:30:01 +00:00
|
|
|
|
1999-01-07 20:24:43 +00:00
|
|
|
#include <Include/general.hxx>
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-10-17 01:33:52 +00:00
|
|
|
#include <Aircraft/aircraft.hxx>
|
1998-06-03 00:47:11 +00:00
|
|
|
|
2000-04-30 06:51:49 +00:00
|
|
|
#include <Autopilot/newauto.hxx>
|
1998-04-24 00:49:17 +00:00
|
|
|
#include <Cockpit/cockpit.hxx>
|
2000-04-25 03:09:26 +00:00
|
|
|
#include <Cockpit/radiostack.hxx>
|
2000-03-21 20:51:03 +00:00
|
|
|
#include <Cockpit/steam.hxx>
|
2000-05-16 18:21:08 +00:00
|
|
|
|
2000-03-22 22:01:33 +00:00
|
|
|
#include <FDM/UIUCModel/uiuc_aircraftdir.h>
|
1998-06-12 14:27:25 +00:00
|
|
|
#include <GUI/gui.h>
|
1998-10-27 02:14:21 +00:00
|
|
|
#include <Joystick/joystick.hxx>
|
1999-06-30 20:21:04 +00:00
|
|
|
#ifdef FG_NETWORK_OLK
|
2000-01-12 18:09:35 +00:00
|
|
|
#include <NetworkOLK/network.h>
|
1999-06-30 20:21:04 +00:00
|
|
|
#endif
|
1998-04-30 12:34:17 +00:00
|
|
|
#include <Scenery/scenery.hxx>
|
1998-04-22 13:25:39 +00:00
|
|
|
#include <Scenery/tilemgr.hxx>
|
1998-04-24 00:49:17 +00:00
|
|
|
#include <Time/event.hxx>
|
|
|
|
#include <Time/fg_timer.hxx>
|
2000-10-25 22:59:02 +00:00
|
|
|
#include <Time/light.hxx>
|
1998-04-22 13:25:39 +00:00
|
|
|
#include <Time/sunpos.hxx>
|
2000-07-05 02:39:30 +00:00
|
|
|
#include <Time/tmp.hxx>
|
1999-08-12 17:13:44 +00:00
|
|
|
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
// $$$ begin - added VS Renganathan
|
|
|
|
#include <simgear/misc/fgstream.hxx>
|
|
|
|
#include <FDM/flight.hxx>
|
|
|
|
void fgLoadDCS (void);
|
|
|
|
void fgUpdateDCS (void);
|
|
|
|
ssgSelector *ship_sel = NULL;
|
|
|
|
ssgTransform *ship_pos = NULL;
|
|
|
|
//int totalDCSobj = 0;
|
|
|
|
// $$$ end - added VS Renganathan
|
|
|
|
|
1999-10-22 00:27:49 +00:00
|
|
|
#ifndef FG_OLD_WEATHER
|
|
|
|
# include <WeatherCM/FGLocalWeatherDatabase.h>
|
|
|
|
#else
|
1999-08-12 17:13:44 +00:00
|
|
|
# include <Weather/weather.hxx>
|
|
|
|
#endif
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2000-10-10 20:31:20 +00:00
|
|
|
#include "version.h"
|
|
|
|
|
2000-05-23 22:08:00 +00:00
|
|
|
#include "bfi.hxx"
|
1998-04-22 13:25:39 +00:00
|
|
|
#include "fg_init.hxx"
|
1999-11-19 02:10:24 +00:00
|
|
|
#include "fg_io.hxx"
|
2000-07-07 17:27:37 +00:00
|
|
|
#include "globals.hxx"
|
1999-06-18 03:42:54 +00:00
|
|
|
#include "keyboard.hxx"
|
1998-07-06 02:42:02 +00:00
|
|
|
#include "splash.hxx"
|
1998-04-22 13:25:39 +00:00
|
|
|
|
1999-04-27 19:27:45 +00:00
|
|
|
// -dw- use custom sioux settings so I can see output window
|
2000-09-10 00:04:50 +00:00
|
|
|
#ifdef macintosh
|
1999-04-27 19:27:45 +00:00
|
|
|
# ifndef FG_NDEBUG
|
|
|
|
# include <sioux.h> // settings for output window
|
|
|
|
# endif
|
1999-06-02 22:22:47 +00:00
|
|
|
# include <console.h>
|
1999-04-27 19:27:45 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
1999-01-07 20:24:43 +00:00
|
|
|
// This is a record containing a bit of global housekeeping information
|
|
|
|
FGGeneral general;
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-07-06 02:42:02 +00:00
|
|
|
// Specify our current idle function state. This is used to run all
|
|
|
|
// our initializations out of the glutIdleLoop() so that we can get a
|
|
|
|
// splash screen up and running right away.
|
1998-09-15 02:09:24 +00:00
|
|
|
static int idle_state = 0;
|
1999-10-23 00:09:26 +00:00
|
|
|
static int global_multi_loop;
|
1998-07-06 02:42:02 +00:00
|
|
|
|
2000-09-15 19:28:26 +00:00
|
|
|
// attempt to avoid a large bounce at startup
|
|
|
|
static bool initial_freeze = true;
|
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
// Another hack
|
|
|
|
int use_signals = 0;
|
|
|
|
|
2000-10-19 23:09:33 +00:00
|
|
|
// forward declaration
|
|
|
|
void fgReshape( int width, int height );
|
|
|
|
|
1998-06-01 17:54:40 +00:00
|
|
|
// Global structures for the Audio library
|
1998-07-16 17:33:34 +00:00
|
|
|
#ifdef ENABLE_AUDIO_SUPPORT
|
1998-09-25 16:02:07 +00:00
|
|
|
slEnvelope pitch_envelope ( 1, SL_SAMPLE_ONE_SHOT ) ;
|
|
|
|
slEnvelope volume_envelope ( 1, SL_SAMPLE_ONE_SHOT ) ;
|
1998-07-08 14:45:07 +00:00
|
|
|
slScheduler *audio_sched;
|
|
|
|
smMixer *audio_mixer;
|
1998-06-05 18:18:40 +00:00
|
|
|
slSample *s1;
|
|
|
|
slSample *s2;
|
1998-06-03 00:47:11 +00:00
|
|
|
#endif
|
1998-06-01 17:54:40 +00:00
|
|
|
|
|
|
|
|
1999-06-18 03:42:54 +00:00
|
|
|
// ssg variables
|
|
|
|
ssgRoot *scene = NULL;
|
1999-06-28 00:02:52 +00:00
|
|
|
ssgBranch *terrain = NULL;
|
1999-06-30 19:16:53 +00:00
|
|
|
ssgSelector *penguin_sel = NULL;
|
|
|
|
ssgTransform *penguin_pos = NULL;
|
1999-06-18 03:42:54 +00:00
|
|
|
|
2000-01-12 18:09:35 +00:00
|
|
|
#ifdef FG_NETWORK_OLK
|
|
|
|
ssgSelector *fgd_sel = NULL;
|
|
|
|
ssgTransform *fgd_pos = NULL;
|
|
|
|
//sgMat4 sgTUX;
|
|
|
|
#endif
|
|
|
|
|
1999-10-14 17:32:34 +00:00
|
|
|
// current fdm/position used for view
|
|
|
|
FGInterface cur_view_fdm;
|
|
|
|
|
2000-03-02 13:51:31 +00:00
|
|
|
// Sky structures
|
2000-03-16 04:15:22 +00:00
|
|
|
SGSky *thesky;
|
2000-03-02 13:51:31 +00:00
|
|
|
|
1999-08-08 01:31:30 +00:00
|
|
|
// hack
|
|
|
|
sgMat4 copy_of_ssgOpenGLAxisSwapMatrix =
|
|
|
|
{
|
|
|
|
{ 1.0f, 0.0f, 0.0f, 0.0f },
|
|
|
|
{ 0.0f, 0.0f, -1.0f, 0.0f },
|
|
|
|
{ 0.0f, 1.0f, 0.0f, 0.0f },
|
|
|
|
{ 0.0f, 0.0f, 0.0f, 1.0f }
|
|
|
|
} ;
|
1999-06-18 03:42:54 +00:00
|
|
|
|
2000-10-10 20:31:20 +00:00
|
|
|
// The following defines flightgear options. Because glutlib will also
|
1998-04-21 17:02:27 +00:00
|
|
|
// want to parse its own options, those options must not be included here
|
|
|
|
// or they will get parsed by the main program option parser. Hence case
|
|
|
|
// is significant for any option added that might be in conflict with
|
|
|
|
// glutlib's parser.
|
|
|
|
//
|
|
|
|
// glutlib parses for:
|
|
|
|
// -display
|
|
|
|
// -direct (invalid in Win32)
|
|
|
|
// -geometry
|
|
|
|
// -gldebug
|
|
|
|
// -iconized
|
|
|
|
// -indirect (invalid in Win32)
|
|
|
|
// -synce
|
|
|
|
//
|
|
|
|
// Note that glutlib depends upon strings while this program's
|
|
|
|
// option parser wants only initial characters followed by numbers
|
|
|
|
// or pathnames.
|
|
|
|
//
|
|
|
|
|
|
|
|
|
2000-03-02 03:03:16 +00:00
|
|
|
ssgSimpleState *default_state;
|
|
|
|
ssgSimpleState *hud_and_panel;
|
|
|
|
ssgSimpleState *menus;
|
|
|
|
|
|
|
|
void fgBuildRenderStates( void ) {
|
|
|
|
default_state = new ssgSimpleState;
|
2000-10-18 00:48:12 +00:00
|
|
|
default_state->ref();
|
2000-03-02 03:03:16 +00:00
|
|
|
default_state->disable( GL_TEXTURE_2D );
|
|
|
|
default_state->enable( GL_CULL_FACE );
|
2000-06-01 21:14:06 +00:00
|
|
|
default_state->enable( GL_COLOR_MATERIAL );
|
|
|
|
default_state->setColourMaterial( GL_AMBIENT_AND_DIFFUSE );
|
|
|
|
default_state->setMaterial( GL_EMISSION, 0, 0, 0, 1 );
|
|
|
|
default_state->setMaterial( GL_SPECULAR, 0, 0, 0, 1 );
|
2000-03-02 03:03:16 +00:00
|
|
|
default_state->disable( GL_BLEND );
|
|
|
|
default_state->disable( GL_ALPHA_TEST );
|
|
|
|
default_state->disable( GL_LIGHTING );
|
|
|
|
|
|
|
|
hud_and_panel = new ssgSimpleState;
|
2000-10-18 00:48:12 +00:00
|
|
|
hud_and_panel->ref();
|
2000-03-02 03:03:16 +00:00
|
|
|
hud_and_panel->disable( GL_CULL_FACE );
|
|
|
|
hud_and_panel->disable( GL_TEXTURE_2D );
|
|
|
|
hud_and_panel->disable( GL_LIGHTING );
|
2000-05-30 20:51:47 +00:00
|
|
|
hud_and_panel->enable( GL_BLEND );
|
2000-03-02 03:03:16 +00:00
|
|
|
|
|
|
|
menus = new ssgSimpleState;
|
2000-10-18 00:48:12 +00:00
|
|
|
menus->ref();
|
2000-03-02 03:03:16 +00:00
|
|
|
menus->disable( GL_CULL_FACE );
|
|
|
|
menus->disable( GL_TEXTURE_2D );
|
|
|
|
menus->enable( GL_BLEND );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
// fgInitVisuals() -- Initialize various GL/view parameters
|
1999-10-14 23:46:28 +00:00
|
|
|
void fgInitVisuals( void ) {
|
1998-04-26 05:10:00 +00:00
|
|
|
fgLIGHT *l;
|
1998-04-21 17:02:27 +00:00
|
|
|
|
|
|
|
l = &cur_light_params;
|
|
|
|
|
1999-04-27 19:27:45 +00:00
|
|
|
#ifndef GLUT_WRONG_VERSION
|
1998-05-03 00:47:31 +00:00
|
|
|
// Go full screen if requested ...
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_fullscreen() ) {
|
1998-05-03 00:47:31 +00:00
|
|
|
glutFullScreen();
|
|
|
|
}
|
1999-04-27 19:27:45 +00:00
|
|
|
#endif
|
1998-04-21 17:02:27 +00:00
|
|
|
|
|
|
|
// If enabled, normal vectors specified with glNormal are scaled
|
|
|
|
// to unit length after transformation. See glNormal.
|
2000-03-17 06:16:15 +00:00
|
|
|
// glEnable( GL_NORMALIZE );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2000-03-17 06:16:15 +00:00
|
|
|
glEnable( GL_LIGHTING );
|
|
|
|
glEnable( GL_LIGHT0 );
|
|
|
|
glLightfv( GL_LIGHT0, GL_POSITION, l->sun_vec );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1999-06-18 03:42:54 +00:00
|
|
|
sgVec3 sunpos;
|
|
|
|
sgSetVec3( sunpos, l->sun_vec[0], l->sun_vec[1], l->sun_vec[2] );
|
|
|
|
ssgGetLight( 0 ) -> setPosition( sunpos );
|
|
|
|
|
2000-03-17 06:16:15 +00:00
|
|
|
// glFogi (GL_FOG_MODE, GL_LINEAR);
|
|
|
|
glFogi (GL_FOG_MODE, GL_EXP2);
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( (globals->get_options()->get_fog() == 1) ||
|
|
|
|
(globals->get_options()->get_shading() == 0) ) {
|
1998-06-13 00:40:32 +00:00
|
|
|
// if fastest fog requested, or if flat shading force fastest
|
2000-03-17 06:16:15 +00:00
|
|
|
glHint ( GL_FOG_HINT, GL_FASTEST );
|
2000-10-19 21:24:43 +00:00
|
|
|
} else if ( globals->get_options()->get_fog() == 2 ) {
|
2000-03-17 06:16:15 +00:00
|
|
|
glHint ( GL_FOG_HINT, GL_NICEST );
|
1998-05-11 18:18:15 +00:00
|
|
|
}
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_wireframe() ) {
|
1998-04-30 12:34:17 +00:00
|
|
|
// draw wire frame
|
2000-03-17 06:16:15 +00:00
|
|
|
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
|
1998-04-30 12:34:17 +00:00
|
|
|
}
|
1998-05-20 20:51:33 +00:00
|
|
|
|
|
|
|
// This is the default anyways, but it can't hurt
|
2000-03-17 06:16:15 +00:00
|
|
|
glFrontFace ( GL_CCW );
|
1998-07-20 12:49:44 +00:00
|
|
|
|
|
|
|
// Just testing ...
|
2000-03-17 06:16:15 +00:00
|
|
|
// glEnable(GL_POINT_SMOOTH);
|
|
|
|
// glEnable(GL_LINE_SMOOTH);
|
|
|
|
// glEnable(GL_POLYGON_SMOOTH);
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Update all Visuals (redraws anything graphics related)
|
1999-10-14 23:46:28 +00:00
|
|
|
void fgRenderFrame( void ) {
|
2000-05-16 18:21:08 +00:00
|
|
|
// Update the BFI.
|
|
|
|
FGBFI::update();
|
|
|
|
|
1998-12-09 18:50:12 +00:00
|
|
|
fgLIGHT *l = &cur_light_params;
|
1999-10-22 00:27:49 +00:00
|
|
|
static double last_visibility = -9999;
|
2000-06-20 22:31:47 +00:00
|
|
|
|
2000-10-25 15:27:55 +00:00
|
|
|
// double angle;
|
1998-07-22 21:40:43 +00:00
|
|
|
// GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
|
1999-10-22 00:27:49 +00:00
|
|
|
// GLfloat white[4] = { 1.0, 1.0, 1.0, 1.0 };
|
|
|
|
// GLfloat terrain_color[4] = { 0.54, 0.44, 0.29, 1.0 };
|
1999-05-13 02:10:52 +00:00
|
|
|
// GLfloat mat_shininess[] = { 10.0 };
|
1998-07-13 15:32:37 +00:00
|
|
|
GLbitfield clear_mask;
|
1999-10-22 00:27:49 +00:00
|
|
|
|
1998-07-06 02:42:02 +00:00
|
|
|
if ( idle_state != 1000 ) {
|
|
|
|
// still initializing, draw the splash screen
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_splash_screen() == 1 ) {
|
1998-07-06 21:34:17 +00:00
|
|
|
fgSplashUpdate(0.0);
|
|
|
|
}
|
1998-04-30 12:34:17 +00:00
|
|
|
} else {
|
1998-07-06 02:42:02 +00:00
|
|
|
// 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.
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-07-12 03:14:42 +00:00
|
|
|
// printf("Ground = %.2f Altitude = %.2f\n", scenery.cur_elev,
|
|
|
|
// FG_Altitude * FEET_TO_METER);
|
|
|
|
|
1998-07-06 02:42:02 +00:00
|
|
|
// this is just a temporary hack, to make me understand Pui
|
1998-08-22 14:49:55 +00:00
|
|
|
// timerText -> setLabel (ctime (&t->cur_time));
|
1998-07-06 02:42:02 +00:00
|
|
|
// end of hack
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2000-10-25 15:27:55 +00:00
|
|
|
// calculate our current position in cartesian space
|
|
|
|
scenery.center = scenery.next_center;
|
|
|
|
// printf("scenery center = %.2f %.2f %.2f\n", scenery.center.x(),
|
|
|
|
// scenery.center.y(), scenery.center.z());
|
|
|
|
|
2000-10-26 21:51:09 +00:00
|
|
|
FGViewerRPH *pilot_view =
|
|
|
|
(FGViewerRPH *)globals->get_viewmgr()->get_view( 0 );
|
|
|
|
|
|
|
|
pilot_view->set_geod_view_pos( cur_fdm_state->get_Longitude(),
|
|
|
|
cur_fdm_state->get_Lat_geocentric(),
|
|
|
|
cur_fdm_state->get_Altitude() *
|
|
|
|
FEET_TO_METER );
|
|
|
|
pilot_view->set_sea_level_radius( cur_fdm_state->
|
|
|
|
get_Sea_level_radius() *
|
|
|
|
FEET_TO_METER );
|
|
|
|
pilot_view->set_rph( cur_fdm_state->get_Phi(),
|
|
|
|
cur_fdm_state->get_Theta(),
|
|
|
|
cur_fdm_state->get_Psi() );
|
2000-10-25 15:27:55 +00:00
|
|
|
|
2000-10-27 22:00:43 +00:00
|
|
|
FGViewerLookAt *chase_view =
|
|
|
|
(FGViewerLookAt *)globals->get_viewmgr()->get_view( 1 );
|
|
|
|
|
|
|
|
sgVec3 po; // chase view pilot_offset
|
|
|
|
sgVec3 wup; // chase view world up
|
2000-11-01 04:32:04 +00:00
|
|
|
sgSetVec3( po, 0.0, 0.0, 50.0 );
|
2000-11-01 02:30:10 +00:00
|
|
|
sgCopyVec3( wup, pilot_view->get_world_up() );
|
2000-11-01 04:32:04 +00:00
|
|
|
sgMat4 CXFM; // chase view + pilot offset xform
|
|
|
|
sgMakeRotMat4( CXFM,
|
|
|
|
chase_view->get_view_offset() * RAD_TO_DEG -
|
|
|
|
cur_fdm_state->get_Psi() * RAD_TO_DEG,
|
|
|
|
wup );
|
|
|
|
sgVec3 npo; // new pilot offset after rotation
|
|
|
|
sgXformVec3( po, po, pilot_view->get_UP() );
|
|
|
|
sgXformVec3( npo, po, CXFM );
|
2000-10-27 22:00:43 +00:00
|
|
|
|
|
|
|
chase_view->set_geod_view_pos( cur_fdm_state->get_Longitude(),
|
|
|
|
cur_fdm_state->get_Lat_geocentric(),
|
|
|
|
cur_fdm_state->get_Altitude() *
|
|
|
|
FEET_TO_METER );
|
2000-11-01 02:30:10 +00:00
|
|
|
chase_view->set_sea_level_radius( cur_fdm_state->
|
|
|
|
get_Sea_level_radius() *
|
|
|
|
FEET_TO_METER );
|
2000-11-01 04:32:04 +00:00
|
|
|
chase_view->set_pilot_offset( npo[0], npo[1], npo[2] );
|
|
|
|
chase_view->set_view_forward( pilot_view->get_view_pos() );
|
2000-10-27 22:00:43 +00:00
|
|
|
chase_view->set_view_up( wup );
|
|
|
|
|
2000-10-26 18:20:55 +00:00
|
|
|
#if 0
|
2000-10-26 18:10:28 +00:00
|
|
|
sgMat4 rph;
|
2000-11-01 02:30:10 +00:00
|
|
|
sgCopyMat4( rph, pilot_view->get_VIEW() );
|
2000-10-26 18:10:28 +00:00
|
|
|
cout << "RPH Matrix = " << endl;
|
|
|
|
int i, j;
|
|
|
|
for ( i = 0; i < 4; i++ ) {
|
|
|
|
for ( j = 0; j < 4; j++ ) {
|
|
|
|
printf("%10.4f ", rph[i][j]);
|
|
|
|
}
|
|
|
|
cout << endl;
|
|
|
|
}
|
2000-11-01 02:30:10 +00:00
|
|
|
|
2000-10-26 18:10:28 +00:00
|
|
|
sgMat4 la;
|
2000-11-01 02:30:10 +00:00
|
|
|
sgCopyMat4( la, chase_view->get_VIEW() );
|
2000-10-26 18:10:28 +00:00
|
|
|
cout << "LookAt Matrix = " << endl;
|
|
|
|
for ( i = 0; i < 4; i++ ) {
|
|
|
|
for ( j = 0; j < 4; j++ ) {
|
|
|
|
printf("%10.4f ", la[i][j]);
|
|
|
|
}
|
|
|
|
cout << endl;
|
|
|
|
}
|
2000-11-01 02:30:10 +00:00
|
|
|
#endif
|
2000-10-25 15:27:55 +00:00
|
|
|
|
2000-11-01 04:32:04 +00:00
|
|
|
// update view port
|
2000-11-01 23:27:32 +00:00
|
|
|
fgReshape( globals->get_options()->get_xsize(),
|
|
|
|
globals->get_options()->get_ysize() );
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
// swing and a miss
|
|
|
|
|
2000-10-25 15:27:55 +00:00
|
|
|
if ( ! fgPanelVisible() ) {
|
|
|
|
xglViewport( 0, 0 ,
|
|
|
|
(GLint)(globals->get_options()->get_xsize()),
|
|
|
|
(GLint)(globals->get_options()->get_ysize()) );
|
|
|
|
} else {
|
|
|
|
int view_h =
|
|
|
|
int( (current_panel->getViewHeight() -
|
|
|
|
current_panel->getYOffset())
|
|
|
|
* (globals->get_options()->get_ysize() / 768.0) );
|
|
|
|
glViewport( 0,
|
|
|
|
(GLint)(globals->get_options()->get_ysize() - view_h),
|
|
|
|
(GLint)(globals->get_options()->get_xsize()),
|
|
|
|
(GLint)(view_h) );
|
|
|
|
}
|
2000-11-01 23:27:32 +00:00
|
|
|
#endif
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-12-11 20:26:25 +00:00
|
|
|
// set the sun position
|
2000-03-17 06:16:15 +00:00
|
|
|
glLightfv( GL_LIGHT0, GL_POSITION, l->sun_vec );
|
1998-12-11 20:26:25 +00:00
|
|
|
|
1998-07-13 15:32:37 +00:00
|
|
|
clear_mask = GL_DEPTH_BUFFER_BIT;
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_wireframe() ) {
|
1998-07-13 15:32:37 +00:00
|
|
|
clear_mask |= GL_COLOR_BUFFER_BIT;
|
|
|
|
}
|
2000-07-05 02:39:30 +00:00
|
|
|
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_skyblend() ) {
|
|
|
|
if ( globals->get_options()->get_textures() ) {
|
1998-07-20 12:49:44 +00:00
|
|
|
// glClearColor(black[0], black[1], black[2], black[3]);
|
1998-07-22 21:40:43 +00:00
|
|
|
glClearColor(l->adj_fog_color[0], l->adj_fog_color[1],
|
|
|
|
l->adj_fog_color[2], l->adj_fog_color[3]);
|
1999-05-12 01:11:17 +00:00
|
|
|
clear_mask |= GL_COLOR_BUFFER_BIT;
|
1998-07-20 12:49:44 +00:00
|
|
|
}
|
1998-07-06 02:42:02 +00:00
|
|
|
} else {
|
|
|
|
glClearColor(l->sky_color[0], l->sky_color[1],
|
|
|
|
l->sky_color[2], l->sky_color[3]);
|
1998-07-13 15:32:37 +00:00
|
|
|
clear_mask |= GL_COLOR_BUFFER_BIT;
|
1998-07-06 02:42:02 +00:00
|
|
|
}
|
2000-03-17 06:16:15 +00:00
|
|
|
glClear( clear_mask );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-07-06 02:42:02 +00:00
|
|
|
// Tell GL we are switching to model view parameters
|
1999-08-08 01:31:30 +00:00
|
|
|
|
|
|
|
// I really should create a derived ssg node or use a call
|
|
|
|
// back or something so that I can draw the sky within the
|
2000-06-20 02:29:31 +00:00
|
|
|
// ssgCullAndDraw() function, but for now I just mimic what
|
1999-08-08 01:31:30 +00:00
|
|
|
// ssg does to set up the model view matrix
|
2000-03-17 06:16:15 +00:00
|
|
|
glMatrixMode(GL_MODELVIEW);
|
|
|
|
glLoadIdentity();
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
ssgSetCamera( (sgMat4)globals->get_current_view()->get_VIEW() );
|
2000-03-01 00:31:35 +00:00
|
|
|
|
2000-03-02 03:03:16 +00:00
|
|
|
// set the opengl state to known default values
|
|
|
|
default_state->force();
|
|
|
|
|
2000-06-20 22:31:47 +00:00
|
|
|
// update fog params if visibility has changed
|
|
|
|
#ifndef FG_OLD_WEATHER
|
|
|
|
thesky->set_visibility( WeatherDatabase->getWeatherVisibility() );
|
|
|
|
#else
|
|
|
|
thesky->set_visibility( current_weather.get_visibility() );
|
|
|
|
#endif
|
|
|
|
|
2000-06-30 21:46:41 +00:00
|
|
|
thesky->modify_vis( cur_fdm_state->get_Altitude() * FEET_TO_METER,
|
2000-06-20 22:31:47 +00:00
|
|
|
|
|
|
|
( global_multi_loop *
|
2000-10-19 21:24:43 +00:00
|
|
|
globals->get_options()->get_speed_up() ) /
|
|
|
|
(double)globals->get_options()->get_model_hz() );
|
2000-06-20 22:31:47 +00:00
|
|
|
|
|
|
|
double actual_visibility = thesky->get_visibility();
|
|
|
|
// cout << "actual visibility = " << actual_visibility << endl;
|
|
|
|
|
|
|
|
if ( actual_visibility != last_visibility ) {
|
|
|
|
last_visibility = actual_visibility;
|
|
|
|
|
|
|
|
// cout << "----> updating fog params" << endl;
|
|
|
|
|
|
|
|
GLfloat fog_exp_density;
|
|
|
|
GLfloat fog_exp2_density;
|
|
|
|
|
|
|
|
// for GL_FOG_EXP
|
|
|
|
fog_exp_density = -log(0.01 / actual_visibility);
|
|
|
|
|
|
|
|
// for GL_FOG_EXP2
|
|
|
|
fog_exp2_density = sqrt( -log(0.01) ) / actual_visibility;
|
|
|
|
|
|
|
|
// Set correct opengl fog density
|
|
|
|
glFogf (GL_FOG_DENSITY, fog_exp2_density);
|
|
|
|
}
|
|
|
|
|
|
|
|
// update the sky dome
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_skyblend() ) {
|
2000-03-16 04:15:22 +00:00
|
|
|
/* cout << "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] << endl;
|
|
|
|
cout << " 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] << endl;
|
|
|
|
cout << " sun_angle = " << cur_light_params.sun_angle
|
|
|
|
<< " moon_angle = " << cur_light_params.moon_angle
|
|
|
|
<< endl; */
|
|
|
|
thesky->repaint( cur_light_params.sky_color,
|
2000-03-17 06:16:15 +00:00
|
|
|
cur_light_params.adj_fog_color,
|
2000-03-16 04:15:22 +00:00
|
|
|
cur_light_params.sun_angle,
|
|
|
|
cur_light_params.moon_angle,
|
2000-07-08 05:09:24 +00:00
|
|
|
globals->get_ephem()->getNumPlanets(),
|
|
|
|
globals->get_ephem()->getPlanets(),
|
|
|
|
globals->get_ephem()->getNumStars(),
|
|
|
|
globals->get_ephem()->getStars() );
|
2000-03-16 23:01:57 +00:00
|
|
|
|
2000-03-16 04:15:22 +00:00
|
|
|
/* cout << "thesky->reposition( view_pos = " << view_pos[0] << " "
|
|
|
|
<< view_pos[1] << " " << view_pos[2] << endl;
|
|
|
|
cout << " zero_elev = " << zero_elev[0] << " "
|
|
|
|
<< zero_elev[1] << " " << zero_elev[2]
|
|
|
|
<< " lon = " << cur_fdm_state->get_Longitude()
|
|
|
|
<< " lat = " << cur_fdm_state->get_Latitude() << endl;
|
|
|
|
cout << " sun_rot = " << cur_light_params.sun_rotation
|
2000-07-06 22:13:24 +00:00
|
|
|
<< " gst = " << SGTime::cur_time_params->getGst() << endl;
|
2000-07-08 05:09:24 +00:00
|
|
|
cout << " sun ra = " << globals->get_ephem()->getSunRightAscension()
|
|
|
|
<< " sun dec = " << globals->get_ephem()->getSunDeclination()
|
|
|
|
<< " moon ra = " << globals->get_ephem()->getMoonRightAscension()
|
|
|
|
<< " moon dec = " << globals->get_ephem()->getMoonDeclination() << endl; */
|
2000-03-16 04:15:22 +00:00
|
|
|
|
2000-10-25 19:27:13 +00:00
|
|
|
thesky->reposition( globals->get_current_view()->get_view_pos(),
|
2000-10-25 19:46:43 +00:00
|
|
|
globals->get_current_view()->get_zero_elev(),
|
2000-10-26 18:10:28 +00:00
|
|
|
globals->get_current_view()->get_world_up(),
|
2000-03-16 04:15:22 +00:00
|
|
|
cur_fdm_state->get_Longitude(),
|
|
|
|
cur_fdm_state->get_Latitude(),
|
2000-06-20 22:31:47 +00:00
|
|
|
cur_fdm_state->get_Altitude() * FEET_TO_METER,
|
2000-03-16 04:15:22 +00:00
|
|
|
cur_light_params.sun_rotation,
|
2000-07-07 20:28:51 +00:00
|
|
|
globals->get_time_params()->getGst(),
|
2000-07-08 05:09:24 +00:00
|
|
|
globals->get_ephem()->getSunRightAscension(),
|
|
|
|
globals->get_ephem()->getSunDeclination(),
|
|
|
|
50000.0,
|
|
|
|
globals->get_ephem()->getMoonRightAscension(),
|
|
|
|
globals->get_ephem()->getMoonDeclination(),
|
|
|
|
50000.0 );
|
2000-03-02 03:03:16 +00:00
|
|
|
}
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2000-03-17 06:16:15 +00:00
|
|
|
glEnable( GL_DEPTH_TEST );
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_fog() > 0 ) {
|
2000-03-17 06:16:15 +00:00
|
|
|
glEnable( GL_FOG );
|
|
|
|
glFogi( GL_FOG_MODE, GL_EXP2 );
|
|
|
|
glFogfv( GL_FOG_COLOR, l->adj_fog_color );
|
1998-07-06 02:42:02 +00:00
|
|
|
}
|
1999-10-22 00:27:49 +00:00
|
|
|
|
1998-07-06 02:42:02 +00:00
|
|
|
// set lighting parameters
|
2000-06-20 04:50:00 +00:00
|
|
|
GLfloat black[4] = { 0.0, 0.0, 0.0, 1.0 };
|
|
|
|
glLightModelfv( GL_LIGHT_MODEL_AMBIENT, l->scene_ambient );
|
|
|
|
glLightfv( GL_LIGHT0, GL_AMBIENT, black );
|
2000-03-17 06:16:15 +00:00
|
|
|
glLightfv( GL_LIGHT0, GL_DIFFUSE, l->scene_diffuse );
|
|
|
|
// glLightfv(GL_LIGHT0, GL_SPECULAR, white );
|
1999-10-20 22:18:54 +00:00
|
|
|
|
|
|
|
// texture parameters
|
2000-03-17 06:16:15 +00:00
|
|
|
// glEnable( GL_TEXTURE_2D );
|
|
|
|
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ;
|
|
|
|
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ) ;
|
1999-10-20 22:18:54 +00:00
|
|
|
// set base color (I don't think this is doing anything here)
|
2000-03-17 06:16:15 +00:00
|
|
|
// glMaterialfv (GL_FRONT, GL_AMBIENT, white);
|
1999-10-20 22:18:54 +00:00
|
|
|
// (GL_FRONT, GL_DIFFUSE, white);
|
2000-03-17 06:16:15 +00:00
|
|
|
// glMaterialfv (GL_FRONT, GL_SPECULAR, white);
|
|
|
|
// glMaterialfv (GL_FRONT, GL_SHININESS, mat_shininess);
|
1999-10-20 22:18:54 +00:00
|
|
|
|
1999-08-15 15:35:07 +00:00
|
|
|
sgVec3 sunpos;
|
|
|
|
sgSetVec3( sunpos, l->sun_vec[0], l->sun_vec[1], l->sun_vec[2] );
|
|
|
|
ssgGetLight( 0 ) -> setPosition( sunpos );
|
1999-06-18 03:42:54 +00:00
|
|
|
|
2000-03-17 06:16:15 +00:00
|
|
|
// glMatrixMode( GL_PROJECTION );
|
|
|
|
// glLoadIdentity();
|
2000-11-01 23:27:32 +00:00
|
|
|
float fov = globals->get_current_view()->get_fov();
|
|
|
|
ssgSetFOV(fov, fov * globals->get_current_view()->get_win_ratio());
|
1999-06-29 14:57:00 +00:00
|
|
|
|
|
|
|
double agl = current_aircraft.fdm_state->get_Altitude() * FEET_TO_METER
|
|
|
|
- scenery.cur_elev;
|
|
|
|
|
1999-06-29 17:26:46 +00:00
|
|
|
// FG_LOG( FG_ALL, FG_INFO, "visibility is "
|
|
|
|
// << current_weather.get_visibility() );
|
1999-06-29 14:57:00 +00:00
|
|
|
|
|
|
|
if ( agl > 10.0 ) {
|
2000-03-01 00:31:35 +00:00
|
|
|
ssgSetNearFar( 10.0f, 120000.0f );
|
1999-06-29 14:57:00 +00:00
|
|
|
} else {
|
2000-03-01 00:31:35 +00:00
|
|
|
ssgSetNearFar( 0.5f, 120000.0f );
|
1999-06-29 14:57:00 +00:00
|
|
|
}
|
1999-06-19 04:48:07 +00:00
|
|
|
|
2000-11-01 02:30:10 +00:00
|
|
|
if ( globals->get_viewmgr()->get_current() == 0 ) {
|
1999-06-30 19:16:53 +00:00
|
|
|
// disable TuX
|
|
|
|
penguin_sel->select(0);
|
2000-11-01 02:30:10 +00:00
|
|
|
} else {
|
1999-06-30 19:16:53 +00:00
|
|
|
// enable TuX and set up his position and orientation
|
|
|
|
penguin_sel->select(1);
|
|
|
|
|
2000-11-01 02:30:10 +00:00
|
|
|
FGViewerRPH *pilot_view =
|
|
|
|
(FGViewerRPH *)globals->get_viewmgr()->get_view( 0 );
|
|
|
|
|
1999-06-30 19:16:53 +00:00
|
|
|
sgMat4 sgTRANS;
|
2000-11-01 02:30:10 +00:00
|
|
|
sgMakeTransMat4( sgTRANS, pilot_view->get_view_pos() );
|
1999-06-30 19:16:53 +00:00
|
|
|
|
1999-07-01 01:17:43 +00:00
|
|
|
sgVec3 ownship_up;
|
|
|
|
sgSetVec3( ownship_up, 0.0, 0.0, 1.0);
|
|
|
|
|
|
|
|
sgMat4 sgROT;
|
|
|
|
sgMakeRotMat4( sgROT, -90.0, ownship_up );
|
|
|
|
|
2000-04-04 05:49:05 +00:00
|
|
|
// sgMat4 sgTMP;
|
|
|
|
// sgMat4 sgTUX;
|
|
|
|
// sgMultMat4( sgTMP, sgROT, pilot_view.VIEW_ROT );
|
|
|
|
// sgMultMat4( sgTUX, sgTMP, sgTRANS );
|
|
|
|
|
|
|
|
// sgTUX = ( sgROT * pilot_view.VIEW_ROT ) * sgTRANS
|
1999-06-30 19:16:53 +00:00
|
|
|
sgMat4 sgTUX;
|
2000-04-04 05:49:05 +00:00
|
|
|
sgCopyMat4( sgTUX, sgROT );
|
2000-11-01 02:30:10 +00:00
|
|
|
sgPostMultMat4( sgTUX, pilot_view->get_VIEW_ROT() );
|
2000-04-04 05:49:05 +00:00
|
|
|
sgPostMultMat4( sgTUX, sgTRANS );
|
1999-06-30 19:16:53 +00:00
|
|
|
|
|
|
|
sgCoord tuxpos;
|
|
|
|
sgSetCoord( &tuxpos, sgTUX );
|
|
|
|
penguin_pos->setTransform( &tuxpos );
|
1999-06-30 14:35:01 +00:00
|
|
|
}
|
|
|
|
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
// $$$ begin - added VS Renganthan 17 Oct 2K
|
|
|
|
fgUpdateDCS();
|
|
|
|
// $$$ end - added VS Renganthan 17 Oct 2K
|
|
|
|
|
2000-01-12 18:09:35 +00:00
|
|
|
# ifdef FG_NETWORK_OLK
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_network_olk() ) {
|
2000-02-28 04:16:12 +00:00
|
|
|
sgCoord fgdpos;
|
|
|
|
other = head->next; /* put listpointer to start */
|
|
|
|
while ( other != tail) { /* display all except myself */
|
|
|
|
if ( strcmp( other->ipadr, fgd_mcp_ip) != 0) {
|
|
|
|
other->fgd_sel->select(1);
|
|
|
|
sgSetCoord( &fgdpos, other->sgFGD_COORD );
|
|
|
|
other->fgd_pos->setTransform( &fgdpos );
|
|
|
|
}
|
|
|
|
other = other->next;
|
2000-01-12 18:09:35 +00:00
|
|
|
}
|
|
|
|
|
2000-02-28 04:16:12 +00:00
|
|
|
// fgd_sel->select(1);
|
|
|
|
// sgCopyMat4( sgTUX, current_view.sgVIEW);
|
|
|
|
// sgCoord fgdpos;
|
|
|
|
// sgSetCoord( &fgdpos, sgFGD_VIEW );
|
|
|
|
// fgd_pos->setTransform( &fgdpos);
|
|
|
|
}
|
2000-01-12 18:09:35 +00:00
|
|
|
# endif
|
|
|
|
|
1999-06-30 19:16:53 +00:00
|
|
|
// position tile nodes and update range selectors
|
1999-06-30 00:25:13 +00:00
|
|
|
global_tile_mgr.prep_ssg_nodes();
|
1999-06-30 19:16:53 +00:00
|
|
|
|
2000-06-20 02:29:31 +00:00
|
|
|
// draw the sky backdrop
|
2000-06-30 23:51:11 +00:00
|
|
|
thesky->preDraw();
|
2000-06-20 02:29:31 +00:00
|
|
|
|
1999-06-30 19:16:53 +00:00
|
|
|
// draw the ssg scene
|
2000-08-22 04:45:31 +00:00
|
|
|
glEnable( GL_DEPTH_TEST );
|
1999-06-28 00:02:52 +00:00
|
|
|
ssgCullAndDraw( scene );
|
1999-06-18 03:42:54 +00:00
|
|
|
|
2000-06-20 02:29:31 +00:00
|
|
|
// draw the sky cloud layers
|
2000-06-30 23:51:11 +00:00
|
|
|
thesky->postDraw( cur_fdm_state->get_Altitude() * FEET_TO_METER );
|
1999-06-28 05:47:02 +00:00
|
|
|
|
|
|
|
// display HUD && Panel
|
2000-03-17 06:16:15 +00:00
|
|
|
glDisable( GL_FOG );
|
|
|
|
glDisable( GL_DEPTH_TEST );
|
|
|
|
// glDisable( GL_CULL_FACE );
|
|
|
|
// glDisable( GL_TEXTURE_2D );
|
2000-03-02 03:03:16 +00:00
|
|
|
hud_and_panel->apply();
|
1999-06-28 05:47:02 +00:00
|
|
|
fgCockpitUpdate();
|
|
|
|
|
|
|
|
// We can do translucent menus, so why not. :-)
|
2000-03-17 06:16:15 +00:00
|
|
|
// glEnable ( GL_BLEND ) ;
|
2000-03-02 03:03:16 +00:00
|
|
|
menus->apply();
|
2000-03-17 06:16:15 +00:00
|
|
|
glBlendFunc ( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ;
|
1999-06-28 05:47:02 +00:00
|
|
|
puDisplay();
|
2000-03-17 06:16:15 +00:00
|
|
|
// glDisable ( GL_BLEND ) ;
|
1999-06-28 05:47:02 +00:00
|
|
|
|
2000-03-17 06:16:15 +00:00
|
|
|
// glEnable( GL_FOG );
|
1998-07-06 02:42:02 +00:00
|
|
|
}
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2000-03-17 06:16:15 +00:00
|
|
|
glutSwapBuffers();
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Update internal time dependent calculations (i.e. flight model)
|
1999-01-08 03:23:51 +00:00
|
|
|
void fgUpdateTimeDepCalcs(int multi_loop, int remainder) {
|
1999-09-09 00:16:28 +00:00
|
|
|
static fdm_state_list fdm_list;
|
1998-12-09 18:50:12 +00:00
|
|
|
fgLIGHT *l = &cur_light_params;
|
1998-04-21 17:02:27 +00:00
|
|
|
int i;
|
|
|
|
|
|
|
|
// update the flight model
|
|
|
|
if ( multi_loop < 0 ) {
|
1999-09-01 20:24:54 +00:00
|
|
|
multi_loop = 1;
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
2000-09-15 19:28:26 +00:00
|
|
|
if ( !globals->get_freeze() && !initial_freeze ) {
|
1998-09-29 02:03:36 +00:00
|
|
|
// run Autopilot system
|
2000-04-30 06:51:49 +00:00
|
|
|
current_autopilot->run();
|
1998-09-29 02:03:36 +00:00
|
|
|
|
1998-07-27 18:41:23 +00:00
|
|
|
// printf("updating flight model x %d\n", multi_loop);
|
2000-10-19 21:24:43 +00:00
|
|
|
/* fgFDMUpdate( globals->get_options()->get_flight_model(),
|
1999-09-09 00:16:28 +00:00
|
|
|
fdm_state,
|
2000-10-19 21:24:43 +00:00
|
|
|
multi_loop * globals->get_options()->get_speed_up(),
|
1999-10-11 23:09:07 +00:00
|
|
|
remainder ); */
|
2000-10-19 21:24:43 +00:00
|
|
|
cur_fdm_state->update( multi_loop *
|
|
|
|
globals->get_options()->get_speed_up() );
|
|
|
|
FGSteam::update( multi_loop * globals->get_options()->get_speed_up() );
|
1998-07-27 18:41:23 +00:00
|
|
|
} else {
|
2000-10-19 21:24:43 +00:00
|
|
|
// fgFDMUpdate( globals->get_options()->get_flight_model(),
|
1999-10-11 23:09:07 +00:00
|
|
|
// fdm_state, 0, remainder );
|
|
|
|
cur_fdm_state->update( 0 );
|
2000-03-21 20:51:03 +00:00
|
|
|
FGSteam::update( 0 );
|
2000-09-15 19:28:26 +00:00
|
|
|
|
|
|
|
if ( global_tile_mgr.queue_size() == 0 ) {
|
|
|
|
initial_freeze = false;
|
|
|
|
}
|
1999-09-09 00:16:28 +00:00
|
|
|
}
|
|
|
|
|
1999-10-14 17:32:34 +00:00
|
|
|
fdm_list.push_back( *cur_fdm_state );
|
|
|
|
while ( fdm_list.size() > 15 ) {
|
1999-09-09 00:16:28 +00:00
|
|
|
fdm_list.pop_front();
|
|
|
|
}
|
|
|
|
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_view_mode() == FGOptions::FG_VIEW_PILOT ) {
|
1999-10-14 17:32:34 +00:00
|
|
|
cur_view_fdm = *cur_fdm_state;
|
|
|
|
// do nothing
|
2000-10-19 21:24:43 +00:00
|
|
|
} else if ( globals->get_options()->get_view_mode()
|
|
|
|
== FGOptions::FG_VIEW_FOLLOW )
|
|
|
|
{
|
1999-10-14 17:32:34 +00:00
|
|
|
cur_view_fdm = fdm_list.front();
|
1998-07-27 18:41:23 +00:00
|
|
|
}
|
1998-04-21 17:02:27 +00:00
|
|
|
|
|
|
|
// update the view angle
|
2000-11-01 04:32:04 +00:00
|
|
|
FGViewer *v = globals->get_current_view();
|
1998-04-21 17:02:27 +00:00
|
|
|
for ( i = 0; i < multi_loop; i++ ) {
|
2000-11-01 04:32:04 +00:00
|
|
|
if ( fabs(v->get_goal_view_offset() - v->get_view_offset()) < 0.05 ) {
|
|
|
|
v->set_view_offset( v->get_goal_view_offset() );
|
1998-04-21 17:02:27 +00:00
|
|
|
break;
|
|
|
|
} else {
|
2000-10-19 21:24:43 +00:00
|
|
|
// move current_view.view_offset towards
|
|
|
|
// current_view.goal_view_offset
|
2000-11-01 04:32:04 +00:00
|
|
|
if ( v->get_goal_view_offset() > v->get_view_offset() )
|
1999-09-09 00:16:28 +00:00
|
|
|
{
|
2000-11-01 04:32:04 +00:00
|
|
|
if ( v->get_goal_view_offset() - v->get_view_offset() < FG_PI ){
|
|
|
|
v->inc_view_offset( 0.01 );
|
1998-04-21 17:02:27 +00:00
|
|
|
} else {
|
2000-11-01 04:32:04 +00:00
|
|
|
v->inc_view_offset( -0.01 );
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
} else {
|
2000-11-01 04:32:04 +00:00
|
|
|
if ( v->get_view_offset() - v->get_goal_view_offset() < FG_PI ){
|
|
|
|
v->inc_view_offset( -0.01 );
|
1998-04-21 17:02:27 +00:00
|
|
|
} else {
|
2000-11-01 04:32:04 +00:00
|
|
|
v->inc_view_offset( 0.01 );
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
}
|
2000-11-01 04:32:04 +00:00
|
|
|
if ( v->get_view_offset() > FG_2PI ) {
|
|
|
|
v->inc_view_offset( -FG_2PI );
|
|
|
|
} else if ( v->get_view_offset() < 0 ) {
|
|
|
|
v->inc_view_offset( FG_2PI );
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
1998-07-22 21:40:43 +00:00
|
|
|
|
1998-12-09 18:50:12 +00:00
|
|
|
double tmp = -(l->sun_rotation + FG_PI)
|
2000-10-19 21:24:43 +00:00
|
|
|
- (cur_fdm_state->get_Psi() -
|
|
|
|
globals->get_current_view()->get_view_offset() );
|
1998-07-22 21:40:43 +00:00
|
|
|
while ( tmp < 0.0 ) {
|
|
|
|
tmp += FG_2PI;
|
|
|
|
}
|
|
|
|
while ( tmp > FG_2PI ) {
|
|
|
|
tmp -= FG_2PI;
|
|
|
|
}
|
1998-07-24 21:39:08 +00:00
|
|
|
/* printf("Psi = %.2f, viewoffset = %.2f sunrot = %.2f rottosun = %.2f\n",
|
1999-09-09 00:16:28 +00:00
|
|
|
FG_Psi * RAD_TO_DEG, current_view.view_offset * RAD_TO_DEG,
|
1998-07-24 21:39:08 +00:00
|
|
|
-(l->sun_rotation+FG_PI) * RAD_TO_DEG, tmp * RAD_TO_DEG); */
|
1998-07-22 21:40:43 +00:00
|
|
|
l->UpdateAdjFog();
|
2000-03-02 13:51:31 +00:00
|
|
|
|
|
|
|
// Update solar system
|
2000-07-08 05:09:24 +00:00
|
|
|
globals->get_ephem()->update( globals->get_time_params()->getMjd(),
|
|
|
|
globals->get_time_params()->getLst(),
|
|
|
|
cur_fdm_state->get_Latitude() );
|
2000-04-25 03:09:26 +00:00
|
|
|
|
|
|
|
// Update radio stack model
|
2000-05-04 01:18:45 +00:00
|
|
|
current_radiostack->update( cur_fdm_state->get_Longitude(),
|
|
|
|
cur_fdm_state->get_Latitude(),
|
2000-04-25 03:09:26 +00:00
|
|
|
cur_fdm_state->get_Altitude() * FEET_TO_METER );
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void fgInitTimeDepCalcs( void ) {
|
|
|
|
// initialize timer
|
|
|
|
|
1999-01-08 03:23:51 +00:00
|
|
|
// #ifdef HAVE_SETITIMER
|
2000-10-19 21:24:43 +00:00
|
|
|
// fgTimerInit( 1.0 / globals->get_options()->get_model_hz(),
|
1999-09-01 20:24:54 +00:00
|
|
|
// fgUpdateTimeDepCalcs );
|
1999-01-08 03:23:51 +00:00
|
|
|
// #endif HAVE_SETITIMER
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
1999-09-01 20:24:54 +00:00
|
|
|
|
1998-08-27 17:01:55 +00:00
|
|
|
static const double alt_adjust_ft = 3.758099;
|
|
|
|
static const double alt_adjust_m = alt_adjust_ft * FEET_TO_METER;
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1999-09-01 20:24:54 +00:00
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
// What should we do when we have nothing else to do? Let's get ready
|
|
|
|
// for the next move and update the display?
|
1998-04-21 17:02:27 +00:00
|
|
|
static void fgMainLoop( void ) {
|
1999-01-09 13:37:32 +00:00
|
|
|
static long remainder = 0;
|
1999-10-23 00:09:26 +00:00
|
|
|
long elapsed;
|
1999-05-06 21:14:06 +00:00
|
|
|
#ifdef FANCY_FRAME_COUNTER
|
|
|
|
int i;
|
|
|
|
double accum;
|
|
|
|
#else
|
1998-12-18 23:40:55 +00:00
|
|
|
static time_t last_time = 0;
|
|
|
|
static int frames = 0;
|
1999-05-06 21:14:06 +00:00
|
|
|
#endif // FANCY_FRAME_COUNTER
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2000-07-07 20:28:51 +00:00
|
|
|
SGTime *t = globals->get_time_params();
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-11-06 21:17:31 +00:00
|
|
|
FG_LOG( FG_ALL, FG_DEBUG, "Running Main Loop");
|
|
|
|
FG_LOG( FG_ALL, FG_DEBUG, "======= ==== ====");
|
1998-05-06 03:16:23 +00:00
|
|
|
|
2000-01-12 18:09:35 +00:00
|
|
|
#ifdef FG_NETWORK_OLK
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_network_olk() ) {
|
2000-02-28 04:16:12 +00:00
|
|
|
if ( net_is_registered == 0 ) { // We first have to reg. to fgd
|
|
|
|
// printf("FGD: Netupdate\n");
|
|
|
|
fgd_send_com( "A", FGFS_host); // Send Mat4 data
|
|
|
|
fgd_send_com( "B", FGFS_host); // Recv Mat4 data
|
|
|
|
}
|
2000-01-12 18:09:35 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
1999-05-27 00:21:54 +00:00
|
|
|
#if defined( ENABLE_PLIB_JOYSTICK )
|
1998-12-18 23:40:55 +00:00
|
|
|
// Read joystick and update control settings
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_control_mode() == FGOptions::FG_JOYSTICK )
|
|
|
|
{
|
1999-08-10 03:44:47 +00:00
|
|
|
fgJoystickRead();
|
|
|
|
}
|
1998-12-18 23:40:55 +00:00
|
|
|
#elif defined( ENABLE_GLUT_JOYSTICK )
|
|
|
|
// Glut joystick support works by feeding a joystick handler
|
|
|
|
// function to glut. This is taken care of once in the joystick
|
|
|
|
// init routine and we don't have to worry about it again.
|
|
|
|
#endif
|
|
|
|
|
1999-10-14 20:30:54 +00:00
|
|
|
#ifdef FG_OLD_WEATHER
|
1999-08-12 17:13:44 +00:00
|
|
|
current_weather.Update();
|
|
|
|
#endif
|
1998-10-02 12:46:43 +00:00
|
|
|
|
1998-07-12 03:14:42 +00:00
|
|
|
// Fix elevation. I'm just sticking this here for now, it should
|
|
|
|
// probably move eventually
|
|
|
|
|
1998-12-06 14:52:54 +00:00
|
|
|
/* printf("Before - ground = %.2f runway = %.2f alt = %.2f\n",
|
1998-07-12 03:14:42 +00:00
|
|
|
scenery.cur_elev,
|
1999-10-11 23:09:07 +00:00
|
|
|
cur_fdm_state->get_Runway_altitude() * FEET_TO_METER,
|
|
|
|
cur_fdm_state->get_Altitude() * FEET_TO_METER); */
|
1998-07-12 03:14:42 +00:00
|
|
|
|
|
|
|
if ( scenery.cur_elev > -9990 ) {
|
1999-10-11 23:09:07 +00:00
|
|
|
if ( cur_fdm_state->get_Altitude() * FEET_TO_METER <
|
1998-08-27 17:01:55 +00:00
|
|
|
(scenery.cur_elev + alt_adjust_m - 3.0) ) {
|
1998-07-12 03:14:42 +00:00
|
|
|
// now set aircraft altitude above ground
|
2000-01-13 20:12:16 +00:00
|
|
|
printf("(*) Current Altitude = %.2f < %.2f forcing to %.2f\n",
|
1999-10-11 23:09:07 +00:00
|
|
|
cur_fdm_state->get_Altitude() * FEET_TO_METER,
|
1998-08-27 17:01:55 +00:00
|
|
|
scenery.cur_elev + alt_adjust_m - 3.0,
|
|
|
|
scenery.cur_elev + alt_adjust_m );
|
2000-10-19 21:24:43 +00:00
|
|
|
fgFDMForceAltitude( globals->get_options()->get_flight_model(),
|
1999-01-20 13:42:22 +00:00
|
|
|
scenery.cur_elev + alt_adjust_m );
|
1998-07-12 03:14:42 +00:00
|
|
|
|
1998-12-05 14:19:51 +00:00
|
|
|
FG_LOG( FG_ALL, FG_DEBUG,
|
1998-11-06 21:17:31 +00:00
|
|
|
"<*> resetting altitude to "
|
2000-10-19 21:24:43 +00:00
|
|
|
<< cur_fdm_state->get_Altitude() * FEET_TO_METER
|
|
|
|
<< " meters" );
|
1998-07-12 03:14:42 +00:00
|
|
|
}
|
I tested:
LaRCsim c172 on-ground and in-air starts, reset: all work
UIUC Cessna172 on-ground and in-air starts work as expected, reset
results in an aircraft that is upside down but does not crash FG. I
don't know what it was like before, so it may well be no change.
JSBSim c172 and X15 in-air starts work fine, resets now work (and are
trimmed), on-ground starts do not -- the c172 ends up on its back. I
suspect this is no worse than before.
I did not test:
Balloon (the weather code returns nan's for the atmosphere data --this
is in the weather module and apparently is a linux only bug)
ADA (don't know how)
MagicCarpet (needs work yet)
External (don't know how)
known to be broken:
LaRCsim c172 on-ground starts with a negative terrain altitude (this
happens at KPAO when the scenery is not present). The FDM inits to
about 50 feet AGL and the model falls to the ground. It does stay
upright, however, and seems to be fine once it settles out, FWIW.
To do:
--implement set_Model on the bus
--bring Christian's weather data into JSBSim
-- add default method to bus for updating things like the sin and cos of
latitude (for Balloon, MagicCarpet)
-- lots of cleanup
The files:
src/FDM/flight.cxx
src/FDM/flight.hxx
-- all data members now declared protected instead of private.
-- eliminated all but a small set of 'setters', no change to getters.
-- that small set is declared virtual, the default implementation
provided preserves the old behavior
-- all of the vector data members are now initialized.
-- added busdump() method -- FG_LOG's all the bus data when called,
useful for diagnostics.
src/FDM/ADA.cxx
-- bus data members now directly assigned to
src/FDM/Balloon.cxx
-- bus data members now directly assigned to
-- changed V_equiv_kts to V_calibrated_kts
src/FDM/JSBSim.cxx
src/FDM/JSBSim.hxx
-- bus data members now directly assigned to
-- implemented the FGInterface virtual setters with JSBSim specific
logic
-- changed the static FDMExec to a dynamic fdmex (needed so that the
JSBSim object can be deleted when a model change is called for)
-- implemented constructor and destructor, moved some of the logic
formerly in init() to constructor
-- added logic to bring up FGEngInterface objects and set the RPM and
throttle values.
src/FDM/LaRCsim.cxx
src/FDM/LaRCsim.hxx
-- bus data members now directly assigned to
-- implemented the FGInterface virtual setters with LaRCsim specific
logic, uses LaRCsimIC
-- implemented constructor and destructor, moved some of the logic
formerly in init() to constructor
-- moved default inertias to here from fg_init.cxx
-- eliminated the climb rate calculation. The equivalent, climb_rate =
-1*vdown, is now in copy_from_LaRCsim().
src/FDM/LaRCsimIC.cxx
src/FDM/LaRCsimIC.hxx
-- similar to FGInitialCondition, this class has all the logic needed to
turn data like Vc and Mach into the more fundamental quantities LaRCsim
needs to initialize.
-- put it in src/FDM since it is a class
src/FDM/MagicCarpet.cxx
-- bus data members now directly assigned to
src/FDM/Makefile.am
-- adds LaRCsimIC.hxx and cxx
src/FDM/JSBSim/FGAtmosphere.h
src/FDM/JSBSim/FGDefs.h
src/FDM/JSBSim/FGInitialCondition.cpp
src/FDM/JSBSim/FGInitialCondition.h
src/FDM/JSBSim/JSBSim.cpp
-- changes to accomodate the new bus
src/FDM/LaRCsim/atmos_62.h
src/FDM/LaRCsim/ls_geodesy.h
-- surrounded prototypes with #ifdef __cplusplus ... #endif , functions
here are needed in LaRCsimIC
src/FDM/LaRCsim/c172_main.c
src/FDM/LaRCsim/cherokee_aero.c
src/FDM/LaRCsim/ls_aux.c
src/FDM/LaRCsim/ls_constants.h
src/FDM/LaRCsim/ls_geodesy.c
src/FDM/LaRCsim/ls_geodesy.h
src/FDM/LaRCsim/ls_step.c
src/FDM/UIUCModel/uiuc_betaprobe.cpp
-- changed PI to LS_PI, eliminates preprocessor naming conflict with
weather module
src/FDM/LaRCsim/ls_interface.c
src/FDM/LaRCsim/ls_interface.h
-- added function ls_set_model_dt()
src/Main/bfi.cxx
-- eliminated calls that set the NED speeds to body components. They
are no longer needed and confuse the new bus.
src/Main/fg_init.cxx
-- eliminated calls that just brought the bus data up-to-date (e.g.
set_sin_cos_latitude). or set default values. The bus now handles the
defaults and updates itself when the setters are called (for LaRCsim and
JSBSim). A default method for doing this needs to be added to the bus.
-- added fgVelocityInit() to set the speed the user asked for. Both
JSBSim and LaRCsim can now be initialized using any of:
vc,mach, NED components, UVW components.
src/Main/main.cxx
--eliminated call to fgFDMSetGroundElevation, this data is now 'pulled'
onto the bus every update()
src/Main/options.cxx
src/Main/options.hxx
-- added enum to keep track of the speed requested by the user
-- eliminated calls to set NED velocity properties to body speeds, they
are no longer needed.
-- added options for the NED components.
src/Network/garmin.cxx
src/Network/nmea.cxx
--eliminated calls that just brought the bus data up-to-date (e.g.
set_sin_cos_latitude). The bus now updates itself when the setters are
called (for LaRCsim and JSBSim). A default method for doing this needs
to be added to the bus.
-- changed set_V_equiv_kts to set_V_calibrated_kts. set_V_equiv_kts no
longer exists ( get_V_equiv_kts still does, though)
src/WeatherCM/FGLocalWeatherDatabase.cpp
-- commented out the code to put the weather data on the bus, a
different scheme for this is needed.
2000-10-24 00:34:50 +00:00
|
|
|
//fgFDMSetGroundElevation( globals->get_options()->get_flight_model(),
|
|
|
|
// scenery.cur_elev ); // meters
|
1998-07-12 03:14:42 +00:00
|
|
|
}
|
|
|
|
|
1998-12-06 14:52:54 +00:00
|
|
|
/* printf("Adjustment - ground = %.2f runway = %.2f alt = %.2f\n",
|
1998-07-12 03:14:42 +00:00
|
|
|
scenery.cur_elev,
|
1999-10-11 23:09:07 +00:00
|
|
|
cur_fdm_state->get_Runway_altitude() * FEET_TO_METER,
|
|
|
|
cur_fdm_state->get_Altitude() * FEET_TO_METER); */
|
1998-07-12 03:14:42 +00:00
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
// update "time"
|
2000-07-07 17:27:37 +00:00
|
|
|
if ( globals->get_warp_delta() != 0 ) {
|
|
|
|
globals->inc_warp( globals->get_warp_delta() );
|
|
|
|
}
|
|
|
|
|
2000-03-29 00:15:58 +00:00
|
|
|
t->update( cur_fdm_state->get_Longitude(),
|
|
|
|
cur_fdm_state->get_Latitude(),
|
2000-07-07 17:27:37 +00:00
|
|
|
globals->get_warp() );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
2000-07-07 17:27:37 +00:00
|
|
|
if ( globals->get_warp_delta() != 0 ) {
|
2000-07-05 02:39:30 +00:00
|
|
|
fgUpdateSkyAndLightingParams();
|
|
|
|
}
|
|
|
|
|
|
|
|
// update magvar model
|
2000-08-08 00:39:52 +00:00
|
|
|
globals->get_mag()->update( cur_fdm_state->get_Longitude(),
|
|
|
|
cur_fdm_state->get_Latitude(),
|
|
|
|
cur_fdm_state->get_Altitude()* FEET_TO_METER,
|
|
|
|
globals->get_time_params()->getJD() );
|
2000-07-05 02:39:30 +00:00
|
|
|
|
1999-01-09 13:37:32 +00:00
|
|
|
// Get elapsed time (in usec) for this past frame
|
1998-04-21 17:02:27 +00:00
|
|
|
elapsed = fgGetTimeInterval();
|
1999-01-09 13:37:32 +00:00
|
|
|
FG_LOG( FG_ALL, FG_DEBUG,
|
|
|
|
"Elapsed time interval is = " << elapsed
|
1998-11-06 21:17:31 +00:00
|
|
|
<< ", previous remainder is = " << remainder );
|
1998-05-06 03:16:23 +00:00
|
|
|
|
|
|
|
// Calculate frame rate average
|
1999-05-06 21:14:06 +00:00
|
|
|
#ifdef FANCY_FRAME_COUNTER
|
|
|
|
/* old fps calculation */
|
|
|
|
if ( elapsed > 0 ) {
|
|
|
|
double tmp;
|
|
|
|
accum = 0.0;
|
|
|
|
for ( i = FG_FRAME_RATE_HISTORY - 2; i >= 0; i-- ) {
|
|
|
|
tmp = general.get_frame(i);
|
|
|
|
accum += tmp;
|
|
|
|
// printf("frame[%d] = %.2f\n", i, g->frames[i]);
|
|
|
|
general.set_frame(i+1,tmp);
|
|
|
|
}
|
|
|
|
tmp = 1000000.0 / (float)elapsed;
|
|
|
|
general.set_frame(0,tmp);
|
|
|
|
// printf("frame[0] = %.2f\n", general.frames[0]);
|
|
|
|
accum += tmp;
|
|
|
|
general.set_frame_rate(accum / (float)FG_FRAME_RATE_HISTORY);
|
|
|
|
// printf("ave = %.2f\n", general.frame_rate);
|
|
|
|
}
|
|
|
|
#else
|
1999-04-08 19:53:46 +00:00
|
|
|
if ( (t->get_cur_time() != last_time) && (last_time > 0) ) {
|
1999-01-07 20:24:43 +00:00
|
|
|
general.set_frame_rate( frames );
|
1999-01-09 13:37:32 +00:00
|
|
|
FG_LOG( FG_ALL, FG_DEBUG,
|
|
|
|
"--> Frame rate is = " << general.get_frame_rate() );
|
1998-12-18 23:40:55 +00:00
|
|
|
frames = 0;
|
|
|
|
}
|
1999-04-08 19:53:46 +00:00
|
|
|
last_time = t->get_cur_time();
|
1998-12-18 23:40:55 +00:00
|
|
|
++frames;
|
1999-05-06 21:14:06 +00:00
|
|
|
#endif
|
1998-07-12 03:14:42 +00:00
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
// Run flight model
|
|
|
|
if ( ! use_signals ) {
|
1998-12-18 23:40:55 +00:00
|
|
|
// Calculate model iterations needed for next frame
|
|
|
|
elapsed += remainder;
|
|
|
|
|
1999-10-23 00:09:26 +00:00
|
|
|
global_multi_loop = (int)(((double)elapsed * 0.000001) *
|
2000-10-19 21:24:43 +00:00
|
|
|
globals->get_options()->get_model_hz());
|
1999-10-23 00:09:26 +00:00
|
|
|
remainder = elapsed - ( (global_multi_loop*1000000) /
|
2000-10-19 21:24:43 +00:00
|
|
|
globals->get_options()->get_model_hz() );
|
1999-01-09 13:37:32 +00:00
|
|
|
FG_LOG( FG_ALL, FG_DEBUG,
|
1999-10-23 00:09:26 +00:00
|
|
|
"Model iterations needed = " << global_multi_loop
|
1998-12-18 23:40:55 +00:00
|
|
|
<< ", new remainder = " << remainder );
|
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
// flight model
|
1999-10-23 00:09:26 +00:00
|
|
|
if ( global_multi_loop > 0 ) {
|
|
|
|
fgUpdateTimeDepCalcs(global_multi_loop, remainder);
|
1998-12-18 23:40:55 +00:00
|
|
|
} else {
|
1999-09-01 20:24:54 +00:00
|
|
|
FG_LOG( FG_ALL, FG_DEBUG,
|
|
|
|
"Elapsed time is zero ... we're zinging" );
|
1998-12-18 23:40:55 +00:00
|
|
|
}
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
2000-09-10 00:04:50 +00:00
|
|
|
#if ! defined( macintosh )
|
1999-11-19 02:10:24 +00:00
|
|
|
// Do any I/O channel work that might need to be done
|
|
|
|
fgIOProcess();
|
1999-04-27 19:27:45 +00:00
|
|
|
#endif
|
1998-04-21 17:02:27 +00:00
|
|
|
|
|
|
|
// see if we need to load any new scenery tiles
|
2000-07-23 21:32:59 +00:00
|
|
|
global_tile_mgr.update( cur_fdm_state->get_Longitude() * RAD_TO_DEG,
|
|
|
|
cur_fdm_state->get_Latitude() * RAD_TO_DEG );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
|
|
|
// Process/manage pending events
|
1998-05-22 21:28:52 +00:00
|
|
|
global_events.Process();
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-06-01 17:54:40 +00:00
|
|
|
// Run audio scheduler
|
1998-07-16 17:33:34 +00:00
|
|
|
#ifdef ENABLE_AUDIO_SUPPORT
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_sound() && !audio_sched->not_working() ) {
|
1998-09-25 16:02:07 +00:00
|
|
|
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_aircraft() == "c172" ) {
|
2000-10-02 23:07:30 +00:00
|
|
|
// pitch corresponds to rpm
|
|
|
|
// volume corresponds to manifold pressure
|
2000-09-29 03:27:21 +00:00
|
|
|
|
2000-10-10 20:31:20 +00:00
|
|
|
double rpm_factor;
|
|
|
|
if ( cur_fdm_state->get_engine(0) != NULL ) {
|
|
|
|
rpm_factor = cur_fdm_state->get_engine(0)->get_RPM() / 2500.0;
|
|
|
|
} else {
|
|
|
|
rpm_factor = 1.0;
|
|
|
|
}
|
2000-10-04 20:50:38 +00:00
|
|
|
// cout << "rpm = " << cur_fdm_state->get_engine(0)->get_RPM()
|
|
|
|
// << endl;
|
2000-09-29 03:27:21 +00:00
|
|
|
|
2000-10-02 23:07:30 +00:00
|
|
|
double pitch = 0.3 + rpm_factor * 3.0;
|
2000-09-29 03:27:21 +00:00
|
|
|
|
2000-10-02 23:07:30 +00:00
|
|
|
// don't run at absurdly slow rates -- not realistic
|
|
|
|
// and sounds bad to boot. :-)
|
|
|
|
if (pitch < 0.7) { pitch = 0.7; }
|
|
|
|
if (pitch > 5.0) { pitch = 5.0; }
|
2000-10-04 20:50:38 +00:00
|
|
|
// cout << "pitch = " << pitch << endl;
|
2000-10-02 23:07:30 +00:00
|
|
|
|
2000-10-10 20:31:20 +00:00
|
|
|
double mp_factor;
|
|
|
|
if ( cur_fdm_state->get_engine(0) != NULL ) {
|
|
|
|
mp_factor =
|
|
|
|
cur_fdm_state->get_engine(0)->get_Manifold_Pressure() / 28;
|
|
|
|
} else {
|
|
|
|
mp_factor = 1.0;
|
|
|
|
}
|
2000-10-04 20:50:38 +00:00
|
|
|
// cout << "mp = "
|
|
|
|
// << cur_fdm_state->get_engine(0)->get_Manifold_Pressure()
|
|
|
|
// << endl;
|
2000-10-02 23:07:30 +00:00
|
|
|
|
|
|
|
double volume = mp_factor;
|
|
|
|
|
|
|
|
if ( volume < 0.3 ) { volume = 0.3; }
|
|
|
|
if ( volume > 2.0 ) { volume = 2.0; }
|
2000-10-04 20:50:38 +00:00
|
|
|
// cout << "volume = " << volume << endl;
|
2000-10-02 23:07:30 +00:00
|
|
|
|
|
|
|
pitch_envelope.setStep ( 0, 0.01, pitch );
|
|
|
|
volume_envelope.setStep ( 0, 0.01, volume );
|
|
|
|
} else {
|
|
|
|
double param = controls.get_throttle( 0 ) * 2.0 + 1.0;
|
|
|
|
pitch_envelope.setStep ( 0, 0.01, param );
|
|
|
|
volume_envelope.setStep ( 0, 0.01, param );
|
|
|
|
}
|
2000-10-10 20:31:20 +00:00
|
|
|
|
1998-07-27 18:41:23 +00:00
|
|
|
audio_sched -> update();
|
|
|
|
}
|
1998-06-03 00:47:11 +00:00
|
|
|
#endif
|
1998-06-01 17:54:40 +00:00
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
// redraw display
|
|
|
|
fgRenderFrame();
|
|
|
|
|
1998-11-06 21:17:31 +00:00
|
|
|
FG_LOG( FG_ALL, FG_DEBUG, "" );
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
1998-07-06 02:42:02 +00:00
|
|
|
// This is the top level master main function that is registered as
|
|
|
|
// our idle funciton
|
|
|
|
//
|
|
|
|
|
|
|
|
// The first few passes take care of initialization things (a couple
|
|
|
|
// per pass) and once everything has been initialized fgMainLoop from
|
|
|
|
// then on.
|
|
|
|
|
|
|
|
static void fgIdleFunction ( void ) {
|
|
|
|
// printf("idle state == %d\n", idle_state);
|
|
|
|
|
|
|
|
if ( idle_state == 0 ) {
|
|
|
|
// Initialize the splash screen right away
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_splash_screen() ) {
|
1998-07-06 21:34:17 +00:00
|
|
|
fgSplashInit();
|
|
|
|
}
|
1998-07-06 02:42:02 +00:00
|
|
|
|
|
|
|
idle_state++;
|
|
|
|
} else if ( idle_state == 1 ) {
|
|
|
|
// Start the intro music
|
1998-07-06 21:34:17 +00:00
|
|
|
#if !defined(WIN32)
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_intro_music() ) {
|
1998-08-27 17:01:55 +00:00
|
|
|
string lockfile = "/tmp/mpg123.running";
|
2000-10-19 21:24:43 +00:00
|
|
|
FGPath mp3file( globals->get_options()->get_fg_root() );
|
1999-04-27 19:27:45 +00:00
|
|
|
mp3file.append( "Sounds/intro.mp3" );
|
|
|
|
|
|
|
|
string command = "(touch " + lockfile + "; mpg123 "
|
|
|
|
+ mp3file.str() + "> /dev/null 2>&1; /bin/rm "
|
|
|
|
+ lockfile + ") &";
|
1998-11-06 21:17:31 +00:00
|
|
|
FG_LOG( FG_GENERAL, FG_INFO,
|
1999-04-27 19:27:45 +00:00
|
|
|
"Starting intro music: " << mp3file.str() );
|
1998-08-27 17:01:55 +00:00
|
|
|
system ( command.c_str() );
|
1998-07-06 21:34:17 +00:00
|
|
|
}
|
1998-07-06 02:42:02 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
idle_state++;
|
|
|
|
} else if ( idle_state == 2 ) {
|
|
|
|
// These are a few miscellaneous things that aren't really
|
|
|
|
// "subsystems" but still need to be initialized.
|
1998-07-27 18:41:23 +00:00
|
|
|
|
1998-07-06 02:42:02 +00:00
|
|
|
#ifdef USE_GLIDE
|
1999-01-07 20:24:43 +00:00
|
|
|
if ( strstr ( general.get_glRenderer(), "Glide" ) ) {
|
1998-07-06 02:42:02 +00:00
|
|
|
grTexLodBiasValue ( GR_TMU0, 1.0 ) ;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
idle_state++;
|
|
|
|
} else if ( idle_state == 3 ) {
|
|
|
|
// This is the top level init routine which calls all the
|
|
|
|
// other subsystem initialization routines. If you are adding
|
2000-10-10 20:31:20 +00:00
|
|
|
// a subsystem to flightgear, its initialization call should
|
1998-07-06 02:42:02 +00:00
|
|
|
// located in this routine.
|
|
|
|
if( !fgInitSubsystems()) {
|
1998-11-06 21:17:31 +00:00
|
|
|
FG_LOG( FG_GENERAL, FG_ALERT,
|
|
|
|
"Subsystem initializations failed ..." );
|
|
|
|
exit(-1);
|
1998-07-06 02:42:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
idle_state++;
|
|
|
|
} else if ( idle_state == 4 ) {
|
|
|
|
// 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 ) {
|
|
|
|
|
|
|
|
idle_state++;
|
|
|
|
} else if ( idle_state == 6 ) {
|
|
|
|
// Initialize audio support
|
1998-07-16 17:33:34 +00:00
|
|
|
#ifdef ENABLE_AUDIO_SUPPORT
|
1998-07-06 02:42:02 +00:00
|
|
|
|
1998-07-06 21:34:17 +00:00
|
|
|
#if !defined(WIN32)
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_intro_music() ) {
|
1998-07-06 21:34:17 +00:00
|
|
|
// Let's wait for mpg123 to finish
|
1998-08-27 17:01:55 +00:00
|
|
|
string lockfile = "/tmp/mpg123.running";
|
1998-07-20 12:49:44 +00:00
|
|
|
struct stat stat_buf;
|
1998-07-06 21:34:17 +00:00
|
|
|
|
1998-11-06 21:17:31 +00:00
|
|
|
FG_LOG( FG_GENERAL, FG_INFO,
|
|
|
|
"Waiting for mpg123 player to finish ..." );
|
1998-08-27 17:01:55 +00:00
|
|
|
while ( stat(lockfile.c_str(), &stat_buf) == 0 ) {
|
1998-07-06 21:34:17 +00:00
|
|
|
// file exist, wait ...
|
|
|
|
sleep(1);
|
1998-11-06 21:17:31 +00:00
|
|
|
FG_LOG( FG_GENERAL, FG_INFO, ".");
|
1998-07-06 21:34:17 +00:00
|
|
|
}
|
1998-11-06 21:17:31 +00:00
|
|
|
FG_LOG( FG_GENERAL, FG_INFO, "");
|
1998-07-06 02:42:02 +00:00
|
|
|
}
|
|
|
|
#endif // WIN32
|
|
|
|
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_sound() ) {
|
1999-11-20 15:39:53 +00:00
|
|
|
audio_sched = new slScheduler ( 8000 );
|
|
|
|
audio_mixer = new smMixer;
|
|
|
|
audio_mixer -> setMasterVolume ( 80 ) ; /* 80% of max volume. */
|
|
|
|
audio_sched -> setSafetyMargin ( 1.0 ) ;
|
|
|
|
|
2000-10-19 21:24:43 +00:00
|
|
|
FGPath slfile( globals->get_options()->get_fg_root() );
|
1999-11-20 15:39:53 +00:00
|
|
|
slfile.append( "Sounds/wasp.wav" );
|
|
|
|
|
|
|
|
s1 = new slSample ( (char *)slfile.c_str() );
|
|
|
|
FG_LOG( FG_GENERAL, FG_INFO,
|
|
|
|
"Rate = " << s1 -> getRate()
|
|
|
|
<< " Bps = " << s1 -> getBps()
|
|
|
|
<< " Stereo = " << s1 -> getStereo() );
|
|
|
|
audio_sched -> loopSample ( s1 );
|
|
|
|
|
|
|
|
if ( audio_sched->not_working() ) {
|
|
|
|
// skip
|
|
|
|
} else {
|
|
|
|
pitch_envelope.setStep ( 0, 0.01, 0.6 );
|
|
|
|
volume_envelope.setStep ( 0, 0.01, 0.6 );
|
|
|
|
|
|
|
|
audio_sched -> addSampleEnvelope( s1, 0, 0,
|
|
|
|
&pitch_envelope,
|
|
|
|
SL_PITCH_ENVELOPE );
|
|
|
|
audio_sched -> addSampleEnvelope( s1, 0, 1,
|
|
|
|
&volume_envelope,
|
|
|
|
SL_VOLUME_ENVELOPE );
|
|
|
|
}
|
1998-09-25 16:02:07 +00:00
|
|
|
|
1999-11-20 15:39:53 +00:00
|
|
|
// strcpy(slfile, path);
|
|
|
|
// strcat(slfile, "thunder.wav");
|
|
|
|
// s2 -> loadFile ( slfile );
|
|
|
|
// s2 -> adjustVolume(0.5);
|
|
|
|
// audio_sched -> playSample ( s2 );
|
|
|
|
}
|
1998-07-06 02:42:02 +00:00
|
|
|
#endif
|
|
|
|
|
1998-07-27 18:41:23 +00:00
|
|
|
// sleep(1);
|
1998-07-06 02:42:02 +00:00
|
|
|
idle_state = 1000;
|
2000-10-19 23:09:33 +00:00
|
|
|
|
|
|
|
cout << "Panel visible = " << fgPanelVisible() << endl;
|
|
|
|
fgReshape( globals->get_options()->get_xsize(),
|
|
|
|
globals->get_options()->get_ysize() );
|
1998-07-06 02:42:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( idle_state == 1000 ) {
|
|
|
|
// We've finished all our initialization steps, from now on we
|
|
|
|
// run the main loop.
|
|
|
|
|
|
|
|
fgMainLoop();
|
|
|
|
} else {
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_splash_screen() == 1 ) {
|
1998-07-06 21:34:17 +00:00
|
|
|
fgSplashUpdate(0.0);
|
|
|
|
}
|
1998-07-06 02:42:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-05-06 22:16:12 +00:00
|
|
|
// options.cxx needs to see this for toggle_panel()
|
1998-04-21 17:02:27 +00:00
|
|
|
// Handle new window size or exposure
|
1999-05-06 22:16:12 +00:00
|
|
|
void fgReshape( int width, int height ) {
|
2000-11-01 23:27:32 +00:00
|
|
|
// for all views
|
|
|
|
for ( int i = 0; i < globals->get_viewmgr()->size(); ++i ) {
|
|
|
|
if ( ! fgPanelVisible() || idle_state != 1000 ) {
|
|
|
|
globals->get_viewmgr()->get_view(i)->
|
|
|
|
set_win_ratio( (float)height / (float)width );
|
|
|
|
} else {
|
|
|
|
int view_h =
|
|
|
|
int((current_panel->getViewHeight() -
|
|
|
|
current_panel->getYOffset())
|
|
|
|
* (height / 768.0)) + 1;
|
|
|
|
globals->get_viewmgr()->get_view(i)->
|
|
|
|
set_win_ratio( (float)view_h / (float)width );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-10-18 21:19:30 +00:00
|
|
|
if ( ! fgPanelVisible() || idle_state != 1000 ) {
|
2000-03-17 06:16:15 +00:00
|
|
|
glViewport(0, 0 , (GLint)(width), (GLint)(height) );
|
1999-06-18 03:42:54 +00:00
|
|
|
} else {
|
David Megginson writes:
I have a scrollable panel working (it didn't take long in the end). A
panel can now be much wider or higher than the available area, and the
user can scroll around using [Shift]F5, [Shift]F6, [Shift]F7, and
[Shift]F8. The user can also scroll the panel down to get a bigger
external view. Mouse clicks seem still to be working correctly.
To set the panel's (virtual) height and width, use the panel file's /w
and /h properties in a panel XML file; to set the initial x- and y-
offsets (untested), use the panel file's /x-offset and /y-offset
properties; to set the initial height of the external view (untested
and optional), use the panel file's /view-height property. Note that
none of these show up in the regular FGFS property manager.
Unfortunately, these patches will not affect your initialization
problems with the property manager -- I'm having a hard time tracking
them down because I cannot reproduce them.
I have also made some patches to main.cxx and views.cxx to do two
things:
1. Expand or shrink the external view as the panel moves up and down.
2. Set the window ratio correctly, so that we don't get an oval sun
and flat clouds when the panel is visible (the problem before was
integer division, so I added casts).
Unfortunately, the window ratio is not set properly at start-up --
there are too many dependencies, and I haven't figured that part out
yet. As soon as you hide and redisplay the panel or move it
vertically (i.e. force fgReshape to be called), you'll see the correct
ratio.
2000-10-06 21:16:01 +00:00
|
|
|
int view_h =
|
2000-11-01 23:27:32 +00:00
|
|
|
int((current_panel->getViewHeight() - current_panel->getYOffset())
|
|
|
|
* (height / 768.0)) + 1;
|
David Megginson writes:
I have a scrollable panel working (it didn't take long in the end). A
panel can now be much wider or higher than the available area, and the
user can scroll around using [Shift]F5, [Shift]F6, [Shift]F7, and
[Shift]F8. The user can also scroll the panel down to get a bigger
external view. Mouse clicks seem still to be working correctly.
To set the panel's (virtual) height and width, use the panel file's /w
and /h properties in a panel XML file; to set the initial x- and y-
offsets (untested), use the panel file's /x-offset and /y-offset
properties; to set the initial height of the external view (untested
and optional), use the panel file's /view-height property. Note that
none of these show up in the regular FGFS property manager.
Unfortunately, these patches will not affect your initialization
problems with the property manager -- I'm having a hard time tracking
them down because I cannot reproduce them.
I have also made some patches to main.cxx and views.cxx to do two
things:
1. Expand or shrink the external view as the panel moves up and down.
2. Set the window ratio correctly, so that we don't get an oval sun
and flat clouds when the panel is visible (the problem before was
integer division, so I added casts).
Unfortunately, the window ratio is not set properly at start-up --
there are too many dependencies, and I haven't figured that part out
yet. As soon as you hide and redisplay the panel or move it
vertically (i.e. force fgReshape to be called), you'll see the correct
ratio.
2000-10-06 21:16:01 +00:00
|
|
|
glViewport(0, (GLint)(height - view_h),
|
|
|
|
(GLint)(width), (GLint)(view_h) );
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
2000-10-19 23:09:33 +00:00
|
|
|
globals->get_options()->set_xsize( width );
|
|
|
|
globals->get_options()->set_ysize( height );
|
1999-09-28 22:43:52 +00:00
|
|
|
|
2000-11-01 23:27:32 +00:00
|
|
|
float fov = globals->get_current_view()->get_fov();
|
|
|
|
ssgSetFOV(fov, fov * globals->get_current_view()->get_win_ratio());
|
1999-08-31 23:22:05 +00:00
|
|
|
|
2000-05-13 00:02:43 +00:00
|
|
|
fgHUDReshape();
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
// Initialize GLUT and define a main window
|
1998-05-06 03:16:23 +00:00
|
|
|
int fgGlutInit( int *argc, char **argv ) {
|
1999-06-02 22:22:47 +00:00
|
|
|
|
2000-09-10 00:04:50 +00:00
|
|
|
#if !defined( macintosh )
|
1998-04-24 00:49:17 +00:00
|
|
|
// GLUT will extract all glut specific options so later on we only
|
|
|
|
// need wory about our own.
|
2000-03-17 06:16:15 +00:00
|
|
|
glutInit(argc, argv);
|
1999-06-02 22:22:47 +00:00
|
|
|
#endif
|
1998-04-21 17:02:27 +00:00
|
|
|
|
|
|
|
// Define Display Parameters
|
2000-03-17 06:16:15 +00:00
|
|
|
glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-11-16 13:59:58 +00:00
|
|
|
FG_LOG( FG_GENERAL, FG_INFO, "Opening a window: " <<
|
2000-10-19 21:24:43 +00:00
|
|
|
globals->get_options()->get_xsize() << "x"
|
|
|
|
<< globals->get_options()->get_ysize() );
|
1998-11-16 13:59:58 +00:00
|
|
|
|
1998-04-21 17:02:27 +00:00
|
|
|
// Define initial window size
|
2000-10-19 21:24:43 +00:00
|
|
|
glutInitWindowSize( globals->get_options()->get_xsize(),
|
|
|
|
globals->get_options()->get_ysize() );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
|
|
|
// Initialize windows
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_game_mode() == 0 ) {
|
1998-08-20 15:10:33 +00:00
|
|
|
// Open the regular window
|
2000-10-10 20:31:20 +00:00
|
|
|
glutCreateWindow("FlightGear");
|
1999-04-27 19:27:45 +00:00
|
|
|
#ifndef GLUT_WRONG_VERSION
|
1998-08-20 15:10:33 +00:00
|
|
|
} else {
|
|
|
|
// Open the cool new 'game mode' window
|
1999-01-27 04:49:17 +00:00
|
|
|
char game_mode_str[256];
|
2000-05-13 00:02:43 +00:00
|
|
|
sprintf( game_mode_str, "width=%d height=%d bpp=%d",
|
2000-10-19 21:24:43 +00:00
|
|
|
globals->get_options()->get_xsize(),
|
|
|
|
globals->get_options()->get_ysize(),
|
|
|
|
globals->get_options()->get_bpp());
|
1999-01-27 04:49:17 +00:00
|
|
|
|
|
|
|
FG_LOG( FG_GENERAL, FG_INFO,
|
|
|
|
"game mode params = " << game_mode_str );
|
|
|
|
glutGameModeString( game_mode_str );
|
1998-08-20 15:10:33 +00:00
|
|
|
glutEnterGameMode();
|
1999-04-27 19:27:45 +00:00
|
|
|
#endif
|
1998-08-20 15:10:33 +00:00
|
|
|
}
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-11-23 20:51:26 +00:00
|
|
|
// This seems to be the absolute earliest in the init sequence
|
|
|
|
// that these calls will return valid info. Too bad it's after
|
|
|
|
// we've already created and sized out window. :-(
|
1999-01-07 20:24:43 +00:00
|
|
|
general.set_glVendor( (char *)glGetString ( GL_VENDOR ) );
|
|
|
|
general.set_glRenderer( (char *)glGetString ( GL_RENDERER ) );
|
|
|
|
general.set_glVersion( (char *)glGetString ( GL_VERSION ) );
|
2000-09-18 21:02:59 +00:00
|
|
|
int tmp;
|
|
|
|
glGetIntegerv( GL_MAX_TEXTURE_SIZE, &tmp );
|
|
|
|
general.set_glMaxTexSize( tmp );
|
1999-01-07 20:24:43 +00:00
|
|
|
FG_LOG ( FG_GENERAL, FG_INFO, general.get_glRenderer() );
|
2000-09-18 21:02:59 +00:00
|
|
|
FG_LOG ( FG_GENERAL, FG_INFO, "Max texture size = " << tmp );
|
1998-11-23 20:51:26 +00:00
|
|
|
|
|
|
|
#if 0
|
|
|
|
// try to determine if we should adjust the initial default
|
|
|
|
// display resolution. The options class defaults (is
|
|
|
|
// initialized) to 640x480.
|
|
|
|
string renderer = general.glRenderer;
|
|
|
|
|
|
|
|
// currently we only know how to deal with Mesa/Glide/Voodoo cards
|
|
|
|
if ( renderer.find( "Glide" ) != string::npos ) {
|
|
|
|
FG_LOG( FG_GENERAL, FG_INFO, "Detected a Glide driver" );
|
|
|
|
if ( renderer.find( "FB/8" ) != string::npos ) {
|
|
|
|
// probably a voodoo-2
|
|
|
|
if ( renderer.find( "TMU/SLI" ) != string::npos ) {
|
|
|
|
// probably two SLI'd Voodoo-2's
|
2000-10-19 21:24:43 +00:00
|
|
|
globals->get_options()->set_xsize( 1024 );
|
|
|
|
globals->get_options()->set_ysize( 768 );
|
1998-11-23 20:51:26 +00:00
|
|
|
FG_LOG( FG_GENERAL, FG_INFO,
|
|
|
|
"It looks like you have two sli'd voodoo-2's." << endl
|
|
|
|
<< "upgrading your win resolution to 1024 x 768" );
|
|
|
|
glutReshapeWindow(1024, 768);
|
|
|
|
} else {
|
|
|
|
// probably a single non-SLI'd Voodoo-2
|
2000-10-19 21:24:43 +00:00
|
|
|
globals->get_options()->set_xsize( 800 );
|
|
|
|
globals->get_options()->set_ysize( 600 );
|
1998-11-23 20:51:26 +00:00
|
|
|
FG_LOG( FG_GENERAL, FG_INFO,
|
|
|
|
"It looks like you have a voodoo-2." << endl
|
|
|
|
<< "upgrading your win resolution to 800 x 600" );
|
|
|
|
glutReshapeWindow(800, 600);
|
|
|
|
}
|
|
|
|
} else if ( renderer.find( "FB/2" ) != string::npos ) {
|
|
|
|
// probably a voodoo-1, stick with the default
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// we have no special knowledge of this card, stick with the default
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
return(1);
|
|
|
|
}
|
1998-04-21 17:02:27 +00:00
|
|
|
|
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
// Initialize GLUT event handlers
|
|
|
|
int fgGlutInitEvents( void ) {
|
|
|
|
// call fgReshape() on window resizes
|
2000-03-17 06:16:15 +00:00
|
|
|
glutReshapeFunc( fgReshape );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
// call GLUTkey() on keyboard event
|
2000-03-17 06:16:15 +00:00
|
|
|
glutKeyboardFunc( GLUTkey );
|
1998-04-24 00:49:17 +00:00
|
|
|
glutSpecialFunc( GLUTspecialkey );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-06-12 00:57:38 +00:00
|
|
|
// call guiMouseFunc() whenever our little rodent is used
|
|
|
|
glutMouseFunc ( guiMouseFunc );
|
|
|
|
glutMotionFunc (guiMotionFunc );
|
|
|
|
glutPassiveMotionFunc (guiMotionFunc );
|
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
// call fgMainLoop() whenever there is
|
|
|
|
// nothing else to do
|
2000-03-17 06:16:15 +00:00
|
|
|
glutIdleFunc( fgIdleFunction );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
// draw the scene
|
2000-03-17 06:16:15 +00:00
|
|
|
glutDisplayFunc( fgRenderFrame );
|
1998-04-21 17:02:27 +00:00
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
return(1);
|
|
|
|
}
|
1998-04-21 17:02:27 +00:00
|
|
|
|
|
|
|
|
1998-04-24 00:49:17 +00:00
|
|
|
// Main ...
|
|
|
|
int main( int argc, char **argv ) {
|
1999-04-27 19:27:45 +00:00
|
|
|
|
2000-09-10 00:04:50 +00:00
|
|
|
#if defined( macintosh )
|
2000-04-27 21:57:08 +00:00
|
|
|
freopen ("stdout.txt", "w", stdout );
|
|
|
|
freopen ("stderr.txt", "w", stderr );
|
1999-06-02 22:22:47 +00:00
|
|
|
argc = ccommand( &argv );
|
1999-04-27 19:27:45 +00:00
|
|
|
#endif
|
|
|
|
|
1998-05-07 23:14:14 +00:00
|
|
|
#ifdef HAVE_BC5PLUS
|
|
|
|
_control87(MCW_EM, MCW_EM); /* defined in float.h */
|
|
|
|
#endif
|
|
|
|
|
1998-11-16 13:59:58 +00:00
|
|
|
// set default log levels
|
1998-12-06 13:51:20 +00:00
|
|
|
fglog().setLogLevels( FG_ALL, FG_INFO );
|
1998-11-16 13:59:58 +00:00
|
|
|
|
2000-10-10 20:31:20 +00:00
|
|
|
FG_LOG( FG_GENERAL, FG_INFO, "FlightGear: Version "
|
|
|
|
<< FLIGHTGEAR_VERSION << endl );
|
1998-11-20 01:02:35 +00:00
|
|
|
|
1999-03-08 21:56:37 +00:00
|
|
|
// seed the random number generater
|
|
|
|
fg_srandom();
|
|
|
|
|
2000-10-19 23:09:33 +00:00
|
|
|
// Allocate global data structures. This needs to happen before
|
|
|
|
// we parse command line options
|
2000-10-19 21:24:43 +00:00
|
|
|
globals = new FGGlobals;
|
|
|
|
|
|
|
|
SGRoute *route = new SGRoute;
|
|
|
|
globals->set_route( route );
|
|
|
|
|
|
|
|
FGOptions *options = new FGOptions;
|
|
|
|
globals->set_options( options );
|
|
|
|
|
2000-10-26 21:51:09 +00:00
|
|
|
FGViewMgr *viewmgr = new FGViewMgr;
|
|
|
|
globals->set_viewmgr( viewmgr );
|
|
|
|
|
2000-10-25 22:59:02 +00:00
|
|
|
FGViewerRPH *pv = new FGViewerRPH;
|
2000-10-26 21:51:09 +00:00
|
|
|
globals->get_viewmgr()->add_view( pv );
|
2000-10-27 22:00:43 +00:00
|
|
|
|
|
|
|
FGViewerLookAt *chase = new FGViewerLookAt;
|
|
|
|
globals->get_viewmgr()->add_view( chase );
|
|
|
|
|
|
|
|
// set current view to 0 (first) which is our main pilot view
|
|
|
|
globals->set_current_view( globals->get_viewmgr()->get_view( 0 ) );
|
2000-10-26 21:51:09 +00:00
|
|
|
|
2000-10-04 22:52:34 +00:00
|
|
|
// Scan the config file(s) and command line options to see if
|
|
|
|
// fg_root was specified (ignore all other options for now)
|
|
|
|
fgInitFGRoot(argc, argv);
|
2000-09-25 21:41:50 +00:00
|
|
|
|
2000-10-19 21:24:43 +00:00
|
|
|
// cout << "1. airport_id = " << globals->get_options()->get_airport_id() << endl;
|
2000-10-10 17:45:04 +00:00
|
|
|
|
2000-10-04 22:52:34 +00:00
|
|
|
// Read global preferences from $FG_ROOT/preferences.xml
|
2000-10-19 21:24:43 +00:00
|
|
|
FGPath props_path(globals->get_options()->get_fg_root());
|
2000-09-25 21:41:50 +00:00
|
|
|
props_path.append("preferences.xml");
|
|
|
|
FG_LOG(FG_INPUT, FG_INFO, "Reading global preferences");
|
|
|
|
if (!readPropertyList(props_path.str(), ¤t_properties)) {
|
|
|
|
FG_LOG(FG_INPUT, FG_ALERT, "Failed to read global preferences from "
|
|
|
|
<< props_path.str());
|
|
|
|
} else {
|
|
|
|
FG_LOG(FG_INPUT, FG_INFO, "Finished Reading global preferences");
|
|
|
|
}
|
|
|
|
|
2000-10-19 21:24:43 +00:00
|
|
|
// cout << "2. airport_id = " << globals->get_options()->get_airport_id() << endl;
|
2000-10-10 17:45:04 +00:00
|
|
|
|
2000-09-25 21:41:50 +00:00
|
|
|
// Initialize the Aircraft directory to "" (UIUC)
|
|
|
|
aircraft_dir = "";
|
2000-03-22 22:01:33 +00:00
|
|
|
|
1999-06-18 03:42:54 +00:00
|
|
|
// Load the configuration parameters
|
|
|
|
if ( !fgInitConfig(argc, argv) ) {
|
|
|
|
FG_LOG( FG_GENERAL, FG_ALERT, "Config option parsing failed ..." );
|
1998-11-06 21:17:31 +00:00
|
|
|
exit(-1);
|
1998-04-24 00:49:17 +00:00
|
|
|
}
|
1999-06-18 03:42:54 +00:00
|
|
|
|
1998-08-20 15:10:33 +00:00
|
|
|
// Initialize the Window/Graphics environment.
|
|
|
|
if( !fgGlutInit(&argc, argv) ) {
|
1998-11-06 21:17:31 +00:00
|
|
|
FG_LOG( FG_GENERAL, FG_ALERT, "GLUT initialization failed ..." );
|
|
|
|
exit(-1);
|
1998-08-20 15:10:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Initialize the various GLUT Event Handlers.
|
|
|
|
if( !fgGlutInitEvents() ) {
|
2000-04-19 21:22:16 +00:00
|
|
|
FG_LOG( FG_GENERAL, FG_ALERT,
|
|
|
|
"GLUT event handler initialization failed ..." );
|
|
|
|
exit(-1);
|
1998-08-20 15:10:33 +00:00
|
|
|
}
|
2000-04-19 21:22:16 +00:00
|
|
|
|
|
|
|
// Initialize ssg (from plib). Needs to come before we do any
|
|
|
|
// other ssg stuff, but after opengl/glut has been initialized.
|
|
|
|
ssgInit();
|
1998-08-20 15:10:33 +00:00
|
|
|
|
1999-06-18 03:42:54 +00:00
|
|
|
// Initialize the user interface (we need to do this before
|
|
|
|
// passing off control to glut and before fgInitGeneral to get our
|
|
|
|
// fonts !!!
|
1999-05-12 01:11:17 +00:00
|
|
|
guiInit();
|
|
|
|
|
2000-07-21 22:54:14 +00:00
|
|
|
// set current_options lon/lat if an airport id is specified
|
2000-10-19 21:24:43 +00:00
|
|
|
// cout << "3. airport_id = " << globals->get_options()->get_airport_id() << endl;
|
|
|
|
if ( globals->get_options()->get_airport_id().length() ) {
|
|
|
|
// fgSetPosFromAirportID( globals->get_options()->get_airport_id() );
|
|
|
|
fgSetPosFromAirportIDandHdg( globals->get_options()->get_airport_id(),
|
|
|
|
globals->get_options()->get_heading() );
|
2000-07-21 22:54:14 +00:00
|
|
|
}
|
|
|
|
|
2000-03-16 04:15:22 +00:00
|
|
|
// Initialize time
|
2000-10-19 21:24:43 +00:00
|
|
|
FGPath zone( globals->get_options()->get_fg_root() );
|
2000-07-07 23:56:43 +00:00
|
|
|
zone.append( "Timezone" );
|
2000-10-19 21:24:43 +00:00
|
|
|
SGTime *t = new SGTime( globals->get_options()->get_lon() * DEG_TO_RAD,
|
|
|
|
globals->get_options()->get_lat() * DEG_TO_RAD,
|
2000-07-22 23:34:28 +00:00
|
|
|
zone.str() );
|
2000-07-07 17:27:37 +00:00
|
|
|
|
2000-07-07 20:28:51 +00:00
|
|
|
// Handle potential user specified time offsets
|
|
|
|
time_t cur_time = t->get_cur_time();
|
2000-07-07 23:56:43 +00:00
|
|
|
time_t currGMT = sgTimeGetGMT( gmtime(&cur_time) );
|
|
|
|
time_t systemLocalTime = sgTimeGetGMT( localtime(&cur_time) );
|
2000-07-07 20:28:51 +00:00
|
|
|
time_t aircraftLocalTime =
|
2000-07-07 23:56:43 +00:00
|
|
|
sgTimeGetGMT( fgLocaltime(&cur_time, t->get_zonename() ) );
|
2000-07-07 17:27:37 +00:00
|
|
|
|
|
|
|
// Okay, we now have six possible scenarios
|
2000-10-19 21:24:43 +00:00
|
|
|
switch ( globals->get_options()->get_time_offset_type() ) {
|
|
|
|
case FGOptions::FG_TIME_SYS_OFFSET:
|
|
|
|
globals->set_warp( globals->get_options()->get_time_offset() );
|
2000-07-07 17:27:37 +00:00
|
|
|
break;
|
2000-10-19 21:24:43 +00:00
|
|
|
case FGOptions::FG_TIME_GMT_OFFSET:
|
|
|
|
globals->set_warp( globals->get_options()->get_time_offset() -
|
2000-07-07 17:27:37 +00:00
|
|
|
(currGMT - systemLocalTime) );
|
|
|
|
break;
|
2000-10-19 21:24:43 +00:00
|
|
|
case FGOptions::FG_TIME_LAT_OFFSET:
|
|
|
|
globals->set_warp( globals->get_options()->get_time_offset() -
|
2000-07-07 17:27:37 +00:00
|
|
|
(aircraftLocalTime - systemLocalTime) );
|
|
|
|
break;
|
2000-10-19 21:24:43 +00:00
|
|
|
case FGOptions::FG_TIME_SYS_ABSOLUTE:
|
|
|
|
globals->set_warp( globals->get_options()->get_time_offset() -
|
|
|
|
cur_time );
|
2000-07-07 17:27:37 +00:00
|
|
|
//printf("warp = %d\n", warp);
|
|
|
|
break;
|
2000-10-19 21:24:43 +00:00
|
|
|
case FGOptions::FG_TIME_GMT_ABSOLUTE:
|
|
|
|
globals->set_warp( globals->get_options()->get_time_offset() -
|
|
|
|
currGMT );
|
2000-07-07 17:27:37 +00:00
|
|
|
break;
|
2000-10-19 21:24:43 +00:00
|
|
|
case FGOptions::FG_TIME_LAT_ABSOLUTE:
|
|
|
|
globals->set_warp( globals->get_options()->get_time_offset() -
|
2000-07-07 17:27:37 +00:00
|
|
|
(aircraftLocalTime - systemLocalTime) -
|
|
|
|
cur_time );
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
FG_LOG( FG_GENERAL, FG_ALERT, "Unsupported type" );
|
|
|
|
exit( -1 );
|
|
|
|
}
|
|
|
|
|
|
|
|
FG_LOG( FG_GENERAL, FG_INFO, "After time init, warp = "
|
|
|
|
<< globals->get_warp() );
|
|
|
|
|
|
|
|
globals->set_warp_delta( 0 );
|
|
|
|
|
2000-07-07 23:56:43 +00:00
|
|
|
t->update( 0.0, 0.0, globals->get_warp() );
|
2000-07-07 20:28:51 +00:00
|
|
|
|
|
|
|
globals->set_time_params( t );
|
2000-03-16 04:15:22 +00:00
|
|
|
|
1999-06-18 03:42:54 +00:00
|
|
|
// Do some quick general initializations
|
1998-07-27 18:41:23 +00:00
|
|
|
if( !fgInitGeneral()) {
|
1998-11-06 21:17:31 +00:00
|
|
|
FG_LOG( FG_GENERAL, FG_ALERT,
|
|
|
|
"General initializations failed ..." );
|
|
|
|
exit(-1);
|
1998-07-27 18:41:23 +00:00
|
|
|
}
|
|
|
|
|
1999-06-18 03:42:54 +00:00
|
|
|
//
|
|
|
|
// some ssg test stuff (requires data from the plib source
|
|
|
|
// distribution) specifically from the ssg tux example
|
|
|
|
//
|
|
|
|
|
2000-10-19 21:24:43 +00:00
|
|
|
FGPath modelpath( globals->get_options()->get_fg_root() );
|
2000-10-18 21:19:30 +00:00
|
|
|
// modelpath.append( "Models" );
|
|
|
|
// modelpath.append( "Geometry" );
|
1999-07-01 01:17:43 +00:00
|
|
|
|
2000-10-19 21:24:43 +00:00
|
|
|
FGPath texturepath( globals->get_options()->get_fg_root() );
|
1999-07-01 01:17:43 +00:00
|
|
|
texturepath.append( "Models" );
|
|
|
|
texturepath.append( "Textures" );
|
|
|
|
|
|
|
|
ssgModelPath( (char *)modelpath.c_str() );
|
|
|
|
ssgTexturePath( (char *)texturepath.c_str() );
|
1999-06-18 03:42:54 +00:00
|
|
|
|
2000-02-29 17:13:02 +00:00
|
|
|
// Scene graph root
|
1999-06-18 03:42:54 +00:00
|
|
|
scene = new ssgRoot;
|
2000-02-29 17:13:02 +00:00
|
|
|
scene->setName( "Scene" );
|
|
|
|
|
2000-03-02 03:03:16 +00:00
|
|
|
// Initialize the sky
|
2000-10-19 21:24:43 +00:00
|
|
|
FGPath ephem_data_path( globals->get_options()->get_fg_root() );
|
2000-03-16 23:01:57 +00:00
|
|
|
ephem_data_path.append( "Astro" );
|
2000-07-08 05:09:24 +00:00
|
|
|
SGEphemeris *ephem = new SGEphemeris( ephem_data_path.c_str() );
|
|
|
|
ephem->update( globals->get_time_params()->getMjd(),
|
|
|
|
globals->get_time_params()->getLst(),
|
|
|
|
0.0 );
|
|
|
|
globals->set_ephem( ephem );
|
2000-03-16 23:01:57 +00:00
|
|
|
|
2000-10-19 21:24:43 +00:00
|
|
|
FGPath sky_tex_path( globals->get_options()->get_fg_root() );
|
2000-03-06 23:28:43 +00:00
|
|
|
sky_tex_path.append( "Textures" );
|
|
|
|
sky_tex_path.append( "Sky" );
|
2000-03-16 04:15:22 +00:00
|
|
|
thesky = new SGSky;
|
|
|
|
thesky->texture_path( sky_tex_path.str() );
|
2000-03-16 23:01:57 +00:00
|
|
|
|
2000-06-20 02:29:31 +00:00
|
|
|
thesky->build( 550.0, 550.0,
|
2000-07-08 05:09:24 +00:00
|
|
|
globals->get_ephem()->getNumPlanets(),
|
|
|
|
globals->get_ephem()->getPlanets(), 60000.0,
|
|
|
|
globals->get_ephem()->getNumStars(),
|
|
|
|
globals->get_ephem()->getStars(), 60000.0 );
|
2000-07-05 02:39:30 +00:00
|
|
|
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_clouds() == true ) {
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
thesky->add_cloud_layer( 2600.0, 200.0, 50.0, 40000.0,
|
|
|
|
SG_CLOUD_MOSTLY_SUNNY );
|
|
|
|
thesky->add_cloud_layer( 6000.0, 20.0, 10.0, 40000.0,
|
|
|
|
SG_CLOUD_CIRRUS );
|
|
|
|
// thesky->add_cloud_layer( 1000.0, 200.0, 50.0,
|
|
|
|
// SG_CLOUD_MOSTLY_SUNNY );
|
|
|
|
// thesky->add_cloud_layer( 1800.0, 400.0, 100.0, SG_CLOUD_OVERCAST );
|
|
|
|
// thesky->add_cloud_layer( 5000.0, 20.0, 10.0, SG_CLOUD_CIRRUS );
|
|
|
|
}
|
2000-03-16 04:15:22 +00:00
|
|
|
|
2000-08-08 00:39:52 +00:00
|
|
|
// Initialize MagVar model
|
|
|
|
SGMagVar *magvar = new SGMagVar();
|
|
|
|
globals->set_mag( magvar );
|
|
|
|
|
2000-03-16 04:15:22 +00:00
|
|
|
// Terrain branch
|
|
|
|
terrain = new ssgBranch;
|
|
|
|
terrain->setName( "Terrain" );
|
|
|
|
scene->addKid( terrain );
|
2000-02-29 17:13:02 +00:00
|
|
|
|
|
|
|
// temporary visible aircraft "own ship"
|
1999-06-30 19:16:53 +00:00
|
|
|
penguin_sel = new ssgSelector;
|
|
|
|
penguin_pos = new ssgTransform;
|
2000-10-18 21:19:30 +00:00
|
|
|
string tux_path =
|
|
|
|
current_properties.getStringValue("/sim/model/path",
|
|
|
|
"Models/Geometry/glider.ac");
|
|
|
|
ssgEntity *tux_obj = ssgLoad((char *)(tux_path.c_str()));
|
|
|
|
|
|
|
|
// align the model properly for FGFS
|
|
|
|
ssgTransform *tux_align = new ssgTransform;
|
|
|
|
tux_align->addKid(tux_obj);
|
2000-11-14 20:43:38 +00:00
|
|
|
sgMat4 rot_matrix;
|
|
|
|
sgMat4 off_matrix;
|
|
|
|
sgMat4 res_matrix;
|
2000-10-18 21:19:30 +00:00
|
|
|
float h_rot =
|
|
|
|
current_properties.getFloatValue("/sim/model/h-rotation", 0.0);
|
2000-11-14 20:43:38 +00:00
|
|
|
float p_rot =
|
|
|
|
current_properties.getFloatValue("/sim/model/p-rotation", 0.0);
|
2000-10-18 21:19:30 +00:00
|
|
|
float r_rot =
|
|
|
|
current_properties.getFloatValue("/sim/model/r-rotation", 0.0);
|
2000-11-14 20:43:38 +00:00
|
|
|
float x_off =
|
|
|
|
current_properties.getFloatValue("/sim/model/x-offset", 0.0);
|
|
|
|
float y_off =
|
|
|
|
current_properties.getFloatValue("/sim/model/y-offset", 0.0);
|
|
|
|
float z_off =
|
|
|
|
current_properties.getFloatValue("/sim/model/z-offset", 0.0);
|
|
|
|
sgMakeRotMat4(rot_matrix, h_rot, p_rot, r_rot);
|
|
|
|
sgMakeTransMat4(off_matrix, x_off, y_off, z_off);
|
|
|
|
sgMultMat4(res_matrix, off_matrix, rot_matrix);
|
|
|
|
tux_align->setTransform(res_matrix);
|
2000-10-18 21:19:30 +00:00
|
|
|
|
|
|
|
penguin_pos->addKid( tux_align );
|
1999-06-30 19:16:53 +00:00
|
|
|
penguin_sel->addKid( penguin_pos );
|
1999-06-18 03:42:54 +00:00
|
|
|
ssgFlatten( tux_obj );
|
1999-06-30 19:16:53 +00:00
|
|
|
ssgStripify( penguin_sel );
|
2000-01-13 20:12:16 +00:00
|
|
|
penguin_sel->clrTraversalMaskBits( SSGTRAV_HOT );
|
2000-02-29 17:13:02 +00:00
|
|
|
scene->addKid( penguin_sel );
|
1999-06-18 03:42:54 +00:00
|
|
|
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
// $$$ begin - added VS Renganthan 17 Oct 2K
|
|
|
|
fgLoadDCS();
|
|
|
|
// $$$ end - added VS Renganthan 17 Oct 2K
|
|
|
|
|
1999-06-30 20:21:04 +00:00
|
|
|
#ifdef FG_NETWORK_OLK
|
|
|
|
// Do the network intialization
|
2000-10-19 21:24:43 +00:00
|
|
|
if ( globals->get_options()->get_network_olk() ) {
|
2000-02-28 04:16:12 +00:00
|
|
|
printf("Multipilot mode %s\n", fg_net_init( scene ) );
|
|
|
|
}
|
1999-06-30 20:21:04 +00:00
|
|
|
#endif
|
|
|
|
|
2000-03-02 03:03:16 +00:00
|
|
|
// build our custom render states
|
|
|
|
fgBuildRenderStates();
|
|
|
|
|
1998-04-24 14:19:29 +00:00
|
|
|
// pass control off to the master GLUT event handler
|
1998-04-24 00:49:17 +00:00
|
|
|
glutMainLoop();
|
|
|
|
|
1999-06-18 03:42:54 +00:00
|
|
|
// we never actually get here ... but to avoid compiler warnings,
|
|
|
|
// etc.
|
|
|
|
return 0;
|
1998-04-21 17:02:27 +00:00
|
|
|
}
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
|
|
|
|
|
|
|
|
// $$$ end - added VS Renganathan, 15 Oct 2K
|
|
|
|
void fgLoadDCS(void) {
|
|
|
|
|
|
|
|
string obj_filename;
|
|
|
|
|
2000-10-19 21:24:43 +00:00
|
|
|
FGPath modelpath( globals->get_options()->get_fg_root() );
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
modelpath.append( "Models" );
|
|
|
|
modelpath.append( "Geometry" );
|
|
|
|
|
2000-10-19 21:24:43 +00:00
|
|
|
FGPath texturepath( globals->get_options()->get_fg_root() );
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
texturepath.append( "Models" );
|
|
|
|
texturepath.append( "Textures" );
|
|
|
|
|
|
|
|
ssgModelPath( (char *)modelpath.c_str() );
|
|
|
|
ssgTexturePath( (char *)texturepath.c_str() );
|
|
|
|
|
|
|
|
// while ( ! in.eof() ) {
|
|
|
|
// in >> obj_filename >> obj_lat >> obj_lon >> obj_alt;
|
|
|
|
// totalDCSobj = totalDCSobj+1;
|
|
|
|
|
|
|
|
ship_sel = new ssgSelector;
|
|
|
|
ship_pos = new ssgTransform;
|
|
|
|
ssgEntity *ship_obj = ssgLoadOBJ( "saratoga.obj" );
|
|
|
|
if ( ship_obj != NULL ) {
|
|
|
|
ship_pos->addKid( ship_obj ); // add object to transform node
|
|
|
|
ship_sel->addKid( ship_pos ); // add transform node to selector
|
|
|
|
// ssgFlatten( ship_obj );
|
|
|
|
// ssgStripify( ship_sel );
|
|
|
|
ship_sel->clrTraversalMaskBits( SSGTRAV_HOT );
|
|
|
|
scene->addKid( ship_sel ); //add selector node to root node
|
|
|
|
} else {
|
|
|
|
FG_LOG( FG_TERRAIN, FG_ALERT, "Cannot open file: " << "saratoga.obj" );
|
|
|
|
}
|
|
|
|
|
|
|
|
// if (in.eof()) break;
|
|
|
|
|
|
|
|
// } // while
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void fgUpdateDCS (void) {
|
|
|
|
|
2000-10-25 15:27:55 +00:00
|
|
|
// double eye_lat,eye_lon,eye_alt;
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
static double obj_lat=15.377603*DEG_TO_RAD;
|
|
|
|
static double obj_lon= 73.816436*DEG_TO_RAD;
|
|
|
|
static double obj_alt=0.15;
|
2000-10-25 15:27:55 +00:00
|
|
|
// static double obj_head;
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
double sl_radius,obj_latgc;
|
2000-10-25 15:27:55 +00:00
|
|
|
// float nresultmat[4][4];
|
The following changes were made to flightgear-0.7.5 code to implement the follow
ing features:
a) ADA Flight model - ADA.cxx, ADA.hxx, flight.hxx
b) Fighter a/c HUD - flight.hxx, hud.hxx, hud.cxx, cockpit.cxx, hud_ladr.c
xx, hud_card.cxx
c) 3-window display - options.hxx, options.cxx, viewer.cxx
d) Moving objects (ship) - main.cxx
e) Patches - main.cxx
ADA.cxx, ADA.hxx
--------------------------
Interface to the external ADA flight dynamics package.
flight.hxx
----------
Included prototypes for accepting additional data fron the External flight
model for fighter aircraft HUD
Hud.hxx
-------
Included prototypes for accepting additional data for fighter HUD from Exernal F
light model.
Defined FIGHTER_HUD pre-processor directive to enable compilation of fighter hud
code.
hud.cxx, cockpit.cxx, hud_ladr.cxx, hud_card.cxx
---------------------------------------
Included code to initialise additional reticles/text for fighter HUD which is co
nditionally
compiled if FIGHTER_HUD is defined.
options.hxx
-----------
Added window_offset, and function to retrieve its value for 3 windows
options.cxx
-----------
Changed few options to suit ADA/CEF projection system/screens and checks for win
dow offset.
views.cxx
---------
Added code to retrieve view offset for window.
Main.cxx
--------
Added code to load and move an aircraft carrier.
Patch to enable clouds from command line until Curtis fixes it. By default cloud
s are disabled.
2000-10-19 19:46:13 +00:00
|
|
|
double bz[3];
|
|
|
|
|
|
|
|
obj_lat = obj_lat + 0.0000001;
|
|
|
|
|
|
|
|
// Instantaneous Geodetic Lat/Lon/Alt of moving object
|
|
|
|
// obj_lon = current_aircraft.fdm_state->get_aux5()*DEG_TO_RAD;
|
|
|
|
// obj_lat = current_aircraft.fdm_state->get_aux6()*DEG_TO_RAD;
|
|
|
|
// obj_alt = current_aircraft.fdm_state->get_aux7();
|
|
|
|
|
|
|
|
// Geodetic to Geocentric angles for rotation
|
|
|
|
sgGeodToGeoc(obj_lat,obj_alt,&sl_radius,&obj_latgc);
|
|
|
|
|
|
|
|
// moving object gbs-posn in cartesian coords
|
|
|
|
Point3D obj_posn = Point3D( obj_lon,obj_lat,obj_alt);
|
|
|
|
Point3D obj_pos = sgGeodToCart( obj_posn );
|
|
|
|
|
|
|
|
// Translate moving object w.r.t eye
|
|
|
|
Point3D Objtrans = obj_pos-scenery.center;
|
|
|
|
bz[0]=Objtrans.x();
|
|
|
|
bz[1]=Objtrans.y();
|
|
|
|
bz[2]=Objtrans.z();
|
|
|
|
|
|
|
|
// rotate dynamic objects for lat,lon & alt and other motion about its axes
|
|
|
|
if ( ship_sel != NULL ) {
|
|
|
|
ship_sel->select(1);
|
|
|
|
|
|
|
|
sgMat4 sgTRANS;
|
|
|
|
sgMakeTransMat4( sgTRANS, bz[0],bz[1],bz[2]);
|
|
|
|
|
|
|
|
sgVec3 ship_fwd,ship_rt,ship_up;
|
|
|
|
sgSetVec3( ship_fwd, 1.0, 0.0, 0.0);//east,roll
|
|
|
|
sgSetVec3( ship_rt, 0.0, 1.0, 0.0);//up,pitch
|
|
|
|
sgSetVec3( ship_up, 0.0, 0.0, 1.0); //north,yaw
|
|
|
|
|
|
|
|
sgMat4 sgROT_lon, sgROT_lat, sgROT_hdg;
|
|
|
|
sgMakeRotMat4( sgROT_lon, obj_lon*RAD_TO_DEG, ship_up );
|
|
|
|
sgMakeRotMat4( sgROT_lat, 90-obj_latgc*RAD_TO_DEG, ship_rt );
|
|
|
|
sgMakeRotMat4( sgROT_hdg, 180.0, ship_up );
|
|
|
|
|
|
|
|
sgMat4 sgTUX;
|
|
|
|
sgCopyMat4( sgTUX, sgROT_hdg );
|
|
|
|
sgPostMultMat4( sgTUX, sgROT_lat );
|
|
|
|
sgPostMultMat4( sgTUX, sgROT_lon );
|
|
|
|
sgPostMultMat4( sgTUX, sgTRANS );
|
|
|
|
|
|
|
|
sgCoord shippos;
|
|
|
|
sgSetCoord( &shippos, sgTUX );
|
|
|
|
ship_pos->setTransform( &shippos );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// $$$ end - added VS Renganathan, 15 Oct 2K
|