<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.flightgear.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wkitty42</id>
	<title>FlightGear wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.flightgear.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Wkitty42"/>
	<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/Special:Contributions/Wkitty42"/>
	<updated>2026-04-19T06:16:26Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Animated_jetways&amp;diff=140832</id>
		<title>Animated jetways</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Animated_jetways&amp;diff=140832"/>
		<updated>2024-11-01T22:24:54Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Animated jetways type 1 */ add date they were fixed in FGDate&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Animated-jetways-KSFO.jpg|thumb|Animated jetways at [[San Francisco International Airport|KSFO]]]]&lt;br /&gt;
'''Animated jetways''' can be set in motion by pilots arriving at terminals of airports in FlightGear that have had them added.&lt;br /&gt;
&lt;br /&gt;
Jetways are the &amp;quot;tubes&amp;quot; that passengers use when entering or leaving aircraft docked to the passenger terminals.&lt;br /&gt;
&lt;br /&gt;
== Different types of jetways ==&lt;br /&gt;
There are at least two types of animated jetways in FlightGear, here called type 1 and type 2. Type 1 is more advanced than type 2.&lt;br /&gt;
&lt;br /&gt;
; Type 1&lt;br /&gt;
: They can connect to your aircraft and also to AI or multiplayer aircraft, (almost) no matter where you stand and in which orientation, as long as you are near enough.&lt;br /&gt;
&lt;br /&gt;
; Type 2&lt;br /&gt;
: You have to park very precisely, they do not connect to AI aircraft and they are not visible to other in multiplayer, etc. &lt;br /&gt;
&lt;br /&gt;
== Animated jetways type 1 ==&lt;br /&gt;
{{main article|Howto:Animated jetways}}&lt;br /&gt;
&lt;br /&gt;
=== Known issues ===&lt;br /&gt;
* They only exist in [[San Francisco International Airport|KSFO]]. But &amp;lt;code&amp;gt;jetways.xml&amp;lt;/code&amp;gt; files for more airports are available here: http://media.lug-marl.de/flightgear/jetways/ and here: {{github source|user=mherweg|repo=Airports}}&lt;br /&gt;
* &amp;lt;code&amp;gt;generic.xml&amp;lt;/code&amp;gt; in FGData is broken. &amp;lt;code&amp;gt;generic.xml&amp;lt;/code&amp;gt; in [[TerraSync]] is repaired.  See this forum post: {{forum link|p=257608|title=Re: jetways at KSFO}}&lt;br /&gt;
* The elevations in the output file of the Jetway editor has to be corrected manually. '''A version of &amp;lt;code&amp;gt;jetways.nas&amp;lt;/code&amp;gt; without the elevation problem can be found here''': http://media.lug-marl.de/flightgear/jetways/&lt;br /&gt;
* The stg converter of the Jetway editor has a bug in the file-selection dialog.   '''A fixed version of &amp;lt;code&amp;gt;jetways_edit.nas&amp;lt;/code&amp;gt; can be found here: ''' http://media.lug-marl.de/flightgear/jetways/&lt;br /&gt;
&lt;br /&gt;
As of Oct 2015, the last 2 bugs (&amp;lt;code&amp;gt;jetways.nas&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;jetways_edit.nas&amp;lt;/code&amp;gt;) are fixed in the git version of FGData {{fgdata source|commit=dd3390b3afee955ba23dfd9334baf438bc7ae989}}&lt;br /&gt;
&lt;br /&gt;
Here's another improved version of &amp;lt;code&amp;gt;jetways.nas&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;jetways_edit.nas&amp;lt;/code&amp;gt;:&lt;br /&gt;
{{forum link|p=306013|title=Re: The animated jetway project}}&lt;br /&gt;
&lt;br /&gt;
=== Adding type 1 jetways to an airport ===&lt;br /&gt;
If you use them at your airport, try to find someone (Torsten D.) with commit rights to FGData or TerraSysnc's &amp;lt;code&amp;gt;Airports/&amp;lt;/code&amp;gt; folder and/or use them in your custom scenery.&lt;br /&gt;
&lt;br /&gt;
=== Type 1 Jetways at KDEN ===&lt;br /&gt;
recommended:&lt;br /&gt;
* Rename &amp;lt;code&amp;gt;Models/Airport/Jetway/jetway-movable.xml&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;jetway-movable.xml.bak&amp;lt;/code&amp;gt;&lt;br /&gt;
alternative:&lt;br /&gt;
* remove all &amp;lt;model&amp;gt; entries from &amp;lt;code&amp;gt;Objects/w110n30/w105n39/KDEN_Concourse_C.xml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Type 1 Jetways at KLAS ===&lt;br /&gt;
recommended:&lt;br /&gt;
* Rename &amp;lt;code&amp;gt;Models/Airport/Jetway/jetway-movable.xml&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;jetway-movable.xml.bak&amp;lt;/code&amp;gt;&lt;br /&gt;
alternative:&lt;br /&gt;
* remove all lines with &amp;lt;code&amp;gt;OBJECT_SHARED Models/Airport/Jetway/jetway-movable.xml&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;Objects/w120n30/w116n36/1056643.stg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Type 1 Jetways at PANC ===&lt;br /&gt;
recommended:&lt;br /&gt;
* Rename &amp;lt;code&amp;gt;Models/Airport/Jetway/jetway-movable.xml&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;jetway-movable.xml.bak&amp;lt;/code&amp;gt;&lt;br /&gt;
alternative:&lt;br /&gt;
* remove all lines with &amp;lt;code&amp;gt;OBJECT_SHARED Models/Airport/Jetway/jetway-movable.xml&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;Objects/w150n60/w150n61/501192.stg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Type 1 Jetways at EGKK ===&lt;br /&gt;
* create a folder &amp;lt;code&amp;gt;Models/Airport/Jetway/backup and move jetway.xml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;jetway-747-ba.xml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;jetway-737-ba.xml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;jetway-a320-ba.xml&amp;lt;/code&amp;gt; into that folder.&lt;br /&gt;
alternative:&lt;br /&gt;
* remove all lines with &amp;lt;code&amp;gt;OBJECT_SHARED Models/Airport/Jetway/...&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;Objects/w010n50/w001n51/2941771.stg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Type 1 Jetways at EHAM ===&lt;br /&gt;
That is a tough one! The static jetways are part of the .ac file of the terminals e.g. &amp;lt;code&amp;gt;Schiphol_Gate_E.ac.&amp;lt;/code&amp;gt; If you really want animated jetways there, you have to edit those terminal buildings in a 3D software like blender or sketchup.  &amp;lt;code&amp;gt;EHAM_gate.xml&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EHAM_gate_2.xml&amp;lt;/code&amp;gt; also need to be fixed but that is easy: you can download them here: &lt;br /&gt;
http://media.lug-marl.de/flightgear/jetways/&lt;br /&gt;
&lt;br /&gt;
=== Type 1 Jetways at EDDF ===&lt;br /&gt;
EDDF has no other jetways except for Type1-Jetways at Terminal A+. So just put &amp;lt;code&amp;gt;EDDF.jetways.xml&amp;lt;/code&amp;gt; into  the &amp;lt;code&amp;gt;Airports/E/D/D/&amp;lt;/code&amp;gt;   folder&lt;br /&gt;
&lt;br /&gt;
== Animated jetways type 2 ==&lt;br /&gt;
You can find type 2  at EDDH, EDDK, EDDG and some other airports, They exist in three versions for aircraft with one, two or three doors:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;jetway-movable.xml&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;jetway-movable-2.xml&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;jetway-movable-3.xml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Known issues ===&lt;br /&gt;
* You click one of them and all others also move&lt;br /&gt;
* Your aircraft has to park exactly aligned on the yellow line with the front wheel on the mark.&lt;br /&gt;
* They only fit when the terminal building in front of the aircraft, you can not use them when the terminal building is on the side of the aircraft.&lt;br /&gt;
* Movement is not visible via multiplayer&lt;br /&gt;
&lt;br /&gt;
=== Adding type 2 jetways to an airport ===&lt;br /&gt;
Place them as a shared object with the ufo and submit the locations to to http://scenemodels.flightgear.org/.  See [[Placing 3D Objects with the UFO]].&lt;br /&gt;
&lt;br /&gt;
=== Adding type 2 jetways to an aircraft ===&lt;br /&gt;
Add the following to your aircraft-set.xml, see the A380 as an example. You can find the right values by parking your aircraft at a type 2 jetway and setting the properties in &amp;lt;code&amp;gt;/scenery/airport/jetway&amp;lt;/code&amp;gt;. In that way you don't have to restart FlightGear every time to check if your settings are right.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight language=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;aircraft&amp;gt;&lt;br /&gt;
 &amp;lt;jetway-pos&amp;gt;&lt;br /&gt;
  &amp;lt;x-tra&amp;gt;-2&amp;lt;/x-tra&amp;gt;&lt;br /&gt;
  &amp;lt;y-rot&amp;gt;2&amp;lt;/y-rot&amp;gt;&lt;br /&gt;
  &amp;lt;z-rot&amp;gt;18&amp;lt;/z-rot&amp;gt;&lt;br /&gt;
  &amp;lt;hood-rot&amp;gt;0&amp;lt;/hood-rot&amp;gt;&lt;br /&gt;
 &amp;lt;/jetway-pos&amp;gt;&lt;br /&gt;
 &amp;lt;jetway2-pos&amp;gt;&lt;br /&gt;
  &amp;lt;x-tra&amp;gt;2.5&amp;lt;/x-tra&amp;gt;&lt;br /&gt;
  &amp;lt;y-rot&amp;gt;2.5&amp;lt;/y-rot&amp;gt;&lt;br /&gt;
  &amp;lt;z-rot&amp;gt;45&amp;lt;/z-rot&amp;gt;&lt;br /&gt;
  &amp;lt;hood-rot&amp;gt;0&amp;lt;/hood-rot&amp;gt;&lt;br /&gt;
 &amp;lt;/jetway2-pos&amp;gt;&lt;br /&gt;
 &amp;lt;jetway3-pos&amp;gt;&lt;br /&gt;
  &amp;lt;x-tra&amp;gt;4&amp;lt;/x-tra&amp;gt;&lt;br /&gt;
  &amp;lt;y-rot&amp;gt;5&amp;lt;/y-rot&amp;gt;&lt;br /&gt;
  &amp;lt;z-rot&amp;gt;47&amp;lt;/z-rot&amp;gt;&lt;br /&gt;
  &amp;lt;hood-rot&amp;gt;3&amp;lt;/hood-rot&amp;gt;&lt;br /&gt;
 &amp;lt;/jetway3-pos&amp;gt;&lt;br /&gt;
&amp;lt;/aircraft&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
* [[AI Jetway Objects]]&lt;br /&gt;
* [[Howto:Animated jetways]]&lt;br /&gt;
* [[List of .stg files with non-AI jetway scenery objects]]&lt;br /&gt;
* [[Ramp Marshall]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Scenery enhancement]]&lt;br /&gt;
[[Category:AI Traffic]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Canvas_Maps&amp;diff=134472</id>
		<title>Canvas Maps</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Canvas_Maps&amp;diff=134472"/>
		<updated>2022-01-18T13:23:15Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Geo-referencing */ remove link to osggis.org... apparently someone bought the domain and turned it into a XXX site&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Canvas Navigation}}&lt;br /&gt;
&lt;br /&gt;
== Status: The Map/NavDisplay backend ==&lt;br /&gt;
* '''TheTom''': &amp;quot; [[ATC-FS]] is definitely an interesting application which can benefit from the Canvas very much. Maybe we can do some ATC programs which look like the real ones... &amp;quot;&lt;br /&gt;
* '''Hooray''': &amp;quot; It would be great to have 2-3 &amp;quot;real&amp;quot; applications, so that the canvas/map API becomes more powerful.&amp;quot;&lt;br /&gt;
* '''TheTom''': &amp;quot;vertical projection seems not too complicated as its basically just calculating segment lenghts on a sphere, or maybe just direct distance calculations. I think the error in comparison to the real sphere can be neglected while using typical distances (eg. at a distance of 300 miles the error is about 2.8 miles, which is ~0.9%).&amp;quot; {{Pending}} (see [[Canvas Maps]])&lt;br /&gt;
&lt;br /&gt;
== Shared Requirements (MFDs and GUI maps) ==&lt;br /&gt;
It would make sense to introduce another wrapper here, something like &amp;quot;mfd.nas&amp;quot; which transparently handles the low level details and which uses canvas.nas as its workhorse.&lt;br /&gt;
&lt;br /&gt;
Like you say, the API requirements for canvas and the mfd module will become clearer once existing dialogs and gauges are getting ported. I would however be careful not to put too much special stuff into the generic canvas module.&lt;br /&gt;
&lt;br /&gt;
We need to keep in mind that once the hard coded Map dialog is getting ported, there will be lots of overlapping functionality with similar &amp;quot;displays&amp;quot;, like the NavDisplay, agradar, wxradar - all of these are basically about mapping a geo-position to 2D screen space (horizontal currently).&lt;br /&gt;
&lt;br /&gt;
The Canvas system's mapping mode loosely follows the ideas from ARINC 661.&lt;br /&gt;
The current hard coded NavDisplay is really an ARINC 661 display - it takes a list of symbols, a list of items and combines then using a projection to create a final  display. The only additional code is to deal with special things that can't easily be described by a simply symbol, especially the flight-plan/route path.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Map widget will be special in that it will be a shared component that can be used for both, GUI dialogs, as well as MFD-style avionics. The idea is to create a generic system that can be easily parametrized and customized as required, so that it can be used by people to create all sorts of mapping/charting displays in FlighGear, either as conventional MFD gauges, or as GUI dialogs (for example ATC radar screens).&lt;br /&gt;
&lt;br /&gt;
A display like the current navdisplay could be rendered as an instrument, but also as a GUI widget. &lt;br /&gt;
In any case, there would be a fixed set of &amp;quot;inputs&amp;quot; and &amp;quot;outputs&amp;quot;, i.e. the &amp;quot;interface&amp;quot; of the system.&lt;br /&gt;
&lt;br /&gt;
In FlightGear, this would usually mean that there are input and output properties. For cockpit instruments, these would be mapped to hot spots, i.e. clickable panel actions.&lt;br /&gt;
&lt;br /&gt;
So, what could be done is adding a new Nasal class to make these relationships explicit: input properties and output properties.&lt;br /&gt;
When a canvas system is being loaded as an instrument, these &amp;quot;generic&amp;quot; properties would be mapped to instrument-specific properties. And when it is loaded as a GUI widget, these could be exposed as GUI hooks, i.e. mapped to checkboxes, buttons etc.&lt;br /&gt;
&lt;br /&gt;
In its simplest form, developers would use different hashes or vectors to specify the properties supported for input/output, in each different mode:&lt;br /&gt;
&lt;br /&gt;
* Instrument mode&lt;br /&gt;
* HUD mode&lt;br /&gt;
* GUI (widget) mode&lt;br /&gt;
* scenery mode&lt;br /&gt;
&lt;br /&gt;
There could be other more specific modes, for MFDs (or CDUs).&lt;br /&gt;
&lt;br /&gt;
For example, let's consider the MFD example, i.e. the map dialog, which has a single &amp;quot;control property&amp;quot; (input) to select if the runways shall be rendered or not. The GUI widget would simply map this property to a checkbox, while the cockpit panel would map it to a cockpit hotspot to show/hide this layer.&lt;br /&gt;
&lt;br /&gt;
Obviously, it would be important to support multiple instances, so that an aircraft may have multiple MFDs, CDUs - and so that the cockpit settings don't override the settings in the canvas-driven map dialog, but that can be accomplished by using different canvases. At some point it might make sense to see how this can be optimized, so that a single canvas may be partially shared, ie. by having cascades of canvases (like we talked about), so that there are no redundant canvases being drawn. Basically, something like a shared canvas instance, which is evaluated for each instance of the instrument/widget, i.e. drawn multiple times per frame for the control properties of each canvas system (PFD, ND, EICAS).&lt;br /&gt;
&lt;br /&gt;
That would make it possible to share multiple instances, with different settings, while sharing most of the rendering logic and data, i.e. a single canvas RTT context could be largely shared. That may be a worthwhile thing to support, because it would help improve the performance for complex glass cockpits, with many identical instruments (layers/groups) - which may still have different &amp;quot;modes&amp;quot; selected, so that they require their own rendering pass, while sharings lots of data/GL state otherwise.&lt;br /&gt;
&lt;br /&gt;
That being said, I would consider changing the canvas class such that it is possible to link properties to certain usage modes/scenarios. That would make it possible for people to easily use the same code for different purposes.&lt;br /&gt;
&lt;br /&gt;
Overall, I feel that the design would evolve automatically once we actually try to port the map dialog to become a generic canvas module, usable for both, cockpit instruments - but also as a GUI widget. In other words: how would the design ideally look, if we could create generic canvas systems for such purposes?&lt;br /&gt;
&lt;br /&gt;
That shouldn't involve any C++ changes - just creating abstract interface classes for people to use - so that their subclasses automatically satisfy everything that's needed.&lt;br /&gt;
&lt;br /&gt;
And it would actually make sense to support the same thing for GUI widgets, too - i.e. allow them to be rendered as part of fully functioning cockpit instruments, that may seem like over-engineering now - but all modern airliners use A661 meanwhile, and they all support &amp;quot;real GUIs&amp;quot; as part of the MFD/CDU - i.e. control boxes, dialog boxes, check boxes, buttons etc. &lt;br /&gt;
So it would be great to support the FG canvas widget here, too - we could get it for free like this.&lt;br /&gt;
&lt;br /&gt;
== Moving Maps ==&lt;br /&gt;
Basically, a moving map terrain view would require support for accessing the FG tile manager, so that a orthographic view of the scenery can be rendered.&lt;br /&gt;
It might be easier to use OSG's GeoTIFF support instead and require people to add GeoTIFF images for the region of interest?&lt;br /&gt;
Overall, I feel that would be better implemeneted as a separate mode (implemented in C++)?&lt;br /&gt;
I think it would be better to use the same elevation data that is used for rendering, so that you don't have to create and provide the same data two times. Rendering an orthographic view would come for free if we implement support for multiple cameras. If we don't want to do it with rendering we can use a cached list of terrain intersections. I have seen such an implementation in one of the aircrafts in the forum (I think it was the 787).&lt;br /&gt;
Yes, that's true - that's been discussed previously, but there was talk about using a dedicated scene graph for such moving map displays on the devel list, see [[CompositeViewer Support]].&lt;br /&gt;
&lt;br /&gt;
Also see: [[Howto:Use a Camera View in an Instrument]]&lt;br /&gt;
&lt;br /&gt;
Related:&lt;br /&gt;
* http://forum.flightgear.org/viewtopic.php?f=4&amp;amp;t=15722&amp;amp;p=154788&amp;amp;hilit=synthetic#p153941&lt;br /&gt;
* http://forum.flightgear.org/viewtopic.php?f=71&amp;amp;t=17105&amp;amp;p=163120&amp;amp;hilit=synthetic#p163119&lt;br /&gt;
* http://forum.flightgear.org/viewtopic.php?f=71&amp;amp;p=164340#p163475&lt;br /&gt;
&lt;br /&gt;
== Vector data ==&lt;br /&gt;
{{Main article|Canvas Tile Element}}&lt;br /&gt;
&lt;br /&gt;
Looking at the [[Map]] dialog docs, James was planning to add a bunch of other features which are not currently supported by the map widget, but which would probably be worth keeping in mind for the canvas system as such, for example:&lt;br /&gt;
* &amp;quot;use terrain height intersections to compute a EGPWS / G1000-style terrain clearance overlay&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Also, he mentions &amp;quot;national borders &amp;amp; coastlines rendering&amp;quot; under planned improvements.&lt;br /&gt;
&lt;br /&gt;
That would probably be best accomplished by rendering vector data from shapefiles (esri), OSG already has support for ESRI using the ESRIShape plugin: http://svn.openscenegraph.org/osg/OpenSceneGraph/tags/OpenSceneGraph-2.8.2/src/osgPlugins/shp/ESRIShape.cpp&lt;br /&gt;
&lt;br /&gt;
Yeah, it seems like osgGIS is really focused too much on OSG. But instead of using shapelib for ESRI support I'd rather use gdal or ogr which is already used in TerraGear and is not limited to a single format. But I think this is something to consider later. For a first version of the map it should be enough to expose the data that is already available in the core.&lt;br /&gt;
&lt;br /&gt;
== Misc ==&lt;br /&gt;
This is copied from various articles that have become obsolete now and which are considered for deletion - so none of this is currently planned, it's just kept here to help us assess whether all the required building blocks are in place, or if we should look into adding other building blocks.&lt;br /&gt;
&lt;br /&gt;
=== Geo-referencing ===&lt;br /&gt;
* ability to load maps/charts in standard formats, i.e. as ESRI shapefile layers (There are some plugins for OSG to deal with ESRI/GIS data)&lt;br /&gt;
* access to terrain via terrain API to query terrain properties&lt;br /&gt;
* access to airspace via airspace API to query surrounding airspace&lt;br /&gt;
* access to navigation databases (airports, navaids, waypoints, airways)&lt;br /&gt;
* render to texture&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=132688</id>
		<title>FlightGear history</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=132688"/>
		<updated>2021-08-05T11:31:09Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Release timeline */ fix 2020.2.1 date... used date of branch cut from commit logs mailing list since archive was removed as too buggy and 2020.3 was cut a week or two later...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[FlightGear]] development started with an online proposal in 1996, using custom 3D graphics code. Development of an [[OpenGL]] based version was spearheaded by Curtis Olson starting in 1997. Many people have contributed to the project in the years since its inception.&lt;br /&gt;
&lt;br /&gt;
FlightGear incorporated other open-source resources, including the [[LaRCsim]] flight model from NASA, and freely available elevation data. The first working binaries, using OpenGL for 3D graphic code, came out in 1997. Enthusiastic development of newer versions for several years resulted in progressively more stable and advanced versions. By 2001, the team was releasing new beta versions regularly, and by 2005, the maturity of software lead to more widespread reviews, and increased popularity. 2007 marked a formal transition out of beta development with the release of version 1.0.0, ten years after FlightGear's first release in 1997.&lt;br /&gt;
&lt;br /&gt;
In 2008, version 1.9.0 of FlightGear included a major change from [[PLIB]] to [[OSG]], which caused the temporarily loss of some features like 3D clouds and shadows, while newly added features, such as particles, imparted another degree of realism to the simulation. &lt;br /&gt;
 &lt;br /&gt;
== Beginnings (1996-1997) ==&lt;br /&gt;
[[File:FG SUNHALO.JPG|thumb|270px|March 18, 1999: one of the oldest surviving screenshots of FlightGear. Back then, FlightGear was the only PC based flight simulator rendering the [[Moon|sun, moon, and celestial]] objects at the correct position, and under the correct lighting conditions, in the sky. ]]&lt;br /&gt;
[[File:Image103.gif|thumb|Original Win95 icon]]&lt;br /&gt;
The FlightGear project was conceived on April 8, 1996 by David Murr who proposed a new flight simulator to be developed by volunteers&amp;lt;ref&amp;gt;David Murr (Apr 9, 1996).  FlightGear proposal 1.0: [https://groups.google.com/forum/#!msg/rec.aviation.simulators/ny8HFBE5_T8/OdtIiGNGJc8J &amp;quot;A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@&amp;quot;].  Published on the rec.aviation.simulators newsgroup.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (1996).  FlightGear proposal 2.0: [http://www.flightgear.org/proposal-2.0 FLIGHT GEAR &amp;quot;This truly is as real as it gets!&amp;quot; - a proposal for a new flight simulator - REVISION 2.0].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Oct 29, 1996).  FlightGear proposal 3.0: [http://www.flightgear.org/proposal-3.0 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0 - Wednesday, 10.30.96, &amp;quot;The future of flight simulation is here&amp;quot;].  Published on the [http://ftp.igh.cnrs.fr/pub/flightgear/www/old-stuff/flight-gear.9610 flight-gear@infoplane.com mailing list].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Sep 11, 1998).  FlightGear proposal 3.0.1: [http://www.flightgear.org/proposal-3.0.1 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0.1 - Friday, Sep.11.98, &amp;quot;The future of flight simulation is here&amp;quot;].&amp;lt;/ref&amp;gt;.  Part of the initial goals were to develop 2D and 3D graphics routines for the simulator.  However this was a huge task that came to an unfinished halt at the start of 1997 as the main developer,  Eric Korpela, was finishing his thesis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Development of an OpenGL based version was spearheaded by Curtis Olsen starting in 1997, after the initial start in 1996. A large community response lead to many contributing to the project from its start in late '90s up to the present.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;''I was working at the University of Minnesota at the time, and had access to Sun and SGI graphical work stations which offered OpenGL for 3d graphics. OpenGl was just starting to become available on PC hardware with things like the 3dfx voodoo card. Somewhere at this point it occurred to me that a far better path would be to leverage an existing multi-platform 3d graphics system (like OpenGL) to build our flight simulator upon.''&lt;br /&gt;
&lt;br /&gt;
''So I proceeded to rough together a basic scenery system, pasted on the larcsim flight model, and in a relatively short time was able to show actual flight over real 3d terrain. Good, realistic 3d terrain was something the other existing flight sims at the time were pretty far behind on ... and I think my work was enough of a breakthrough that it got a lot of people excited about the possibilities.''&amp;quot;~Curt Olson &amp;lt;ref&amp;gt;Curtis Olson (Sep 28, 2015).  [http://forum.flightgear.org/viewtopic.php?f=42&amp;amp;t=27558&amp;amp;p=259048#p259021 Re: A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@].  Published on the FlightGear forum.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Rather than start entirely from scratch, FlightGear developers made use of the LaRCsim flight model from NASA, with OpenGL for 3D graphic code, and freely available elevation data. First working binaries came out in 1997, with an intense updating of newer versions for several years resulting in progressively more stable and advanced programs.&lt;br /&gt;
&lt;br /&gt;
== Versions 0.7–0.9 (2001–2003) ==&lt;br /&gt;
By 2001, the team was releasing new beta versions regularly (0.7.x, 0.8.0, over 2001-2003) and with 0.9.xx (2003-2006). Later in the decade, the rate of final public releases slowed, but had larger amounts of content (0.9.10, 1.0.0 etc.). The maturity of software by 2005 lead to more widespread reviews, and increased popularity. &lt;br /&gt;
&lt;br /&gt;
== Version 0.9.0-0.9.11 (2002-2007) ==&lt;br /&gt;
The use of version numbers slowed dramatically after the late 2002 release of version 0.9.0. Versions 0.9.9 (2005) and 0.9.10 (2006) had about 8 all-new or redone [[aircraft]] adding to a total of 70-90 aircraft. [[Nasal]] was also integrated into FlightGear in version 0.9.4. FlightGear 0.9.10 won Softpedia's &amp;quot;Pick&amp;quot; award (5 out of 5 stars) on June 3, 2006 as well as the &amp;quot;100% CLEAN&amp;quot; Softpedia award.&lt;br /&gt;
&lt;br /&gt;
Behind the scenes there was a 0.9.11-pre1 released in 2007 that ended up being superseded by FlightGear 1.0. The pre-version had about 33 new or redone aircraft.&lt;br /&gt;
&lt;br /&gt;
[[File:FG-A-10.jpg|thumb|270px|3D Cockpit panel for [[A-10]] in version 1.0.0 in 2008]]&lt;br /&gt;
&lt;br /&gt;
== Version 1.0 (2008) ==&lt;br /&gt;
The version number marked a formal transition out of beta development since the software's first release in 1997, ten years prior.&lt;br /&gt;
&lt;br /&gt;
== Version 1.9.0 (2008) ==&lt;br /&gt;
At the time version 1.9.0 was released FlightGear switched from [[PLIB]] to [[OSG]], which caused the temporary loss of some of the features like 3D clouds and shadows. On the contrary new features such as particles add another degree of realism to the simulation. Most aircraft developed for OSG do not work with older versions. The user is able to choose from 230 aircraft provided with 1.9.0, although only a few are included in the base package.&lt;br /&gt;
Version 1.9.1, released shortly afterwards, was a bug fix release.&lt;br /&gt;
&lt;br /&gt;
== Version 2.0.0 (2010) ==&lt;br /&gt;
FlightGear 2.0.0 reflects the maturation of the OpenSceneGraph port that started with the previous 1.9.0 release. In addition to many internal code improvements, FlightGear 2.0.0 marks the introduction of many new exciting improvements in the graphics and sound system, as well as improved usability of key features, and improved behavior of existing features. Highlights of this new version include: Dramatic new 3D clouds, dramatic lighting conditions, improved support for custom scenery, and many many new and detailed aircraft models. &lt;br /&gt;
&lt;br /&gt;
== Version 2.4.0 (2011) ==&lt;br /&gt;
Starting with version 2.4.0, the FlightGear team adopted a [[release plan]]. From then on, a new version is released every February and August.&lt;br /&gt;
&lt;br /&gt;
==Version 3.8.0/2016.1.0==&lt;br /&gt;
{{Main article|Release plan#Detailed time schedule and checklist}}&lt;br /&gt;
Following the cancellation of 3.6, the modern FlightGear team revised the release plan and process. New releases are essentially selected and tuned &amp;quot;nightlies&amp;quot; instead of special compilations.&lt;br /&gt;
&lt;br /&gt;
Also, in this release the concept of rotating default airports first started. All FlightGear releases after 2016.1 have unique default airports and 'codenames'.&lt;br /&gt;
&lt;br /&gt;
{{Main article|Release plan/Lessons learned#2016.1}}&lt;br /&gt;
&lt;br /&gt;
== Release timeline ==&lt;br /&gt;
Final build code release dates by year.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:40%; margin:auto&amp;quot;&lt;br /&gt;
! Date !! Version&lt;br /&gt;
|-&lt;br /&gt;
| Jul 17, 1997 || First major code release&lt;br /&gt;
|-&lt;br /&gt;
| Sep 23, 1997 || 0.12&lt;br /&gt;
|-&lt;br /&gt;
| Dec 9, 1997 || 0.15&lt;br /&gt;
|-&lt;br /&gt;
| Dec 17, 1997 || 0.18&lt;br /&gt;
|-&lt;br /&gt;
| Dec 30, 1997 || 0.19 (first binaries)&lt;br /&gt;
|-&lt;br /&gt;
| Jan 6, 1998 || 0.22&lt;br /&gt;
|-&lt;br /&gt;
| Mar 11 98 || 0.37&lt;br /&gt;
|-&lt;br /&gt;
| Apr 8, 1998 || 0.41&lt;br /&gt;
|-&lt;br /&gt;
| Apr 14, 1998 || 0.42&lt;br /&gt;
|-&lt;br /&gt;
| Apr 23, 1998 || 0.43&lt;br /&gt;
|-&lt;br /&gt;
| Apr 28, 1998 || 0.44&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 1998 || 0.45&lt;br /&gt;
|-&lt;br /&gt;
| May 11, 1998 || 0.46&lt;br /&gt;
|-&lt;br /&gt;
| May 18, 1998 || 0.47&lt;br /&gt;
|-&lt;br /&gt;
| Jun 9, 1998 || 0.48&lt;br /&gt;
|-&lt;br /&gt;
| Jun 27, 1998 || 0.49&lt;br /&gt;
|-&lt;br /&gt;
| Jul 13, 1998 || 0.50&lt;br /&gt;
|-&lt;br /&gt;
| Jul 21, 1998 || 0.51&lt;br /&gt;
|-&lt;br /&gt;
| Aug 15, 1998 || 0.52&lt;br /&gt;
|-&lt;br /&gt;
| Sep 2, 1998 || 0.53&lt;br /&gt;
|-&lt;br /&gt;
| Sep 25, 1998 || 0.54&lt;br /&gt;
|-&lt;br /&gt;
| Oct 23, 1998 || 0.55&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 1998 || 0.56&lt;br /&gt;
|-&lt;br /&gt;
| Jan 21, 1999 || 0.57&lt;br /&gt;
|-&lt;br /&gt;
| Feb 10, 1999 || 0.58&lt;br /&gt;
|-&lt;br /&gt;
| Mar 31, 1999 || 0.59&lt;br /&gt;
|-&lt;br /&gt;
| May 26, 1999 || 0.6.0&lt;br /&gt;
|-&lt;br /&gt;
| Jun 21, 1999 || 0.6.1 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2 | Sep 11, 1999 || 0.7.0 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| 0.6.2 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
| Oct 22, 1999 || 0.7.1 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2000 || 0.7.2 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| May 18, 2000 || 0.7.3 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| Jul 20, 2000 || 0.7.4&lt;br /&gt;
|-&lt;br /&gt;
| Sep 18, 2000 || 0.7.5&lt;br /&gt;
|-&lt;br /&gt;
| Dec 19, 2000 || 0.7.6&lt;br /&gt;
|-&lt;br /&gt;
| Jun 20, 2001 || 0.7.7&lt;br /&gt;
|-&lt;br /&gt;
| Jul 13, 2001 || 0.7.8&lt;br /&gt;
|-&lt;br /&gt;
| Feb 16, 2002 || 0.7.9&lt;br /&gt;
|-&lt;br /&gt;
| Apr 20, 2002 || 0.7.10&lt;br /&gt;
|-&lt;br /&gt;
| Sep 7, 2002 || 0.8.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 3, 2002 || 0.9.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 5, 2002 || 0.9.1 &lt;br /&gt;
|-&lt;br /&gt;
| Jun 4, 2003 || 0.9.2&lt;br /&gt;
|-&lt;br /&gt;
| Oct 24, 2003 || 0.9.3&lt;br /&gt;
|-&lt;br /&gt;
| Mar 26, 2004 || 0.9.4&lt;br /&gt;
|-&lt;br /&gt;
| Jul 29, 2004 || 0.9.5&lt;br /&gt;
|-&lt;br /&gt;
| Oct 12, 2004 || 0.9.6&lt;br /&gt;
|-&lt;br /&gt;
| Jan 18, 2005 || 0.9.8&lt;br /&gt;
|-&lt;br /&gt;
| Nov 17, 2005 || 0.9.9&lt;br /&gt;
|-&lt;br /&gt;
| Apr 5, 2006 || 0.9.10&lt;br /&gt;
|-&lt;br /&gt;
| May 2007 || 0.9.11-pre1&lt;br /&gt;
|-&lt;br /&gt;
| Dec 17, 2007 || 1.0.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 22, 2008 || 1.9.0 &lt;br /&gt;
|-&lt;br /&gt;
| Jan 25, 2009 || 1.9.1&lt;br /&gt;
|-&lt;br /&gt;
| Feb 25, 2010 || 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| Aug 17, 2011 || 2.4.0&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2012 || 2.6.0&lt;br /&gt;
|-&lt;br /&gt;
| Aug 17, 2012 || 2.8.0&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2013 || 2.10&lt;br /&gt;
|-&lt;br /&gt;
| Sep 21, 2013 || 2.12&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2014 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| Oct 15, 2014 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2015 || 3.4&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 3.6 (unreleased, see [[FlightGear Newsletter November 2015#FlightGear v3.6 canceled|here]])&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2016 || 2016.1.1 (new versioning scheme)&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 2016 || 2016.1.2&lt;br /&gt;
|-&lt;br /&gt;
| May 17, 2016 || 2016.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 12, 2016 || 2016.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 19, 2016 || 2016.4.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 2016 || 2016.4.2&lt;br /&gt;
|-&lt;br /&gt;
| Dec 5, 2016 || 2016.4.3&lt;br /&gt;
|-&lt;br /&gt;
| Dec 28, 2016 || 2016.4.4&lt;br /&gt;
|-&lt;br /&gt;
| Feb 23, 2017 || 2017.1.1&lt;br /&gt;
|-&lt;br /&gt;
| Mar 1, 2017 || 2017.1.2&lt;br /&gt;
|-&lt;br /&gt;
| Apr 4, 2017 || 2017.1.3&lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2017 || 2017.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 20, 2017 || 2017.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Apr 11, 2018 || 2018.1.1 &lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2018 || 2018.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Dec 3, 2018 || 2018.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Jan 29, 2019 || 2018.3.2&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 2018.3.3 (not released)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2019 || 2018.3.4&lt;br /&gt;
|-&lt;br /&gt;
| Apr 20, 2020 || 2018.3.5&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2020 || 2018.3.6&lt;br /&gt;
|-&lt;br /&gt;
| Mar 14, 2019 || 2019.1.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 1, 2019 || 2019.1.2&lt;br /&gt;
|-&lt;br /&gt;
| May 11, 2020 || 2020.1.1&lt;br /&gt;
|-&lt;br /&gt;
| May 25, 2020 || 2020.1.2&lt;br /&gt;
|-&lt;br /&gt;
| Jun 26, 2020 || 2020.1.3&lt;br /&gt;
|-&lt;br /&gt;
| Oct 13, 2020 || 2020.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Oct 29, 2020 || 2020.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 6, 2020 || 2020.3.2&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 2020 || 2020.3.3&lt;br /&gt;
|-&lt;br /&gt;
| Dec 1, 2020 || 2020.3.4&lt;br /&gt;
|-&lt;br /&gt;
| Dec 19, 2020 || 2020.3.5&lt;br /&gt;
|-&lt;br /&gt;
| Jan 24, 2021 || 2020.3.6&lt;br /&gt;
|-&lt;br /&gt;
| Mar 21, 2021 || 2020.3.7&lt;br /&gt;
|-&lt;br /&gt;
| Mar 25, 2021 || 2020.3.8&lt;br /&gt;
|-&lt;br /&gt;
| Jun 14, 2021 || 2020.3.9&lt;br /&gt;
|-&lt;br /&gt;
| Jul 26, 2021 || 2020.3.10&lt;br /&gt;
|-&lt;br /&gt;
| Jul 29, 2021 || 2020.3.11&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cycled default airports ==&lt;br /&gt;
&lt;br /&gt;
FlightGear did not start changing the default airport until version 2016.1 was released. At that time, the idea was that each new release would have a new default airport. This chart lists the default airports since 2016.1 was released. Since 2018.1, the selection of a new default airport has been changed so that a new airport is selected for each new major version release instead of for each minor version release.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Release !! ICAO !! Default Airport&lt;br /&gt;
|-&lt;br /&gt;
| 2016.1 || [[KSFO]] || San Francisco ''(transition)''&lt;br /&gt;
|-&lt;br /&gt;
| 2016.2 || [[LEBL]] || Barcelona&lt;br /&gt;
|-&lt;br /&gt;
| 2016.3 || [[SBRJ]] || Rio de Janeiro&lt;br /&gt;
|-&lt;br /&gt;
| 2016.4 || [[LSZH]] || Zürich&lt;br /&gt;
|-&lt;br /&gt;
| 2017.1 || [[ENBR]] || Bergen&lt;br /&gt;
|-&lt;br /&gt;
| 2017.2 || [[KBOS]] || Boston&lt;br /&gt;
|- &lt;br /&gt;
| 2017.3 || [[LKPR]] || Prague&lt;br /&gt;
|- &lt;br /&gt;
| 2018.1 || rowspan=&amp;quot;4&amp;quot; | [[PHNL]] || rowspan=&amp;quot;4&amp;quot; | Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2018.2 &lt;br /&gt;
|- &lt;br /&gt;
| 2018.3 &lt;br /&gt;
|- &lt;br /&gt;
| 2019.1 &lt;br /&gt;
|- &lt;br /&gt;
| 2020.1 || rowspan=&amp;quot;3&amp;quot; | [[BIKF]] || rowspan=&amp;quot;3&amp;quot; | Keflavik&lt;br /&gt;
|- &lt;br /&gt;
| 2020.2 &lt;br /&gt;
|- &lt;br /&gt;
| 2020.3 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://web.archive.org/web/*/http://www.flightgear.org/ Internet Archive: Wayback Machine for http://www.flightgear.org/ ]&lt;br /&gt;
* [http://web.archive.org/web/19981212014011/http://flightgear.org/ Old website on December 5, 1998]&lt;br /&gt;
* [http://web.archive.org/web/19990209082206/http://www.flightgear.org/Gallery/tucson.jpg link] (&amp;quot;A view from the ground near Tucson, AZ (KTUS)&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
* [http://web.archive.org/web/19990209050729/http://www.flightgear.org/Gallery/texture2.jpg link] (&amp;quot;Here's one of the Grand Canyon with a rock face texture. I know this looks funny, but I'm just experimenting here.&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
&lt;br /&gt;
{{Appendix|2=&lt;br /&gt;
* {{wikipedia|FlightGear}}&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Original Flight Gear Proposal] by David L. Murr (Revision 3.0.1)&lt;br /&gt;
* [ftp://flightgear.wo0t.de/flightgear-ftp/ FlightGear FTP Archive]&lt;br /&gt;
----&lt;br /&gt;
{{References}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=132679</id>
		<title>FlightGear history</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=132679"/>
		<updated>2021-08-04T10:35:04Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Release timeline */ add sub versions 2020.3.10 and 2020.3.11... i should note the dates i'm using are the dates of the files on SF in the release-YYYY.V directory... in case anyone was wondering...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[FlightGear]] development started with an online proposal in 1996, using custom 3D graphics code. Development of an [[OpenGL]] based version was spearheaded by Curtis Olson starting in 1997. Many people have contributed to the project in the years since its inception.&lt;br /&gt;
&lt;br /&gt;
FlightGear incorporated other open-source resources, including the [[LaRCsim]] flight model from NASA, and freely available elevation data. The first working binaries, using OpenGL for 3D graphic code, came out in 1997. Enthusiastic development of newer versions for several years resulted in progressively more stable and advanced versions. By 2001, the team was releasing new beta versions regularly, and by 2005, the maturity of software lead to more widespread reviews, and increased popularity. 2007 marked a formal transition out of beta development with the release of version 1.0.0, ten years after FlightGear's first release in 1997.&lt;br /&gt;
&lt;br /&gt;
In 2008, version 1.9.0 of FlightGear included a major change from [[PLIB]] to [[OSG]], which caused the temporarily loss of some features like 3D clouds and shadows, while newly added features, such as particles, imparted another degree of realism to the simulation. &lt;br /&gt;
 &lt;br /&gt;
== Beginnings (1996-1997) ==&lt;br /&gt;
[[File:FG SUNHALO.JPG|thumb|270px|March 18, 1999: one of the oldest surviving screenshots of FlightGear. Back then, FlightGear was the only PC based flight simulator rendering the [[Moon|sun, moon, and celestial]] objects at the correct position, and under the correct lighting conditions, in the sky. ]]&lt;br /&gt;
[[File:Image103.gif|thumb|Original Win95 icon]]&lt;br /&gt;
The FlightGear project was conceived on April 8, 1996 by David Murr who proposed a new flight simulator to be developed by volunteers&amp;lt;ref&amp;gt;David Murr (Apr 9, 1996).  FlightGear proposal 1.0: [https://groups.google.com/forum/#!msg/rec.aviation.simulators/ny8HFBE5_T8/OdtIiGNGJc8J &amp;quot;A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@&amp;quot;].  Published on the rec.aviation.simulators newsgroup.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (1996).  FlightGear proposal 2.0: [http://www.flightgear.org/proposal-2.0 FLIGHT GEAR &amp;quot;This truly is as real as it gets!&amp;quot; - a proposal for a new flight simulator - REVISION 2.0].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Oct 29, 1996).  FlightGear proposal 3.0: [http://www.flightgear.org/proposal-3.0 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0 - Wednesday, 10.30.96, &amp;quot;The future of flight simulation is here&amp;quot;].  Published on the [http://ftp.igh.cnrs.fr/pub/flightgear/www/old-stuff/flight-gear.9610 flight-gear@infoplane.com mailing list].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Sep 11, 1998).  FlightGear proposal 3.0.1: [http://www.flightgear.org/proposal-3.0.1 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0.1 - Friday, Sep.11.98, &amp;quot;The future of flight simulation is here&amp;quot;].&amp;lt;/ref&amp;gt;.  Part of the initial goals were to develop 2D and 3D graphics routines for the simulator.  However this was a huge task that came to an unfinished halt at the start of 1997 as the main developer,  Eric Korpela, was finishing his thesis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Development of an OpenGL based version was spearheaded by Curtis Olsen starting in 1997, after the initial start in 1996. A large community response lead to many contributing to the project from its start in late '90s up to the present.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;''I was working at the University of Minnesota at the time, and had access to Sun and SGI graphical work stations which offered OpenGL for 3d graphics. OpenGl was just starting to become available on PC hardware with things like the 3dfx voodoo card. Somewhere at this point it occurred to me that a far better path would be to leverage an existing multi-platform 3d graphics system (like OpenGL) to build our flight simulator upon.''&lt;br /&gt;
&lt;br /&gt;
''So I proceeded to rough together a basic scenery system, pasted on the larcsim flight model, and in a relatively short time was able to show actual flight over real 3d terrain. Good, realistic 3d terrain was something the other existing flight sims at the time were pretty far behind on ... and I think my work was enough of a breakthrough that it got a lot of people excited about the possibilities.''&amp;quot;~Curt Olson &amp;lt;ref&amp;gt;Curtis Olson (Sep 28, 2015).  [http://forum.flightgear.org/viewtopic.php?f=42&amp;amp;t=27558&amp;amp;p=259048#p259021 Re: A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@].  Published on the FlightGear forum.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Rather than start entirely from scratch, FlightGear developers made use of the LaRCsim flight model from NASA, with OpenGL for 3D graphic code, and freely available elevation data. First working binaries came out in 1997, with an intense updating of newer versions for several years resulting in progressively more stable and advanced programs.&lt;br /&gt;
&lt;br /&gt;
== Versions 0.7–0.9 (2001–2003) ==&lt;br /&gt;
By 2001, the team was releasing new beta versions regularly (0.7.x, 0.8.0, over 2001-2003) and with 0.9.xx (2003-2006). Later in the decade, the rate of final public releases slowed, but had larger amounts of content (0.9.10, 1.0.0 etc.). The maturity of software by 2005 lead to more widespread reviews, and increased popularity. &lt;br /&gt;
&lt;br /&gt;
== Version 0.9.0-0.9.11 (2002-2007) ==&lt;br /&gt;
The use of version numbers slowed dramatically after the late 2002 release of version 0.9.0. Versions 0.9.9 (2005) and 0.9.10 (2006) had about 8 all-new or redone [[aircraft]] adding to a total of 70-90 aircraft. [[Nasal]] was also integrated into FlightGear in version 0.9.4. FlightGear 0.9.10 won Softpedia's &amp;quot;Pick&amp;quot; award (5 out of 5 stars) on June 3, 2006 as well as the &amp;quot;100% CLEAN&amp;quot; Softpedia award.&lt;br /&gt;
&lt;br /&gt;
Behind the scenes there was a 0.9.11-pre1 released in 2007 that ended up being superseded by FlightGear 1.0. The pre-version had about 33 new or redone aircraft.&lt;br /&gt;
&lt;br /&gt;
[[File:FG-A-10.jpg|thumb|270px|3D Cockpit panel for [[A-10]] in version 1.0.0 in 2008]]&lt;br /&gt;
&lt;br /&gt;
== Version 1.0 (2008) ==&lt;br /&gt;
The version number marked a formal transition out of beta development since the software's first release in 1997, ten years prior.&lt;br /&gt;
&lt;br /&gt;
== Version 1.9.0 (2008) ==&lt;br /&gt;
At the time version 1.9.0 was released FlightGear switched from [[PLIB]] to [[OSG]], which caused the temporary loss of some of the features like 3D clouds and shadows. On the contrary new features such as particles add another degree of realism to the simulation. Most aircraft developed for OSG do not work with older versions. The user is able to choose from 230 aircraft provided with 1.9.0, although only a few are included in the base package.&lt;br /&gt;
Version 1.9.1, released shortly afterwards, was a bug fix release.&lt;br /&gt;
&lt;br /&gt;
== Version 2.0.0 (2010) ==&lt;br /&gt;
FlightGear 2.0.0 reflects the maturation of the OpenSceneGraph port that started with the previous 1.9.0 release. In addition to many internal code improvements, FlightGear 2.0.0 marks the introduction of many new exciting improvements in the graphics and sound system, as well as improved usability of key features, and improved behavior of existing features. Highlights of this new version include: Dramatic new 3D clouds, dramatic lighting conditions, improved support for custom scenery, and many many new and detailed aircraft models. &lt;br /&gt;
&lt;br /&gt;
== Version 2.4.0 (2011) ==&lt;br /&gt;
Starting with version 2.4.0, the FlightGear team adopted a [[release plan]]. From then on, a new version is released every February and August.&lt;br /&gt;
&lt;br /&gt;
==Version 3.8.0/2016.1.0==&lt;br /&gt;
{{Main article|Release plan#Detailed time schedule and checklist}}&lt;br /&gt;
Following the cancellation of 3.6, the modern FlightGear team revised the release plan and process. New releases are essentially selected and tuned &amp;quot;nightlies&amp;quot; instead of special compilations.&lt;br /&gt;
&lt;br /&gt;
Also, in this release the concept of rotating default airports first started. All FlightGear releases after 2016.1 have unique default airports and 'codenames'.&lt;br /&gt;
&lt;br /&gt;
{{Main article|Release plan/Lessons learned#2016.1}}&lt;br /&gt;
&lt;br /&gt;
== Release timeline ==&lt;br /&gt;
Final build code release dates by year.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:40%; margin:auto&amp;quot;&lt;br /&gt;
! Date !! Version&lt;br /&gt;
|-&lt;br /&gt;
| Jul 17, 1997 || First major code release&lt;br /&gt;
|-&lt;br /&gt;
| Sep 23, 1997 || 0.12&lt;br /&gt;
|-&lt;br /&gt;
| Dec 9, 1997 || 0.15&lt;br /&gt;
|-&lt;br /&gt;
| Dec 17, 1997 || 0.18&lt;br /&gt;
|-&lt;br /&gt;
| Dec 30, 1997 || 0.19 (first binaries)&lt;br /&gt;
|-&lt;br /&gt;
| Jan 6, 1998 || 0.22&lt;br /&gt;
|-&lt;br /&gt;
| Mar 11 98 || 0.37&lt;br /&gt;
|-&lt;br /&gt;
| Apr 8, 1998 || 0.41&lt;br /&gt;
|-&lt;br /&gt;
| Apr 14, 1998 || 0.42&lt;br /&gt;
|-&lt;br /&gt;
| Apr 23, 1998 || 0.43&lt;br /&gt;
|-&lt;br /&gt;
| Apr 28, 1998 || 0.44&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 1998 || 0.45&lt;br /&gt;
|-&lt;br /&gt;
| May 11, 1998 || 0.46&lt;br /&gt;
|-&lt;br /&gt;
| May 18, 1998 || 0.47&lt;br /&gt;
|-&lt;br /&gt;
| Jun 9, 1998 || 0.48&lt;br /&gt;
|-&lt;br /&gt;
| Jun 27, 1998 || 0.49&lt;br /&gt;
|-&lt;br /&gt;
| Jul 13, 1998 || 0.50&lt;br /&gt;
|-&lt;br /&gt;
| Jul 21, 1998 || 0.51&lt;br /&gt;
|-&lt;br /&gt;
| Aug 15, 1998 || 0.52&lt;br /&gt;
|-&lt;br /&gt;
| Sep 2, 1998 || 0.53&lt;br /&gt;
|-&lt;br /&gt;
| Sep 25, 1998 || 0.54&lt;br /&gt;
|-&lt;br /&gt;
| Oct 23, 1998 || 0.55&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 1998 || 0.56&lt;br /&gt;
|-&lt;br /&gt;
| Jan 21, 1999 || 0.57&lt;br /&gt;
|-&lt;br /&gt;
| Feb 10, 1999 || 0.58&lt;br /&gt;
|-&lt;br /&gt;
| Mar 31, 1999 || 0.59&lt;br /&gt;
|-&lt;br /&gt;
| May 26, 1999 || 0.6.0&lt;br /&gt;
|-&lt;br /&gt;
| Jun 21, 1999 || 0.6.1 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2 | Sep 11, 1999 || 0.7.0 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| 0.6.2 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
| Oct 22, 1999 || 0.7.1 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2000 || 0.7.2 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| May 18, 2000 || 0.7.3 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| Jul 20, 2000 || 0.7.4&lt;br /&gt;
|-&lt;br /&gt;
| Sep 18, 2000 || 0.7.5&lt;br /&gt;
|-&lt;br /&gt;
| Dec 19, 2000 || 0.7.6&lt;br /&gt;
|-&lt;br /&gt;
| Jun 20, 2001 || 0.7.7&lt;br /&gt;
|-&lt;br /&gt;
| Jul 13, 2001 || 0.7.8&lt;br /&gt;
|-&lt;br /&gt;
| Feb 16, 2002 || 0.7.9&lt;br /&gt;
|-&lt;br /&gt;
| Apr 20, 2002 || 0.7.10&lt;br /&gt;
|-&lt;br /&gt;
| Sep 7, 2002 || 0.8.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 3, 2002 || 0.9.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 5, 2002 || 0.9.1 &lt;br /&gt;
|-&lt;br /&gt;
| Jun 4, 2003 || 0.9.2&lt;br /&gt;
|-&lt;br /&gt;
| Oct 24, 2003 || 0.9.3&lt;br /&gt;
|-&lt;br /&gt;
| Mar 26, 2004 || 0.9.4&lt;br /&gt;
|-&lt;br /&gt;
| Jul 29, 2004 || 0.9.5&lt;br /&gt;
|-&lt;br /&gt;
| Oct 12, 2004 || 0.9.6&lt;br /&gt;
|-&lt;br /&gt;
| Jan 18, 2005 || 0.9.8&lt;br /&gt;
|-&lt;br /&gt;
| Nov 17, 2005 || 0.9.9&lt;br /&gt;
|-&lt;br /&gt;
| Apr 5, 2006 || 0.9.10&lt;br /&gt;
|-&lt;br /&gt;
| May 2007 || 0.9.11-pre1&lt;br /&gt;
|-&lt;br /&gt;
| Dec 17, 2007 || 1.0.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 22, 2008 || 1.9.0 &lt;br /&gt;
|-&lt;br /&gt;
| Jan 25, 2009 || 1.9.1&lt;br /&gt;
|-&lt;br /&gt;
| Feb 25, 2010 || 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| Aug 17, 2011 || 2.4.0&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2012 || 2.6.0&lt;br /&gt;
|-&lt;br /&gt;
| Aug 17, 2012 || 2.8.0&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2013 || 2.10&lt;br /&gt;
|-&lt;br /&gt;
| Sep 21, 2013 || 2.12&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2014 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| Oct 15, 2014 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2015 || 3.4&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 3.6 (unreleased, see [[FlightGear Newsletter November 2015#FlightGear v3.6 canceled|here]])&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2016 || 2016.1.1 (new versioning scheme)&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 2016 || 2016.1.2&lt;br /&gt;
|-&lt;br /&gt;
| May 17, 2016 || 2016.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 12, 2016 || 2016.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 19, 2016 || 2016.4.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 2016 || 2016.4.2&lt;br /&gt;
|-&lt;br /&gt;
| Dec 5, 2016 || 2016.4.3&lt;br /&gt;
|-&lt;br /&gt;
| Dec 28, 2016 || 2016.4.4&lt;br /&gt;
|-&lt;br /&gt;
| Feb 23, 2017 || 2017.1.1&lt;br /&gt;
|-&lt;br /&gt;
| Mar 1, 2017 || 2017.1.2&lt;br /&gt;
|-&lt;br /&gt;
| Apr 4, 2017 || 2017.1.3&lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2017 || 2017.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 20, 2017 || 2017.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Apr 11, 2018 || 2018.1.1 &lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2018 || 2018.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Dec 3, 2018 || 2018.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Jan 29, 2019 || 2018.3.2&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 2018.3.3 (not released)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2019 || 2018.3.4&lt;br /&gt;
|-&lt;br /&gt;
| Apr 20, 2020 || 2018.3.5&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2020 || 2018.3.6&lt;br /&gt;
|-&lt;br /&gt;
| Mar 14, 2019 || 2019.1.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 1, 2019 || 2019.1.2&lt;br /&gt;
|-&lt;br /&gt;
| May 11, 2020 || 2020.1.1&lt;br /&gt;
|-&lt;br /&gt;
| May 25, 2020 || 2020.1.2&lt;br /&gt;
|-&lt;br /&gt;
| Jun 26, 2020 || 2020.1.3&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Oct 29, 2020 || 2020.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 6, 2020 || 2020.3.2&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 2020 || 2020.3.3&lt;br /&gt;
|-&lt;br /&gt;
| Dec 1, 2020 || 2020.3.4&lt;br /&gt;
|-&lt;br /&gt;
| Dec 19, 2020 || 2020.3.5&lt;br /&gt;
|-&lt;br /&gt;
| Jan 24, 2021 || 2020.3.6&lt;br /&gt;
|-&lt;br /&gt;
| Mar 21, 2021 || 2020.3.7&lt;br /&gt;
|-&lt;br /&gt;
| Mar 25, 2021 || 2020.3.8&lt;br /&gt;
|-&lt;br /&gt;
| Jun 14, 2021 || 2020.3.9&lt;br /&gt;
|-&lt;br /&gt;
| Jul 26, 2021 || 2020.3.10&lt;br /&gt;
|-&lt;br /&gt;
| Jul 29, 2021 || 2020.3.11&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cycled default airports ==&lt;br /&gt;
&lt;br /&gt;
FlightGear did not start changing the default airport until version 2016.1 was released. At that time, the idea was that each new release would have a new default airport. This chart lists the default airports since 2016.1 was released. Since 2018.1, the selection of a new default airport has been changed so that a new airport is selected for each new major version release instead of for each minor version release.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Release !! ICAO !! Default Airport&lt;br /&gt;
|-&lt;br /&gt;
| 2016.1 || [[KSFO]] || San Francisco ''(transition)''&lt;br /&gt;
|-&lt;br /&gt;
| 2016.2 || [[LEBL]] || Barcelona&lt;br /&gt;
|-&lt;br /&gt;
| 2016.3 || [[SBRJ]] || Rio de Janeiro&lt;br /&gt;
|-&lt;br /&gt;
| 2016.4 || [[LSZH]] || Zürich&lt;br /&gt;
|-&lt;br /&gt;
| 2017.1 || [[ENBR]] || Bergen&lt;br /&gt;
|-&lt;br /&gt;
| 2017.2 || [[KBOS]] || Boston&lt;br /&gt;
|- &lt;br /&gt;
| 2017.3 || [[LKPR]] || Prague&lt;br /&gt;
|- &lt;br /&gt;
| 2018.1 || rowspan=&amp;quot;4&amp;quot; | [[PHNL]] || rowspan=&amp;quot;4&amp;quot; | Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2018.2 &lt;br /&gt;
|- &lt;br /&gt;
| 2018.3 &lt;br /&gt;
|- &lt;br /&gt;
| 2019.1 &lt;br /&gt;
|- &lt;br /&gt;
| 2020.1 || rowspan=&amp;quot;3&amp;quot; | [[BIKF]] || rowspan=&amp;quot;3&amp;quot; | Keflavik&lt;br /&gt;
|- &lt;br /&gt;
| 2020.2 &lt;br /&gt;
|- &lt;br /&gt;
| 2020.3 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://web.archive.org/web/*/http://www.flightgear.org/ Internet Archive: Wayback Machine for http://www.flightgear.org/ ]&lt;br /&gt;
* [http://web.archive.org/web/19981212014011/http://flightgear.org/ Old website on December 5, 1998]&lt;br /&gt;
* [http://web.archive.org/web/19990209082206/http://www.flightgear.org/Gallery/tucson.jpg link] (&amp;quot;A view from the ground near Tucson, AZ (KTUS)&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
* [http://web.archive.org/web/19990209050729/http://www.flightgear.org/Gallery/texture2.jpg link] (&amp;quot;Here's one of the Grand Canyon with a rock face texture. I know this looks funny, but I'm just experimenting here.&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
&lt;br /&gt;
{{Appendix|2=&lt;br /&gt;
* {{wikipedia|FlightGear}}&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Original Flight Gear Proposal] by David L. Murr (Revision 3.0.1)&lt;br /&gt;
* [ftp://flightgear.wo0t.de/flightgear-ftp/ FlightGear FTP Archive]&lt;br /&gt;
----&lt;br /&gt;
{{References}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=132290</id>
		<title>FlightGear history</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=132290"/>
		<updated>2021-06-12T10:37:01Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Release timeline */ remove &amp;quot;(bugfix release)&amp;quot; from entries because all minor releases are bug fixes...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[FlightGear]] development started with an online proposal in 1996, using custom 3D graphics code. Development of an [[OpenGL]] based version was spearheaded by Curtis Olson starting in 1997. Many people have contributed to the project in the years since its inception.&lt;br /&gt;
&lt;br /&gt;
FlightGear incorporated other open-source resources, including the [[LaRCsim]] flight model from NASA, and freely available elevation data. The first working binaries, using OpenGL for 3D graphic code, came out in 1997. Enthusiastic development of newer versions for several years resulted in progressively more stable and advanced versions. By 2001, the team was releasing new beta versions regularly, and by 2005, the maturity of software lead to more widespread reviews, and increased popularity. 2007 marked a formal transition out of beta development with the release of version 1.0.0, ten years after FlightGear's first release in 1997.&lt;br /&gt;
&lt;br /&gt;
In 2008, version 1.9.0 of FlightGear included a major change from [[PLIB]] to [[OSG]], which caused the temporarily loss of some features like 3D clouds and shadows, while newly added features, such as particles, imparted another degree of realism to the simulation. &lt;br /&gt;
 &lt;br /&gt;
== Beginnings (1996-1997) ==&lt;br /&gt;
[[File:FG SUNHALO.JPG|thumb|270px|March 18, 1999: one of the oldest surviving screenshots of FlightGear. Back then, FlightGear was the only PC based flight simulator rendering the [[Moon|sun, moon, and celestial]] objects at the correct position, and under the correct lighting conditions, in the sky. ]]&lt;br /&gt;
[[File:Image103.gif|thumb|Original Win95 icon]]&lt;br /&gt;
The FlightGear project was conceived on April 8, 1996 by David Murr who proposed a new flight simulator to be developed by volunteers&amp;lt;ref&amp;gt;David Murr (Apr 9, 1996).  FlightGear proposal 1.0: [https://groups.google.com/forum/#!msg/rec.aviation.simulators/ny8HFBE5_T8/OdtIiGNGJc8J &amp;quot;A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@&amp;quot;].  Published on the rec.aviation.simulators newsgroup.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (1996).  FlightGear proposal 2.0: [http://www.flightgear.org/proposal-2.0 FLIGHT GEAR &amp;quot;This truly is as real as it gets!&amp;quot; - a proposal for a new flight simulator - REVISION 2.0].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Oct 29, 1996).  FlightGear proposal 3.0: [http://www.flightgear.org/proposal-3.0 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0 - Wednesday, 10.30.96, &amp;quot;The future of flight simulation is here&amp;quot;].  Published on the [http://ftp.igh.cnrs.fr/pub/flightgear/www/old-stuff/flight-gear.9610 flight-gear@infoplane.com mailing list].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Sep 11, 1998).  FlightGear proposal 3.0.1: [http://www.flightgear.org/proposal-3.0.1 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0.1 - Friday, Sep.11.98, &amp;quot;The future of flight simulation is here&amp;quot;].&amp;lt;/ref&amp;gt;.  Part of the initial goals were to develop 2D and 3D graphics routines for the simulator.  However this was a huge task that came to an unfinished halt at the start of 1997 as the main developer,  Eric Korpela, was finishing his thesis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Development of an OpenGL based version was spearheaded by Curtis Olsen starting in 1997, after the initial start in 1996. A large community response lead to many contributing to the project from its start in late '90s up to the present.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;''I was working at the University of Minnesota at the time, and had access to Sun and SGI graphical work stations which offered OpenGL for 3d graphics. OpenGl was just starting to become available on PC hardware with things like the 3dfx voodoo card. Somewhere at this point it occurred to me that a far better path would be to leverage an existing multi-platform 3d graphics system (like OpenGL) to build our flight simulator upon.''&lt;br /&gt;
&lt;br /&gt;
''So I proceeded to rough together a basic scenery system, pasted on the larcsim flight model, and in a relatively short time was able to show actual flight over real 3d terrain. Good, realistic 3d terrain was something the other existing flight sims at the time were pretty far behind on ... and I think my work was enough of a breakthrough that it got a lot of people excited about the possibilities.''&amp;quot;~Curt Olson &amp;lt;ref&amp;gt;Curtis Olson (Sep 28, 2015).  [http://forum.flightgear.org/viewtopic.php?f=42&amp;amp;t=27558&amp;amp;p=259048#p259021 Re: A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@].  Published on the FlightGear forum.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Rather than start entirely from scratch, FlightGear developers made use of the LaRCsim flight model from NASA, with OpenGL for 3D graphic code, and freely available elevation data. First working binaries came out in 1997, with an intense updating of newer versions for several years resulting in progressively more stable and advanced programs.&lt;br /&gt;
&lt;br /&gt;
== Versions 0.7–0.9 (2001–2003) ==&lt;br /&gt;
By 2001, the team was releasing new beta versions regularly (0.7.x, 0.8.0, over 2001-2003) and with 0.9.xx (2003-2006). Later in the decade, the rate of final public releases slowed, but had larger amounts of content (0.9.10, 1.0.0 etc.). The maturity of software by 2005 lead to more widespread reviews, and increased popularity. &lt;br /&gt;
&lt;br /&gt;
== Version 0.9.0-0.9.11 (2002-2007) ==&lt;br /&gt;
The use of version numbers slowed dramatically after the late 2002 release of version 0.9.0. Versions 0.9.9 (2005) and 0.9.10 (2006) had about 8 all-new or redone [[aircraft]] adding to a total of 70-90 aircraft. [[Nasal]] was also integrated into FlightGear in version 0.9.4. FlightGear 0.9.10 won Softpedia's &amp;quot;Pick&amp;quot; award (5 out of 5 stars) on June 3, 2006 as well as the &amp;quot;100% CLEAN&amp;quot; Softpedia award.&lt;br /&gt;
&lt;br /&gt;
Behind the scenes there was a 0.9.11-pre1 released in 2007 that ended up being superseded by FlightGear 1.0. The pre-version had about 33 new or redone aircraft.&lt;br /&gt;
&lt;br /&gt;
[[File:FG-A-10.jpg|thumb|270px|3D Cockpit panel for [[A-10]] in version 1.0.0 in 2008]]&lt;br /&gt;
&lt;br /&gt;
== Version 1.0 (2008) ==&lt;br /&gt;
The version number marked a formal transition out of beta development since the software's first release in 1997, ten years prior.&lt;br /&gt;
&lt;br /&gt;
== Version 1.9.0 (2008) ==&lt;br /&gt;
At the time version 1.9.0 was released FlightGear switched from [[PLIB]] to [[OSG]], which caused the temporary loss of some of the features like 3D clouds and shadows. On the contrary new features such as particles add another degree of realism to the simulation. Most aircraft developed for OSG do not work with older versions. The user is able to choose from 230 aircraft provided with 1.9.0, although only a few are included in the base package.&lt;br /&gt;
Version 1.9.1, released shortly afterwards, was a bug fix release.&lt;br /&gt;
&lt;br /&gt;
== Version 2.0.0 (2010) ==&lt;br /&gt;
FlightGear 2.0.0 reflects the maturation of the OpenSceneGraph port that started with the previous 1.9.0 release. In addition to many internal code improvements, FlightGear 2.0.0 marks the introduction of many new exciting improvements in the graphics and sound system, as well as improved usability of key features, and improved behavior of existing features. Highlights of this new version include: Dramatic new 3D clouds, dramatic lighting conditions, improved support for custom scenery, and many many new and detailed aircraft models. &lt;br /&gt;
&lt;br /&gt;
== Version 2.4.0 (2011) ==&lt;br /&gt;
Starting with version 2.4.0, the FlightGear team adopted a [[release plan]]. From then on, a new version is released every February and August.&lt;br /&gt;
&lt;br /&gt;
==Version 3.8.0/2016.1.0==&lt;br /&gt;
{{Main article|Release plan#Detailed time schedule and checklist}}&lt;br /&gt;
Following the cancellation of 3.6, the modern FlightGear team revised the release plan and process. New releases are essentially selected and tuned &amp;quot;nightlies&amp;quot; instead of special compilations.&lt;br /&gt;
&lt;br /&gt;
Also, in this release the concept of rotating default airports first started. All FlightGear releases after 2016.1 have unique default airports and 'codenames'.&lt;br /&gt;
&lt;br /&gt;
{{Main article|Release plan/Lessons learned#2016.1}}&lt;br /&gt;
&lt;br /&gt;
== Release timeline ==&lt;br /&gt;
Final build code release dates by year.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:40%; margin:auto&amp;quot;&lt;br /&gt;
! Date !! Version&lt;br /&gt;
|-&lt;br /&gt;
| Jul 17, 1997 || First major code release&lt;br /&gt;
|-&lt;br /&gt;
| Sep 23, 1997 || 0.12&lt;br /&gt;
|-&lt;br /&gt;
| Dec 9, 1997 || 0.15&lt;br /&gt;
|-&lt;br /&gt;
| Dec 17, 1997 || 0.18&lt;br /&gt;
|-&lt;br /&gt;
| Dec 30, 1997 || 0.19 (first binaries)&lt;br /&gt;
|-&lt;br /&gt;
| Jan 6, 1998 || 0.22&lt;br /&gt;
|-&lt;br /&gt;
| Mar 11 98 || 0.37&lt;br /&gt;
|-&lt;br /&gt;
| Apr 8, 1998 || 0.41&lt;br /&gt;
|-&lt;br /&gt;
| Apr 14, 1998 || 0.42&lt;br /&gt;
|-&lt;br /&gt;
| Apr 23, 1998 || 0.43&lt;br /&gt;
|-&lt;br /&gt;
| Apr 28, 1998 || 0.44&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 1998 || 0.45&lt;br /&gt;
|-&lt;br /&gt;
| May 11, 1998 || 0.46&lt;br /&gt;
|-&lt;br /&gt;
| May 18, 1998 || 0.47&lt;br /&gt;
|-&lt;br /&gt;
| Jun 9, 1998 || 0.48&lt;br /&gt;
|-&lt;br /&gt;
| Jun 27, 1998 || 0.49&lt;br /&gt;
|-&lt;br /&gt;
| Jul 13, 1998 || 0.50&lt;br /&gt;
|-&lt;br /&gt;
| Jul 21, 1998 || 0.51&lt;br /&gt;
|-&lt;br /&gt;
| Aug 15, 1998 || 0.52&lt;br /&gt;
|-&lt;br /&gt;
| Sep 2, 1998 || 0.53&lt;br /&gt;
|-&lt;br /&gt;
| Sep 25, 1998 || 0.54&lt;br /&gt;
|-&lt;br /&gt;
| Oct 23, 1998 || 0.55&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 1998 || 0.56&lt;br /&gt;
|-&lt;br /&gt;
| Jan 21, 1999 || 0.57&lt;br /&gt;
|-&lt;br /&gt;
| Feb 10, 1999 || 0.58&lt;br /&gt;
|-&lt;br /&gt;
| Mar 31, 1999 || 0.59&lt;br /&gt;
|-&lt;br /&gt;
| May 26, 1999 || 0.6.0&lt;br /&gt;
|-&lt;br /&gt;
| Jun 21, 1999 || 0.6.1 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2 | Sep 11, 1999 || 0.7.0 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| 0.6.2 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
| Oct 22, 1999 || 0.7.1 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2000 || 0.7.2 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| May 18, 2000 || 0.7.3 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| Jul 20, 2000 || 0.7.4&lt;br /&gt;
|-&lt;br /&gt;
| Sep 18, 2000 || 0.7.5&lt;br /&gt;
|-&lt;br /&gt;
| Dec 19, 2000 || 0.7.6&lt;br /&gt;
|-&lt;br /&gt;
| Jun 20, 2001 || 0.7.7&lt;br /&gt;
|-&lt;br /&gt;
| Jul 13, 2001 || 0.7.8&lt;br /&gt;
|-&lt;br /&gt;
| Feb 16, 2002 || 0.7.9&lt;br /&gt;
|-&lt;br /&gt;
| Apr 20, 2002 || 0.7.10&lt;br /&gt;
|-&lt;br /&gt;
| Sep 7, 2002 || 0.8.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 3, 2002 || 0.9.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 5, 2002 || 0.9.1 &lt;br /&gt;
|-&lt;br /&gt;
| Jun 4, 2003 || 0.9.2&lt;br /&gt;
|-&lt;br /&gt;
| Oct 24, 2003 || 0.9.3&lt;br /&gt;
|-&lt;br /&gt;
| Mar 26, 2004 || 0.9.4&lt;br /&gt;
|-&lt;br /&gt;
| Jul 29, 2004 || 0.9.5&lt;br /&gt;
|-&lt;br /&gt;
| Oct 12, 2004 || 0.9.6&lt;br /&gt;
|-&lt;br /&gt;
| Jan 18, 2005 || 0.9.8&lt;br /&gt;
|-&lt;br /&gt;
| Nov 17, 2005 || 0.9.9&lt;br /&gt;
|-&lt;br /&gt;
| Apr 5, 2006 || 0.9.10&lt;br /&gt;
|-&lt;br /&gt;
| May 2007 || 0.9.11-pre1&lt;br /&gt;
|-&lt;br /&gt;
| Dec 17, 2007 || 1.0.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 22, 2008 || 1.9.0 &lt;br /&gt;
|-&lt;br /&gt;
| Jan 25, 2009 || 1.9.1&lt;br /&gt;
|-&lt;br /&gt;
| Feb 25, 2010 || 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| Aug 17, 2011 || 2.4.0&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2012 || 2.6.0&lt;br /&gt;
|-&lt;br /&gt;
| Aug 17, 2012 || 2.8.0&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2013 || 2.10&lt;br /&gt;
|-&lt;br /&gt;
| Sep 21, 2013 || 2.12&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2014 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| Oct 15, 2014 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2015 || 3.4&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 3.6 (unreleased, see [[FlightGear Newsletter November 2015#FlightGear v3.6 canceled|here]])&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2016 || 2016.1.1 (new versioning scheme)&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 2016 || 2016.1.2&lt;br /&gt;
|-&lt;br /&gt;
| May 17, 2016 || 2016.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 12, 2016 || 2016.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 19, 2016 || 2016.4.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 2016 || 2016.4.2&lt;br /&gt;
|-&lt;br /&gt;
| Dec 5, 2016 || 2016.4.3&lt;br /&gt;
|-&lt;br /&gt;
| Dec 28, 2016 || 2016.4.4&lt;br /&gt;
|-&lt;br /&gt;
| Feb 23, 2017 || 2017.1.1&lt;br /&gt;
|-&lt;br /&gt;
| Mar 1, 2017 || 2017.1.2&lt;br /&gt;
|-&lt;br /&gt;
| Apr 4, 2017 || 2017.1.3&lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2017 || 2017.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 20, 2017 || 2017.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Apr 11, 2018 || 2018.1.1 &lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2018 || 2018.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Dec 3, 2018 || 2018.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Jan 29, 2019 || 2018.3.2&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 2018.3.3 (not released)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2019 || 2018.3.4&lt;br /&gt;
|-&lt;br /&gt;
| Apr 20, 2020 || 2018.3.5&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2020 || 2018.3.6&lt;br /&gt;
|-&lt;br /&gt;
| Mar 14, 2019 || 2019.1.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 1, 2019 || 2019.1.2&lt;br /&gt;
|-&lt;br /&gt;
| May 11, 2020 || 2020.1.1&lt;br /&gt;
|-&lt;br /&gt;
| May 25, 2020 || 2020.1.2&lt;br /&gt;
|-&lt;br /&gt;
| Jun 26, 2020 || 2020.1.3&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Oct 29, 2020 || 2020.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 6, 2020 || 2020.3.2&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 2020 || 2020.3.3&lt;br /&gt;
|-&lt;br /&gt;
| Dec 1, 2020 || 2020.3.4&lt;br /&gt;
|-&lt;br /&gt;
| Dec 19, 2020 || 2020.3.5&lt;br /&gt;
|-&lt;br /&gt;
| Jan 24, 2021 || 2020.3.6&lt;br /&gt;
|-&lt;br /&gt;
| Mar 21, 2021 || 2020.3.7&lt;br /&gt;
|-&lt;br /&gt;
| Mar 25, 2021 || 2020.3.8&lt;br /&gt;
|-&lt;br /&gt;
| Jun 14, 2021 || 2020.3.9&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cycled default airports ==&lt;br /&gt;
&lt;br /&gt;
FlightGear did not start changing the default airport until version 2016.1 was released. At that time, the idea was that each new release would have a new default airport. This chart lists the default airports since 2016.1 was released. Since 2018.1, the selection of a new default airport has been changed so that a new airport is selected for each new major version release instead of for each minor version release.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Release !! ICAO !! Default Airport&lt;br /&gt;
|-&lt;br /&gt;
| 2016.1 || [[KSFO]] || San Francisco ''(transition)''&lt;br /&gt;
|-&lt;br /&gt;
| 2016.2 || [[LEBL]] || Barcelona&lt;br /&gt;
|-&lt;br /&gt;
| 2016.3 || [[SBRJ]] || Rio de Janeiro&lt;br /&gt;
|-&lt;br /&gt;
| 2016.4 || [[LSZH]] || Zürich&lt;br /&gt;
|-&lt;br /&gt;
| 2017.1 || [[ENBR]] || Bergen&lt;br /&gt;
|-&lt;br /&gt;
| 2017.2 || [[KBOS]] || Boston&lt;br /&gt;
|- &lt;br /&gt;
| 2017.3 || [[LKPR]] || Prague&lt;br /&gt;
|- &lt;br /&gt;
| 2018.1 || rowspan=&amp;quot;4&amp;quot; | [[PHNL]] || rowspan=&amp;quot;4&amp;quot; | Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2018.2 &lt;br /&gt;
|- &lt;br /&gt;
| 2018.3 &lt;br /&gt;
|- &lt;br /&gt;
| 2019.1 &lt;br /&gt;
|- &lt;br /&gt;
| 2020.1 || rowspan=&amp;quot;3&amp;quot; | [[BIKF]] || rowspan=&amp;quot;3&amp;quot; | Keflavik&lt;br /&gt;
|- &lt;br /&gt;
| 2020.2 &lt;br /&gt;
|- &lt;br /&gt;
| 2020.3 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://web.archive.org/web/*/http://www.flightgear.org/ Internet Archive: Wayback Machine for http://www.flightgear.org/ ]&lt;br /&gt;
* [http://web.archive.org/web/19981212014011/http://flightgear.org/ Old website on December 5, 1998]&lt;br /&gt;
* [http://web.archive.org/web/19990209082206/http://www.flightgear.org/Gallery/tucson.jpg link] (&amp;quot;A view from the ground near Tucson, AZ (KTUS)&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
* [http://web.archive.org/web/19990209050729/http://www.flightgear.org/Gallery/texture2.jpg link] (&amp;quot;Here's one of the Grand Canyon with a rock face texture. I know this looks funny, but I'm just experimenting here.&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
&lt;br /&gt;
{{Appendix|2=&lt;br /&gt;
* {{wikipedia|FlightGear}}&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Original Flight Gear Proposal] by David L. Murr (Revision 3.0.1)&lt;br /&gt;
* [ftp://flightgear.wo0t.de/flightgear-ftp/ FlightGear FTP Archive]&lt;br /&gt;
----&lt;br /&gt;
{{References}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=132289</id>
		<title>FlightGear history</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=132289"/>
		<updated>2021-06-12T10:24:00Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Release timeline */ anticipated official release of 2020.3.9...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[FlightGear]] development started with an online proposal in 1996, using custom 3D graphics code. Development of an [[OpenGL]] based version was spearheaded by Curtis Olson starting in 1997. Many people have contributed to the project in the years since its inception.&lt;br /&gt;
&lt;br /&gt;
FlightGear incorporated other open-source resources, including the [[LaRCsim]] flight model from NASA, and freely available elevation data. The first working binaries, using OpenGL for 3D graphic code, came out in 1997. Enthusiastic development of newer versions for several years resulted in progressively more stable and advanced versions. By 2001, the team was releasing new beta versions regularly, and by 2005, the maturity of software lead to more widespread reviews, and increased popularity. 2007 marked a formal transition out of beta development with the release of version 1.0.0, ten years after FlightGear's first release in 1997.&lt;br /&gt;
&lt;br /&gt;
In 2008, version 1.9.0 of FlightGear included a major change from [[PLIB]] to [[OSG]], which caused the temporarily loss of some features like 3D clouds and shadows, while newly added features, such as particles, imparted another degree of realism to the simulation. &lt;br /&gt;
 &lt;br /&gt;
== Beginnings (1996-1997) ==&lt;br /&gt;
[[File:FG SUNHALO.JPG|thumb|270px|March 18, 1999: one of the oldest surviving screenshots of FlightGear. Back then, FlightGear was the only PC based flight simulator rendering the [[Moon|sun, moon, and celestial]] objects at the correct position, and under the correct lighting conditions, in the sky. ]]&lt;br /&gt;
[[File:Image103.gif|thumb|Original Win95 icon]]&lt;br /&gt;
The FlightGear project was conceived on April 8, 1996 by David Murr who proposed a new flight simulator to be developed by volunteers&amp;lt;ref&amp;gt;David Murr (Apr 9, 1996).  FlightGear proposal 1.0: [https://groups.google.com/forum/#!msg/rec.aviation.simulators/ny8HFBE5_T8/OdtIiGNGJc8J &amp;quot;A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@&amp;quot;].  Published on the rec.aviation.simulators newsgroup.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (1996).  FlightGear proposal 2.0: [http://www.flightgear.org/proposal-2.0 FLIGHT GEAR &amp;quot;This truly is as real as it gets!&amp;quot; - a proposal for a new flight simulator - REVISION 2.0].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Oct 29, 1996).  FlightGear proposal 3.0: [http://www.flightgear.org/proposal-3.0 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0 - Wednesday, 10.30.96, &amp;quot;The future of flight simulation is here&amp;quot;].  Published on the [http://ftp.igh.cnrs.fr/pub/flightgear/www/old-stuff/flight-gear.9610 flight-gear@infoplane.com mailing list].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Sep 11, 1998).  FlightGear proposal 3.0.1: [http://www.flightgear.org/proposal-3.0.1 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0.1 - Friday, Sep.11.98, &amp;quot;The future of flight simulation is here&amp;quot;].&amp;lt;/ref&amp;gt;.  Part of the initial goals were to develop 2D and 3D graphics routines for the simulator.  However this was a huge task that came to an unfinished halt at the start of 1997 as the main developer,  Eric Korpela, was finishing his thesis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Development of an OpenGL based version was spearheaded by Curtis Olsen starting in 1997, after the initial start in 1996. A large community response lead to many contributing to the project from its start in late '90s up to the present.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;''I was working at the University of Minnesota at the time, and had access to Sun and SGI graphical work stations which offered OpenGL for 3d graphics. OpenGl was just starting to become available on PC hardware with things like the 3dfx voodoo card. Somewhere at this point it occurred to me that a far better path would be to leverage an existing multi-platform 3d graphics system (like OpenGL) to build our flight simulator upon.''&lt;br /&gt;
&lt;br /&gt;
''So I proceeded to rough together a basic scenery system, pasted on the larcsim flight model, and in a relatively short time was able to show actual flight over real 3d terrain. Good, realistic 3d terrain was something the other existing flight sims at the time were pretty far behind on ... and I think my work was enough of a breakthrough that it got a lot of people excited about the possibilities.''&amp;quot;~Curt Olson &amp;lt;ref&amp;gt;Curtis Olson (Sep 28, 2015).  [http://forum.flightgear.org/viewtopic.php?f=42&amp;amp;t=27558&amp;amp;p=259048#p259021 Re: A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@].  Published on the FlightGear forum.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Rather than start entirely from scratch, FlightGear developers made use of the LaRCsim flight model from NASA, with OpenGL for 3D graphic code, and freely available elevation data. First working binaries came out in 1997, with an intense updating of newer versions for several years resulting in progressively more stable and advanced programs.&lt;br /&gt;
&lt;br /&gt;
== Versions 0.7–0.9 (2001–2003) ==&lt;br /&gt;
By 2001, the team was releasing new beta versions regularly (0.7.x, 0.8.0, over 2001-2003) and with 0.9.xx (2003-2006). Later in the decade, the rate of final public releases slowed, but had larger amounts of content (0.9.10, 1.0.0 etc.). The maturity of software by 2005 lead to more widespread reviews, and increased popularity. &lt;br /&gt;
&lt;br /&gt;
== Version 0.9.0-0.9.11 (2002-2007) ==&lt;br /&gt;
The use of version numbers slowed dramatically after the late 2002 release of version 0.9.0. Versions 0.9.9 (2005) and 0.9.10 (2006) had about 8 all-new or redone [[aircraft]] adding to a total of 70-90 aircraft. [[Nasal]] was also integrated into FlightGear in version 0.9.4. FlightGear 0.9.10 won Softpedia's &amp;quot;Pick&amp;quot; award (5 out of 5 stars) on June 3, 2006 as well as the &amp;quot;100% CLEAN&amp;quot; Softpedia award.&lt;br /&gt;
&lt;br /&gt;
Behind the scenes there was a 0.9.11-pre1 released in 2007 that ended up being superseded by FlightGear 1.0. The pre-version had about 33 new or redone aircraft.&lt;br /&gt;
&lt;br /&gt;
[[File:FG-A-10.jpg|thumb|270px|3D Cockpit panel for [[A-10]] in version 1.0.0 in 2008]]&lt;br /&gt;
&lt;br /&gt;
== Version 1.0 (2008) ==&lt;br /&gt;
The version number marked a formal transition out of beta development since the software's first release in 1997, ten years prior.&lt;br /&gt;
&lt;br /&gt;
== Version 1.9.0 (2008) ==&lt;br /&gt;
At the time version 1.9.0 was released FlightGear switched from [[PLIB]] to [[OSG]], which caused the temporary loss of some of the features like 3D clouds and shadows. On the contrary new features such as particles add another degree of realism to the simulation. Most aircraft developed for OSG do not work with older versions. The user is able to choose from 230 aircraft provided with 1.9.0, although only a few are included in the base package.&lt;br /&gt;
Version 1.9.1, released shortly afterwards, was a bug fix release.&lt;br /&gt;
&lt;br /&gt;
== Version 2.0.0 (2010) ==&lt;br /&gt;
FlightGear 2.0.0 reflects the maturation of the OpenSceneGraph port that started with the previous 1.9.0 release. In addition to many internal code improvements, FlightGear 2.0.0 marks the introduction of many new exciting improvements in the graphics and sound system, as well as improved usability of key features, and improved behavior of existing features. Highlights of this new version include: Dramatic new 3D clouds, dramatic lighting conditions, improved support for custom scenery, and many many new and detailed aircraft models. &lt;br /&gt;
&lt;br /&gt;
== Version 2.4.0 (2011) ==&lt;br /&gt;
Starting with version 2.4.0, the FlightGear team adopted a [[release plan]]. From then on, a new version is released every February and August.&lt;br /&gt;
&lt;br /&gt;
==Version 3.8.0/2016.1.0==&lt;br /&gt;
{{Main article|Release plan#Detailed time schedule and checklist}}&lt;br /&gt;
Following the cancellation of 3.6, the modern FlightGear team revised the release plan and process. New releases are essentially selected and tuned &amp;quot;nightlies&amp;quot; instead of special compilations.&lt;br /&gt;
&lt;br /&gt;
Also, in this release the concept of rotating default airports first started. All FlightGear releases after 2016.1 have unique default airports and 'codenames'.&lt;br /&gt;
&lt;br /&gt;
{{Main article|Release plan/Lessons learned#2016.1}}&lt;br /&gt;
&lt;br /&gt;
== Release timeline ==&lt;br /&gt;
Final build code release dates by year.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:40%; margin:auto&amp;quot;&lt;br /&gt;
! Date !! Version&lt;br /&gt;
|-&lt;br /&gt;
| Jul 17, 1997 || First major code release&lt;br /&gt;
|-&lt;br /&gt;
| Sep 23, 1997 || 0.12&lt;br /&gt;
|-&lt;br /&gt;
| Dec 9, 1997 || 0.15&lt;br /&gt;
|-&lt;br /&gt;
| Dec 17, 1997 || 0.18&lt;br /&gt;
|-&lt;br /&gt;
| Dec 30, 1997 || 0.19 (first binaries)&lt;br /&gt;
|-&lt;br /&gt;
| Jan 6, 1998 || 0.22&lt;br /&gt;
|-&lt;br /&gt;
| Mar 11 98 || 0.37&lt;br /&gt;
|-&lt;br /&gt;
| Apr 8, 1998 || 0.41&lt;br /&gt;
|-&lt;br /&gt;
| Apr 14, 1998 || 0.42&lt;br /&gt;
|-&lt;br /&gt;
| Apr 23, 1998 || 0.43&lt;br /&gt;
|-&lt;br /&gt;
| Apr 28, 1998 || 0.44&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 1998 || 0.45&lt;br /&gt;
|-&lt;br /&gt;
| May 11, 1998 || 0.46&lt;br /&gt;
|-&lt;br /&gt;
| May 18, 1998 || 0.47&lt;br /&gt;
|-&lt;br /&gt;
| Jun 9, 1998 || 0.48&lt;br /&gt;
|-&lt;br /&gt;
| Jun 27, 1998 || 0.49&lt;br /&gt;
|-&lt;br /&gt;
| Jul 13, 1998 || 0.50&lt;br /&gt;
|-&lt;br /&gt;
| Jul 21, 1998 || 0.51&lt;br /&gt;
|-&lt;br /&gt;
| Aug 15, 1998 || 0.52&lt;br /&gt;
|-&lt;br /&gt;
| Sep 2, 1998 || 0.53&lt;br /&gt;
|-&lt;br /&gt;
| Sep 25, 1998 || 0.54&lt;br /&gt;
|-&lt;br /&gt;
| Oct 23, 1998 || 0.55&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 1998 || 0.56&lt;br /&gt;
|-&lt;br /&gt;
| Jan 21, 1999 || 0.57&lt;br /&gt;
|-&lt;br /&gt;
| Feb 10, 1999 || 0.58&lt;br /&gt;
|-&lt;br /&gt;
| Mar 31, 1999 || 0.59&lt;br /&gt;
|-&lt;br /&gt;
| May 26, 1999 || 0.6.0&lt;br /&gt;
|-&lt;br /&gt;
| Jun 21, 1999 || 0.6.1 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2 | Sep 11, 1999 || 0.7.0 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| 0.6.2 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
| Oct 22, 1999 || 0.7.1 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2000 || 0.7.2 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| May 18, 2000 || 0.7.3 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| Jul 20, 2000 || 0.7.4&lt;br /&gt;
|-&lt;br /&gt;
| Sep 18, 2000 || 0.7.5&lt;br /&gt;
|-&lt;br /&gt;
| Dec 19, 2000 || 0.7.6&lt;br /&gt;
|-&lt;br /&gt;
| Jun 20, 2001 || 0.7.7&lt;br /&gt;
|-&lt;br /&gt;
| Jul 13, 2001 || 0.7.8&lt;br /&gt;
|-&lt;br /&gt;
| Feb 16, 2002 || 0.7.9&lt;br /&gt;
|-&lt;br /&gt;
| Apr 20, 2002 || 0.7.10&lt;br /&gt;
|-&lt;br /&gt;
| Sep 7, 2002 || 0.8.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 3, 2002 || 0.9.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 5, 2002 || 0.9.1 &lt;br /&gt;
|-&lt;br /&gt;
| Jun 4, 2003 || 0.9.2&lt;br /&gt;
|-&lt;br /&gt;
| Oct 24, 2003 || 0.9.3&lt;br /&gt;
|-&lt;br /&gt;
| Mar 26, 2004 || 0.9.4&lt;br /&gt;
|-&lt;br /&gt;
| Jul 29, 2004 || 0.9.5&lt;br /&gt;
|-&lt;br /&gt;
| Oct 12, 2004 || 0.9.6&lt;br /&gt;
|-&lt;br /&gt;
| Jan 18, 2005 || 0.9.8&lt;br /&gt;
|-&lt;br /&gt;
| Nov 17, 2005 || 0.9.9&lt;br /&gt;
|-&lt;br /&gt;
| Apr 5, 2006 || 0.9.10&lt;br /&gt;
|-&lt;br /&gt;
| May 2007 || 0.9.11-pre1&lt;br /&gt;
|-&lt;br /&gt;
| Dec 17, 2007 || 1.0.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 22, 2008 || 1.9.0 &lt;br /&gt;
|-&lt;br /&gt;
| Jan 25, 2009 || 1.9.1&lt;br /&gt;
|-&lt;br /&gt;
| Feb 25, 2010 || 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| Aug 17, 2011 || 2.4.0&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2012 || 2.6.0&lt;br /&gt;
|-&lt;br /&gt;
| Aug 17, 2012 || 2.8.0&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2013 || 2.10&lt;br /&gt;
|-&lt;br /&gt;
| Sep 21, 2013 || 2.12&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2014 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| Oct 15, 2014 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2015 || 3.4&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 3.6 (unreleased, see [[FlightGear Newsletter November 2015#FlightGear v3.6 canceled|here]])&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2016 || 2016.1.1 (new versioning scheme)&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 2016 || 2016.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 17, 2016 || 2016.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 12, 2016 || 2016.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 19, 2016 || 2016.4.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 2016 || 2016.4.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 5, 2016 || 2016.4.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 28, 2016 || 2016.4.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Feb 23, 2017 || 2017.1.1&lt;br /&gt;
|-&lt;br /&gt;
| Mar 1, 2017 || 2017.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Apr 4, 2017 || 2017.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2017 || 2017.2.1 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Sep 20, 2017 || 2017.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Apr 11, 2018 || 2018.1.1 &lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2018 || 2018.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Dec 3, 2018 || 2018.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Jan 29, 2019 || 2018.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 2018.3.3 (not released)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2019 || 2018.3.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Apr 20, 2020 || 2018.3.5 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2020 || 2018.3.6 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Mar 14, 2019 || 2019.1.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 1, 2019 || 2019.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 11, 2020 || 2020.1.1&lt;br /&gt;
|-&lt;br /&gt;
| May 25, 2020 || 2020.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Jun 26, 2020 || 2020.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Oct 29, 2020 || 2020.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 6, 2020 || 2020.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 2020 || 2020.3.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 1, 2020 || 2020.3.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 19, 2020 || 2020.3.5 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Jan 24, 2021 || 2020.3.6 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Mar 21, 2021 || 2020.3.7 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Mar 25, 2021 || 2020.3.8 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Jun 14, 2021 || 2020.3.9 (bugfix release)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cycled default airports ==&lt;br /&gt;
&lt;br /&gt;
FlightGear did not start changing the default airport until version 2016.1 was released. At that time, the idea was that each new release would have a new default airport. This chart lists the default airports since 2016.1 was released. Since 2018.1, the selection of a new default airport has been changed so that a new airport is selected for each new major version release instead of for each minor version release.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Release !! ICAO !! Default Airport&lt;br /&gt;
|-&lt;br /&gt;
| 2016.1 || [[KSFO]] || San Francisco ''(transition)''&lt;br /&gt;
|-&lt;br /&gt;
| 2016.2 || [[LEBL]] || Barcelona&lt;br /&gt;
|-&lt;br /&gt;
| 2016.3 || [[SBRJ]] || Rio de Janeiro&lt;br /&gt;
|-&lt;br /&gt;
| 2016.4 || [[LSZH]] || Zürich&lt;br /&gt;
|-&lt;br /&gt;
| 2017.1 || [[ENBR]] || Bergen&lt;br /&gt;
|-&lt;br /&gt;
| 2017.2 || [[KBOS]] || Boston&lt;br /&gt;
|- &lt;br /&gt;
| 2017.3 || [[LKPR]] || Prague&lt;br /&gt;
|- &lt;br /&gt;
| 2018.1 || rowspan=&amp;quot;4&amp;quot; | [[PHNL]] || rowspan=&amp;quot;4&amp;quot; | Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2018.2 &lt;br /&gt;
|- &lt;br /&gt;
| 2018.3 &lt;br /&gt;
|- &lt;br /&gt;
| 2019.1 &lt;br /&gt;
|- &lt;br /&gt;
| 2020.1 || rowspan=&amp;quot;3&amp;quot; | [[BIKF]] || rowspan=&amp;quot;3&amp;quot; | Keflavik&lt;br /&gt;
|- &lt;br /&gt;
| 2020.2 &lt;br /&gt;
|- &lt;br /&gt;
| 2020.3 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://web.archive.org/web/*/http://www.flightgear.org/ Internet Archive: Wayback Machine for http://www.flightgear.org/ ]&lt;br /&gt;
* [http://web.archive.org/web/19981212014011/http://flightgear.org/ Old website on December 5, 1998]&lt;br /&gt;
* [http://web.archive.org/web/19990209082206/http://www.flightgear.org/Gallery/tucson.jpg link] (&amp;quot;A view from the ground near Tucson, AZ (KTUS)&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
* [http://web.archive.org/web/19990209050729/http://www.flightgear.org/Gallery/texture2.jpg link] (&amp;quot;Here's one of the Grand Canyon with a rock face texture. I know this looks funny, but I'm just experimenting here.&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
&lt;br /&gt;
{{Appendix|2=&lt;br /&gt;
* {{wikipedia|FlightGear}}&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Original Flight Gear Proposal] by David L. Murr (Revision 3.0.1)&lt;br /&gt;
* [ftp://flightgear.wo0t.de/flightgear-ftp/ FlightGear FTP Archive]&lt;br /&gt;
----&lt;br /&gt;
{{References}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=132229</id>
		<title>FlightGear history</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=132229"/>
		<updated>2021-06-04T11:21:12Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Cycled default airports */ add statement about new default airport selection being changed to each major version release instead of each minor version release...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[FlightGear]] development started with an online proposal in 1996, using custom 3D graphics code. Development of an [[OpenGL]] based version was spearheaded by Curtis Olson starting in 1997. Many people have contributed to the project in the years since its inception.&lt;br /&gt;
&lt;br /&gt;
FlightGear incorporated other open-source resources, including the [[LaRCsim]] flight model from NASA, and freely available elevation data. The first working binaries, using OpenGL for 3D graphic code, came out in 1997. Enthusiastic development of newer versions for several years resulted in progressively more stable and advanced versions. By 2001, the team was releasing new beta versions regularly, and by 2005, the maturity of software lead to more widespread reviews, and increased popularity. 2007 marked a formal transition out of beta development with the release of version 1.0.0, ten years after FlightGear's first release in 1997.&lt;br /&gt;
&lt;br /&gt;
In 2008, version 1.9.0 of FlightGear included a major change from [[PLIB]] to [[OSG]], which caused the temporarily loss of some features like 3D clouds and shadows, while newly added features, such as particles, imparted another degree of realism to the simulation. &lt;br /&gt;
 &lt;br /&gt;
== Beginnings (1996-1997) ==&lt;br /&gt;
[[File:FG SUNHALO.JPG|thumb|270px|March 18, 1999: one of the oldest surviving screenshots of FlightGear. Back then, FlightGear was the only PC based flight simulator rendering the [[Moon|sun, moon, and celestial]] objects at the correct position, and under the correct lighting conditions, in the sky. ]]&lt;br /&gt;
[[File:Image103.gif|thumb|Original Win95 icon]]&lt;br /&gt;
The FlightGear project was conceived on April 8, 1996 by David Murr who proposed a new flight simulator to be developed by volunteers&amp;lt;ref&amp;gt;David Murr (Apr 9, 1996).  FlightGear proposal 1.0: [https://groups.google.com/forum/#!msg/rec.aviation.simulators/ny8HFBE5_T8/OdtIiGNGJc8J &amp;quot;A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@&amp;quot;].  Published on the rec.aviation.simulators newsgroup.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (1996).  FlightGear proposal 2.0: [http://www.flightgear.org/proposal-2.0 FLIGHT GEAR &amp;quot;This truly is as real as it gets!&amp;quot; - a proposal for a new flight simulator - REVISION 2.0].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Oct 29, 1996).  FlightGear proposal 3.0: [http://www.flightgear.org/proposal-3.0 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0 - Wednesday, 10.30.96, &amp;quot;The future of flight simulation is here&amp;quot;].  Published on the [http://ftp.igh.cnrs.fr/pub/flightgear/www/old-stuff/flight-gear.9610 flight-gear@infoplane.com mailing list].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Sep 11, 1998).  FlightGear proposal 3.0.1: [http://www.flightgear.org/proposal-3.0.1 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0.1 - Friday, Sep.11.98, &amp;quot;The future of flight simulation is here&amp;quot;].&amp;lt;/ref&amp;gt;.  Part of the initial goals were to develop 2D and 3D graphics routines for the simulator.  However this was a huge task that came to an unfinished halt at the start of 1997 as the main developer,  Eric Korpela, was finishing his thesis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Development of an OpenGL based version was spearheaded by Curtis Olsen starting in 1997, after the initial start in 1996. A large community response lead to many contributing to the project from its start in late '90s up to the present.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;''I was working at the University of Minnesota at the time, and had access to Sun and SGI graphical work stations which offered OpenGL for 3d graphics. OpenGl was just starting to become available on PC hardware with things like the 3dfx voodoo card. Somewhere at this point it occurred to me that a far better path would be to leverage an existing multi-platform 3d graphics system (like OpenGL) to build our flight simulator upon.''&lt;br /&gt;
&lt;br /&gt;
''So I proceeded to rough together a basic scenery system, pasted on the larcsim flight model, and in a relatively short time was able to show actual flight over real 3d terrain. Good, realistic 3d terrain was something the other existing flight sims at the time were pretty far behind on ... and I think my work was enough of a breakthrough that it got a lot of people excited about the possibilities.''&amp;quot;~Curt Olson &amp;lt;ref&amp;gt;Curtis Olson (Sep 28, 2015).  [http://forum.flightgear.org/viewtopic.php?f=42&amp;amp;t=27558&amp;amp;p=259048#p259021 Re: A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@].  Published on the FlightGear forum.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Rather than start entirely from scratch, FlightGear developers made use of the LaRCsim flight model from NASA, with OpenGL for 3D graphic code, and freely available elevation data. First working binaries came out in 1997, with an intense updating of newer versions for several years resulting in progressively more stable and advanced programs.&lt;br /&gt;
&lt;br /&gt;
== Versions 0.7–0.9 (2001–2003) ==&lt;br /&gt;
By 2001, the team was releasing new beta versions regularly (0.7.x, 0.8.0, over 2001-2003) and with 0.9.xx (2003-2006). Later in the decade, the rate of final public releases slowed, but had larger amounts of content (0.9.10, 1.0.0 etc.). The maturity of software by 2005 lead to more widespread reviews, and increased popularity. &lt;br /&gt;
&lt;br /&gt;
== Version 0.9.0-0.9.11 (2002-2007) ==&lt;br /&gt;
The use of version numbers slowed dramatically after the late 2002 release of version 0.9.0. Versions 0.9.9 (2005) and 0.9.10 (2006) had about 8 all-new or redone [[aircraft]] adding to a total of 70-90 aircraft. [[Nasal]] was also integrated into FlightGear in version 0.9.4. FlightGear 0.9.10 won Softpedia's &amp;quot;Pick&amp;quot; award (5 out of 5 stars) on June 3, 2006 as well as the &amp;quot;100% CLEAN&amp;quot; Softpedia award.&lt;br /&gt;
&lt;br /&gt;
Behind the scenes there was a 0.9.11-pre1 released in 2007 that ended up being superseded by FlightGear 1.0. The pre-version had about 33 new or redone aircraft.&lt;br /&gt;
&lt;br /&gt;
[[File:FG-A-10.jpg|thumb|270px|3D Cockpit panel for [[A-10]] in version 1.0.0 in 2008]]&lt;br /&gt;
&lt;br /&gt;
== Version 1.0 (2008) ==&lt;br /&gt;
The version number marked a formal transition out of beta development since the software's first release in 1997, ten years prior.&lt;br /&gt;
&lt;br /&gt;
== Version 1.9.0 (2008) ==&lt;br /&gt;
At the time version 1.9.0 was released FlightGear switched from [[PLIB]] to [[OSG]], which caused the temporary loss of some of the features like 3D clouds and shadows. On the contrary new features such as particles add another degree of realism to the simulation. Most aircraft developed for OSG do not work with older versions. The user is able to choose from 230 aircraft provided with 1.9.0, although only a few are included in the base package.&lt;br /&gt;
Version 1.9.1, released shortly afterwards, was a bug fix release.&lt;br /&gt;
&lt;br /&gt;
== Version 2.0.0 (2010) ==&lt;br /&gt;
FlightGear 2.0.0 reflects the maturation of the OpenSceneGraph port that started with the previous 1.9.0 release. In addition to many internal code improvements, FlightGear 2.0.0 marks the introduction of many new exciting improvements in the graphics and sound system, as well as improved usability of key features, and improved behavior of existing features. Highlights of this new version include: Dramatic new 3D clouds, dramatic lighting conditions, improved support for custom scenery, and many many new and detailed aircraft models. &lt;br /&gt;
&lt;br /&gt;
== Version 2.4.0 (2011) ==&lt;br /&gt;
Starting with version 2.4.0, the FlightGear team adopted a [[release plan]]. From then on, a new version is released every February and August.&lt;br /&gt;
&lt;br /&gt;
==Version 3.8.0/2016.1.0==&lt;br /&gt;
{{Main article|Release plan#Detailed time schedule and checklist}}&lt;br /&gt;
Following the cancellation of 3.6, the modern FlightGear team revised the release plan and process. New releases are essentially selected and tuned &amp;quot;nightlies&amp;quot; instead of special compilations.&lt;br /&gt;
&lt;br /&gt;
Also, in this release the concept of rotating default airports first started. All FlightGear releases after 2016.1 have unique default airports and 'codenames'.&lt;br /&gt;
&lt;br /&gt;
{{Main article|Release plan/Lessons learned#2016.1}}&lt;br /&gt;
&lt;br /&gt;
== Release timeline ==&lt;br /&gt;
Final build code release dates by year.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:40%; margin:auto&amp;quot;&lt;br /&gt;
! Date !! Version&lt;br /&gt;
|-&lt;br /&gt;
| Jul 17, 1997 || First major code release&lt;br /&gt;
|-&lt;br /&gt;
| Sep 23, 1997 || 0.12&lt;br /&gt;
|-&lt;br /&gt;
| Dec 9, 1997 || 0.15&lt;br /&gt;
|-&lt;br /&gt;
| Dec 17, 1997 || 0.18&lt;br /&gt;
|-&lt;br /&gt;
| Dec 30, 1997 || 0.19 (first binaries)&lt;br /&gt;
|-&lt;br /&gt;
| Jan 6, 1998 || 0.22&lt;br /&gt;
|-&lt;br /&gt;
| Mar 11 98 || 0.37&lt;br /&gt;
|-&lt;br /&gt;
| Apr 8, 1998 || 0.41&lt;br /&gt;
|-&lt;br /&gt;
| Apr 14, 1998 || 0.42&lt;br /&gt;
|-&lt;br /&gt;
| Apr 23, 1998 || 0.43&lt;br /&gt;
|-&lt;br /&gt;
| Apr 28, 1998 || 0.44&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 1998 || 0.45&lt;br /&gt;
|-&lt;br /&gt;
| May 11, 1998 || 0.46&lt;br /&gt;
|-&lt;br /&gt;
| May 18, 1998 || 0.47&lt;br /&gt;
|-&lt;br /&gt;
| Jun 9, 1998 || 0.48&lt;br /&gt;
|-&lt;br /&gt;
| Jun 27, 1998 || 0.49&lt;br /&gt;
|-&lt;br /&gt;
| Jul 13, 1998 || 0.50&lt;br /&gt;
|-&lt;br /&gt;
| Jul 21, 1998 || 0.51&lt;br /&gt;
|-&lt;br /&gt;
| Aug 15, 1998 || 0.52&lt;br /&gt;
|-&lt;br /&gt;
| Sep 2, 1998 || 0.53&lt;br /&gt;
|-&lt;br /&gt;
| Sep 25, 1998 || 0.54&lt;br /&gt;
|-&lt;br /&gt;
| Oct 23, 1998 || 0.55&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 1998 || 0.56&lt;br /&gt;
|-&lt;br /&gt;
| Jan 21, 1999 || 0.57&lt;br /&gt;
|-&lt;br /&gt;
| Feb 10, 1999 || 0.58&lt;br /&gt;
|-&lt;br /&gt;
| Mar 31, 1999 || 0.59&lt;br /&gt;
|-&lt;br /&gt;
| May 26, 1999 || 0.6.0&lt;br /&gt;
|-&lt;br /&gt;
| Jun 21, 1999 || 0.6.1 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2 | Sep 11, 1999 || 0.7.0 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| 0.6.2 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
| Oct 22, 1999 || 0.7.1 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2000 || 0.7.2 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| May 18, 2000 || 0.7.3 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| Jul 20, 2000 || 0.7.4&lt;br /&gt;
|-&lt;br /&gt;
| Sep 18, 2000 || 0.7.5&lt;br /&gt;
|-&lt;br /&gt;
| Dec 19, 2000 || 0.7.6&lt;br /&gt;
|-&lt;br /&gt;
| Jun 20, 2001 || 0.7.7&lt;br /&gt;
|-&lt;br /&gt;
| Jul 13, 2001 || 0.7.8&lt;br /&gt;
|-&lt;br /&gt;
| Feb 16, 2002 || 0.7.9&lt;br /&gt;
|-&lt;br /&gt;
| Apr 20, 2002 || 0.7.10&lt;br /&gt;
|-&lt;br /&gt;
| Sep 7, 2002 || 0.8.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 3, 2002 || 0.9.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 5, 2002 || 0.9.1 &lt;br /&gt;
|-&lt;br /&gt;
| Jun 4, 2003 || 0.9.2&lt;br /&gt;
|-&lt;br /&gt;
| Oct 24, 2003 || 0.9.3&lt;br /&gt;
|-&lt;br /&gt;
| Mar 26, 2004 || 0.9.4&lt;br /&gt;
|-&lt;br /&gt;
| Jul 29, 2004 || 0.9.5&lt;br /&gt;
|-&lt;br /&gt;
| Oct 12, 2004 || 0.9.6&lt;br /&gt;
|-&lt;br /&gt;
| Jan 18, 2005 || 0.9.8&lt;br /&gt;
|-&lt;br /&gt;
| Nov 17, 2005 || 0.9.9&lt;br /&gt;
|-&lt;br /&gt;
| Apr 5, 2006 || 0.9.10&lt;br /&gt;
|-&lt;br /&gt;
| May 2007 || 0.9.11-pre1&lt;br /&gt;
|-&lt;br /&gt;
| Dec 17, 2007 || 1.0.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 22, 2008 || 1.9.0 &lt;br /&gt;
|-&lt;br /&gt;
| Jan 25, 2009 || 1.9.1&lt;br /&gt;
|-&lt;br /&gt;
| Feb 25, 2010 || 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| Aug 17, 2011 || 2.4.0&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2012 || 2.6.0&lt;br /&gt;
|-&lt;br /&gt;
| Aug 17, 2012 || 2.8.0&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2013 || 2.10&lt;br /&gt;
|-&lt;br /&gt;
| Sep 21, 2013 || 2.12&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2014 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| Oct 15, 2014 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2015 || 3.4&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 3.6 (unreleased, see [[FlightGear Newsletter November 2015#FlightGear v3.6 canceled|here]])&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2016 || 2016.1.1 (new versioning scheme)&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 2016 || 2016.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 17, 2016 || 2016.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 12, 2016 || 2016.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 19, 2016 || 2016.4.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 2016 || 2016.4.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 5, 2016 || 2016.4.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 28, 2016 || 2016.4.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Feb 23, 2017 || 2017.1.1&lt;br /&gt;
|-&lt;br /&gt;
| Mar 1, 2017 || 2017.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Apr 4, 2017 || 2017.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2017 || 2017.2.1 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Sep 20, 2017 || 2017.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Apr 11, 2018 || 2018.1.1 &lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2018 || 2018.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Dec 3, 2018 || 2018.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Jan 29, 2019 || 2018.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 2018.3.3 (not released)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2019 || 2018.3.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Apr 20, 2020 || 2018.3.5 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2020 || 2018.3.6 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Mar 14, 2019 || 2019.1.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 1, 2019 || 2019.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 11, 2020 || 2020.1.1&lt;br /&gt;
|-&lt;br /&gt;
| May 25, 2020 || 2020.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Jun 26, 2020 || 2020.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Oct 29, 2020 || 2020.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 6, 2020 || 2020.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 2020 || 2020.3.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 1, 2020 || 2020.3.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 19, 2020 || 2020.3.5 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Jan 24, 2021 || 2020.3.6 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Mar 21, 2021 || 2020.3.7 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Mar 25, 2021 || 2020.3.8 (bugfix release)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cycled default airports ==&lt;br /&gt;
&lt;br /&gt;
FlightGear did not start changing the default airport until version 2016.1 was released. At that time, the idea was that each new release would have a new default airport. This chart lists the default airports since 2016.1 was released. Since 2018.1, the selection of a new default airport has been changed so that a new airport is selected for each new major version release instead of for each minor version release.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Release !! ICAO !! Default Airport&lt;br /&gt;
|-&lt;br /&gt;
| 2016.1 || [[KSFO]] || San Francisco ''(transition)''&lt;br /&gt;
|-&lt;br /&gt;
| 2016.2 || [[LEBL]] || Barcelona&lt;br /&gt;
|-&lt;br /&gt;
| 2016.3 || [[SBRJ]] || Rio de Janeiro&lt;br /&gt;
|-&lt;br /&gt;
| 2016.4 || [[LSZH]] || Zürich&lt;br /&gt;
|-&lt;br /&gt;
| 2017.1 || [[ENBR]] || Bergen&lt;br /&gt;
|-&lt;br /&gt;
| 2017.2 || [[KBOS]] || Boston&lt;br /&gt;
|- &lt;br /&gt;
| 2017.3 || [[LKPR]] || Prague&lt;br /&gt;
|- &lt;br /&gt;
| 2018.1 || rowspan=&amp;quot;4&amp;quot; | [[PHNL]] || rowspan=&amp;quot;4&amp;quot; | Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2018.2 &lt;br /&gt;
|- &lt;br /&gt;
| 2018.3 &lt;br /&gt;
|- &lt;br /&gt;
| 2019.1 &lt;br /&gt;
|- &lt;br /&gt;
| 2020.1 || rowspan=&amp;quot;3&amp;quot; | [[BIKF]] || rowspan=&amp;quot;3&amp;quot; | Keflavik&lt;br /&gt;
|- &lt;br /&gt;
| 2020.2 &lt;br /&gt;
|- &lt;br /&gt;
| 2020.3 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://web.archive.org/web/*/http://www.flightgear.org/ Internet Archive: Wayback Machine for http://www.flightgear.org/ ]&lt;br /&gt;
* [http://web.archive.org/web/19981212014011/http://flightgear.org/ Old website on December 5, 1998]&lt;br /&gt;
* [http://web.archive.org/web/19990209082206/http://www.flightgear.org/Gallery/tucson.jpg link] (&amp;quot;A view from the ground near Tucson, AZ (KTUS)&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
* [http://web.archive.org/web/19990209050729/http://www.flightgear.org/Gallery/texture2.jpg link] (&amp;quot;Here's one of the Grand Canyon with a rock face texture. I know this looks funny, but I'm just experimenting here.&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
&lt;br /&gt;
{{Appendix|2=&lt;br /&gt;
* {{wikipedia|FlightGear}}&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Original Flight Gear Proposal] by David L. Murr (Revision 3.0.1)&lt;br /&gt;
* [ftp://flightgear.wo0t.de/flightgear-ftp/ FlightGear FTP Archive]&lt;br /&gt;
----&lt;br /&gt;
{{References}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=131633</id>
		<title>FlightGear history</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=131633"/>
		<updated>2021-05-04T14:58:54Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Release timeline */ consistent three-letter month names and leading spaces&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[FlightGear]] development started with an online proposal in 1996, using custom 3D graphics code. Development of an [[OpenGL]] based version was spearheaded by Curtis Olson starting in 1997. Many people have contributed to the project in the years since its inception.&lt;br /&gt;
&lt;br /&gt;
FlightGear incorporated other open-source resources, including the [[LaRCsim]] flight model from NASA, and freely available elevation data. The first working binaries, using OpenGL for 3D graphic code, came out in 1997. Enthusiastic development of newer versions for several years resulted in progressively more stable and advanced versions. By 2001, the team was releasing new beta versions regularly, and by 2005, the maturity of software lead to more widespread reviews, and increased popularity. 2007 marked a formal transition out of beta development with the release of version 1.0.0, ten years after FlightGear's first release in 1997.&lt;br /&gt;
&lt;br /&gt;
In 2008, version 1.9.0 of FlightGear included a major change from [[PLIB]] to [[OSG]], which caused the temporarily loss of some features like 3D clouds and shadows, while newly added features, such as particles, imparted another degree of realism to the simulation. &lt;br /&gt;
 &lt;br /&gt;
== Beginnings (1996-1997) ==&lt;br /&gt;
[[File:FG SUNHALO.JPG|thumb|270px|March 18, 1999: one of the oldest surviving screenshots of FlightGear. Back then, FlightGear was the only PC based flight simulator rendering the [[Moon|sun, moon, and celestial]] objects at the correct position, and under the correct lighting conditions, in the sky. ]]&lt;br /&gt;
[[File:Image103.gif|thumb|Original Win95 icon]]&lt;br /&gt;
The FlightGear project was conceived on April 8, 1996 by David Murr who proposed a new flight simulator to be developed by volunteers&amp;lt;ref&amp;gt;David Murr (Apr 9, 1996).  FlightGear proposal 1.0: [https://groups.google.com/forum/#!msg/rec.aviation.simulators/ny8HFBE5_T8/OdtIiGNGJc8J &amp;quot;A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@&amp;quot;].  Published on the rec.aviation.simulators newsgroup.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (1996).  FlightGear proposal 2.0: [http://www.flightgear.org/proposal-2.0 FLIGHT GEAR &amp;quot;This truly is as real as it gets!&amp;quot; - a proposal for a new flight simulator - REVISION 2.0].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Oct 29, 1996).  FlightGear proposal 3.0: [http://www.flightgear.org/proposal-3.0 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0 - Wednesday, 10.30.96, &amp;quot;The future of flight simulation is here&amp;quot;].  Published on the [http://ftp.igh.cnrs.fr/pub/flightgear/www/old-stuff/flight-gear.9610 flight-gear@infoplane.com mailing list].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Sep 11, 1998).  FlightGear proposal 3.0.1: [http://www.flightgear.org/proposal-3.0.1 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0.1 - Friday, Sep.11.98, &amp;quot;The future of flight simulation is here&amp;quot;].&amp;lt;/ref&amp;gt;.  Part of the initial goals were to develop 2D and 3D graphics routines for the simulator.  However this was a huge task that came to an unfinished halt at the start of 1997 as the main developer,  Eric Korpela, was finishing his thesis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Development of an OpenGL based version was spearheaded by Curtis Olsen starting in 1997, after the initial start in 1996. A large community response lead to many contributing to the project from its start in late '90s up to the present.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;''I was working at the University of Minnesota at the time, and had access to Sun and SGI graphical work stations which offered OpenGL for 3d graphics. OpenGl was just starting to become available on PC hardware with things like the 3dfx voodoo card. Somewhere at this point it occurred to me that a far better path would be to leverage an existing multi-platform 3d graphics system (like OpenGL) to build our flight simulator upon.''&lt;br /&gt;
&lt;br /&gt;
''So I proceeded to rough together a basic scenery system, pasted on the larcsim flight model, and in a relatively short time was able to show actual flight over real 3d terrain. Good, realistic 3d terrain was something the other existing flight sims at the time were pretty far behind on ... and I think my work was enough of a breakthrough that it got a lot of people excited about the possibilities.''&amp;quot;~Curt Olson &amp;lt;ref&amp;gt;Curtis Olson (Sep 28, 2015).  [http://forum.flightgear.org/viewtopic.php?f=42&amp;amp;t=27558&amp;amp;p=259048#p259021 Re: A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@].  Published on the FlightGear forum.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Rather than start entirely from scratch, FlightGear developers made use of the LaRCsim flight model from NASA, with OpenGL for 3D graphic code, and freely available elevation data. First working binaries came out in 1997, with an intense updating of newer versions for several years resulting in progressively more stable and advanced programs.&lt;br /&gt;
&lt;br /&gt;
== Versions 0.7–0.9 (2001–2003) ==&lt;br /&gt;
By 2001, the team was releasing new beta versions regularly (0.7.x, 0.8.0, over 2001-2003) and with 0.9.xx (2003-2006). Later in the decade, the rate of final public releases slowed, but had larger amounts of content (0.9.10, 1.0.0 etc.). The maturity of software by 2005 lead to more widespread reviews, and increased popularity. &lt;br /&gt;
&lt;br /&gt;
== Version 0.9.0-0.9.11 (2002-2007) ==&lt;br /&gt;
The use of version numbers slowed dramatically after the late 2002 release of version 0.9.0. Versions 0.9.9 (2005) and 0.9.10 (2006) had about 8 all-new or redone [[aircraft]] adding to a total of 70-90 aircraft. [[Nasal]] was also integrated into FlightGear in version 0.9.4. FlightGear 0.9.10 won Softpedia's &amp;quot;Pick&amp;quot; award (5 out of 5 stars) on June 3, 2006 as well as the &amp;quot;100% CLEAN&amp;quot; Softpedia award.&lt;br /&gt;
&lt;br /&gt;
Behind the scenes there was a 0.9.11-pre1 released in 2007 that ended up being superseded by FlightGear 1.0. The pre-version had about 33 new or redone aircraft.&lt;br /&gt;
&lt;br /&gt;
[[File:FG-A-10.jpg|thumb|270px|3D Cockpit panel for [[A-10]] in version 1.0.0 in 2008]]&lt;br /&gt;
&lt;br /&gt;
== Version 1.0 (2008) ==&lt;br /&gt;
The version number marked a formal transition out of beta development since the software's first release in 1997, ten years prior.&lt;br /&gt;
&lt;br /&gt;
== Version 1.9.0 (2008) ==&lt;br /&gt;
At the time version 1.9.0 was released FlightGear switched from [[PLIB]] to [[OSG]], which caused the temporary loss of some of the features like 3D clouds and shadows. On the contrary new features such as particles add another degree of realism to the simulation. Most aircraft developed for OSG do not work with older versions. The user is able to choose from 230 aircraft provided with 1.9.0, although only a few are included in the base package.&lt;br /&gt;
Version 1.9.1, released shortly afterwards, was a bug fix release.&lt;br /&gt;
&lt;br /&gt;
== Version 2.0.0 (2010) ==&lt;br /&gt;
FlightGear 2.0.0 reflects the maturation of the OpenSceneGraph port that started with the previous 1.9.0 release. In addition to many internal code improvements, FlightGear 2.0.0 marks the introduction of many new exciting improvements in the graphics and sound system, as well as improved usability of key features, and improved behavior of existing features. Highlights of this new version include: Dramatic new 3D clouds, dramatic lighting conditions, improved support for custom scenery, and many many new and detailed aircraft models. &lt;br /&gt;
&lt;br /&gt;
== Version 2.4.0 (2011) ==&lt;br /&gt;
Starting with version 2.4.0, the FlightGear team adopted a [[release plan]]. From then on, a new version is released every February and August.&lt;br /&gt;
&lt;br /&gt;
==Version 3.8.0/2016.1.0==&lt;br /&gt;
{{Main article|Release plan#Detailed time schedule and checklist}}&lt;br /&gt;
Following the cancellation of 3.6, the modern FlightGear team revised the release plan and process. New releases are essentially selected and tuned &amp;quot;nightlies&amp;quot; instead of special compilations.&lt;br /&gt;
&lt;br /&gt;
Also, in this release the concept of rotating default airports first started. All FlightGear releases after 2016.1 have unique default airports and 'codenames'.&lt;br /&gt;
&lt;br /&gt;
{{Main article|Release plan/Lessons learned#2016.1}}&lt;br /&gt;
&lt;br /&gt;
== Release timeline ==&lt;br /&gt;
Final build code release dates by year.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:40%; margin:auto&amp;quot;&lt;br /&gt;
! Date !! Version&lt;br /&gt;
|-&lt;br /&gt;
| Jul 17, 1997 || First major code release&lt;br /&gt;
|-&lt;br /&gt;
| Sep 23, 1997 || 0.12&lt;br /&gt;
|-&lt;br /&gt;
| Dec 9, 1997 || 0.15&lt;br /&gt;
|-&lt;br /&gt;
| Dec 17, 1997 || 0.18&lt;br /&gt;
|-&lt;br /&gt;
| Dec 30, 1997 || 0.19 (first binaries)&lt;br /&gt;
|-&lt;br /&gt;
| Jan 6, 1998 || 0.22&lt;br /&gt;
|-&lt;br /&gt;
| Mar 11 98 || 0.37&lt;br /&gt;
|-&lt;br /&gt;
| Apr 8, 1998 || 0.41&lt;br /&gt;
|-&lt;br /&gt;
| Apr 14, 1998 || 0.42&lt;br /&gt;
|-&lt;br /&gt;
| Apr 23, 1998 || 0.43&lt;br /&gt;
|-&lt;br /&gt;
| Apr 28, 1998 || 0.44&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 1998 || 0.45&lt;br /&gt;
|-&lt;br /&gt;
| May 11, 1998 || 0.46&lt;br /&gt;
|-&lt;br /&gt;
| May 18, 1998 || 0.47&lt;br /&gt;
|-&lt;br /&gt;
| Jun 9, 1998 || 0.48&lt;br /&gt;
|-&lt;br /&gt;
| Jun 27, 1998 || 0.49&lt;br /&gt;
|-&lt;br /&gt;
| Jul 13, 1998 || 0.50&lt;br /&gt;
|-&lt;br /&gt;
| Jul 21, 1998 || 0.51&lt;br /&gt;
|-&lt;br /&gt;
| Aug 15, 1998 || 0.52&lt;br /&gt;
|-&lt;br /&gt;
| Sep 2, 1998 || 0.53&lt;br /&gt;
|-&lt;br /&gt;
| Sep 25, 1998 || 0.54&lt;br /&gt;
|-&lt;br /&gt;
| Oct 23, 1998 || 0.55&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 1998 || 0.56&lt;br /&gt;
|-&lt;br /&gt;
| Jan 21, 1999 || 0.57&lt;br /&gt;
|-&lt;br /&gt;
| Feb 10, 1999 || 0.58&lt;br /&gt;
|-&lt;br /&gt;
| Mar 31, 1999 || 0.59&lt;br /&gt;
|-&lt;br /&gt;
| May 26, 1999 || 0.6.0&lt;br /&gt;
|-&lt;br /&gt;
| Jun 21, 1999 || 0.6.1 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2 | Sep 11, 1999 || 0.7.0 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| 0.6.2 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
| Oct 22, 1999 || 0.7.1 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2000 || 0.7.2 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| May 18, 2000 || 0.7.3 (Development)&lt;br /&gt;
|-&lt;br /&gt;
| Jul 20, 2000 || 0.7.4&lt;br /&gt;
|-&lt;br /&gt;
| Sep 18, 2000 || 0.7.5&lt;br /&gt;
|-&lt;br /&gt;
| Dec 19, 2000 || 0.7.6&lt;br /&gt;
|-&lt;br /&gt;
| Jun 20, 2001 || 0.7.7&lt;br /&gt;
|-&lt;br /&gt;
| Jul 13, 2001 || 0.7.8&lt;br /&gt;
|-&lt;br /&gt;
| Feb 16, 2002 || 0.7.9&lt;br /&gt;
|-&lt;br /&gt;
| Apr 20, 2002 || 0.7.10&lt;br /&gt;
|-&lt;br /&gt;
| Sep 7, 2002 || 0.8.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 3, 2002 || 0.9.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 5, 2002 || 0.9.1 &lt;br /&gt;
|-&lt;br /&gt;
| Jun 4, 2003 || 0.9.2&lt;br /&gt;
|-&lt;br /&gt;
| Oct 24, 2003 || 0.9.3&lt;br /&gt;
|-&lt;br /&gt;
| Mar 26, 2004 || 0.9.4&lt;br /&gt;
|-&lt;br /&gt;
| Jul 29, 2004 || 0.9.5&lt;br /&gt;
|-&lt;br /&gt;
| Oct 12, 2004 || 0.9.6&lt;br /&gt;
|-&lt;br /&gt;
| Jan 18, 2005 || 0.9.8&lt;br /&gt;
|-&lt;br /&gt;
| Nov 17, 2005 || 0.9.9&lt;br /&gt;
|-&lt;br /&gt;
| Apr 5, 2006 || 0.9.10&lt;br /&gt;
|-&lt;br /&gt;
| May 2007 || 0.9.11-pre1&lt;br /&gt;
|-&lt;br /&gt;
| Dec 17, 2007 || 1.0.0&lt;br /&gt;
|-&lt;br /&gt;
| Dec 22, 2008 || 1.9.0 &lt;br /&gt;
|-&lt;br /&gt;
| Jan 25, 2009 || 1.9.1&lt;br /&gt;
|-&lt;br /&gt;
| Feb 25, 2010 || 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| Aug 17, 2011 || 2.4.0&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2012 || 2.6.0&lt;br /&gt;
|-&lt;br /&gt;
| Aug 17, 2012 || 2.8.0&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2013 || 2.10&lt;br /&gt;
|-&lt;br /&gt;
| Sep 21, 2013 || 2.12&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2014 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| Oct 15, 2014 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2015 || 3.4&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 3.6 (unreleased, see [[FlightGear Newsletter November 2015#FlightGear v3.6 canceled|here]])&lt;br /&gt;
|-&lt;br /&gt;
| Feb 17, 2016 || 2016.1.1 (new versioning scheme)&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 2016 || 2016.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 17, 2016 || 2016.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 12, 2016 || 2016.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 19, 2016 || 2016.4.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 2016 || 2016.4.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 5, 2016 || 2016.4.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 28, 2016 || 2016.4.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Feb 23, 2017 || 2017.1.1&lt;br /&gt;
|-&lt;br /&gt;
| Mar 1, 2017 || 2017.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Apr 4, 2017 || 2017.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2017 || 2017.2.1 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Sep 20, 2017 || 2017.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Apr 11, 2018 || 2018.1.1 &lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2018 || 2018.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Dec 3, 2018 || 2018.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Jan 29, 2019 || 2018.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 2018.3.3 (not released)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2019 || 2018.3.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Apr 20, 2020 || 2018.3.5 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2020 || 2018.3.6 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Mar 14, 2019 || 2019.1.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 1, 2019 || 2019.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 11, 2020 || 2020.1.1&lt;br /&gt;
|-&lt;br /&gt;
| May 25, 2020 || 2020.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Jun 26, 2020 || 2020.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Oct 29, 2020 || 2020.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 6, 2020 || 2020.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 2020 || 2020.3.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 1, 2020 || 2020.3.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 19, 2020 || 2020.3.5 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Jan 24, 2021 || 2020.3.6 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Mar 21, 2021 || 2020.3.7 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Mar 25, 2021 || 2020.3.8 (bugfix release)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cycled default airports ==&lt;br /&gt;
&lt;br /&gt;
FlightGear did not start changing the default airport until version 2016.1 was released. At that time, the idea was that each new release would have a new default airport. This chart lists the default airports since 2016.1 was released.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Release !! ICAO !! Default Airport&lt;br /&gt;
|-&lt;br /&gt;
| 2016.1 || [[KSFO]] || San Francisco ''(transition)''&lt;br /&gt;
|-&lt;br /&gt;
| 2016.2 || [[LEBL]] || Barcelona&lt;br /&gt;
|-&lt;br /&gt;
| 2016.3 || [[SBRJ]] || Rio de Janeiro&lt;br /&gt;
|-&lt;br /&gt;
| 2016.4 || [[LSZH]] || Zürich&lt;br /&gt;
|-&lt;br /&gt;
| 2017.1 || [[ENBR]] || Bergen&lt;br /&gt;
|-&lt;br /&gt;
| 2017.2 || [[KBOS]] || Boston&lt;br /&gt;
|- &lt;br /&gt;
| 2017.3 || [[LKPR]] || Prague&lt;br /&gt;
|- &lt;br /&gt;
| 2018.1 || rowspan=&amp;quot;4&amp;quot; | [[PHNL]] || rowspan=&amp;quot;4&amp;quot; | Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2018.2 &lt;br /&gt;
|- &lt;br /&gt;
| 2018.3 &lt;br /&gt;
|- &lt;br /&gt;
| 2019.1 &lt;br /&gt;
|- &lt;br /&gt;
| 2020.1 || rowspan=&amp;quot;3&amp;quot; | [[BIKF]] || rowspan=&amp;quot;3&amp;quot; | Keflavik&lt;br /&gt;
|- &lt;br /&gt;
| 2020.2 &lt;br /&gt;
|- &lt;br /&gt;
| 2020.3 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://web.archive.org/web/*/http://www.flightgear.org/ Internet Archive: Wayback Machine for http://www.flightgear.org/ ]&lt;br /&gt;
* [http://web.archive.org/web/19981212014011/http://flightgear.org/ Old website on December 5, 1998]&lt;br /&gt;
* [http://web.archive.org/web/19990209082206/http://www.flightgear.org/Gallery/tucson.jpg link] (&amp;quot;A view from the ground near Tucson, AZ (KTUS)&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
* [http://web.archive.org/web/19990209050729/http://www.flightgear.org/Gallery/texture2.jpg link] (&amp;quot;Here's one of the Grand Canyon with a rock face texture. I know this looks funny, but I'm just experimenting here.&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
&lt;br /&gt;
{{Appendix|2=&lt;br /&gt;
* {{wikipedia|FlightGear}}&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Original Flight Gear Proposal] by David L. Murr (Revision 3.0.1)&lt;br /&gt;
* [ftp://flightgear.wo0t.de/flightgear-ftp/ FlightGear FTP Archive]&lt;br /&gt;
----&lt;br /&gt;
{{References}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=131389</id>
		<title>FlightGear history</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=131389"/>
		<updated>2021-04-25T11:58:06Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Release timeline */ update released versions and dates&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[FlightGear]] development started with an online proposal in 1996, using custom 3D graphics code. Development of an [[OpenGL]] based version was spearheaded by Curtis Olson starting in 1997. Many people have contributed to the project in the years since its inception.&lt;br /&gt;
&lt;br /&gt;
FlightGear incorporated other open-source resources, including the [[LaRCsim]] flight model from NASA, and freely available elevation data. The first working binaries, using OpenGL for 3D graphic code, came out in 1997. Enthusiastic development of newer versions for several years resulted in progressively more stable and advanced versions. By 2001, the team was releasing new beta versions regularly, and by 2005, the maturity of software lead to more widespread reviews, and increased popularity. 2007 marked a formal transition out of beta development with the release of version 1.0.0, ten years after FlightGear's first release in 1997.&lt;br /&gt;
&lt;br /&gt;
In 2008, version 1.9.0 of FlightGear included a major change from [[PLIB]] to [[OSG]], which caused the temporarily loss of some features like 3D clouds and shadows, while newly added features, such as particles, imparted another degree of realism to the simulation. &lt;br /&gt;
 &lt;br /&gt;
== Beginnings (1996-1997) ==&lt;br /&gt;
[[File:FG SUNHALO.JPG|thumb|270px|March 18, 1999: one of the oldest surviving screenshots of FlightGear. Back then, FlightGear was the only PC based flight simulator rendering the [[Moon|sun, moon, and celestial]] objects at the correct position, and under the correct lighting conditions, in the sky. ]]&lt;br /&gt;
[[File:Image103.gif|thumb|Original Win95 icon]]&lt;br /&gt;
The FlightGear project was conceived on April 8, 1996 by David Murr who proposed a new flight simulator to be developed by volunteers&amp;lt;ref&amp;gt;David Murr (Apr 9, 1996).  FlightGear proposal 1.0: [https://groups.google.com/forum/#!msg/rec.aviation.simulators/ny8HFBE5_T8/OdtIiGNGJc8J &amp;quot;A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@&amp;quot;].  Published on the rec.aviation.simulators newsgroup.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (1996).  FlightGear proposal 2.0: [http://www.flightgear.org/proposal-2.0 FLIGHT GEAR &amp;quot;This truly is as real as it gets!&amp;quot; - a proposal for a new flight simulator - REVISION 2.0].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Oct 29, 1996).  FlightGear proposal 3.0: [http://www.flightgear.org/proposal-3.0 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0 - Wednesday, 10.30.96, &amp;quot;The future of flight simulation is here&amp;quot;].  Published on the [http://ftp.igh.cnrs.fr/pub/flightgear/www/old-stuff/flight-gear.9610 flight-gear@infoplane.com mailing list].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Sep 11, 1998).  FlightGear proposal 3.0.1: [http://www.flightgear.org/proposal-3.0.1 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0.1 - Friday, Sep.11.98, &amp;quot;The future of flight simulation is here&amp;quot;].&amp;lt;/ref&amp;gt;.  Part of the initial goals were to develop 2D and 3D graphics routines for the simulator.  However this was a huge task that came to an unfinished halt at the start of 1997 as the main developer,  Eric Korpela, was finishing his thesis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Development of an OpenGL based version was spearheaded by Curtis Olsen starting in 1997, after the initial start in 1996. A large community response lead to many contributing to the project from its start in late '90s up to the present.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;''I was working at the University of Minnesota at the time, and had access to Sun and SGI graphical work stations which offered OpenGL for 3d graphics. OpenGl was just starting to become available on PC hardware with things like the 3dfx voodoo card. Somewhere at this point it occurred to me that a far better path would be to leverage an existing multi-platform 3d graphics system (like OpenGL) to build our flight simulator upon.''&lt;br /&gt;
&lt;br /&gt;
''So I proceeded to rough together a basic scenery system, pasted on the larcsim flight model, and in a relatively short time was able to show actual flight over real 3d terrain. Good, realistic 3d terrain was something the other existing flight sims at the time were pretty far behind on ... and I think my work was enough of a breakthrough that it got a lot of people excited about the possibilities.''&amp;quot;~Curt Olson &amp;lt;ref&amp;gt;Curtis Olson (Sep 28, 2015).  [http://forum.flightgear.org/viewtopic.php?f=42&amp;amp;t=27558&amp;amp;p=259048#p259021 Re: A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@].  Published on the FlightGear forum.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Rather than start entirely from scratch, FlightGear developers made use of the LaRCsim flight model from NASA, with OpenGL for 3D graphic code, and freely available elevation data. First working binaries came out in 1997, with an intense updating of newer versions for several years resulting in progressively more stable and advanced programs.&lt;br /&gt;
&lt;br /&gt;
== Versions 0.7–0.9 (2001–2003) ==&lt;br /&gt;
By 2001, the team was releasing new beta versions regularly (0.7.x, 0.8.0, over 2001-2003) and with 0.9.xx (2003-2006). Later in the decade, the rate of final public releases slowed, but had larger amounts of content (0.9.10, 1.0.0 etc.). The maturity of software by 2005 lead to more widespread reviews, and increased popularity. &lt;br /&gt;
&lt;br /&gt;
== Version 0.9.0-0.9.11 (2002-2007) ==&lt;br /&gt;
The use of version numbers slowed dramatically after the late 2002 release of version 0.9.0. Versions 0.9.9 (2005) and 0.9.10 (2006) had about 8 all-new or redone [[aircraft]] adding to a total of 70-90 aircraft. [[Nasal]] was also integrated into FlightGear in version 0.9.4. FlightGear 0.9.10 won Softpedia's &amp;quot;Pick&amp;quot; award (5 out of 5 stars) on June 3, 2006 as well as the &amp;quot;100% CLEAN&amp;quot; Softpedia award.&lt;br /&gt;
&lt;br /&gt;
Behind the scenes there was a 0.9.11-pre1 released in 2007 that ended up being superseded by FlightGear 1.0. The pre-version had about 33 new or redone aircraft.&lt;br /&gt;
&lt;br /&gt;
[[File:FG-A-10.jpg|thumb|270px|3D Cockpit panel for [[A-10]] in version 1.0.0 in 2008]]&lt;br /&gt;
&lt;br /&gt;
== Version 1.0 (2008) ==&lt;br /&gt;
The version number marked a formal transition out of beta development since the software's first release in 1997, ten years prior.&lt;br /&gt;
&lt;br /&gt;
== Version 1.9.0 (2008) ==&lt;br /&gt;
At the time version 1.9.0 was released FlightGear switched from [[PLIB]] to [[OSG]], which caused the temporary loss of some of the features like 3D clouds and shadows. On the contrary new features such as particles add another degree of realism to the simulation. Most aircraft developed for OSG do not work with older versions. The user is able to choose from 230 aircraft provided with 1.9.0, although only a few are included in the base package.&lt;br /&gt;
Version 1.9.1, released shortly afterwards, was a bug fix release.&lt;br /&gt;
&lt;br /&gt;
== Version 2.0.0 (2010) ==&lt;br /&gt;
FlightGear 2.0.0 reflects the maturation of the OpenSceneGraph port that started with the previous 1.9.0 release. In addition to many internal code improvements, FlightGear 2.0.0 marks the introduction of many new exciting improvements in the graphics and sound system, as well as improved usability of key features, and improved behavior of existing features. Highlights of this new version include: Dramatic new 3D clouds, dramatic lighting conditions, improved support for custom scenery, and many many new and detailed aircraft models. &lt;br /&gt;
&lt;br /&gt;
== Version 2.4.0 (2011) ==&lt;br /&gt;
Starting with version 2.4.0, the FlightGear team adopted a [[release plan]]. From then on, a new version is released every February and August.&lt;br /&gt;
&lt;br /&gt;
==Version 3.8.0/2016.1.0==&lt;br /&gt;
{{Main article|Release plan#Detailed time schedule and checklist}}&lt;br /&gt;
Following the cancellation of 3.6, the modern FlightGear team revised the release plan and process. New releases are essentially selected and tuned &amp;quot;nightlies&amp;quot; instead of special compilations.&lt;br /&gt;
&lt;br /&gt;
Also, in this release the concept of rotating default airports first started. All FlightGear releases after 2016.1 have unique default airports and 'codenames'.&lt;br /&gt;
&lt;br /&gt;
{{Main article|Release plan/Lessons learned#2016.1}}&lt;br /&gt;
&lt;br /&gt;
== Release timeline ==&lt;br /&gt;
Final build code release dates by year.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:40%; margin:auto&amp;quot;&lt;br /&gt;
! Date !! Version&lt;br /&gt;
|-&lt;br /&gt;
|July 17, 1997 || First major code release&lt;br /&gt;
|-&lt;br /&gt;
|September 23, 1997 || 0.12&lt;br /&gt;
|-&lt;br /&gt;
|December 9, 1997 || 0.15&lt;br /&gt;
|-&lt;br /&gt;
|December 17, 1997 || 0.18&lt;br /&gt;
|-&lt;br /&gt;
|December 30, 1997 || 0.19 (first binaries)&lt;br /&gt;
|-&lt;br /&gt;
|January 6, 1998 || 0.22&lt;br /&gt;
|-&lt;br /&gt;
|Mar 11 98 || 0.37&lt;br /&gt;
|-&lt;br /&gt;
|April 8, 1998 || 0.41&lt;br /&gt;
|-&lt;br /&gt;
|April 14, 1998 || 0.42&lt;br /&gt;
|-&lt;br /&gt;
|April 23, 1998 || 0.43&lt;br /&gt;
|-&lt;br /&gt;
|Apr 28, 1998 || 0.44&lt;br /&gt;
|-&lt;br /&gt;
|May 7, 1998 || 0.45&lt;br /&gt;
|-&lt;br /&gt;
|May 11, 1998 || 0.46&lt;br /&gt;
|-&lt;br /&gt;
|May 18, 1998 || 0.47&lt;br /&gt;
|-&lt;br /&gt;
|June 9, 1998 || 0.48&lt;br /&gt;
|-&lt;br /&gt;
|June 27, 1998 || 0.49&lt;br /&gt;
|-&lt;br /&gt;
|July 13, 1998 || 0.50&lt;br /&gt;
|-&lt;br /&gt;
|July 21, 1998 || 0.51&lt;br /&gt;
|-&lt;br /&gt;
|August 15, 1998 || 0.52&lt;br /&gt;
|-&lt;br /&gt;
|September 2, 1998 || 0.53&lt;br /&gt;
|-&lt;br /&gt;
|September 25, 1998 || 0.54&lt;br /&gt;
|-&lt;br /&gt;
|October 23, 1998 || 0.55&lt;br /&gt;
|-&lt;br /&gt;
|November 23, 1998 || 0.56&lt;br /&gt;
|-&lt;br /&gt;
|January 21, 1999 || 0.57&lt;br /&gt;
|-&lt;br /&gt;
|February 10, 1999 || 0.58&lt;br /&gt;
|-&lt;br /&gt;
|March 31, 1999 || 0.59&lt;br /&gt;
|-&lt;br /&gt;
|May 26, 1999 || 0.6.0&lt;br /&gt;
|-&lt;br /&gt;
| June 21, 1999 || 0.6.1 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2 | September 11, 1999 || 0.7.0 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|0.6.2 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|October 22, 1999 || 0.7.1 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|February 17, 2000 || 0.7.2 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|May 18, 2000 || 0.7.3 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|July 20, 2000 || 0.7.4&lt;br /&gt;
|-&lt;br /&gt;
|September 18, 2000 || 0.7.5&lt;br /&gt;
|-&lt;br /&gt;
|December 19, 2000 || 0.7.6&lt;br /&gt;
|-&lt;br /&gt;
|June 20, 2001 || 0.7.7&lt;br /&gt;
|-&lt;br /&gt;
|July 13, 2001 || 0.7.8&lt;br /&gt;
|-&lt;br /&gt;
| February 16, 2002 || 0.7.9&lt;br /&gt;
|-&lt;br /&gt;
| April 20, 2002 || 0.7.10&lt;br /&gt;
|-&lt;br /&gt;
| September 7, 2002 || 0.8.0&lt;br /&gt;
|-&lt;br /&gt;
| December 3, 2002 || 0.9.0&lt;br /&gt;
|-&lt;br /&gt;
| December 5, 2002 || 0.9.1 &lt;br /&gt;
|-&lt;br /&gt;
| June 4, 2003 || 0.9.2&lt;br /&gt;
|-&lt;br /&gt;
| October 24, 2003 || 0.9.3&lt;br /&gt;
|-&lt;br /&gt;
| March 26, 2004 || 0.9.4&lt;br /&gt;
|-&lt;br /&gt;
| July 29, 2004 || 0.9.5&lt;br /&gt;
|-&lt;br /&gt;
| October 12, 2004 || 0.9.6&lt;br /&gt;
|-&lt;br /&gt;
| January 18, 2005 || 0.9.8&lt;br /&gt;
|-&lt;br /&gt;
| November 17, 2005 || 0.9.9&lt;br /&gt;
|-&lt;br /&gt;
| April 5, 2006 || 0.9.10&lt;br /&gt;
|-&lt;br /&gt;
| May 2007 || 0.9.11-pre1&lt;br /&gt;
|-&lt;br /&gt;
| December 17, 2007 || 1.0.0&lt;br /&gt;
|-&lt;br /&gt;
| December 22, 2008 || 1.9.0 &lt;br /&gt;
|-&lt;br /&gt;
| January 25, 2009 || 1.9.1&lt;br /&gt;
|-&lt;br /&gt;
| February 25, 2010 || 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| August 17, 2011 || 2.4.0&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2012 || 2.6.0&lt;br /&gt;
|-&lt;br /&gt;
| August 17, 2012 || 2.8.0&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2013 || 2.10&lt;br /&gt;
|-&lt;br /&gt;
| September 21, 2013 || 2.12&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2014 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| October 15, 2014 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2015 || 3.4&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 3.6 (unreleased, see [[FlightGear Newsletter November 2015#FlightGear v3.6 canceled|here]])&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2016 || 2016.1.1 (new versioning scheme)&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 2016 || 2016.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 17, 2016 || 2016.2.1&lt;br /&gt;
|-&lt;br /&gt;
| September 12, 2016 || 2016.3.1&lt;br /&gt;
|-&lt;br /&gt;
| November 19, 2016 || 2016.4.1&lt;br /&gt;
|-&lt;br /&gt;
| November 23, 2016 || 2016.4.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| December 5, 2016 || 2016.4.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| December 28, 2016 || 2016.4.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| February 23, 2017 || 2017.1.1&lt;br /&gt;
|-&lt;br /&gt;
| March 1, 2017 || 2017.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| April 4, 2017 || 2017.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2017 || 2017.2.1 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| September 20, 2017 || 2017.3.1&lt;br /&gt;
|-&lt;br /&gt;
| April 11, 2018 || 2018.1.1 &lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2018 || 2018.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Dec 3, 2018 || 2018.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Jan 29, 2019 || 2018.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 2018.3.3 (not released)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2019 || 2018.3.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Apr 20, 2020 || 2018.3.5 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2020 || 2018.3.6 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Mar 14, 2019 || 2019.1.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 1, 2019 || 2019.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 11, 2020 || 2020.1.1&lt;br /&gt;
|-&lt;br /&gt;
| May 25, 2020 || 2020.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Jun 26, 2020 || 2020.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Oct 29, 2020 || 2020.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 6, 2020 || 2020.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 2020 || 2020.3.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 1, 2020 || 2020.3.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 19, 2020 || 2020.3.5 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Jan 24, 2021 || 2020.3.6 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Mar 21, 2021 || 2020.3.7 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Mar 25, 2021 || 2020.3.8 (bugfix release)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cycled default airports ==&lt;br /&gt;
&lt;br /&gt;
FlightGear did not start changing the default airport until version 2016.1 was released. At that time, the idea was that each new release would have a new default airport. This chart lists the default airports since 2016.1 was released.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Release !! ICAO !! Default Airport&lt;br /&gt;
|-&lt;br /&gt;
| 2016.1 || [[KSFO]] || San Francisco ''(transition)''&lt;br /&gt;
|-&lt;br /&gt;
| 2016.2 || [[LEBL]] || Barcelona&lt;br /&gt;
|-&lt;br /&gt;
| 2016.3 || [[SBRJ]] || Rio de Janeiro&lt;br /&gt;
|-&lt;br /&gt;
| 2016.4 || [[LSZH]] || Zürich&lt;br /&gt;
|-&lt;br /&gt;
| 2017.1 || [[ENBR]] || Bergen&lt;br /&gt;
|-&lt;br /&gt;
| 2017.2 || [[KBOS]] || Boston&lt;br /&gt;
|- &lt;br /&gt;
| 2017.3 || [[LKPR]] || Prague&lt;br /&gt;
|- &lt;br /&gt;
| 2018.1 || rowspan=&amp;quot;4&amp;quot; | [[PHNL]] || rowspan=&amp;quot;4&amp;quot; | Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2018.2 &lt;br /&gt;
|- &lt;br /&gt;
| 2018.3 &lt;br /&gt;
|- &lt;br /&gt;
| 2019.1 &lt;br /&gt;
|- &lt;br /&gt;
| 2020.1 || rowspan=&amp;quot;3&amp;quot; | [[BIKF]] || rowspan=&amp;quot;3&amp;quot; | Keflavik&lt;br /&gt;
|- &lt;br /&gt;
| 2020.2 &lt;br /&gt;
|- &lt;br /&gt;
| 2020.3 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://web.archive.org/web/*/http://www.flightgear.org/ Internet Archive: Wayback Machine for http://www.flightgear.org/ ]&lt;br /&gt;
* [http://web.archive.org/web/19981212014011/http://flightgear.org/ Old website on December 5, 1998]&lt;br /&gt;
* [http://web.archive.org/web/19990209082206/http://www.flightgear.org/Gallery/tucson.jpg link] (&amp;quot;A view from the ground near Tucson, AZ (KTUS)&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
* [http://web.archive.org/web/19990209050729/http://www.flightgear.org/Gallery/texture2.jpg link] (&amp;quot;Here's one of the Grand Canyon with a rock face texture. I know this looks funny, but I'm just experimenting here.&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
&lt;br /&gt;
{{Appendix|2=&lt;br /&gt;
* {{wikipedia|FlightGear}}&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Original Flight Gear Proposal] by David L. Murr (Revision 3.0.1)&lt;br /&gt;
* [ftp://flightgear.wo0t.de/flightgear-ftp/ FlightGear FTP Archive]&lt;br /&gt;
----&lt;br /&gt;
{{References}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=TerraMaster&amp;diff=131118</id>
		<title>TerraMaster</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=TerraMaster&amp;diff=131118"/>
		<updated>2021-03-28T22:11:59Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: after 6 years, i don't think we need the note about the old google code hosted scenery site any more...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Software&lt;br /&gt;
|title             = TerraMaster&lt;br /&gt;
|logo              =&lt;br /&gt;
|image             = TerraMaster r32 - Global view.png&lt;br /&gt;
|developedby       = reeed, portree kid&lt;br /&gt;
|initialrelease    = July 18, 2011&lt;br /&gt;
|latestrelease     = January 30, 2019 (v2.03)&lt;br /&gt;
|writtenin         = Java&lt;br /&gt;
|os                =&lt;br /&gt;
|platform          = Cross-platform&lt;br /&gt;
|developmentstatus =&lt;br /&gt;
|type              = Scenery manager&lt;br /&gt;
|license           = [[GNU GPL]] v2&lt;br /&gt;
|website           = https://portree-kid.github.io/terramaster/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''TerraMaster''' is a graphical [[scenery]] manager that gives you a quick overview of your scenery and makes it easier to maintain that scenery.  TerraMaster is a cross platform stand alone application written in Java that synchronises [[TerraSync]] scenery tiles you select with the FlightGear Scenery Database.  You can delete scenery tiles if the TerraSync scenery directory takes too much space, and you can also search for airports.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
=== Map ===&lt;br /&gt;
When TerraMaster starts it will show a map of the Earth. The map can be zoomed and one or more 1x1 degree tiles can be selected before they are synced or deleted. All the airports within a tile can be shown, and airports can be searched for and be shown.&lt;br /&gt;
&lt;br /&gt;
=== Icons ===&lt;br /&gt;
The top row contains a status field, two groups of icon buttons, a search field and a sync progress bar.  The icons will be grayed out when they can not be used.  For more detailed directions, see the section [[#Using|Using]] below. From left to right:&lt;br /&gt;
* ''Status field''. Shows the name of the tile that was last selected.&lt;br /&gt;
&lt;br /&gt;
* ''Sync icon''. Syncs the tiles currently selected.&lt;br /&gt;
* ''Clock icon''. Syncs old tiles.&lt;br /&gt;
* ''Flight icon''. Opens a dialog to help selecting a route.&lt;br /&gt;
* ''Trash can icon''. Deletes the currently selected tiles.&lt;br /&gt;
* ''Eye icon''. Shows all airports in the first selected tile of the currently selected tiles.&lt;br /&gt;
* ''Stop button''. Currently does not work.&lt;br /&gt;
&lt;br /&gt;
* ''Empty paper''. Hides all shown airports.&lt;br /&gt;
* ''Globe icon''. Zooms out to the global view.&lt;br /&gt;
* ''Gear icon''. Opens a dialogue to select the location of the TerraSync scenery directory.&lt;br /&gt;
&lt;br /&gt;
* ''Search field''. Used to search for airports.&lt;br /&gt;
&lt;br /&gt;
* ''Sync progress bar''. Only visible during syncing.&lt;br /&gt;
&lt;br /&gt;
=== Tile border colours ===&lt;br /&gt;
The tiles are colour coded to represent the state of the tiles:&lt;br /&gt;
&lt;br /&gt;
* '''Green''' tiles have both terrain and objects.&lt;br /&gt;
* '''Amber/Yellow''' tiles has terrain but no objects. (And are possibly unsyncable - see &amp;quot;Bug&amp;quot;, below.)&lt;br /&gt;
* '''Red''' tiles are currently selected for synchronisation.&lt;br /&gt;
* '''Blue''' tiles are currently being synchronised.&lt;br /&gt;
&lt;br /&gt;
The blue tiles that are being synced will change colour to green or amber/yellow as they are synced. Tiles that get no border after they have been synced don't contain terrain or objects and are usually located in open seas.&lt;br /&gt;
&lt;br /&gt;
== Using ==&lt;br /&gt;
[[File:TerraMaster r32 - Mouse hint.png|thumb|Tile information pop-up when holding the mouse pointer over a tile.]]&lt;br /&gt;
[[File:TerraMaster r32 - Airports in selected tile.png|thumb|Showing all airports in a selected tile using the &amp;quot;eye&amp;quot; button.]]&lt;br /&gt;
[[File:TerraMaster r32 - Searching for an airport.png|thumb|Searching for an airport.]]&lt;br /&gt;
&lt;br /&gt;
=== Zooming and panning ===&lt;br /&gt;
TerraMaster with the global view.  Left-clicking will zoom you in on an area.&lt;br /&gt;
&lt;br /&gt;
'''Zoom''' using the scroll wheel.&lt;br /&gt;
&lt;br /&gt;
'''Pan''' around by dragging the map while pressing the right mouse button.&lt;br /&gt;
&lt;br /&gt;
Get '''back to global view''' by clicking the &amp;quot;globe&amp;quot; icon.&lt;br /&gt;
&lt;br /&gt;
=== Showing tile information ===&lt;br /&gt;
To get some information about a downloaded tile, hold the mouse pointer over it.&lt;br /&gt;
&lt;br /&gt;
A pop-up box will show the name of that tile, if there are terrain and objects in it and what airports it contains. This only works if a tile has been synced, either with Terrasync or TerraMaster.&lt;br /&gt;
&lt;br /&gt;
=== Syncing tiles ===&lt;br /&gt;
To '''select just one tile''' left-click it. The scenery for download is available in 1x1 degree tiles.  &lt;br /&gt;
&lt;br /&gt;
To '''select more tiles''' press the Ctrl key while left-clicking or left-dragging over the wanted tiles.  If you accidentally selected a tile to many, '''deselect tiles''' using it Ctrl+left-click.  You can also deselect several tiles using Ctrl+left-click and dragging.&lt;br /&gt;
&lt;br /&gt;
'''Start the update and/or download''' clicking the &amp;quot;sync&amp;quot; icon.  The tiles will be downloaded starting from the first tile you selected and proceed in order of distance from it.  If you are downloading tiles for a long flight you should then begin by selecting a tile close to the departure airport.&lt;br /&gt;
&lt;br /&gt;
=== Syncing old tiles ===&lt;br /&gt;
&lt;br /&gt;
'''Start the update and/or download''' clicking the 2nd &amp;quot;sync&amp;quot; icon. All previously downloaded tiles that are older than the age given in the settings, will be downloaded.&lt;br /&gt;
&lt;br /&gt;
=== Deleting tiles ===&lt;br /&gt;
You can delete files from the TerraSync scenery by selecting the tiles you want to delete and click the &amp;quot;trash can&amp;quot; icon.&lt;br /&gt;
&lt;br /&gt;
=== Showing all airports in a tile ===&lt;br /&gt;
To show all airports in a tile, select it and click on the &amp;quot;eye&amp;quot; icon.  To hide the airports again, click the &amp;quot;empty paper&amp;quot; icon.&lt;br /&gt;
&lt;br /&gt;
=== Searching for an airport ===&lt;br /&gt;
You can search for airports using the search field and pressing enter.  The airports location an ICAO code will be shown in white on the map.  If you don't see it, zoom out.  ICAO airport codes works best, but sometimes the airport's name also work.  To hide the airports again, click the &amp;quot;empty paper&amp;quot; icon.&lt;br /&gt;
&lt;br /&gt;
Be warned that the search function is rather slow as it uses a web query to mpmap.flightgear.org and that it also doesn't tell if there was no airports found.&lt;br /&gt;
&lt;br /&gt;
== Video tutorial ==&lt;br /&gt;
Here is a short video tutorial:&lt;br /&gt;
{{#ev:youtube|YxWV4wk_dHw}}&lt;br /&gt;
&lt;br /&gt;
== Tips ==&lt;br /&gt;
* '''Before [[multiplayer]] events''' it might be an idea to sync the related tiles, even more so if you know that someone has crated new buildings etc. and got them into the [[FlightGear Scenery Database|scenery database]].&lt;br /&gt;
* If you have very little hard drive space left you can delete tiles you rarely or never fly within.&lt;br /&gt;
* Starting TerraMaster in a console window will let you see the sync process, which can be useful if the sync stalls for unknown reasons.&lt;br /&gt;
* If you already have a synchronisation running and want to add more tiles to be synced, just mark more tiles as above with Ctrl + leftclick and drag to mark more tiles and press the sync button again.&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
Before installing, make sure you have Java 6 or higher, as it is needed.&lt;br /&gt;
&lt;br /&gt;
# Download the newest version of TerraMaster from the [https://github.com/Portree-Kid/terramaster/releases releases page].&lt;br /&gt;
# Create a shortcut or script that runs &amp;lt;code&amp;gt;java -jar terramaster.jar&amp;lt;/code&amp;gt;.&lt;br /&gt;
# When running TerraMaster the first time, click the &amp;quot;gear&amp;quot; icon and select the folder where your TerraSync scenery is located.  On some machines you might have to manually edit the property file to have it pointing to the TerraSync directory.&lt;br /&gt;
# Done!&lt;br /&gt;
&lt;br /&gt;
== Models ==&lt;br /&gt;
&amp;lt;strike&amp;gt;Don't forget that the contents of &amp;lt;tt&amp;gt;''TerraSync/Models''&amp;lt;/tt&amp;gt; will have to be copied to &amp;lt;tt&amp;gt;''[[$FG_ROOT]]/Models''&amp;lt;/tt&amp;gt; for them to be visible.&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{note|Since at least FG v3.4, it is no longer necessary to move or copy the &amp;lt;tt&amp;gt;''TerraSync/Models''&amp;lt;/tt&amp;gt; folder. FlightGear will find and use the models in the &amp;lt;tt&amp;gt;''TerraSync/Models''&amp;lt;/tt&amp;gt; directory with no problems.}}&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
* [[FlightGear Admin Wizard]]&lt;br /&gt;
&lt;br /&gt;
== External link ==&lt;br /&gt;
* {{forum link|title=TerraMaster: a new scenery manager|t=12050}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Scenery software]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=131079</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=131079"/>
		<updated>2021-03-25T13:29:00Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* General Options */ add --texture-cache-dir option to the list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]].&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== General Options ====&lt;br /&gt;
&lt;br /&gt;
 --help, -h                   Show the most relevant command line options&lt;br /&gt;
 --verbose, -v                Show all command line options when combined with --help or -h&lt;br /&gt;
 --fg-root=path               Specify the root data path&lt;br /&gt;
 --fg-scenery=path[:path...]  Specify the base scenery path;&lt;br /&gt;
                                Defaults to [[$FG_ROOT]]/Scenery&lt;br /&gt;
 --fg-aircraft=path           Specify additional aircraft directory path(s)&lt;br /&gt;
                                (alternatively, you can use --aircraft-dir to&lt;br /&gt;
                                target a specific aircraft in a given&lt;br /&gt;
                                directory)&lt;br /&gt;
 --texture-cache-dir=path     Set the DDS texture cache directory to be different&lt;br /&gt;
                                than the default location&lt;br /&gt;
 --language=code              Select the language for this session&lt;br /&gt;
 --launcher                   Enable Qt launcher &lt;br /&gt;
 --disable-splash-screen      Disable splash screen&lt;br /&gt;
 --enable-splash-screen       Enable splash screen&lt;br /&gt;
 --disable-mouse-pointer      Disable extra mouse pointer&lt;br /&gt;
 --enable-mouse-pointer       Enable extra mouse pointer&lt;br /&gt;
                                (i.e. for full screen Voodoo based cards)&lt;br /&gt;
 --disable-random-objects     Exclude random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --enable-random-objects      Include random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --disable-ai-models          Disable the AI subsystem.&lt;br /&gt;
                                (This also disables showing the models of other&lt;br /&gt;
                                 multiplayer aircraft)&lt;br /&gt;
 --enable-ai-models           Enable the AI subsystem.&lt;br /&gt;
 --disable-ai-traffic         Disable the autogenerated traffic subsystem.&lt;br /&gt;
 --enable-ai-traffic          Enable the autogenerated traffic subsystem.&lt;br /&gt;
 --disable-freeze             Start in a running state&lt;br /&gt;
 --enable-freeze              Start in a frozen state&lt;br /&gt;
 --disable-fuel-freeze        Fuel is consumed normally&lt;br /&gt;
 --enable-fuel-freeze         Fuel tank quantity forced to remain constant&lt;br /&gt;
 --disable-clock-freeze       Clock advances normally&lt;br /&gt;
 --enable-clock-freeze        Do not advance clock&lt;br /&gt;
 --enable-auto-coordination   Enable auto coordination - rudder and&lt;br /&gt;
                              ailerons will be controlled together&lt;br /&gt;
 --disable-auto-coordination  Disable auto coordination (default)&lt;br /&gt;
 --browser-app=path           Specify path to your web browser&lt;br /&gt;
 --prop:foo=bar               Set property named &amp;quot;foo&amp;quot; to value &amp;quot;bar&amp;quot;&lt;br /&gt;
 --config=path                Load additional properties from path&lt;br /&gt;
 --units-feet                 Use feet for distances&lt;br /&gt;
 --units-meters               Use meters for distances&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
&lt;br /&gt;
 --disable-panel              Disable instrument panel&lt;br /&gt;
 --enable-panel               Enable instrument panel&lt;br /&gt;
 --disable-sound              Disable sound effects&lt;br /&gt;
 --enable-sound               Enable sound effects&lt;br /&gt;
 --ai-scenario=scenario       Add and enable a new scenario. Multiple options&lt;br /&gt;
                              are allowed. Scenarios are in /[[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
==== Aircraft ====&lt;br /&gt;
&lt;br /&gt;
 --aircraft=name              Select an aircraft profile as defined by a top&lt;br /&gt;
                              level -set.xml&lt;br /&gt;
 --aircraft-dir=path          Specify the exact directory to use for the&lt;br /&gt;
                              aircraft (normally not required, but may be&lt;br /&gt;
                              useful). Interpreted relatively to the&lt;br /&gt;
                              current directory. Causes the &amp;lt;path-cache&amp;gt;&lt;br /&gt;
                              from autosave_X_Y.xml, as well as&lt;br /&gt;
                              --fg-aircraft options and the FG_AIRCRAFT&lt;br /&gt;
                              environment variable to be bypassed.&lt;br /&gt;
 --show-aircraft              Print a list of the currently available&lt;br /&gt;
                              aircraft types&lt;br /&gt;
&lt;br /&gt;
==== Flight Model ====&lt;br /&gt;
&lt;br /&gt;
 --fdm=name                   Select the core flight dynamics model&lt;br /&gt;
                              Can be one of jsb, larcsim, yasim, magic,&lt;br /&gt;
                              balloon, ada, external, or null&lt;br /&gt;
 --aero=name                  Select aircraft aerodynamics model to load&lt;br /&gt;
 --model-hz=n                 Run the FDM this rate (iterations per second)&lt;br /&gt;
 --speed=n                    Run the FDM 'n' times faster than real time&lt;br /&gt;
 --notrim                     Do NOT attempt to trim the model&lt;br /&gt;
                              (only with fdm=jsbsim)&lt;br /&gt;
 --on-ground                  Start at ground level (default)&lt;br /&gt;
 --in-air                     Start in air (implied when using --altitude)&lt;br /&gt;
&lt;br /&gt;
==== Initial Position and Orientation ====&lt;br /&gt;
&lt;br /&gt;
 --airport=ID                 Specify airport (e.g. KOAK)&lt;br /&gt;
 --runway=rwy_no              Specify starting runway (must also specify an&lt;br /&gt;
                              airport)&lt;br /&gt;
 --vor=ID                     Specify starting position relative to a VOR&lt;br /&gt;
 --ndb=ID                     Specify starting position relative to an NDB&lt;br /&gt;
 --fix=ID                     Specify starting position relative to a fix&lt;br /&gt;
 --parkpos=NAME               Specify a gate at the airport (e.g. 747d11)&lt;br /&gt;
 --offset-distance=nm         Specify distance to reference point (statute&lt;br /&gt;
                              miles)&lt;br /&gt;
 --offset-azimuth=degrees     Specify heading to reference point&lt;br /&gt;
 --lon=degrees                Starting longitude (west = -)&lt;br /&gt;
 --lat=degrees                Starting latitude (south = -)&lt;br /&gt;
 --altitude=value             Starting altitude&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --heading=degrees            Specify heading (yaw) angle (Psi)&lt;br /&gt;
 --roll=degrees               Specify roll angle (Phi)&lt;br /&gt;
 --pitch=degrees              Specify pitch angle (Theta)&lt;br /&gt;
 --uBody=units_per_sec        Specify velocity along the body X axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vBody=units_per_sec        Specify velocity along the body Y axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --wBody=units_per_sec        Specify velocity along the body Z axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vc=knots                   Specify initial airspeed&lt;br /&gt;
 --mach=num                   Specify initial mach number&lt;br /&gt;
 --glideslope=degrees         Specify flight path angle (can be positive)&lt;br /&gt;
 --roc=fpm                    Specify initial climb rate (can be negative)&lt;br /&gt;
&lt;br /&gt;
==== Rendering Options ====&lt;br /&gt;
&lt;br /&gt;
 --bpp=depth                  Specify the bits per pixel&lt;br /&gt;
 --fog-disable                Disable fog/haze&lt;br /&gt;
 --fog-fastest                Enable fastest fog/haze&lt;br /&gt;
 --fog-nicest                 Enable nicest fog/haze&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --disable-enhanced-lighting  Disable enhanced runway lighting&lt;br /&gt;
 --enable-enhanced-lighting   Enable enhanced runway lighting&lt;br /&gt;
 --season=winter              Enable snow covered scenery&lt;br /&gt;
 --disable-distance-attenuation&lt;br /&gt;
                              Disable runway light distance attenuation&lt;br /&gt;
 --enable-distance-attenuation&lt;br /&gt;
                              Enable runway light distance attenuation&lt;br /&gt;
 --disable-specular-highlight&lt;br /&gt;
                              Disable specular reflections on textured&lt;br /&gt;
                              objects&lt;br /&gt;
 --enable-specular-highlight  Enable specular reflections on textured objects&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --fov=degrees                Specify field of view angle&lt;br /&gt;
 --disable-fullscreen         Disable fullscreen mode&lt;br /&gt;
 --enable-fullscreen          Enable fullscreen mode&lt;br /&gt;
 --shading-flat               Enable flat shading&lt;br /&gt;
 --shading-smooth             Enable smooth shading&lt;br /&gt;
 --disable-wireframe          Disable wireframe drawing mode&lt;br /&gt;
 --enable-wireframe           Enable wireframe drawing mode&lt;br /&gt;
 --geometry=WxH               Specify window geometry/resolution (640x480, etc)&lt;br /&gt;
 --view-offset=value          Specify the default forward view direction as&lt;br /&gt;
                              an offset from straight ahead. Allowable values&lt;br /&gt;
                              are LEFT, RIGHT, CENTER, or a specific number&lt;br /&gt;
                              in degrees&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --texture-filtering=number   Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
==== Hud Options ====&lt;br /&gt;
&lt;br /&gt;
 --disable-hud                Disable Heads Up Display (HUD)&lt;br /&gt;
 --enable-hud                 Enable Heads Up Display (HUD)&lt;br /&gt;
 --disable-anti-alias-hud     Disable anti-aliased HUD&lt;br /&gt;
 --enable-anti-alias-hud      Enable anti-aliased HUD&lt;br /&gt;
 --disable-hud-3d             Disable 3D HUD&lt;br /&gt;
 --enable-hud-3d              Enable 3D HUD&lt;br /&gt;
 --hud-tris                   Hud displays number of triangles rendered&lt;br /&gt;
 --hud-culled                 Hud displays percentage of triangles culled&lt;br /&gt;
&lt;br /&gt;
==== Time Options ====&lt;br /&gt;
&lt;br /&gt;
 --timeofday={dawn,noon,dusk,midnight}&lt;br /&gt;
                              Specify a time of day&lt;br /&gt;
 --time-offset=[+-]hh:mm:ss   Add this time offset&lt;br /&gt;
 --time-match-real            Synchronize time with current time at chosen airport&lt;br /&gt;
 --time-match-local           Synchronize time with system time of computer&lt;br /&gt;
 --start-date-sys=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              system time&lt;br /&gt;
 --start-date-gmt=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Greenwich Mean Time&lt;br /&gt;
 --start-date-lat=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Local Aircraft Time&lt;br /&gt;
&lt;br /&gt;
==== Network Options ====&lt;br /&gt;
&lt;br /&gt;
 --httpd=port                 Enable http server on the specified port&lt;br /&gt;
 --telnet=port                Enable telnet server on the specified port&lt;br /&gt;
 --jpg-httpd=port             Enable screen shot http server on the specified&lt;br /&gt;
                                port&lt;br /&gt;
&lt;br /&gt;
==== MultiPlayer Options ====&lt;br /&gt;
&lt;br /&gt;
 --callsign=name              Assign a unique name to a player&lt;br /&gt;
 --multiplay={in|out},hz,address,port&lt;br /&gt;
                              Specify multipilot communication settings&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
==== Route/Way Point Options ====&lt;br /&gt;
&lt;br /&gt;
 --wp=ID[@alt]                Specify a waypoint for the GC autopilot;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --flight-plan=file           Read all waypoints from a file&lt;br /&gt;
&lt;br /&gt;
==== IO Options ====&lt;br /&gt;
&lt;br /&gt;
 --generic=params             Open connection using a predefined&lt;br /&gt;
                              communication interface and a preselected&lt;br /&gt;
                              communication protocol&lt;br /&gt;
 --garmin=params              Open connection using the Garmin GPS protocol&lt;br /&gt;
 --joyclient=params           Open connection to an Agwagon joystick&lt;br /&gt;
 --jsclient=params            Open connection to a remote joystick&lt;br /&gt;
 --native-ctrls=params        Open connection using the FG Native Controls&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native-fdm=params          Open connection using the FG Native FDM&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native=params              Open connection using the FG Native protocol&lt;br /&gt;
 --nmea=params                Open connection using the NMEA protocol&lt;br /&gt;
 --opengc=params              Open connection using the OpenGC protocol&lt;br /&gt;
 --props=params               Open connection using the interactive property&lt;br /&gt;
                              manager (LEGACY/DEAD DO NOT USE same as --telnet)&lt;br /&gt;
 --pve=params                 Open connection using the PVE protocol&lt;br /&gt;
 --ray=params                 Open connection using the Ray Woodworth motion&lt;br /&gt;
                              chair protocol&lt;br /&gt;
 --rul=params                 Open connection using the RUL protocol&lt;br /&gt;
 --atc610x                    Enable atc610x interface&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: --generic=\\.\COM10,out,1,/tmp/data.xml,myproto&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
==== Avionics Options ====&lt;br /&gt;
&lt;br /&gt;
 --com1=frequency             Set the COM1 radio frequency.&lt;br /&gt;
 --com2=frequency             Set the COM2 radio frequency.&lt;br /&gt;
 --nav1=[radial:]frequency    Set the NAV1 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --nav2=[radial:]frequency    Set the NAV2 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --adf=[rotation:]frequency   Set the ADF radio frequency, optionally&lt;br /&gt;
                              preceded by a card rotation.&lt;br /&gt;
 --dme={nav1|nav2|frequency}  Slave the ADF to one of the NAV radios, or set&lt;br /&gt;
                              its internal frequency.&lt;br /&gt;
&lt;br /&gt;
==== Environment Options ====&lt;br /&gt;
&lt;br /&gt;
 --disable-real-weather-fetch Disable METAR based real weather fetching&lt;br /&gt;
 --enable-real-weather-fetch  Enable METAR based real weather fetching (this&lt;br /&gt;
                              requires an open internet connection)&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
 --random-wind&lt;br /&gt;
 --metar=&amp;quot;metar string&amp;quot;       Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
==== Situation Options ====&lt;br /&gt;
&lt;br /&gt;
 --failure={pitot|static|system|vacuum}&lt;br /&gt;
                              Fail the pitot, static, vacuum, or electrical&lt;br /&gt;
                              system (repeat the option for multiple system&lt;br /&gt;
                              failures).&lt;br /&gt;
&lt;br /&gt;
==== Debugging Options ====&lt;br /&gt;
&lt;br /&gt;
 --log-level={bulk|debug|info|warn|alert}&lt;br /&gt;
                              Set the logging level for this session.&lt;br /&gt;
                              0=verbose, 5=alerts only&lt;br /&gt;
                              See also [[Commonly used debugging tools#fgfs.log]]&lt;br /&gt;
 --pid=/pathto/some/file.pid  Write current PID into file.&lt;br /&gt;
 --trace-read=property        Trace the reads for a property;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --trace-write=property       Trace the writes for a property;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
&lt;br /&gt;
=== Source files ===&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;br /&gt;
[[pl:Opcje wiersza poleceń]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=129988</id>
		<title>FlightGear history</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=129988"/>
		<updated>2021-01-25T22:25:04Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Release timeline */ added 2020.3.5 and 2020.3.6...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[FlightGear]] development started with an online proposal in 1996, using custom 3D graphics code. Development of an [[OpenGL]] based version was spearheaded by Curtis Olson starting in 1997. Many people have contributed to the project in the years since its inception.&lt;br /&gt;
&lt;br /&gt;
FlightGear incorporated other open-source resources, including the LaRCsim flight model from NASA, and freely available elevation data. The first working binaries, using OpenGL for 3D graphic code, came out in 1997. Enthusiastic development of newer versions for several years resulted in progressively more stable and advanced versions. By 2001, the team was releasing new beta versions regularly, and by 2005, the maturity of software lead to more widespread reviews, and increased popularity. 2007 marked a formal transition out of beta development with the release of version 1.0.0, ten years after FlightGear's first release in 1997.&lt;br /&gt;
&lt;br /&gt;
In 2008, version 1.9.0 of FlightGear included a major change from [[PLIB]] to [[OSG]], which caused the temporarily loss of some features like 3D clouds and shadows, while newly added features, such as particles, imparted another degree of realism to the simulation. &lt;br /&gt;
 &lt;br /&gt;
== Beginnings (1996-1997) ==&lt;br /&gt;
[[File:FG SUNHALO.JPG|thumb|270px|March 18, 1999: one of the oldest surviving screenshots of FlightGear. Back then, FlightGear was the only PC based flight simulator rendering the [[Moon|sun, moon, and celestial]] objects at the correct position, and under the correct lighting conditions, in the sky. ]]&lt;br /&gt;
[[File:Image103.gif|thumb|Original Win95 icon]]&lt;br /&gt;
The FlightGear project was conceived on April 8, 1996 by David Murr who proposed a new flight simulator to be developed by volunteers&amp;lt;ref&amp;gt;David Murr (Apr 9, 1996).  FlightGear proposal 1.0: [https://groups.google.com/forum/#!msg/rec.aviation.simulators/ny8HFBE5_T8/OdtIiGNGJc8J &amp;quot;A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@&amp;quot;].  Published on the rec.aviation.simulators newsgroup.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (1996).  FlightGear proposal 2.0: [http://www.flightgear.org/proposal-2.0 FLIGHT GEAR &amp;quot;This truly is as real as it gets!&amp;quot; - a proposal for a new flight simulator - REVISION 2.0].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Oct 29, 1996).  FlightGear proposal 3.0: [http://www.flightgear.org/proposal-3.0 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0 - Wednesday, 10.30.96, &amp;quot;The future of flight simulation is here&amp;quot;].  Published on the [http://ftp.igh.cnrs.fr/pub/flightgear/www/old-stuff/flight-gear.9610 flight-gear@infoplane.com mailing list].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Sep 11, 1998).  FlightGear proposal 3.0.1: [http://www.flightgear.org/proposal-3.0.1 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0.1 - Friday, Sep.11.98, &amp;quot;The future of flight simulation is here&amp;quot;].&amp;lt;/ref&amp;gt;.  Part of the initial goals were to develop 2D and 3D graphics routines for the simulator.  However this was a huge task that came to an unfinished halt at the start of 1997 as the main developer,  Eric Korpela, was finishing his thesis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Development of an [[OpenGL]] based version was spearheaded by Curtis Olsen starting in 1997, after the initial start in 1996. A large community response lead to many contributing to the project from its start in late '90s up to the present.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;''I was working at the University of Minnesota at the time, and had access to Sun and SGI graphical work stations which offered OpenGL for 3d graphics. OpenGl was just starting to become available on PC hardware with things like the 3dfx voodoo card. Somewhere at this point it occurred to me that a far better path would be to leverage an existing multi-platform 3d graphics system (like OpenGL) to build our flight simulator upon.''&lt;br /&gt;
&lt;br /&gt;
''So I proceeded to rough together a basic scenery system, pasted on the larcsim flight model, and in a relatively short time was able to show actual flight over real 3d terrain. Good, realistic 3d terrain was something the other existing flight sims at the time were pretty far behind on ... and I think my work was enough of a breakthrough that it got a lot of people excited about the possibilities.''&amp;quot;~Curt Olson &amp;lt;ref&amp;gt;Curtis Olson (Sep 28, 2015).  [http://forum.flightgear.org/viewtopic.php?f=42&amp;amp;t=27558&amp;amp;p=259048#p259021 Re: A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@].  Published on the FlightGear forum.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Rather than start entirely from scratch, FlightGear developers made use of the LaRCsim flight model from NASA, with OpenGL for 3D graphic code, and freely available elevation data. First working binaries came out in 1997, with an intense updating of newer versions for several years resulting in progressively more stable and advanced programs.&lt;br /&gt;
&lt;br /&gt;
== Versions 0.7–0.9 (2001–2003) ==&lt;br /&gt;
By 2001, the team was releasing new beta versions regularly (0.7.x, 0.8.0, over 2001-2003) and with 0.9.xx (2003-2006). Later in the decade, the rate of final public releases slowed, but had larger amounts of content (0.9.10, 1.0.0 etc.). The maturity of software by 2005 lead to more widespread reviews, and increased popularity. &lt;br /&gt;
&lt;br /&gt;
== Version 0.9.0-0.9.11 (2002-2007) ==&lt;br /&gt;
The use of version numbers slowed dramatically after the late 2002 release of version 0.9.0. Versions 0.9.9 (2005) and 0.9.10 (2006) had about 8 all-new or redone [[aircraft]] adding to a total of 70-90 aircraft. [[Nasal]] was also integrated into FlightGear in version 0.9.4. FlightGear 0.9.10 won Softpedia's &amp;quot;Pick&amp;quot; award (5 out of 5 stars) on June 3, 2006 as well as the &amp;quot;100% CLEAN&amp;quot; Softpedia award.&lt;br /&gt;
&lt;br /&gt;
Behind the scenes there was a 0.9.11-pre1 released in 2007 that ended up being superseded by FlightGear 1.0. The pre-version had about 33 new or redone aircraft.&lt;br /&gt;
&lt;br /&gt;
[[File:FG-A-10.jpg|thumb|270px|3D Cockpit panel for [[A-10]] in version 1.0.0 in 2008]]&lt;br /&gt;
&lt;br /&gt;
== Version 1.0 (2008) ==&lt;br /&gt;
The version number marked a formal transition out of beta development since the software's first release in 1997, ten years prior.&lt;br /&gt;
&lt;br /&gt;
== Version 1.9.0 (2008) ==&lt;br /&gt;
At the time version 1.9.0 was released FlightGear switched from [[PLIB]] to [[OSG]], which caused the temporary loss of some of the features like 3D clouds and shadows. On the contrary new features such as particles add another degree of realism to the simulation. Most aircraft developed for OSG do not work with older versions. The user is able to choose from 230 aircraft provided with 1.9.0, altough only a few are included in the base package.&lt;br /&gt;
Version 1.9.1, released shortly afterwards, was a bug fix release.&lt;br /&gt;
&lt;br /&gt;
== Version 2.0.0 (2010) ==&lt;br /&gt;
FlightGear 2.0.0 reflects the maturation of the OpenSceneGraph port that started with the previous 1.9.0 release. In addition to many internal code improvements, FlightGear 2.0.0 marks the introduction of many new exciting improvements in the graphics and sound system, as well as improved usability of key features, and improved behavior of exsisting features. Highlights of this new version include: Dramatic new 3D clouds, dramatic lighting conditions, improved support for custom scenery, and many many new and detailed aircraft models. &lt;br /&gt;
&lt;br /&gt;
== Version 2.4.0 (2011) ==&lt;br /&gt;
Starting with version 2.4.0, the FlightGear team adopted a [[release plan]]. From then on, a new version is released every February and August.&lt;br /&gt;
&lt;br /&gt;
==Version 3.8.0/2016.1.0==&lt;br /&gt;
{{Main article|Release plan#Detailed time schedule and checklist}}&lt;br /&gt;
Following the cancellation of 3.6, the modern FlightGear team revised the release plan and process. New releases are essentially selected and tuned &amp;quot;nightlies&amp;quot; instead of special compilations.&lt;br /&gt;
&lt;br /&gt;
Also, in this release the concept of rotating default airports first started. All FlightGear releases after 2016.1 have unique default airports and 'codenames'.&lt;br /&gt;
&lt;br /&gt;
{{Main article|Release plan/Lessons learned#2016.1}}&lt;br /&gt;
&lt;br /&gt;
== Release timeline ==&lt;br /&gt;
Final build code release dates by year.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:40%; margin:auto&amp;quot;&lt;br /&gt;
! Date !! Version&lt;br /&gt;
|-&lt;br /&gt;
|July 17, 1997 || First major code release&lt;br /&gt;
|-&lt;br /&gt;
|September 23, 1997 || 0.12&lt;br /&gt;
|-&lt;br /&gt;
|December 9, 1997 || 0.15&lt;br /&gt;
|-&lt;br /&gt;
|December 17, 1997 || 0.18&lt;br /&gt;
|-&lt;br /&gt;
|December 30, 1997 || 0.19 (first binaries)&lt;br /&gt;
|-&lt;br /&gt;
|January 6, 1998 || 0.22&lt;br /&gt;
|-&lt;br /&gt;
|Mar 11 98 || 0.37&lt;br /&gt;
|-&lt;br /&gt;
|April 8, 1998 || 0.41&lt;br /&gt;
|-&lt;br /&gt;
|April 14, 1998 || 0.42&lt;br /&gt;
|-&lt;br /&gt;
|April 23, 1998 || 0.43&lt;br /&gt;
|-&lt;br /&gt;
|Apr 28, 1998 || 0.44&lt;br /&gt;
|-&lt;br /&gt;
|May 7, 1998 || 0.45&lt;br /&gt;
|-&lt;br /&gt;
|May 11, 1998 || 0.46&lt;br /&gt;
|-&lt;br /&gt;
|May 18, 1998 || 0.47&lt;br /&gt;
|-&lt;br /&gt;
|June 9, 1998 || 0.48&lt;br /&gt;
|-&lt;br /&gt;
|June 27, 1998 || 0.49&lt;br /&gt;
|-&lt;br /&gt;
|July 13, 1998 || 0.50&lt;br /&gt;
|-&lt;br /&gt;
|July 21, 1998 || 0.51&lt;br /&gt;
|-&lt;br /&gt;
|August 15, 1998 || 0.52&lt;br /&gt;
|-&lt;br /&gt;
|September 2, 1998 || 0.53&lt;br /&gt;
|-&lt;br /&gt;
|September 25, 1998 || 0.54&lt;br /&gt;
|-&lt;br /&gt;
|October 23, 1998 || 0.55&lt;br /&gt;
|-&lt;br /&gt;
|November 23, 1998 || 0.56&lt;br /&gt;
|-&lt;br /&gt;
|January 21, 1999 || 0.57&lt;br /&gt;
|-&lt;br /&gt;
|February 10, 1999 || 0.58&lt;br /&gt;
|-&lt;br /&gt;
|March 31, 1999 || 0.59&lt;br /&gt;
|-&lt;br /&gt;
|May 26, 1999 || 0.6.0&lt;br /&gt;
|-&lt;br /&gt;
| June 21, 1999 || 0.6.1 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2 | September 11, 1999 || 0.7.0 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|0.6.2 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|October 22, 1999 || 0.7.1 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|February 17, 2000 || 0.7.2 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|May 18, 2000 || 0.7.3 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|July 20, 2000 || 0.7.4&lt;br /&gt;
|-&lt;br /&gt;
|September 18, 2000 || 0.7.5&lt;br /&gt;
|-&lt;br /&gt;
|December 19, 2000 || 0.7.6&lt;br /&gt;
|-&lt;br /&gt;
|June 20, 2001 || 0.7.7&lt;br /&gt;
|-&lt;br /&gt;
|July 13, 2001 || 0.7.8&lt;br /&gt;
|-&lt;br /&gt;
| February 16, 2002 || 0.7.9&lt;br /&gt;
|-&lt;br /&gt;
| April 20, 2002 || 0.7.10&lt;br /&gt;
|-&lt;br /&gt;
| September 7, 2002 || 0.8.0&lt;br /&gt;
|-&lt;br /&gt;
| December 3, 2002 || 0.9.0&lt;br /&gt;
|-&lt;br /&gt;
| December 5, 2002 || 0.9.1 &lt;br /&gt;
|-&lt;br /&gt;
| June 4, 2003 || 0.9.2&lt;br /&gt;
|-&lt;br /&gt;
| October 24, 2003 || 0.9.3&lt;br /&gt;
|-&lt;br /&gt;
| March 26, 2004 || 0.9.4&lt;br /&gt;
|-&lt;br /&gt;
| July 29, 2004 || 0.9.5&lt;br /&gt;
|-&lt;br /&gt;
| October 12, 2004 || 0.9.6&lt;br /&gt;
|-&lt;br /&gt;
| January 18, 2005 || 0.9.8&lt;br /&gt;
|-&lt;br /&gt;
| November 17, 2005 || 0.9.9&lt;br /&gt;
|-&lt;br /&gt;
| April 5, 2006 || 0.9.10&lt;br /&gt;
|-&lt;br /&gt;
| May 2007 || 0.9.11-pre1&lt;br /&gt;
|-&lt;br /&gt;
| December 17, 2007 || 1.0.0&lt;br /&gt;
|-&lt;br /&gt;
| December 22, 2008 || 1.9.0 &lt;br /&gt;
|-&lt;br /&gt;
| January 25, 2009 || 1.9.1&lt;br /&gt;
|-&lt;br /&gt;
| February 25, 2010 || 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| August 17, 2011 || 2.4.0&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2012 || 2.6.0&lt;br /&gt;
|-&lt;br /&gt;
| August 17, 2012 || 2.8.0&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2013 || 2.10&lt;br /&gt;
|-&lt;br /&gt;
| September 21, 2013 || 2.12&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2014 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| October 15, 2014 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2015 || 3.4&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 3.6 (unreleased, see [[FlightGear Newsletter November 2015#FlightGear v3.6 canceled|here]])&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2016 || 2016.1.1 (new versioning scheme)&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 2016 || 2016.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 17, 2016 || 2016.2.1&lt;br /&gt;
|-&lt;br /&gt;
| September 12, 2016 || 2016.3.1&lt;br /&gt;
|-&lt;br /&gt;
| November 19, 2016 || 2016.4.1&lt;br /&gt;
|-&lt;br /&gt;
| November 23, 2016 || 2016.4.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| December 5, 2016 || 2016.4.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| December 28, 2016 || 2016.4.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| February 23, 2017 || 2017.1.1&lt;br /&gt;
|-&lt;br /&gt;
| March 1, 2017 || 2017.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| April 4, 2017 || 2017.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2017 || 2017.2.1 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| September 20, 2017 || 2017.3.1&lt;br /&gt;
|-&lt;br /&gt;
| April 11, 2018 || 2018.1.1 &lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2018 || 2018.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Dec 3, 2018 || 2018.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Jan 29, 2019 || 2018.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 2018.3.3 (not released)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2019 || 2018.3.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Apr 20, 2020 || 2018.3.5 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2020 || 2018.3.6 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Mar 14, 2019 || 2019.1.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 1, 2019 || 2019.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 11, 2020 || 2020.1.1&lt;br /&gt;
|-&lt;br /&gt;
| May 25, 2020 || 2020.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Jun 26, 2020 || 2020.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Oct 29, 2020 || 2020.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 6, 2020 || 2020.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 2020 || 2020.3.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 1, 2020 || 2020.3.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 19, 2020 || 2020.3.5 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Jan 24, 2021 || 2020.3.6 (bugfix release)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cycled default airports ==&lt;br /&gt;
&lt;br /&gt;
FlightGear did not start changing the default airport until version 2016.1 was released. At that time, the idea was that each new release would have a new default airport. This chart lists the default airports since 2016.1 was released.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Release !! ICAO !! Default Airport&lt;br /&gt;
|-&lt;br /&gt;
| 2016.1 || [[KSFO]] || San Francisco ''(transition)''&lt;br /&gt;
|-&lt;br /&gt;
| 2016.2 || [[LEBL]] || Barcelona&lt;br /&gt;
|-&lt;br /&gt;
| 2016.3 || [[SBRJ]] || Rio de Janeiro&lt;br /&gt;
|-&lt;br /&gt;
| 2016.4 || [[LSZH]] || Zürich&lt;br /&gt;
|-&lt;br /&gt;
| 2017.1 || [[ENBR]] || Bergen&lt;br /&gt;
|-&lt;br /&gt;
| 2017.2 || [[KBOS]] || Boston&lt;br /&gt;
|- &lt;br /&gt;
| 2017.3 || [[LKPR]] || Prague&lt;br /&gt;
|- &lt;br /&gt;
| 2018.1 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2018.2 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2018.3 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2019.1 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2020.1 || [[BIKF]] || Keflavik&lt;br /&gt;
|- &lt;br /&gt;
| 2020.2 || [[BIKF]] || Keflavik&lt;br /&gt;
|- &lt;br /&gt;
| 2020.3 || [[BIKF]] || Keflavik&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://web.archive.org/web/*/http://www.flightgear.org/ Internet Archive: Wayback Machine for http://www.flightgear.org/ ]&lt;br /&gt;
* [http://web.archive.org/web/19981212014011/http://flightgear.org/ Old website on December 5, 1998]&lt;br /&gt;
* [http://web.archive.org/web/19990209082206/http://www.flightgear.org/Gallery/tucson.jpg link] (&amp;quot;A view from the ground near Tucson, AZ (KTUS)&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
* [http://web.archive.org/web/19990209050729/http://www.flightgear.org/Gallery/texture2.jpg link] (&amp;quot;Here's one of the Grand Canyon with a rock face texture. I know this looks funny, but I'm just experimenting here.&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
&lt;br /&gt;
{{Appendix|2=&lt;br /&gt;
* {{wikipedia|FlightGear}}&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Original Flight Gear Proposal] by David L. Murr (Revision 3.0.1)&lt;br /&gt;
* [ftp://flightgear.wo0t.de/flightgear-ftp/ FlightGear FTP Archive]&lt;br /&gt;
----&lt;br /&gt;
{{References}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=129535</id>
		<title>FlightGear history</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=129535"/>
		<updated>2020-12-14T16:46:26Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Release timeline */ fix 2020.3.3 entry&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[FlightGear]] development started with an online proposal in 1996, using custom 3D graphics code. Development of an [[OpenGL]] based version was spearheaded by Curtis Olson starting in 1997. Many people have contributed to the project in the years since its inception.&lt;br /&gt;
&lt;br /&gt;
FlightGear incorporated other open-source resources, including the LaRCsim flight model from NASA, and freely available elevation data. The first working binaries, using OpenGL for 3D graphic code, came out in 1997. Enthusiastic development of newer versions for several years resulted in progressively more stable and advanced versions. By 2001, the team was releasing new beta versions regularly, and by 2005, the maturity of software lead to more widespread reviews, and increased popularity. 2007 marked a formal transition out of beta development with the release of version 1.0.0, ten years after FlightGear's first release in 1997.&lt;br /&gt;
&lt;br /&gt;
In 2008, version 1.9.0 of FlightGear included a major change from [[PLIB]] to [[OSG]], which caused the temporarily loss of some features like 3D clouds and shadows, while newly added features, such as particles, imparted another degree of realism to the simulation. &lt;br /&gt;
 &lt;br /&gt;
== Beginnings (1996-1997) ==&lt;br /&gt;
[[File:FG SUNHALO.JPG|thumb|270px|March 18, 1999: one of the oldest surviving screenshots of FlightGear. Back then, FlightGear was the only PC based flight simulator rendering the [[Moon|sun, moon, and celestial]] objects at the correct position, and under the correct lighting conditions, in the sky. ]]&lt;br /&gt;
[[File:Image103.gif|thumb|Original Win95 icon]]&lt;br /&gt;
The FlightGear project was conceived on April 8, 1996 by David Murr who proposed a new flight simulator to be developed by volunteers&amp;lt;ref&amp;gt;David Murr (Apr 9, 1996).  FlightGear proposal 1.0: [https://groups.google.com/forum/#!msg/rec.aviation.simulators/ny8HFBE5_T8/OdtIiGNGJc8J &amp;quot;A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@&amp;quot;].  Published on the rec.aviation.simulators newsgroup.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (1996).  FlightGear proposal 2.0: [http://www.flightgear.org/proposal-2.0 FLIGHT GEAR &amp;quot;This truly is as real as it gets!&amp;quot; - a proposal for a new flight simulator - REVISION 2.0].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Oct 29, 1996).  FlightGear proposal 3.0: [http://www.flightgear.org/proposal-3.0 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0 - Wednesday, 10.30.96, &amp;quot;The future of flight simulation is here&amp;quot;].  Published on the [http://ftp.igh.cnrs.fr/pub/flightgear/www/old-stuff/flight-gear.9610 flight-gear@infoplane.com mailing list].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Sep 11, 1998).  FlightGear proposal 3.0.1: [http://www.flightgear.org/proposal-3.0.1 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0.1 - Friday, Sep.11.98, &amp;quot;The future of flight simulation is here&amp;quot;].&amp;lt;/ref&amp;gt;.  Part of the initial goals were to develop 2D and 3D graphics routines for the simulator.  However this was a huge task that came to an unfinished halt at the start of 1997 as the main developer,  Eric Korpela, was finishing his thesis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Development of an [[OpenGL]] based version was spearheaded by Curtis Olsen starting in 1997, after the initial start in 1996. A large community response lead to many contributing to the project from its start in late '90s up to the present.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;''I was working at the University of Minnesota at the time, and had access to Sun and SGI graphical work stations which offered OpenGL for 3d graphics. OpenGl was just starting to become available on PC hardware with things like the 3dfx voodoo card. Somewhere at this point it occurred to me that a far better path would be to leverage an existing multi-platform 3d graphics system (like OpenGL) to build our flight simulator upon.''&lt;br /&gt;
&lt;br /&gt;
''So I proceeded to rough together a basic scenery system, pasted on the larcsim flight model, and in a relatively short time was able to show actual flight over real 3d terrain. Good, realistic 3d terrain was something the other existing flight sims at the time were pretty far behind on ... and I think my work was enough of a breakthrough that it got a lot of people excited about the possibilities.''&amp;quot;~Curt Olson &amp;lt;ref&amp;gt;Curtis Olson (Sep 28, 2015).  [http://forum.flightgear.org/viewtopic.php?f=42&amp;amp;t=27558&amp;amp;p=259048#p259021 Re: A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@].  Published on the FlightGear forum.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Rather than start entirely from scratch, FlightGear developers made use of the LaRCsim flight model from NASA, with OpenGL for 3D graphic code, and freely available elevation data. First working binaries came out in 1997, with an intense updating of newer versions for several years resulting in progressively more stable and advanced programs.&lt;br /&gt;
&lt;br /&gt;
== Versions 0.7–0.9 (2001–2003) ==&lt;br /&gt;
By 2001, the team was releasing new beta versions regularly (0.7.x, 0.8.0, over 2001-2003) and with 0.9.xx (2003-2006). Later in the decade, the rate of final public releases slowed, but had larger amounts of content (0.9.10, 1.0.0 etc.). The maturity of software by 2005 lead to more widespread reviews, and increased popularity. &lt;br /&gt;
&lt;br /&gt;
== Version 0.9.0-0.9.11 (2002-2007) ==&lt;br /&gt;
The use of version numbers slowed dramatically after the late 2002 release of version 0.9.0. Versions 0.9.9 (2005) and 0.9.10 (2006) had about 8 all-new or redone [[aircraft]] adding to a total of 70-90 aircraft. [[Nasal]] was also integrated into FlightGear in version 0.9.4. FlightGear 0.9.10 won Softpedia's &amp;quot;Pick&amp;quot; award (5 out of 5 stars) on June 3, 2006 as well as the &amp;quot;100% CLEAN&amp;quot; Softpedia award.&lt;br /&gt;
&lt;br /&gt;
Behind the scenes there was a 0.9.11-pre1 released in 2007 that ended up being superseded by FlightGear 1.0. The pre-version had about 33 new or redone aircraft.&lt;br /&gt;
&lt;br /&gt;
[[File:FG-A-10.jpg|thumb|270px|3D Cockpit panel for [[A-10]] in version 1.0.0 in 2008]]&lt;br /&gt;
&lt;br /&gt;
== Version 1.0 (2008) ==&lt;br /&gt;
The version number marked a formal transition out of beta development since the software's first release in 1997, ten years prior.&lt;br /&gt;
&lt;br /&gt;
== Version 1.9.0 (2008) ==&lt;br /&gt;
At the time version 1.9.0 was released FlightGear switched from [[PLIB]] to [[OSG]], which caused the temporary loss of some of the features like 3D clouds and shadows. On the contrary new features such as particles add another degree of realism to the simulation. Most aircraft developed for OSG do not work with older versions. The user is able to choose from 230 aircraft provided with 1.9.0, altough only a few are included in the base package.&lt;br /&gt;
Version 1.9.1, released shortly afterwards, was a bug fix release.&lt;br /&gt;
&lt;br /&gt;
== Version 2.0.0 (2010) ==&lt;br /&gt;
FlightGear 2.0.0 reflects the maturation of the OpenSceneGraph port that started with the previous 1.9.0 release. In addition to many internal code improvements, FlightGear 2.0.0 marks the introduction of many new exciting improvements in the graphics and sound system, as well as improved usability of key features, and improved behavior of exsisting features. Highlights of this new version include: Dramatic new 3D clouds, dramatic lighting conditions, improved support for custom scenery, and many many new and detailed aircraft models. &lt;br /&gt;
&lt;br /&gt;
== Version 2.4.0 (2011) ==&lt;br /&gt;
Starting with version 2.4.0, the FlightGear team adopted a [[release plan]]. From then on, a new version is released every February and August.&lt;br /&gt;
&lt;br /&gt;
==Version 3.8.0/2016.1.0==&lt;br /&gt;
{{Main article|Release plan#Detailed time schedule and checklist}}&lt;br /&gt;
Following the cancellation of 3.6, the modern FlightGear team revised the release plan and process. New releases are essentially selected and tuned &amp;quot;nightlies&amp;quot; instead of special compilations.&lt;br /&gt;
&lt;br /&gt;
Also, in this release the concept of rotating default airports first started. All FlightGear releases after 2016.1 have unique default airports and 'codenames'.&lt;br /&gt;
&lt;br /&gt;
{{Main article|Release plan/Lessons learned#2016.1}}&lt;br /&gt;
&lt;br /&gt;
== Release timeline ==&lt;br /&gt;
Final build code release dates by year.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:40%; margin:auto&amp;quot;&lt;br /&gt;
! Date !! Version&lt;br /&gt;
|-&lt;br /&gt;
|July 17, 1997 || First major code release&lt;br /&gt;
|-&lt;br /&gt;
|September 23, 1997 || 0.12&lt;br /&gt;
|-&lt;br /&gt;
|December 9, 1997 || 0.15&lt;br /&gt;
|-&lt;br /&gt;
|December 17, 1997 || 0.18&lt;br /&gt;
|-&lt;br /&gt;
|December 30, 1997 || 0.19 (first binaries)&lt;br /&gt;
|-&lt;br /&gt;
|January 6, 1998 || 0.22&lt;br /&gt;
|-&lt;br /&gt;
|Mar 11 98 || 0.37&lt;br /&gt;
|-&lt;br /&gt;
|April 8, 1998 || 0.41&lt;br /&gt;
|-&lt;br /&gt;
|April 14, 1998 || 0.42&lt;br /&gt;
|-&lt;br /&gt;
|April 23, 1998 || 0.43&lt;br /&gt;
|-&lt;br /&gt;
|Apr 28, 1998 || 0.44&lt;br /&gt;
|-&lt;br /&gt;
|May 7, 1998 || 0.45&lt;br /&gt;
|-&lt;br /&gt;
|May 11, 1998 || 0.46&lt;br /&gt;
|-&lt;br /&gt;
|May 18, 1998 || 0.47&lt;br /&gt;
|-&lt;br /&gt;
|June 9, 1998 || 0.48&lt;br /&gt;
|-&lt;br /&gt;
|June 27, 1998 || 0.49&lt;br /&gt;
|-&lt;br /&gt;
|July 13, 1998 || 0.50&lt;br /&gt;
|-&lt;br /&gt;
|July 21, 1998 || 0.51&lt;br /&gt;
|-&lt;br /&gt;
|August 15, 1998 || 0.52&lt;br /&gt;
|-&lt;br /&gt;
|September 2, 1998 || 0.53&lt;br /&gt;
|-&lt;br /&gt;
|September 25, 1998 || 0.54&lt;br /&gt;
|-&lt;br /&gt;
|October 23, 1998 || 0.55&lt;br /&gt;
|-&lt;br /&gt;
|November 23, 1998 || 0.56&lt;br /&gt;
|-&lt;br /&gt;
|January 21, 1999 || 0.57&lt;br /&gt;
|-&lt;br /&gt;
|February 10, 1999 || 0.58&lt;br /&gt;
|-&lt;br /&gt;
|March 31, 1999 || 0.59&lt;br /&gt;
|-&lt;br /&gt;
|May 26, 1999 || 0.6.0&lt;br /&gt;
|-&lt;br /&gt;
| June 21, 1999 || 0.6.1 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2 | September 11, 1999 || 0.7.0 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|0.6.2 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|October 22, 1999 || 0.7.1 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|February 17, 2000 || 0.7.2 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|May 18, 2000 || 0.7.3 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|July 20, 2000 || 0.7.4&lt;br /&gt;
|-&lt;br /&gt;
|September 18, 2000 || 0.7.5&lt;br /&gt;
|-&lt;br /&gt;
|December 19, 2000 || 0.7.6&lt;br /&gt;
|-&lt;br /&gt;
|June 20, 2001 || 0.7.7&lt;br /&gt;
|-&lt;br /&gt;
|July 13, 2001 || 0.7.8&lt;br /&gt;
|-&lt;br /&gt;
| February 16, 2002 || 0.7.9&lt;br /&gt;
|-&lt;br /&gt;
| April 20, 2002 || 0.7.10&lt;br /&gt;
|-&lt;br /&gt;
| September 7, 2002 || 0.8.0&lt;br /&gt;
|-&lt;br /&gt;
| December 3, 2002 || 0.9.0&lt;br /&gt;
|-&lt;br /&gt;
| December 5, 2002 || 0.9.1 &lt;br /&gt;
|-&lt;br /&gt;
| June 4, 2003 || 0.9.2&lt;br /&gt;
|-&lt;br /&gt;
| October 24, 2003 || 0.9.3&lt;br /&gt;
|-&lt;br /&gt;
| March 26, 2004 || 0.9.4&lt;br /&gt;
|-&lt;br /&gt;
| July 29, 2004 || 0.9.5&lt;br /&gt;
|-&lt;br /&gt;
| October 12, 2004 || 0.9.6&lt;br /&gt;
|-&lt;br /&gt;
| January 18, 2005 || 0.9.8&lt;br /&gt;
|-&lt;br /&gt;
| November 17, 2005 || 0.9.9&lt;br /&gt;
|-&lt;br /&gt;
| April 5, 2006 || 0.9.10&lt;br /&gt;
|-&lt;br /&gt;
| May 2007 || 0.9.11-pre1&lt;br /&gt;
|-&lt;br /&gt;
| December 17, 2007 || 1.0.0&lt;br /&gt;
|-&lt;br /&gt;
| December 22, 2008 || 1.9.0 &lt;br /&gt;
|-&lt;br /&gt;
| January 25, 2009 || 1.9.1&lt;br /&gt;
|-&lt;br /&gt;
| February 25, 2010 || 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| August 17, 2011 || 2.4.0&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2012 || 2.6.0&lt;br /&gt;
|-&lt;br /&gt;
| August 17, 2012 || 2.8.0&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2013 || 2.10&lt;br /&gt;
|-&lt;br /&gt;
| September 21, 2013 || 2.12&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2014 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| October 15, 2014 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2015 || 3.4&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 3.6 (unreleased, see [[FlightGear Newsletter November 2015#FlightGear v3.6 canceled|here]])&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2016 || 2016.1.1 (new versioning scheme)&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 2016 || 2016.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 17, 2016 || 2016.2.1&lt;br /&gt;
|-&lt;br /&gt;
| September 12, 2016 || 2016.3.1&lt;br /&gt;
|-&lt;br /&gt;
| November 19, 2016 || 2016.4.1&lt;br /&gt;
|-&lt;br /&gt;
| November 23, 2016 || 2016.4.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| December 5, 2016 || 2016.4.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| December 28, 2016 || 2016.4.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| February 23, 2017 || 2017.1.1&lt;br /&gt;
|-&lt;br /&gt;
| March 1, 2017 || 2017.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| April 4, 2017 || 2017.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2017 || 2017.2.1 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| September 20, 2017 || 2017.3.1&lt;br /&gt;
|-&lt;br /&gt;
| April 11, 2018 || 2018.1.1 &lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2018 || 2018.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Dec 3, 2018 || 2018.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Jan 29, 2019 || 2018.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 2018.3.3 (not released)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2019 || 2018.3.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Apr 20, 2020 || 2018.3.5 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2020 || 2018.3.6 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Mar 14, 2019 || 2019.1.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 1, 2019 || 2019.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 11, 2020 || 2020.1.1&lt;br /&gt;
|-&lt;br /&gt;
| May 25, 2020 || 2020.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Jun 26, 2020 || 2020.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Oct 29, 2020 || 2020.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 6, 2020 || 2020.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 2020 || 2020.3.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 1, 2020 || 2020.3.4 (bugfix release)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cycled default airports ==&lt;br /&gt;
&lt;br /&gt;
FlightGear did not start changing the default airport until version 2016.1 was released. At that time, the idea was that each new release would have a new default airport. This chart lists the default airports since 2016.1 was released.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Release !! ICAO !! Default Airport&lt;br /&gt;
|-&lt;br /&gt;
| 2016.1 || [[KSFO]] || San Francisco ''(transition)''&lt;br /&gt;
|-&lt;br /&gt;
| 2016.2 || [[LEBL]] || Barcelona&lt;br /&gt;
|-&lt;br /&gt;
| 2016.3 || [[SBRJ]] || Rio de Janeiro&lt;br /&gt;
|-&lt;br /&gt;
| 2016.4 || [[LSZH]] || Zürich&lt;br /&gt;
|-&lt;br /&gt;
| 2017.1 || [[ENBR]] || Bergen&lt;br /&gt;
|-&lt;br /&gt;
| 2017.2 || [[KBOS]] || Boston&lt;br /&gt;
|- &lt;br /&gt;
| 2017.3 || [[LKPR]] || Prague&lt;br /&gt;
|- &lt;br /&gt;
| 2018.1 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2018.2 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2018.3 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2019.1 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2020.1 || [[BIKF]] || Keflavik&lt;br /&gt;
|- &lt;br /&gt;
| 2020.2 || [[BIKF]] || Keflavik&lt;br /&gt;
|- &lt;br /&gt;
| 2020.3 || [[BIKF]] || Keflavik&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://web.archive.org/web/*/http://www.flightgear.org/ Internet Archive: Wayback Machine for http://www.flightgear.org/ ]&lt;br /&gt;
* [http://web.archive.org/web/19981212014011/http://flightgear.org/ Old website on December 5, 1998]&lt;br /&gt;
* [http://web.archive.org/web/19990209082206/http://www.flightgear.org/Gallery/tucson.jpg link] (&amp;quot;A view from the ground near Tucson, AZ (KTUS)&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
* [http://web.archive.org/web/19990209050729/http://www.flightgear.org/Gallery/texture2.jpg link] (&amp;quot;Here's one of the Grand Canyon with a rock face texture. I know this looks funny, but I'm just experimenting here.&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
&lt;br /&gt;
{{Appendix|2=&lt;br /&gt;
* {{wikipedia|FlightGear}}&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Original Flight Gear Proposal] by David L. Murr (Revision 3.0.1)&lt;br /&gt;
* [ftp://flightgear.wo0t.de/flightgear-ftp/ FlightGear FTP Archive]&lt;br /&gt;
----&lt;br /&gt;
{{References}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=129534</id>
		<title>FlightGear history</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=129534"/>
		<updated>2020-12-14T16:43:50Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Release timeline */ added dates from earlier&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[FlightGear]] development started with an online proposal in 1996, using custom 3D graphics code. Development of an [[OpenGL]] based version was spearheaded by Curtis Olson starting in 1997. Many people have contributed to the project in the years since its inception.&lt;br /&gt;
&lt;br /&gt;
FlightGear incorporated other open-source resources, including the LaRCsim flight model from NASA, and freely available elevation data. The first working binaries, using OpenGL for 3D graphic code, came out in 1997. Enthusiastic development of newer versions for several years resulted in progressively more stable and advanced versions. By 2001, the team was releasing new beta versions regularly, and by 2005, the maturity of software lead to more widespread reviews, and increased popularity. 2007 marked a formal transition out of beta development with the release of version 1.0.0, ten years after FlightGear's first release in 1997.&lt;br /&gt;
&lt;br /&gt;
In 2008, version 1.9.0 of FlightGear included a major change from [[PLIB]] to [[OSG]], which caused the temporarily loss of some features like 3D clouds and shadows, while newly added features, such as particles, imparted another degree of realism to the simulation. &lt;br /&gt;
 &lt;br /&gt;
== Beginnings (1996-1997) ==&lt;br /&gt;
[[File:FG SUNHALO.JPG|thumb|270px|March 18, 1999: one of the oldest surviving screenshots of FlightGear. Back then, FlightGear was the only PC based flight simulator rendering the [[Moon|sun, moon, and celestial]] objects at the correct position, and under the correct lighting conditions, in the sky. ]]&lt;br /&gt;
[[File:Image103.gif|thumb|Original Win95 icon]]&lt;br /&gt;
The FlightGear project was conceived on April 8, 1996 by David Murr who proposed a new flight simulator to be developed by volunteers&amp;lt;ref&amp;gt;David Murr (Apr 9, 1996).  FlightGear proposal 1.0: [https://groups.google.com/forum/#!msg/rec.aviation.simulators/ny8HFBE5_T8/OdtIiGNGJc8J &amp;quot;A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@&amp;quot;].  Published on the rec.aviation.simulators newsgroup.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (1996).  FlightGear proposal 2.0: [http://www.flightgear.org/proposal-2.0 FLIGHT GEAR &amp;quot;This truly is as real as it gets!&amp;quot; - a proposal for a new flight simulator - REVISION 2.0].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Oct 29, 1996).  FlightGear proposal 3.0: [http://www.flightgear.org/proposal-3.0 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0 - Wednesday, 10.30.96, &amp;quot;The future of flight simulation is here&amp;quot;].  Published on the [http://ftp.igh.cnrs.fr/pub/flightgear/www/old-stuff/flight-gear.9610 flight-gear@infoplane.com mailing list].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Sep 11, 1998).  FlightGear proposal 3.0.1: [http://www.flightgear.org/proposal-3.0.1 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0.1 - Friday, Sep.11.98, &amp;quot;The future of flight simulation is here&amp;quot;].&amp;lt;/ref&amp;gt;.  Part of the initial goals were to develop 2D and 3D graphics routines for the simulator.  However this was a huge task that came to an unfinished halt at the start of 1997 as the main developer,  Eric Korpela, was finishing his thesis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Development of an [[OpenGL]] based version was spearheaded by Curtis Olsen starting in 1997, after the initial start in 1996. A large community response lead to many contributing to the project from its start in late '90s up to the present.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;''I was working at the University of Minnesota at the time, and had access to Sun and SGI graphical work stations which offered OpenGL for 3d graphics. OpenGl was just starting to become available on PC hardware with things like the 3dfx voodoo card. Somewhere at this point it occurred to me that a far better path would be to leverage an existing multi-platform 3d graphics system (like OpenGL) to build our flight simulator upon.''&lt;br /&gt;
&lt;br /&gt;
''So I proceeded to rough together a basic scenery system, pasted on the larcsim flight model, and in a relatively short time was able to show actual flight over real 3d terrain. Good, realistic 3d terrain was something the other existing flight sims at the time were pretty far behind on ... and I think my work was enough of a breakthrough that it got a lot of people excited about the possibilities.''&amp;quot;~Curt Olson &amp;lt;ref&amp;gt;Curtis Olson (Sep 28, 2015).  [http://forum.flightgear.org/viewtopic.php?f=42&amp;amp;t=27558&amp;amp;p=259048#p259021 Re: A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@].  Published on the FlightGear forum.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Rather than start entirely from scratch, FlightGear developers made use of the LaRCsim flight model from NASA, with OpenGL for 3D graphic code, and freely available elevation data. First working binaries came out in 1997, with an intense updating of newer versions for several years resulting in progressively more stable and advanced programs.&lt;br /&gt;
&lt;br /&gt;
== Versions 0.7–0.9 (2001–2003) ==&lt;br /&gt;
By 2001, the team was releasing new beta versions regularly (0.7.x, 0.8.0, over 2001-2003) and with 0.9.xx (2003-2006). Later in the decade, the rate of final public releases slowed, but had larger amounts of content (0.9.10, 1.0.0 etc.). The maturity of software by 2005 lead to more widespread reviews, and increased popularity. &lt;br /&gt;
&lt;br /&gt;
== Version 0.9.0-0.9.11 (2002-2007) ==&lt;br /&gt;
The use of version numbers slowed dramatically after the late 2002 release of version 0.9.0. Versions 0.9.9 (2005) and 0.9.10 (2006) had about 8 all-new or redone [[aircraft]] adding to a total of 70-90 aircraft. [[Nasal]] was also integrated into FlightGear in version 0.9.4. FlightGear 0.9.10 won Softpedia's &amp;quot;Pick&amp;quot; award (5 out of 5 stars) on June 3, 2006 as well as the &amp;quot;100% CLEAN&amp;quot; Softpedia award.&lt;br /&gt;
&lt;br /&gt;
Behind the scenes there was a 0.9.11-pre1 released in 2007 that ended up being superseded by FlightGear 1.0. The pre-version had about 33 new or redone aircraft.&lt;br /&gt;
&lt;br /&gt;
[[File:FG-A-10.jpg|thumb|270px|3D Cockpit panel for [[A-10]] in version 1.0.0 in 2008]]&lt;br /&gt;
&lt;br /&gt;
== Version 1.0 (2008) ==&lt;br /&gt;
The version number marked a formal transition out of beta development since the software's first release in 1997, ten years prior.&lt;br /&gt;
&lt;br /&gt;
== Version 1.9.0 (2008) ==&lt;br /&gt;
At the time version 1.9.0 was released FlightGear switched from [[PLIB]] to [[OSG]], which caused the temporary loss of some of the features like 3D clouds and shadows. On the contrary new features such as particles add another degree of realism to the simulation. Most aircraft developed for OSG do not work with older versions. The user is able to choose from 230 aircraft provided with 1.9.0, altough only a few are included in the base package.&lt;br /&gt;
Version 1.9.1, released shortly afterwards, was a bug fix release.&lt;br /&gt;
&lt;br /&gt;
== Version 2.0.0 (2010) ==&lt;br /&gt;
FlightGear 2.0.0 reflects the maturation of the OpenSceneGraph port that started with the previous 1.9.0 release. In addition to many internal code improvements, FlightGear 2.0.0 marks the introduction of many new exciting improvements in the graphics and sound system, as well as improved usability of key features, and improved behavior of exsisting features. Highlights of this new version include: Dramatic new 3D clouds, dramatic lighting conditions, improved support for custom scenery, and many many new and detailed aircraft models. &lt;br /&gt;
&lt;br /&gt;
== Version 2.4.0 (2011) ==&lt;br /&gt;
Starting with version 2.4.0, the FlightGear team adopted a [[release plan]]. From then on, a new version is released every February and August.&lt;br /&gt;
&lt;br /&gt;
==Version 3.8.0/2016.1.0==&lt;br /&gt;
{{Main article|Release plan#Detailed time schedule and checklist}}&lt;br /&gt;
Following the cancellation of 3.6, the modern FlightGear team revised the release plan and process. New releases are essentially selected and tuned &amp;quot;nightlies&amp;quot; instead of special compilations.&lt;br /&gt;
&lt;br /&gt;
Also, in this release the concept of rotating default airports first started. All FlightGear releases after 2016.1 have unique default airports and 'codenames'.&lt;br /&gt;
&lt;br /&gt;
{{Main article|Release plan/Lessons learned#2016.1}}&lt;br /&gt;
&lt;br /&gt;
== Release timeline ==&lt;br /&gt;
Final build code release dates by year.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:40%; margin:auto&amp;quot;&lt;br /&gt;
! Date !! Version&lt;br /&gt;
|-&lt;br /&gt;
|July 17, 1997 || First major code release&lt;br /&gt;
|-&lt;br /&gt;
|September 23, 1997 || 0.12&lt;br /&gt;
|-&lt;br /&gt;
|December 9, 1997 || 0.15&lt;br /&gt;
|-&lt;br /&gt;
|December 17, 1997 || 0.18&lt;br /&gt;
|-&lt;br /&gt;
|December 30, 1997 || 0.19 (first binaries)&lt;br /&gt;
|-&lt;br /&gt;
|January 6, 1998 || 0.22&lt;br /&gt;
|-&lt;br /&gt;
|Mar 11 98 || 0.37&lt;br /&gt;
|-&lt;br /&gt;
|April 8, 1998 || 0.41&lt;br /&gt;
|-&lt;br /&gt;
|April 14, 1998 || 0.42&lt;br /&gt;
|-&lt;br /&gt;
|April 23, 1998 || 0.43&lt;br /&gt;
|-&lt;br /&gt;
|Apr 28, 1998 || 0.44&lt;br /&gt;
|-&lt;br /&gt;
|May 7, 1998 || 0.45&lt;br /&gt;
|-&lt;br /&gt;
|May 11, 1998 || 0.46&lt;br /&gt;
|-&lt;br /&gt;
|May 18, 1998 || 0.47&lt;br /&gt;
|-&lt;br /&gt;
|June 9, 1998 || 0.48&lt;br /&gt;
|-&lt;br /&gt;
|June 27, 1998 || 0.49&lt;br /&gt;
|-&lt;br /&gt;
|July 13, 1998 || 0.50&lt;br /&gt;
|-&lt;br /&gt;
|July 21, 1998 || 0.51&lt;br /&gt;
|-&lt;br /&gt;
|August 15, 1998 || 0.52&lt;br /&gt;
|-&lt;br /&gt;
|September 2, 1998 || 0.53&lt;br /&gt;
|-&lt;br /&gt;
|September 25, 1998 || 0.54&lt;br /&gt;
|-&lt;br /&gt;
|October 23, 1998 || 0.55&lt;br /&gt;
|-&lt;br /&gt;
|November 23, 1998 || 0.56&lt;br /&gt;
|-&lt;br /&gt;
|January 21, 1999 || 0.57&lt;br /&gt;
|-&lt;br /&gt;
|February 10, 1999 || 0.58&lt;br /&gt;
|-&lt;br /&gt;
|March 31, 1999 || 0.59&lt;br /&gt;
|-&lt;br /&gt;
|May 26, 1999 || 0.6.0&lt;br /&gt;
|-&lt;br /&gt;
| June 21, 1999 || 0.6.1 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2 | September 11, 1999 || 0.7.0 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|0.6.2 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|October 22, 1999 || 0.7.1 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|February 17, 2000 || 0.7.2 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|May 18, 2000 || 0.7.3 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|July 20, 2000 || 0.7.4&lt;br /&gt;
|-&lt;br /&gt;
|September 18, 2000 || 0.7.5&lt;br /&gt;
|-&lt;br /&gt;
|December 19, 2000 || 0.7.6&lt;br /&gt;
|-&lt;br /&gt;
|June 20, 2001 || 0.7.7&lt;br /&gt;
|-&lt;br /&gt;
|July 13, 2001 || 0.7.8&lt;br /&gt;
|-&lt;br /&gt;
| February 16, 2002 || 0.7.9&lt;br /&gt;
|-&lt;br /&gt;
| April 20, 2002 || 0.7.10&lt;br /&gt;
|-&lt;br /&gt;
| September 7, 2002 || 0.8.0&lt;br /&gt;
|-&lt;br /&gt;
| December 3, 2002 || 0.9.0&lt;br /&gt;
|-&lt;br /&gt;
| December 5, 2002 || 0.9.1 &lt;br /&gt;
|-&lt;br /&gt;
| June 4, 2003 || 0.9.2&lt;br /&gt;
|-&lt;br /&gt;
| October 24, 2003 || 0.9.3&lt;br /&gt;
|-&lt;br /&gt;
| March 26, 2004 || 0.9.4&lt;br /&gt;
|-&lt;br /&gt;
| July 29, 2004 || 0.9.5&lt;br /&gt;
|-&lt;br /&gt;
| October 12, 2004 || 0.9.6&lt;br /&gt;
|-&lt;br /&gt;
| January 18, 2005 || 0.9.8&lt;br /&gt;
|-&lt;br /&gt;
| November 17, 2005 || 0.9.9&lt;br /&gt;
|-&lt;br /&gt;
| April 5, 2006 || 0.9.10&lt;br /&gt;
|-&lt;br /&gt;
| May 2007 || 0.9.11-pre1&lt;br /&gt;
|-&lt;br /&gt;
| December 17, 2007 || 1.0.0&lt;br /&gt;
|-&lt;br /&gt;
| December 22, 2008 || 1.9.0 &lt;br /&gt;
|-&lt;br /&gt;
| January 25, 2009 || 1.9.1&lt;br /&gt;
|-&lt;br /&gt;
| February 25, 2010 || 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| August 17, 2011 || 2.4.0&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2012 || 2.6.0&lt;br /&gt;
|-&lt;br /&gt;
| August 17, 2012 || 2.8.0&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2013 || 2.10&lt;br /&gt;
|-&lt;br /&gt;
| September 21, 2013 || 2.12&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2014 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| October 15, 2014 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2015 || 3.4&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 3.6 (unreleased, see [[FlightGear Newsletter November 2015#FlightGear v3.6 canceled|here]])&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2016 || 2016.1.1 (new versioning scheme)&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 2016 || 2016.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 17, 2016 || 2016.2.1&lt;br /&gt;
|-&lt;br /&gt;
| September 12, 2016 || 2016.3.1&lt;br /&gt;
|-&lt;br /&gt;
| November 19, 2016 || 2016.4.1&lt;br /&gt;
|-&lt;br /&gt;
| November 23, 2016 || 2016.4.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| December 5, 2016 || 2016.4.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| December 28, 2016 || 2016.4.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| February 23, 2017 || 2017.1.1&lt;br /&gt;
|-&lt;br /&gt;
| March 1, 2017 || 2017.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| April 4, 2017 || 2017.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2017 || 2017.2.1 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| September 20, 2017 || 2017.3.1&lt;br /&gt;
|-&lt;br /&gt;
| April 11, 2018 || 2018.1.1 &lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2018 || 2018.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Dec 3, 2018 || 2018.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Jan 29, 2019 || 2018.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
|  || 2018.3.3 (not released)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2019 || 2018.3.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Apr 20, 2020 || 2018.3.5 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Aug 9, 2020 || 2018.3.6 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Mar 14, 2019 || 2019.1.1&lt;br /&gt;
|-&lt;br /&gt;
| Sep 1, 2019 || 2019.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 11, 2020 || 2020.1.1&lt;br /&gt;
|-&lt;br /&gt;
| May 25, 2020 || 2020.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Jun 26, 2020 || 2020.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.2.1&lt;br /&gt;
|-&lt;br /&gt;
| Oct 29, 2020 || 2020.3.1&lt;br /&gt;
|-&lt;br /&gt;
| Nov 6, 2020 || 2020.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Nov 23, 2020 || 2020.3.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| Dec 1, 2020 || 2020.3.4 (bugfix release)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cycled default airports ==&lt;br /&gt;
&lt;br /&gt;
FlightGear did not start changing the default airport until version 2016.1 was released. At that time, the idea was that each new release would have a new default airport. This chart lists the default airports since 2016.1 was released.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Release !! ICAO !! Default Airport&lt;br /&gt;
|-&lt;br /&gt;
| 2016.1 || [[KSFO]] || San Francisco ''(transition)''&lt;br /&gt;
|-&lt;br /&gt;
| 2016.2 || [[LEBL]] || Barcelona&lt;br /&gt;
|-&lt;br /&gt;
| 2016.3 || [[SBRJ]] || Rio de Janeiro&lt;br /&gt;
|-&lt;br /&gt;
| 2016.4 || [[LSZH]] || Zürich&lt;br /&gt;
|-&lt;br /&gt;
| 2017.1 || [[ENBR]] || Bergen&lt;br /&gt;
|-&lt;br /&gt;
| 2017.2 || [[KBOS]] || Boston&lt;br /&gt;
|- &lt;br /&gt;
| 2017.3 || [[LKPR]] || Prague&lt;br /&gt;
|- &lt;br /&gt;
| 2018.1 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2018.2 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2018.3 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2019.1 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2020.1 || [[BIKF]] || Keflavik&lt;br /&gt;
|- &lt;br /&gt;
| 2020.2 || [[BIKF]] || Keflavik&lt;br /&gt;
|- &lt;br /&gt;
| 2020.3 || [[BIKF]] || Keflavik&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://web.archive.org/web/*/http://www.flightgear.org/ Internet Archive: Wayback Machine for http://www.flightgear.org/ ]&lt;br /&gt;
* [http://web.archive.org/web/19981212014011/http://flightgear.org/ Old website on December 5, 1998]&lt;br /&gt;
* [http://web.archive.org/web/19990209082206/http://www.flightgear.org/Gallery/tucson.jpg link] (&amp;quot;A view from the ground near Tucson, AZ (KTUS)&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
* [http://web.archive.org/web/19990209050729/http://www.flightgear.org/Gallery/texture2.jpg link] (&amp;quot;Here's one of the Grand Canyon with a rock face texture. I know this looks funny, but I'm just experimenting here.&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
&lt;br /&gt;
{{Appendix|2=&lt;br /&gt;
* {{wikipedia|FlightGear}}&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Original Flight Gear Proposal] by David L. Murr (Revision 3.0.1)&lt;br /&gt;
* [ftp://flightgear.wo0t.de/flightgear-ftp/ FlightGear FTP Archive]&lt;br /&gt;
----&lt;br /&gt;
{{References}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=129533</id>
		<title>FlightGear history</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=129533"/>
		<updated>2020-12-14T12:03:47Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Cycled default airports */ adding new releases since 2018.2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[FlightGear]] development started with an online proposal in 1996, using custom 3D graphics code. Development of an [[OpenGL]] based version was spearheaded by Curtis Olson starting in 1997. Many people have contributed to the project in the years since its inception.&lt;br /&gt;
&lt;br /&gt;
FlightGear incorporated other open-source resources, including the LaRCsim flight model from NASA, and freely available elevation data. The first working binaries, using OpenGL for 3D graphic code, came out in 1997. Enthusiastic development of newer versions for several years resulted in progressively more stable and advanced versions. By 2001, the team was releasing new beta versions regularly, and by 2005, the maturity of software lead to more widespread reviews, and increased popularity. 2007 marked a formal transition out of beta development with the release of version 1.0.0, ten years after FlightGear's first release in 1997.&lt;br /&gt;
&lt;br /&gt;
In 2008, version 1.9.0 of FlightGear included a major change from [[PLIB]] to [[OSG]], which caused the temporarily loss of some features like 3D clouds and shadows, while newly added features, such as particles, imparted another degree of realism to the simulation. &lt;br /&gt;
 &lt;br /&gt;
== Beginnings (1996-1997) ==&lt;br /&gt;
[[File:FG SUNHALO.JPG|thumb|270px|March 18, 1999: one of the oldest surviving screenshots of FlightGear. Back then, FlightGear was the only PC based flight simulator rendering the [[Moon|sun, moon, and celestial]] objects at the correct position, and under the correct lighting conditions, in the sky. ]]&lt;br /&gt;
[[File:Image103.gif|thumb|Original Win95 icon]]&lt;br /&gt;
The FlightGear project was conceived on April 8, 1996 by David Murr who proposed a new flight simulator to be developed by volunteers&amp;lt;ref&amp;gt;David Murr (Apr 9, 1996).  FlightGear proposal 1.0: [https://groups.google.com/forum/#!msg/rec.aviation.simulators/ny8HFBE5_T8/OdtIiGNGJc8J &amp;quot;A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@&amp;quot;].  Published on the rec.aviation.simulators newsgroup.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (1996).  FlightGear proposal 2.0: [http://www.flightgear.org/proposal-2.0 FLIGHT GEAR &amp;quot;This truly is as real as it gets!&amp;quot; - a proposal for a new flight simulator - REVISION 2.0].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Oct 29, 1996).  FlightGear proposal 3.0: [http://www.flightgear.org/proposal-3.0 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0 - Wednesday, 10.30.96, &amp;quot;The future of flight simulation is here&amp;quot;].  Published on the [http://ftp.igh.cnrs.fr/pub/flightgear/www/old-stuff/flight-gear.9610 flight-gear@infoplane.com mailing list].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Sep 11, 1998).  FlightGear proposal 3.0.1: [http://www.flightgear.org/proposal-3.0.1 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0.1 - Friday, Sep.11.98, &amp;quot;The future of flight simulation is here&amp;quot;].&amp;lt;/ref&amp;gt;.  Part of the initial goals were to develop 2D and 3D graphics routines for the simulator.  However this was a huge task that came to an unfinished halt at the start of 1997 as the main developer,  Eric Korpela, was finishing his thesis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Development of an [[OpenGL]] based version was spearheaded by Curtis Olsen starting in 1997, after the initial start in 1996. A large community response lead to many contributing to the project from its start in late '90s up to the present.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;''I was working at the University of Minnesota at the time, and had access to Sun and SGI graphical work stations which offered OpenGL for 3d graphics. OpenGl was just starting to become available on PC hardware with things like the 3dfx voodoo card. Somewhere at this point it occurred to me that a far better path would be to leverage an existing multi-platform 3d graphics system (like OpenGL) to build our flight simulator upon.''&lt;br /&gt;
&lt;br /&gt;
''So I proceeded to rough together a basic scenery system, pasted on the larcsim flight model, and in a relatively short time was able to show actual flight over real 3d terrain. Good, realistic 3d terrain was something the other existing flight sims at the time were pretty far behind on ... and I think my work was enough of a breakthrough that it got a lot of people excited about the possibilities.''&amp;quot;~Curt Olson &amp;lt;ref&amp;gt;Curtis Olson (Sep 28, 2015).  [http://forum.flightgear.org/viewtopic.php?f=42&amp;amp;t=27558&amp;amp;p=259048#p259021 Re: A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@].  Published on the FlightGear forum.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Rather than start entirely from scratch, FlightGear developers made use of the LaRCsim flight model from NASA, with OpenGL for 3D graphic code, and freely available elevation data. First working binaries came out in 1997, with an intense updating of newer versions for several years resulting in progressively more stable and advanced programs.&lt;br /&gt;
&lt;br /&gt;
== Versions 0.7–0.9 (2001–2003) ==&lt;br /&gt;
By 2001, the team was releasing new beta versions regularly (0.7.x, 0.8.0, over 2001-2003) and with 0.9.xx (2003-2006). Later in the decade, the rate of final public releases slowed, but had larger amounts of content (0.9.10, 1.0.0 etc.). The maturity of software by 2005 lead to more widespread reviews, and increased popularity. &lt;br /&gt;
&lt;br /&gt;
== Version 0.9.0-0.9.11 (2002-2007) ==&lt;br /&gt;
The use of version numbers slowed dramatically after the late 2002 release of version 0.9.0. Versions 0.9.9 (2005) and 0.9.10 (2006) had about 8 all-new or redone [[aircraft]] adding to a total of 70-90 aircraft. [[Nasal]] was also integrated into FlightGear in version 0.9.4. FlightGear 0.9.10 won Softpedia's &amp;quot;Pick&amp;quot; award (5 out of 5 stars) on June 3, 2006 as well as the &amp;quot;100% CLEAN&amp;quot; Softpedia award.&lt;br /&gt;
&lt;br /&gt;
Behind the scenes there was a 0.9.11-pre1 released in 2007 that ended up being superseded by FlightGear 1.0. The pre-version had about 33 new or redone aircraft.&lt;br /&gt;
&lt;br /&gt;
[[File:FG-A-10.jpg|thumb|270px|3D Cockpit panel for [[A-10]] in version 1.0.0 in 2008]]&lt;br /&gt;
&lt;br /&gt;
== Version 1.0 (2008) ==&lt;br /&gt;
The version number marked a formal transition out of beta development since the software's first release in 1997, ten years prior.&lt;br /&gt;
&lt;br /&gt;
== Version 1.9.0 (2008) ==&lt;br /&gt;
At the time version 1.9.0 was released FlightGear switched from [[PLIB]] to [[OSG]], which caused the temporary loss of some of the features like 3D clouds and shadows. On the contrary new features such as particles add another degree of realism to the simulation. Most aircraft developed for OSG do not work with older versions. The user is able to choose from 230 aircraft provided with 1.9.0, altough only a few are included in the base package.&lt;br /&gt;
Version 1.9.1, released shortly afterwards, was a bug fix release.&lt;br /&gt;
&lt;br /&gt;
== Version 2.0.0 (2010) ==&lt;br /&gt;
FlightGear 2.0.0 reflects the maturation of the OpenSceneGraph port that started with the previous 1.9.0 release. In addition to many internal code improvements, FlightGear 2.0.0 marks the introduction of many new exciting improvements in the graphics and sound system, as well as improved usability of key features, and improved behavior of exsisting features. Highlights of this new version include: Dramatic new 3D clouds, dramatic lighting conditions, improved support for custom scenery, and many many new and detailed aircraft models. &lt;br /&gt;
&lt;br /&gt;
== Version 2.4.0 (2011) ==&lt;br /&gt;
Starting with version 2.4.0, the FlightGear team adopted a [[release plan]]. From then on, a new version is released every February and August.&lt;br /&gt;
&lt;br /&gt;
==Version 3.8.0/2016.1.0==&lt;br /&gt;
{{Main article|Release plan#Detailed time schedule and checklist}}&lt;br /&gt;
Following the cancellation of 3.6, the modern FlightGear team revised the release plan and process. New releases are essentially selected and tuned &amp;quot;nightlies&amp;quot; instead of special compilations.&lt;br /&gt;
&lt;br /&gt;
Also, in this release the concept of rotating default airports first started. All FlightGear releases after 2016.1 have unique default airports and 'codenames'.&lt;br /&gt;
&lt;br /&gt;
{{Main article|Release plan/Lessons learned#2016.1}}&lt;br /&gt;
&lt;br /&gt;
== Release timeline ==&lt;br /&gt;
Final build code release dates by year.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:40%; margin:auto&amp;quot;&lt;br /&gt;
! Date !! Version&lt;br /&gt;
|-&lt;br /&gt;
|July 17, 1997 || First major code release&lt;br /&gt;
|-&lt;br /&gt;
|September 23, 1997 || 0.12&lt;br /&gt;
|-&lt;br /&gt;
|December 9, 1997 || 0.15&lt;br /&gt;
|-&lt;br /&gt;
|December 17, 1997 || 0.18&lt;br /&gt;
|-&lt;br /&gt;
|December 30, 1997 || 0.19 (first binaries)&lt;br /&gt;
|-&lt;br /&gt;
|January 6, 1998 || 0.22&lt;br /&gt;
|-&lt;br /&gt;
|Mar 11 98 || 0.37&lt;br /&gt;
|-&lt;br /&gt;
|April 8, 1998 || 0.41&lt;br /&gt;
|-&lt;br /&gt;
|April 14, 1998 || 0.42&lt;br /&gt;
|-&lt;br /&gt;
|April 23, 1998 || 0.43&lt;br /&gt;
|-&lt;br /&gt;
|Apr 28, 1998 || 0.44&lt;br /&gt;
|-&lt;br /&gt;
|May 7, 1998 || 0.45&lt;br /&gt;
|-&lt;br /&gt;
|May 11, 1998 || 0.46&lt;br /&gt;
|-&lt;br /&gt;
|May 18, 1998 || 0.47&lt;br /&gt;
|-&lt;br /&gt;
|June 9, 1998 || 0.48&lt;br /&gt;
|-&lt;br /&gt;
|June 27, 1998 || 0.49&lt;br /&gt;
|-&lt;br /&gt;
|July 13, 1998 || 0.50&lt;br /&gt;
|-&lt;br /&gt;
|July 21, 1998 || 0.51&lt;br /&gt;
|-&lt;br /&gt;
|August 15, 1998 || 0.52&lt;br /&gt;
|-&lt;br /&gt;
|September 2, 1998 || 0.53&lt;br /&gt;
|-&lt;br /&gt;
|September 25, 1998 || 0.54&lt;br /&gt;
|-&lt;br /&gt;
|October 23, 1998 || 0.55&lt;br /&gt;
|-&lt;br /&gt;
|November 23, 1998 || 0.56&lt;br /&gt;
|-&lt;br /&gt;
|January 21, 1999 || 0.57&lt;br /&gt;
|-&lt;br /&gt;
|February 10, 1999 || 0.58&lt;br /&gt;
|-&lt;br /&gt;
|March 31, 1999 || 0.59&lt;br /&gt;
|-&lt;br /&gt;
|May 26, 1999 || 0.6.0&lt;br /&gt;
|-&lt;br /&gt;
| June 21, 1999 || 0.6.1 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2 | September 11, 1999 || 0.7.0 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|0.6.2 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|October 22, 1999 || 0.7.1 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|February 17, 2000 || 0.7.2 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|May 18, 2000 || 0.7.3 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|July 20, 2000 || 0.7.4&lt;br /&gt;
|-&lt;br /&gt;
|September 18, 2000 || 0.7.5&lt;br /&gt;
|-&lt;br /&gt;
|December 19, 2000 || 0.7.6&lt;br /&gt;
|-&lt;br /&gt;
|June 20, 2001 || 0.7.7&lt;br /&gt;
|-&lt;br /&gt;
|July 13, 2001 || 0.7.8&lt;br /&gt;
|-&lt;br /&gt;
| February 16, 2002 || 0.7.9&lt;br /&gt;
|-&lt;br /&gt;
| April 20, 2002 || 0.7.10&lt;br /&gt;
|-&lt;br /&gt;
| September 7, 2002 || 0.8.0&lt;br /&gt;
|-&lt;br /&gt;
| December 3, 2002 || 0.9.0&lt;br /&gt;
|-&lt;br /&gt;
| December 5, 2002 || 0.9.1 &lt;br /&gt;
|-&lt;br /&gt;
| June 4, 2003 || 0.9.2&lt;br /&gt;
|-&lt;br /&gt;
| October 24, 2003 || 0.9.3&lt;br /&gt;
|-&lt;br /&gt;
| March 26, 2004 || 0.9.4&lt;br /&gt;
|-&lt;br /&gt;
| July 29, 2004 || 0.9.5&lt;br /&gt;
|-&lt;br /&gt;
| October 12, 2004 || 0.9.6&lt;br /&gt;
|-&lt;br /&gt;
| January 18, 2005 || 0.9.8&lt;br /&gt;
|-&lt;br /&gt;
| November 17, 2005 || 0.9.9&lt;br /&gt;
|-&lt;br /&gt;
| April 5, 2006 || 0.9.10&lt;br /&gt;
|-&lt;br /&gt;
| May 2007 || 0.9.11-pre1&lt;br /&gt;
|-&lt;br /&gt;
| December 17, 2007 || 1.0.0&lt;br /&gt;
|-&lt;br /&gt;
| December 22, 2008 || 1.9.0 &lt;br /&gt;
|-&lt;br /&gt;
| January 25, 2009 || 1.9.1&lt;br /&gt;
|-&lt;br /&gt;
| February 25, 2010 || 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| August 17, 2011 || 2.4.0&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2012 || 2.6.0&lt;br /&gt;
|-&lt;br /&gt;
| August 17, 2012 || 2.8.0&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2013 || 2.10&lt;br /&gt;
|-&lt;br /&gt;
| September 21, 2013 || 2.12&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2014 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| October 15, 2014 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2015 || 3.4&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 3.6 (unreleased, see [[FlightGear Newsletter November 2015#FlightGear v3.6 canceled|here]])&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2016 || 2016.1.1 (new versioning scheme)&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 2016 || 2016.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 17, 2016 || 2016.2.1&lt;br /&gt;
|-&lt;br /&gt;
| September 12, 2016 || 2016.3.1&lt;br /&gt;
|-&lt;br /&gt;
| November 19, 2016 || 2016.4.1&lt;br /&gt;
|-&lt;br /&gt;
| November 23, 2016 || 2016.4.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| December 5, 2016 || 2016.4.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| December 28, 2016 || 2016.4.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| February 23, 2017 || 2017.1.1&lt;br /&gt;
|-&lt;br /&gt;
| March 1, 2017 || 2017.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| April 4, 2017 || 2017.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2017 || 2017.2.1 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| September 20, 2017 || 2017.3.1&lt;br /&gt;
|-&lt;br /&gt;
| April 11, 2018 || 2018.1.1 &lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2018 || 2018.2.1&lt;br /&gt;
|-&lt;br /&gt;
| 2018 || 2018.3.1&lt;br /&gt;
|-&lt;br /&gt;
| 2018 || 2018.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2018 || 2018.3.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2018 || 2018.3.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2018 || 2018.3.5 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2018 || 2018.3.6 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2019 || 2019.1.1&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.1.1&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.1.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.2.1&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.3.1&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.3.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.3.4 (bugfix release)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cycled default airports ==&lt;br /&gt;
&lt;br /&gt;
FlightGear did not start changing the default airport until version 2016.1 was released. At that time, the idea was that each new release would have a new default airport. This chart lists the default airports since 2016.1 was released.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Release !! ICAO !! Default Airport&lt;br /&gt;
|-&lt;br /&gt;
| 2016.1 || [[KSFO]] || San Francisco ''(transition)''&lt;br /&gt;
|-&lt;br /&gt;
| 2016.2 || [[LEBL]] || Barcelona&lt;br /&gt;
|-&lt;br /&gt;
| 2016.3 || [[SBRJ]] || Rio de Janeiro&lt;br /&gt;
|-&lt;br /&gt;
| 2016.4 || [[LSZH]] || Zürich&lt;br /&gt;
|-&lt;br /&gt;
| 2017.1 || [[ENBR]] || Bergen&lt;br /&gt;
|-&lt;br /&gt;
| 2017.2 || [[KBOS]] || Boston&lt;br /&gt;
|- &lt;br /&gt;
| 2017.3 || [[LKPR]] || Prague&lt;br /&gt;
|- &lt;br /&gt;
| 2018.1 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2018.2 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2018.3 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2019.1 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2020.1 || [[BIKF]] || Keflavik&lt;br /&gt;
|- &lt;br /&gt;
| 2020.2 || [[BIKF]] || Keflavik&lt;br /&gt;
|- &lt;br /&gt;
| 2020.3 || [[BIKF]] || Keflavik&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://web.archive.org/web/*/http://www.flightgear.org/ Internet Archive: Wayback Machine for http://www.flightgear.org/ ]&lt;br /&gt;
* [http://web.archive.org/web/19981212014011/http://flightgear.org/ Old website on December 5, 1998]&lt;br /&gt;
* [http://web.archive.org/web/19990209082206/http://www.flightgear.org/Gallery/tucson.jpg link] (&amp;quot;A view from the ground near Tucson, AZ (KTUS)&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
* [http://web.archive.org/web/19990209050729/http://www.flightgear.org/Gallery/texture2.jpg link] (&amp;quot;Here's one of the Grand Canyon with a rock face texture. I know this looks funny, but I'm just experimenting here.&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
&lt;br /&gt;
{{Appendix|2=&lt;br /&gt;
* {{wikipedia|FlightGear}}&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Original Flight Gear Proposal] by David L. Murr (Revision 3.0.1)&lt;br /&gt;
* [ftp://flightgear.wo0t.de/flightgear-ftp/ FlightGear FTP Archive]&lt;br /&gt;
----&lt;br /&gt;
{{References}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=129532</id>
		<title>FlightGear history</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_history&amp;diff=129532"/>
		<updated>2020-12-14T11:56:24Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Release timeline */ add missing releases since 2018.1.2 - still need to research release dates and update the table with them&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[FlightGear]] development started with an online proposal in 1996, using custom 3D graphics code. Development of an [[OpenGL]] based version was spearheaded by Curtis Olson starting in 1997. Many people have contributed to the project in the years since its inception.&lt;br /&gt;
&lt;br /&gt;
FlightGear incorporated other open-source resources, including the LaRCsim flight model from NASA, and freely available elevation data. The first working binaries, using OpenGL for 3D graphic code, came out in 1997. Enthusiastic development of newer versions for several years resulted in progressively more stable and advanced versions. By 2001, the team was releasing new beta versions regularly, and by 2005, the maturity of software lead to more widespread reviews, and increased popularity. 2007 marked a formal transition out of beta development with the release of version 1.0.0, ten years after FlightGear's first release in 1997.&lt;br /&gt;
&lt;br /&gt;
In 2008, version 1.9.0 of FlightGear included a major change from [[PLIB]] to [[OSG]], which caused the temporarily loss of some features like 3D clouds and shadows, while newly added features, such as particles, imparted another degree of realism to the simulation. &lt;br /&gt;
 &lt;br /&gt;
== Beginnings (1996-1997) ==&lt;br /&gt;
[[File:FG SUNHALO.JPG|thumb|270px|March 18, 1999: one of the oldest surviving screenshots of FlightGear. Back then, FlightGear was the only PC based flight simulator rendering the [[Moon|sun, moon, and celestial]] objects at the correct position, and under the correct lighting conditions, in the sky. ]]&lt;br /&gt;
[[File:Image103.gif|thumb|Original Win95 icon]]&lt;br /&gt;
The FlightGear project was conceived on April 8, 1996 by David Murr who proposed a new flight simulator to be developed by volunteers&amp;lt;ref&amp;gt;David Murr (Apr 9, 1996).  FlightGear proposal 1.0: [https://groups.google.com/forum/#!msg/rec.aviation.simulators/ny8HFBE5_T8/OdtIiGNGJc8J &amp;quot;A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@&amp;quot;].  Published on the rec.aviation.simulators newsgroup.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (1996).  FlightGear proposal 2.0: [http://www.flightgear.org/proposal-2.0 FLIGHT GEAR &amp;quot;This truly is as real as it gets!&amp;quot; - a proposal for a new flight simulator - REVISION 2.0].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Oct 29, 1996).  FlightGear proposal 3.0: [http://www.flightgear.org/proposal-3.0 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0 - Wednesday, 10.30.96, &amp;quot;The future of flight simulation is here&amp;quot;].  Published on the [http://ftp.igh.cnrs.fr/pub/flightgear/www/old-stuff/flight-gear.9610 flight-gear@infoplane.com mailing list].&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;David Murr (Sep 11, 1998).  FlightGear proposal 3.0.1: [http://www.flightgear.org/proposal-3.0.1 FLIGHT GEAR FLIGHT SIMULATOR, revision 3.0.1 - Friday, Sep.11.98, &amp;quot;The future of flight simulation is here&amp;quot;].&amp;lt;/ref&amp;gt;.  Part of the initial goals were to develop 2D and 3D graphics routines for the simulator.  However this was a huge task that came to an unfinished halt at the start of 1997 as the main developer,  Eric Korpela, was finishing his thesis.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Development of an [[OpenGL]] based version was spearheaded by Curtis Olsen starting in 1997, after the initial start in 1996. A large community response lead to many contributing to the project from its start in late '90s up to the present.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;quot;''I was working at the University of Minnesota at the time, and had access to Sun and SGI graphical work stations which offered OpenGL for 3d graphics. OpenGl was just starting to become available on PC hardware with things like the 3dfx voodoo card. Somewhere at this point it occurred to me that a far better path would be to leverage an existing multi-platform 3d graphics system (like OpenGL) to build our flight simulator upon.''&lt;br /&gt;
&lt;br /&gt;
''So I proceeded to rough together a basic scenery system, pasted on the larcsim flight model, and in a relatively short time was able to show actual flight over real 3d terrain. Good, realistic 3d terrain was something the other existing flight sims at the time were pretty far behind on ... and I think my work was enough of a breakthrough that it got a lot of people excited about the possibilities.''&amp;quot;~Curt Olson &amp;lt;ref&amp;gt;Curtis Olson (Sep 28, 2015).  [http://forum.flightgear.org/viewtopic.php?f=42&amp;amp;t=27558&amp;amp;p=259048#p259021 Re: A PROPOSAL FOR A NEW FLIGHT SIMULATOR - home built!@].  Published on the FlightGear forum.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Rather than start entirely from scratch, FlightGear developers made use of the LaRCsim flight model from NASA, with OpenGL for 3D graphic code, and freely available elevation data. First working binaries came out in 1997, with an intense updating of newer versions for several years resulting in progressively more stable and advanced programs.&lt;br /&gt;
&lt;br /&gt;
== Versions 0.7–0.9 (2001–2003) ==&lt;br /&gt;
By 2001, the team was releasing new beta versions regularly (0.7.x, 0.8.0, over 2001-2003) and with 0.9.xx (2003-2006). Later in the decade, the rate of final public releases slowed, but had larger amounts of content (0.9.10, 1.0.0 etc.). The maturity of software by 2005 lead to more widespread reviews, and increased popularity. &lt;br /&gt;
&lt;br /&gt;
== Version 0.9.0-0.9.11 (2002-2007) ==&lt;br /&gt;
The use of version numbers slowed dramatically after the late 2002 release of version 0.9.0. Versions 0.9.9 (2005) and 0.9.10 (2006) had about 8 all-new or redone [[aircraft]] adding to a total of 70-90 aircraft. [[Nasal]] was also integrated into FlightGear in version 0.9.4. FlightGear 0.9.10 won Softpedia's &amp;quot;Pick&amp;quot; award (5 out of 5 stars) on June 3, 2006 as well as the &amp;quot;100% CLEAN&amp;quot; Softpedia award.&lt;br /&gt;
&lt;br /&gt;
Behind the scenes there was a 0.9.11-pre1 released in 2007 that ended up being superseded by FlightGear 1.0. The pre-version had about 33 new or redone aircraft.&lt;br /&gt;
&lt;br /&gt;
[[File:FG-A-10.jpg|thumb|270px|3D Cockpit panel for [[A-10]] in version 1.0.0 in 2008]]&lt;br /&gt;
&lt;br /&gt;
== Version 1.0 (2008) ==&lt;br /&gt;
The version number marked a formal transition out of beta development since the software's first release in 1997, ten years prior.&lt;br /&gt;
&lt;br /&gt;
== Version 1.9.0 (2008) ==&lt;br /&gt;
At the time version 1.9.0 was released FlightGear switched from [[PLIB]] to [[OSG]], which caused the temporary loss of some of the features like 3D clouds and shadows. On the contrary new features such as particles add another degree of realism to the simulation. Most aircraft developed for OSG do not work with older versions. The user is able to choose from 230 aircraft provided with 1.9.0, altough only a few are included in the base package.&lt;br /&gt;
Version 1.9.1, released shortly afterwards, was a bug fix release.&lt;br /&gt;
&lt;br /&gt;
== Version 2.0.0 (2010) ==&lt;br /&gt;
FlightGear 2.0.0 reflects the maturation of the OpenSceneGraph port that started with the previous 1.9.0 release. In addition to many internal code improvements, FlightGear 2.0.0 marks the introduction of many new exciting improvements in the graphics and sound system, as well as improved usability of key features, and improved behavior of exsisting features. Highlights of this new version include: Dramatic new 3D clouds, dramatic lighting conditions, improved support for custom scenery, and many many new and detailed aircraft models. &lt;br /&gt;
&lt;br /&gt;
== Version 2.4.0 (2011) ==&lt;br /&gt;
Starting with version 2.4.0, the FlightGear team adopted a [[release plan]]. From then on, a new version is released every February and August.&lt;br /&gt;
&lt;br /&gt;
==Version 3.8.0/2016.1.0==&lt;br /&gt;
{{Main article|Release plan#Detailed time schedule and checklist}}&lt;br /&gt;
Following the cancellation of 3.6, the modern FlightGear team revised the release plan and process. New releases are essentially selected and tuned &amp;quot;nightlies&amp;quot; instead of special compilations.&lt;br /&gt;
&lt;br /&gt;
Also, in this release the concept of rotating default airports first started. All FlightGear releases after 2016.1 have unique default airports and 'codenames'.&lt;br /&gt;
&lt;br /&gt;
{{Main article|Release plan/Lessons learned#2016.1}}&lt;br /&gt;
&lt;br /&gt;
== Release timeline ==&lt;br /&gt;
Final build code release dates by year.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:40%; margin:auto&amp;quot;&lt;br /&gt;
! Date !! Version&lt;br /&gt;
|-&lt;br /&gt;
|July 17, 1997 || First major code release&lt;br /&gt;
|-&lt;br /&gt;
|September 23, 1997 || 0.12&lt;br /&gt;
|-&lt;br /&gt;
|December 9, 1997 || 0.15&lt;br /&gt;
|-&lt;br /&gt;
|December 17, 1997 || 0.18&lt;br /&gt;
|-&lt;br /&gt;
|December 30, 1997 || 0.19 (first binaries)&lt;br /&gt;
|-&lt;br /&gt;
|January 6, 1998 || 0.22&lt;br /&gt;
|-&lt;br /&gt;
|Mar 11 98 || 0.37&lt;br /&gt;
|-&lt;br /&gt;
|April 8, 1998 || 0.41&lt;br /&gt;
|-&lt;br /&gt;
|April 14, 1998 || 0.42&lt;br /&gt;
|-&lt;br /&gt;
|April 23, 1998 || 0.43&lt;br /&gt;
|-&lt;br /&gt;
|Apr 28, 1998 || 0.44&lt;br /&gt;
|-&lt;br /&gt;
|May 7, 1998 || 0.45&lt;br /&gt;
|-&lt;br /&gt;
|May 11, 1998 || 0.46&lt;br /&gt;
|-&lt;br /&gt;
|May 18, 1998 || 0.47&lt;br /&gt;
|-&lt;br /&gt;
|June 9, 1998 || 0.48&lt;br /&gt;
|-&lt;br /&gt;
|June 27, 1998 || 0.49&lt;br /&gt;
|-&lt;br /&gt;
|July 13, 1998 || 0.50&lt;br /&gt;
|-&lt;br /&gt;
|July 21, 1998 || 0.51&lt;br /&gt;
|-&lt;br /&gt;
|August 15, 1998 || 0.52&lt;br /&gt;
|-&lt;br /&gt;
|September 2, 1998 || 0.53&lt;br /&gt;
|-&lt;br /&gt;
|September 25, 1998 || 0.54&lt;br /&gt;
|-&lt;br /&gt;
|October 23, 1998 || 0.55&lt;br /&gt;
|-&lt;br /&gt;
|November 23, 1998 || 0.56&lt;br /&gt;
|-&lt;br /&gt;
|January 21, 1999 || 0.57&lt;br /&gt;
|-&lt;br /&gt;
|February 10, 1999 || 0.58&lt;br /&gt;
|-&lt;br /&gt;
|March 31, 1999 || 0.59&lt;br /&gt;
|-&lt;br /&gt;
|May 26, 1999 || 0.6.0&lt;br /&gt;
|-&lt;br /&gt;
| June 21, 1999 || 0.6.1 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2 | September 11, 1999 || 0.7.0 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|0.6.2 (Stable)&lt;br /&gt;
|-&lt;br /&gt;
|October 22, 1999 || 0.7.1 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|February 17, 2000 || 0.7.2 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|May 18, 2000 || 0.7.3 (Development)&lt;br /&gt;
|-&lt;br /&gt;
|July 20, 2000 || 0.7.4&lt;br /&gt;
|-&lt;br /&gt;
|September 18, 2000 || 0.7.5&lt;br /&gt;
|-&lt;br /&gt;
|December 19, 2000 || 0.7.6&lt;br /&gt;
|-&lt;br /&gt;
|June 20, 2001 || 0.7.7&lt;br /&gt;
|-&lt;br /&gt;
|July 13, 2001 || 0.7.8&lt;br /&gt;
|-&lt;br /&gt;
| February 16, 2002 || 0.7.9&lt;br /&gt;
|-&lt;br /&gt;
| April 20, 2002 || 0.7.10&lt;br /&gt;
|-&lt;br /&gt;
| September 7, 2002 || 0.8.0&lt;br /&gt;
|-&lt;br /&gt;
| December 3, 2002 || 0.9.0&lt;br /&gt;
|-&lt;br /&gt;
| December 5, 2002 || 0.9.1 &lt;br /&gt;
|-&lt;br /&gt;
| June 4, 2003 || 0.9.2&lt;br /&gt;
|-&lt;br /&gt;
| October 24, 2003 || 0.9.3&lt;br /&gt;
|-&lt;br /&gt;
| March 26, 2004 || 0.9.4&lt;br /&gt;
|-&lt;br /&gt;
| July 29, 2004 || 0.9.5&lt;br /&gt;
|-&lt;br /&gt;
| October 12, 2004 || 0.9.6&lt;br /&gt;
|-&lt;br /&gt;
| January 18, 2005 || 0.9.8&lt;br /&gt;
|-&lt;br /&gt;
| November 17, 2005 || 0.9.9&lt;br /&gt;
|-&lt;br /&gt;
| April 5, 2006 || 0.9.10&lt;br /&gt;
|-&lt;br /&gt;
| May 2007 || 0.9.11-pre1&lt;br /&gt;
|-&lt;br /&gt;
| December 17, 2007 || 1.0.0&lt;br /&gt;
|-&lt;br /&gt;
| December 22, 2008 || 1.9.0 &lt;br /&gt;
|-&lt;br /&gt;
| January 25, 2009 || 1.9.1&lt;br /&gt;
|-&lt;br /&gt;
| February 25, 2010 || 2.0.0&lt;br /&gt;
|-&lt;br /&gt;
| August 17, 2011 || 2.4.0&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2012 || 2.6.0&lt;br /&gt;
|-&lt;br /&gt;
| August 17, 2012 || 2.8.0&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2013 || 2.10&lt;br /&gt;
|-&lt;br /&gt;
| September 21, 2013 || 2.12&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2014 || 3.0&lt;br /&gt;
|-&lt;br /&gt;
| October 15, 2014 || 3.2&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2015 || 3.4&lt;br /&gt;
|-&lt;br /&gt;
| {{N/a}} || 3.6 (unreleased, see [[FlightGear Newsletter November 2015#FlightGear v3.6 canceled|here]])&lt;br /&gt;
|-&lt;br /&gt;
| February 17, 2016 || 2016.1.1 (new versioning scheme)&lt;br /&gt;
|-&lt;br /&gt;
| May 7, 2016 || 2016.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 17, 2016 || 2016.2.1&lt;br /&gt;
|-&lt;br /&gt;
| September 12, 2016 || 2016.3.1&lt;br /&gt;
|-&lt;br /&gt;
| November 19, 2016 || 2016.4.1&lt;br /&gt;
|-&lt;br /&gt;
| November 23, 2016 || 2016.4.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| December 5, 2016 || 2016.4.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| December 28, 2016 || 2016.4.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| February 23, 2017 || 2017.1.1&lt;br /&gt;
|-&lt;br /&gt;
| March 1, 2017 || 2017.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| April 4, 2017 || 2017.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2017 || 2017.2.1 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| September 20, 2017 || 2017.3.1&lt;br /&gt;
|-&lt;br /&gt;
| April 11, 2018 || 2018.1.1 &lt;br /&gt;
|-&lt;br /&gt;
| May 22, 2018 || 2018.2.1&lt;br /&gt;
|-&lt;br /&gt;
| 2018 || 2018.3.1&lt;br /&gt;
|-&lt;br /&gt;
| 2018 || 2018.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2018 || 2018.3.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2018 || 2018.3.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2018 || 2018.3.5 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2018 || 2018.3.6 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2019 || 2019.1.1&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.1.1&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.1.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.1.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.1.4 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.2.1&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.3.1&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.3.2 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.3.3 (bugfix release)&lt;br /&gt;
|-&lt;br /&gt;
| 2020 || 2020.3.4 (bugfix release)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Cycled default airports ==&lt;br /&gt;
&lt;br /&gt;
FlightGear did not start changing the default airport until version 2016.1 was released. At that time, the idea was that each new release would have a new default airport. This chart lists the default airports since 2016.1 was released.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Release !! ICAO !! Default Airport&lt;br /&gt;
|-&lt;br /&gt;
| 2016.1 || [[KSFO]] || San Francisco ''(transition)''&lt;br /&gt;
|-&lt;br /&gt;
| 2016.2 || [[LEBL]] || Barcelona&lt;br /&gt;
|-&lt;br /&gt;
| 2016.3 || [[SBRJ]] || Rio de Janeiro&lt;br /&gt;
|-&lt;br /&gt;
| 2016.4 || [[LSZH]] || Zürich&lt;br /&gt;
|-&lt;br /&gt;
| 2017.1 || [[ENBR]] || Bergen&lt;br /&gt;
|-&lt;br /&gt;
| 2017.2 || [[KBOS]] || Boston&lt;br /&gt;
|- &lt;br /&gt;
| 2017.3 || [[LKPR]] || Prague&lt;br /&gt;
|- &lt;br /&gt;
| 2018.1 || [[PHNL]] || Honolulu&lt;br /&gt;
|- &lt;br /&gt;
| 2018.2 || [[PHNL]] || Honolulu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [http://web.archive.org/web/*/http://www.flightgear.org/ Internet Archive: Wayback Machine for http://www.flightgear.org/ ]&lt;br /&gt;
* [http://web.archive.org/web/19981212014011/http://flightgear.org/ Old website on December 5, 1998]&lt;br /&gt;
* [http://web.archive.org/web/19990209082206/http://www.flightgear.org/Gallery/tucson.jpg link] (&amp;quot;A view from the ground near Tucson, AZ (KTUS)&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
* [http://web.archive.org/web/19990209050729/http://www.flightgear.org/Gallery/texture2.jpg link] (&amp;quot;Here's one of the Grand Canyon with a rock face texture. I know this looks funny, but I'm just experimenting here.&amp;quot;, old FlightGear screenshot)&lt;br /&gt;
&lt;br /&gt;
{{Appendix|2=&lt;br /&gt;
* {{wikipedia|FlightGear}}&lt;br /&gt;
* [http://www.flightgear.org/proposal-3.0.1 Original Flight Gear Proposal] by David L. Murr (Revision 3.0.1)&lt;br /&gt;
* [ftp://flightgear.wo0t.de/flightgear-ftp/ FlightGear FTP Archive]&lt;br /&gt;
----&lt;br /&gt;
{{References}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FG777Controller&amp;diff=129527</id>
		<title>FG777Controller</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FG777Controller&amp;diff=129527"/>
		<updated>2020-12-13T17:00:37Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: add missing '=' to telnet portion of command line&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Software&lt;br /&gt;
| title                  = FG777Controller&lt;br /&gt;
| image                  = FG777Controller Panel.png&lt;br /&gt;
| alt                    = Controller Panel.&lt;br /&gt;
| developedby            = Eduardo Crispim&lt;br /&gt;
| initialrelease         = 1.0.0 (July, 2016)&lt;br /&gt;
| latestrelease          = 1.0.0 (July, 2016)&lt;br /&gt;
| developmentstatus      = active &lt;br /&gt;
| writtenin              = Python/kivy&lt;br /&gt;
| os                     = Android&lt;br /&gt;
| license                = [[GNU General Public License]]&lt;br /&gt;
| website                = https://github.com/emcrispim/fg777controller/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
This application allows control the [[Boeing 777]] Airplane with your android device (phone,tablet).&lt;br /&gt;
&lt;br /&gt;
Before you start please follow the configuration guide.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
[[File:FG777Controller fgrun.png|thumb|Configuration example using FGrun with controller device ip 192.168.1.68]]&lt;br /&gt;
&lt;br /&gt;
# Install/run FlightGear&lt;br /&gt;
# Install/Select Boeing 777 Aircraft&lt;br /&gt;
# Copy the xml files [https://raw.githubusercontent.com/emcrispim/fg777controller/master/xml/from_fg777controller.xml from_fg777controller.xml] and [https://raw.githubusercontent.com/emcrispim/fg777controller/master/xml/to_fg777controller.xml to_fg777controller.xml] and place in the ''FlightGear-installation-Directory''/'''Protocol''' directory.&lt;br /&gt;
#Run the FlighGear with the following configuration parameters:&lt;br /&gt;
# From command line:&lt;br /&gt;
#: &amp;lt;code&amp;gt;fgfs --generic=socket,in,20,,9009,udp,from_fgcontroller777 --generic=socket,out,5,'''android-device-ip''',9010,udp,to_fgcontroller777 --telnet=9000 &amp;lt;/code&amp;gt;&lt;br /&gt;
#:Or Use FGRun to set the required parameters via '''Advanced''' &amp;gt; '''Input/Output''' menu.&lt;br /&gt;
#:Obs: Change '''android-device-ip''' with your local IP Wi-Fi network device.&lt;br /&gt;
#Install the apk from the play store ([https://play.google.com/store/apps/details?id=org.emcrispim.fg777controller.fg777controller link]).&lt;br /&gt;
#Go to the Settings (upper left corner button) and enter the IP of your computer running the FlightGear&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
The basic features will work in any aircraft and if available. The boeing 777 features may work partially with other airplanes, like the flaps but these are designed specially with the 777 variables values acceptance. &lt;br /&gt;
&lt;br /&gt;
=== Basic features ===&lt;br /&gt;
* Steering, available touchpad or accelerometer&lt;br /&gt;
* Elevator trim&lt;br /&gt;
* Rudder&lt;br /&gt;
* Landing gears, if the airplane allows extend and retract the landing gears.&lt;br /&gt;
* Brakes&lt;br /&gt;
* Throttle, if the airplane have one or two engine, if you try with more engines you may have airplane crash experiences. &lt;br /&gt;
&lt;br /&gt;
=== Boeing 777 Features ===&lt;br /&gt;
* Parking brakes&lt;br /&gt;
* Reverse trust&lt;br /&gt;
* Autobrake&lt;br /&gt;
* Flaps&lt;br /&gt;
* Throttle&lt;br /&gt;
* Speedbrake&lt;br /&gt;
* Views: captain, CDU, OH Panel, etc...&lt;br /&gt;
* Lights&lt;br /&gt;
* Autopilot&lt;br /&gt;
&lt;br /&gt;
== Legend ==&lt;br /&gt;
[[File:FG777Controller Legend.png|1024px|FG777Controller Legend]]&lt;br /&gt;
&lt;br /&gt;
# Settings menu (check settings section for more information)&lt;br /&gt;
# Enable Accelerometer / Enable Touchpad&lt;br /&gt;
#: When enable the accelerometer it will popup a message to calibrate the device. This will give a 3 seconds timer so that the user must put the device (phone/tablet) in a comfortable position that will be the neutral steering position.&lt;br /&gt;
#: When touchpad is enable the steering will be controlled by the pad (Item 17).&lt;br /&gt;
# Elevator trim up&lt;br /&gt;
# Elevator trim down, the current elevator trim is showed in the little white diamond&lt;br /&gt;
# Rudder / front wheel&lt;br /&gt;
# Parking brake&lt;br /&gt;
# Reverse trust, this also sets the throttle to 0.&lt;br /&gt;
# Brakes (wheels)&lt;br /&gt;
# Set autobrake, touch and swipe up or down, to rotate the button right or left accordingly.&lt;br /&gt;
# Landing gear up/down&lt;br /&gt;
# Open/Close view menu&lt;br /&gt;
# Open/Close lights menu&lt;br /&gt;
# Open/Close autopilot menu&lt;br /&gt;
# Flaps&lt;br /&gt;
# Throttle&lt;br /&gt;
# Speedbrakes&lt;br /&gt;
# Touchpad for steering. When accelerometer is enable it will show a steering image.&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&lt;br /&gt;
The Settings menu allows you to configure properly the FG777Controller to your FlightGear and network environment, other tweaks are available to set the application to a more enjoyable e comfortable controller.&lt;br /&gt;
&lt;br /&gt;
* '''FlightGear IP''' - The local network ip where your flightGear is running&lt;br /&gt;
* '''Outgoing UDP Port''' - The port where the FlightGear is listening (check configuration section )&lt;br /&gt;
* '''Incoming UPD Port''' - The port where the Flightgear is sending information (check configuration section)&lt;br /&gt;
* '''Telnet port''' - The telnet port where the FlightGear is listening (check configuration section)&lt;br /&gt;
* '''Accelerometer elevator sensitivity''' - this slider configures the elevator sensitivity &lt;br /&gt;
* '''Accelerometer aileron sensitivity''' - this slider configures the aileron sensitivity &lt;br /&gt;
* '''Accelerometer/pad threshold''' - This slider configures the threshold for the steering. If it sets low threshold (slider left), small changes in the steering controller will change the airplane steering. If it sets high threshold, small changes will not affect/change the airplane steering.&lt;br /&gt;
* '''Pad auto center''' - it auto centers the Pad/steering when touch release&lt;br /&gt;
* '''Rudder auto center''' - it auto centers the  rudder when touch release&lt;br /&gt;
* '''Smooth rudder''' - it applies a smooth (non linear transformation)  rudder response. It gives a better rudder control for small rudder flight corrections.&lt;br /&gt;
* '''Brakes auto disable''' - it sets no brakes when touch is released&lt;br /&gt;
* '''Anchor Throttle''' - If enable the throttle knobs will act as one.&lt;br /&gt;
* '''Disable FlightGear Controller update (time s)''' - This is the time in seconds that the controller will not update any changes that came form the flightgear. Example: if we change the throttle in the controller, the controller will wait some seconds before will listen to changes that came from flightgear.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
* [[FlightGear_TQPanel]] twin engine throttle Quadrant, flaps, speedbrakes, buttons&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [https://play.google.com/store/apps/details?id=org.emcrispim.fg777controller.fg777controller Application Google play store]&lt;br /&gt;
* [https://github.com/emcrispim/fg777controller  Development repository ] &lt;br /&gt;
&lt;br /&gt;
[[Category:Android apps ]]&lt;br /&gt;
[[Category:Software]]&lt;br /&gt;
[[Category:GPL software]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FGAirports&amp;diff=126015</id>
		<title>FGAirports</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FGAirports&amp;diff=126015"/>
		<updated>2020-07-01T19:51:10Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: update latest release version number and date&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox Software&lt;br /&gt;
| title                  = Flightgear Airports&lt;br /&gt;
| image                  = &lt;br /&gt;
| alt                    = &lt;br /&gt;
| developedby            = Keith Paterson&lt;br /&gt;
| initialrelease         = 2020&lt;br /&gt;
| latestrelease          = [https://github.com/Portree-Kid/flightgear-airports/releases/latest 0.0.15 (01 Jul 2020)]&lt;br /&gt;
| os                     = Windows, GNU/Linux, MacOS X&lt;br /&gt;
| website                = https://github.com/Portree-Kid/flightgear-airports/wiki&lt;br /&gt;
| license                = [[GNU General Public License]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Sidebar == &lt;br /&gt;
Flightgear Airports is a (free) taxiway editor for FlightGear licensed under the GNU GPL. It is cross-platform, known to work on Windows but should work on all platforms supported by electron. The usage philosophy is not to be file centred, but airport centred. &lt;br /&gt;
=== Properties ===&lt;br /&gt;
Currently selected item can be edited here.&lt;br /&gt;
=== Parking List ===&lt;br /&gt;
Table of all parkings for easy editing.&lt;br /&gt;
=== Search === &lt;br /&gt;
You can search for airports with ICAO or parts of the name. Only airports with flights are shown. If you want to view another one it will be added when you type the full ICAO.&lt;br /&gt;
=== Check result === &lt;br /&gt;
=== Work in Progress === &lt;br /&gt;
List of edited airports with the possibility to remove after upload.&lt;br /&gt;
== World view ==&lt;br /&gt;
When zoomed out you will see circles. Their size corresponds with the number of flights. Blue means Ok. Yellow too little parking. Red no groundnet.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
# Set directories in settings (bottom left)&lt;br /&gt;
## Airports Directory - The directory with all/most airports. Must conform to Airports/A/B/C/ABCD.groundnet.xml form.&lt;br /&gt;
## Flightgear Directory - Flightgear directory. apt.dat and traffic is read from here.&lt;br /&gt;
## Test Directory - Work in progress can be copied here for test purpose.  &lt;br /&gt;
# Start scans one after the other in sidebar with sync icon.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
[[File:FGAirportsEditing.png|frameless|FG Airports editing view]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Edit Bar ==&lt;br /&gt;
Button with ICAO code opens the Airport data in the edit tab.&lt;br /&gt;
[[File:FGAMenuBar.png|thumb|FG Airports Menu Bar]]&lt;br /&gt;
* The top 4 buttons in the button bar are for zooming (+/-/details/large).&lt;br /&gt;
* Upload sends the current airport to [http://groundweb.azurewebsites.net/ groundweb].&lt;br /&gt;
* Edit switches into edit mode&lt;br /&gt;
* Undo undos all changes or all changes during session&lt;br /&gt;
* Save, saves the groundnet&lt;br /&gt;
* Draw taxiline&lt;br /&gt;
* Draw push&lt;br /&gt;
* Add parking&lt;br /&gt;
* Remove element, removes the currently selected element&lt;br /&gt;
* Check triggers the groundnet check.&lt;br /&gt;
&lt;br /&gt;
== ToDo / Wishlist == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Work item !! Version !! Progress &lt;br /&gt;
|-&lt;br /&gt;
| Zoom/Move performance || 0.10.0 || {{Template:Fixed}}&lt;br /&gt;
|-&lt;br /&gt;
| Extend properties editing || 0.11.0 || {{Template:Done}}&lt;br /&gt;
|-&lt;br /&gt;
| Consistent click behaviour || 0.11.0 || {{Template:Done}}&lt;br /&gt;
|-&lt;br /&gt;
| Loading Performance (SET_PARKINGS) || 0.12.0 || {{Template:Done}}&lt;br /&gt;
|-&lt;br /&gt;
| ParkPos Icon Unclear || 0.14.0 || {{pending}}&lt;br /&gt;
|-&lt;br /&gt;
| Layer visibility || 0.14.0 || {{pending}}&lt;br /&gt;
|-&lt;br /&gt;
| Full Airline names in dropdown || 0.14.0 || {{pending}}&lt;br /&gt;
|-&lt;br /&gt;
| Import from X-Plane Gateway || 0.14.0 || {{pending}}&lt;br /&gt;
|-&lt;br /&gt;
| Editing of single airport (without terrasync copy) || || {{pending}}&lt;br /&gt;
|-&lt;br /&gt;
| Undo || || {{pending}}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
[[Category:Scenery software]]&lt;br /&gt;
[[Category:AI Traffic]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Emesary&amp;diff=123913</id>
		<title>Emesary</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Emesary&amp;diff=123913"/>
		<updated>2020-04-18T14:37:31Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Status */ fix the comment lines&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stub}}&lt;br /&gt;
&lt;br /&gt;
[[File:Emesary-javascript-port.png|thumb|Emesary ported to Node.js (JavaScript]]&lt;br /&gt;
{{Nasal Navigation}}&lt;br /&gt;
&lt;br /&gt;
Richard Harrison has finished porting his Emesary system to [[Nasal]] and it's now part of the base package. '''Emesary''' is a simple and efficient class-based inter-object communication system to allow decoupled disparate parts of a system to function together without knowing about each. It allows decoupling and removal of dependencies by using notifications to cause actions or to query values.&lt;br /&gt;
&lt;br /&gt;
There are many possible applications for Emesary within the system. It solves the problem of how to connect generic instruments to aircraft that have different implementations and properties that need to be used. Richard has been looking at how to abstract out the interface to the MFD and [[NavDisplay]]. &lt;br /&gt;
&lt;br /&gt;
At the highest level Emesary is a way of communicating information between objects that are otherwise unrelated and possibly separated by a physical (machine, network, process) boundary.&lt;br /&gt;
Two (or more) systems can be connected together by using a bridge; the bridge that Richard implemented uses the generic string properties to transmit the messages transparently (to both the sender and recipient). (documentation is possibly slightly out of date for the most recent developments that are in Richard's fgdata)&lt;br /&gt;
Richard has gotten the transmission of properties working using a new notification type.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is a set of notes at [http://chateau-logic.com/content/emesary-nasal-implementation-flightgear] that explains the whole thing with a worked example (ACLS). &lt;br /&gt;
&lt;br /&gt;
This is in Richard's git repository in his commit, together with the changes to the AI carriers to add ACLS (carrier ILS): https://sourceforge.net/u/r-harrison/fgdata/ci/54165c213f03638a4cb02c848c4f2b234c537f66/ &lt;br /&gt;
&lt;br /&gt;
Richard has plans to extend this to be able to transmit over {{Abbr|mp|Multiplayer}} (probably layered on top of mp-broadcast). It would also probably work quite well with the [[High-Level_Architecture#Federate_Object_Model|HLA FOM]] to give us a way for models to communicate with other models.&amp;lt;ref&amp;gt; {{cite web&lt;br /&gt;
  | url    = http://sourceforge.net/p/flightgear/mailman/message/34985731/&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;[Flightgear-devel] Message passing interface for Nasal&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Richard Harrison&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Apr 1st, 2016&lt;br /&gt;
  | added   = Apr 1st, 2016&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
The longer term direction Richard wants to take is to extend the multiplayer protocol to better handle Emesary notifications bridged over MP; it has significant advantages which he's covered previously.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35777639/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Multiplayer packet truncated &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Apr 9th, 2017 &lt;br /&gt;
  |added  =  Apr 9th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Meanwhile, Richard has nearly finished his improvements to Emesary to make it easy and seamless to transmit properties over MP instead of the of the usual way. This is a two part set of changes, the first part (complete) is to transmit from the master model, the second part is still WIP and relates to the transmission back for dual control.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
  var PropertySyncNotification =&lt;br /&gt;
  {&lt;br /&gt;
     new: func(_ident=&amp;quot;none&amp;quot;, _name=&amp;quot;&amp;quot;, _kind=0, _secondary_kind=0)&lt;br /&gt;
     {&lt;br /&gt;
         var new_class = PropertySyncNotificationBase.new(_ident, _name, _kind, _secondary_kind);&lt;br /&gt;
&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;consumables/fuel/total-fuel-lbs&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;controls/fuel/dump-valve&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;engines/engine[0]/augmentation-burner&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;engines/engine[0]/n1&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;engines/engine[0]/n2&amp;quot;, 1);&lt;br /&gt;
         new_class.addNormProperty(&amp;quot;surface-positions/wing-pos-norm&amp;quot;, 2);&lt;br /&gt;
#... etc ...&lt;br /&gt;
         return new_class;&lt;br /&gt;
     }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# this section sets up the notifications that will be routed and the transmitters that are used&lt;br /&gt;
# I've separated out the transmitter that will be used to send the properties to enable better control.&lt;br /&gt;
var routedNotifications = [notifications.PropertySyncNotification.new(nil), notifications.GeoEventNotification.new(nil)];&lt;br /&gt;
var bridgedTransmitter = emesary.Transmitter.new(&amp;quot;outgoingBridge&amp;quot;);&lt;br /&gt;
var outgoingBridge = emesary_mp_bridge.OutgoingMPBridge.new(&amp;quot;F-14mp&amp;quot;,routedNotifications, 19, &amp;quot;&amp;quot;, bridgedTransmitter);&lt;br /&gt;
var incomingBridge = emesary_mp_bridge.IncomingMPBridge.startMPBridge(routedNotifications);&lt;br /&gt;
var f14_aircraft_notification = notifications.PropertySyncNotification.new(&amp;quot;F-14&amp;quot;~getprop(&amp;quot;/sim/multiplay/callsign&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That's all that is required to ship properties between multiplayer modules via Emesary. There is a limit of 128 bytes on a string which limits the amount of outgoing messages. Outgoing notifications are queued and transmitted as space permits. The way the bridge works is to publish the notification, encoded into an MP string, for a period of time to allow for lagging clients and network issues. If a notification IsDistinct then the bridge will transfer just the last message received; otherwise the bridge will transfer all received notifications over MP. In this sense IsDistinct indicates that the contents of the notification are accurate and definitive (e.g. surface position), so the last value is the most accurate. Other notification (e.g. button 12 pushed will always need to be transferred). Obviously using this technique a variable number of properties can be transmitted, and importantly it's up to the modeller to decide what to transmit. There is a flag that I've temporarily added (sim/multiplay/transmit-only-generics) that doesn't transmit the standard properties, just chat and the generics (to make more space in the packet). There can be different types of notifications sent at a different schedule (so you could have a 10 second update of very slow moving items).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Work in progress ==&lt;br /&gt;
What Richard is working on now is how to make (possibly multiple) slaves communicate back to a master craft, initially the F-14 backseat. The design goal is that the same code should work for both the master and the slave, and that there should not need to be any extra logic. At the highest level this would be (master craft): 1. Inside the model bindings a notification is raised, or a property changed that will cause a notification to be raised. 2. The model receives the notification and the appropriate property is changed. 3. The property changed will be sent over Emesary to all slaves. Slaves will not transmit this data back to the master as there is no outgoing bridge configured to do this. For the slave aircraft 1. Inside the model bindings a notification is raised, or a property changed that will cause a notification to be raised. 2. The notification is bridged over MP and received by the master craft.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ALS landing lights visible on the runway from outside views are with FG since 2016.3 or so - same with the technology of lights external to the aircraft specified via relative geometry (used e.g. to illuminate the Shuttle from the ground floodlights during night landings or SRB separation at night). The latter can also  be used for scenery to player or  MP to MP illumination, and Richard is toying with the idea of using the Emesary MP bridge for the job.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=306389#p306389 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: The BK117-B2 &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Mar 5th, 2017 &lt;br /&gt;
  |added  =  Mar 5th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
Any lighting ''always'' requires some form communication between light source and effect assigned to the surface. In Rembrandt, lots of performance is burned to set this up fairly generally via additional passes and buffers. The ALS technique requires you to set this up specifically - so there has to be an information exchange between light and effect - which is what the light manager does for the Shuttle, and which is what Emesary can do more generally between scenery object Nasal snippets and an aircraft.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=306418#p306418 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: The BK117-B2 &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Mar 6th, 2017 &lt;br /&gt;
  |added  =  Mar 6th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are certain things that work better as addons, and with the work Richard has been doing on Emesary FlightGear is in a better position to have integration of addons than it was previously - simply because Emesary removes inter-dependencies.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=318878#p318878 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Serious Request] Making flightgear combat capable. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Sep 15th, 2017 &lt;br /&gt;
  |added  =  Sep 15th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Most of the work that Richard did to the MP protocol - extending the number of properties available and improving the efficiency of transfer came out of the need for the OPRF aircraft to transmit more properties - but is something that has much wider applications. Equally Emesary developments are coming along nicely - we should soon (next few months) see Emesary used on the OPRF fleet to allow models to communicate with each other in a more structured way to provide chaff, flares, radar, missiles, bombs, link16, damage etc.&lt;br /&gt;
&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=318872#p318872 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Serious Request] Making flightgear combat capable. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Sep 15th, 2017 &lt;br /&gt;
  |added  =  Sep 15th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To work over MP properly the model needs to use the existing property transfer over MP (e.g. in sim/multiplay/generic/). &lt;br /&gt;
The best and possibly easiest way to do this is using Emesary with a multiplayer bridge to transmit this (transparently) using a GeoEventNotification. &amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=312137#p312137 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: Synchronization between 2 pc is not reliable &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 9th, 2017 &lt;br /&gt;
  |added  =  Jun 9th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
We all agree having a good IPC mechanism for distributing the simulation state across threads/processes/network is critical&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Properties are much too fine-grained for exposing via HLA. Properties, and subsystems communicating using them, are implementation details of particular HLA federate, not something we’d expose across the federation.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Most solutions that don’t involve fine-grained locking of each property ultimately equate to '''message passing''' anyway&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besides, there's the '''ownship''' assumption hard-coded all over the place - for example, right now subsystems like the replay (flight recorder) system only record and replay your &amp;quot;own&amp;quot; aircraft flight dynamics. &lt;br /&gt;
&lt;br /&gt;
It would be a significant change/addition and somewhat non-trivial to capture all the data for all the AI objects and replay them as well.  &lt;br /&gt;
&lt;br /&gt;
We'd have to decide if the recording and playback mechanism should be part of the AI object or something external that grabs the data and then somehow can force the AI object back through &lt;br /&gt;
it's original path during playback. &amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/8980739/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A similar problem arises when you have a multi viewer environment where you want to interact with the carrier or when you watch AI traffic across the views ..&lt;br /&gt;
&lt;br /&gt;
In this case each viewer has its own carrier AI traffic. That means the can move independently. The same applies to multiplayer mode.&lt;br /&gt;
&lt;br /&gt;
We need some generic code which is able to track SGSubsystems including their child subsystems and transfer their relevant states over the network. The same interface could be used to store replay replay logs. &amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/8980743/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
=== Transmitter ===&lt;br /&gt;
=== Notification ===&lt;br /&gt;
=== Recipient ===&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
=== Loading the framework ===&lt;br /&gt;
The Emesary framework is now part of the base package and available automatically. There is nothing special to be done to load it.&lt;br /&gt;
&lt;br /&gt;
=== Setting up a transmitter ===&lt;br /&gt;
{{Note|Usually, you will just want to use the existing globalTransmitter}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var myTransmitter =  emesary.Transmitter.new(&amp;quot;myTransmitter&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting up a notification ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var HelloNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: func(message)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;Hello&amp;quot;, message);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting up a receiver ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var HelloRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: func(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
        new_class.count = 0;&lt;br /&gt;
        new_class.Receive = func(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;Hello&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                me.count = me.count + 1;&lt;br /&gt;
                print(&amp;quot;Hello message received:&amp;quot;, notification.message);&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registering a receiver ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var receiver = HelloRecipient.new(&amp;quot;my test receiver&amp;quot;);&lt;br /&gt;
myTransmitter.Register(receiver);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notification ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
myTransmitter.NotifyAll( HelloNotification.new(&amp;quot;world !&amp;quot;) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer bridge ==&lt;br /&gt;
Richard has the Emesary multiplayer bridge working ref: http://chateau-logic.com/content/emesary-multiplayer-bridge-flightgear &amp;lt;ref&amp;gt; {{cite web&lt;br /&gt;
  | url    = http://sourceforge.net/p/flightgear/mailman/message/35040437/&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;Re: [Flightgear-devel] Message passing interface for Nasal&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Richard Harrison&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Apr 25th, 2016&lt;br /&gt;
  | added   = Apr 25th, 2016&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code is in the branch of fgdata: https://sourceforge.net/u/r-harrison/fgdata/ci/next-emesary-mp-bridge/tree/ &lt;br /&gt;
* Nasal/emesary.nas &lt;br /&gt;
* Nasal/emesary_mp_bridge.nas &lt;br /&gt;
* Nasal/notifications.nas&lt;br /&gt;
&lt;br /&gt;
The multiplayer bridge allows notifications to be routed over MP. The model creates an incoming bridge specifying the notifications that are to be received and the bridge will messages from multiplayer models. The elegance of the bridge is that neither the sender nor the receiver need to know about each other; all notifications just appear in the recipient method where they can be handled. Each aircraft would have one (or more recipients) and just handle the incoming message.&lt;br /&gt;
&lt;br /&gt;
Create an incoming and outgoing in a model with the following lines.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var routedNotifications = [notifications.GeoEventNotification.new(nil)];&lt;br /&gt;
var outgoingBridge = emesary_mp_bridge.OutgoingMPBridge.new(&amp;quot;F-15mp&amp;quot;,routedNotifications);&lt;br /&gt;
var incomingBridge = emesary_mp_bridge.IncomingMPBridge.startMPBridge(routedNotifications);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then any GeoEventNotification will arrive via MP and the transmitter in &lt;br /&gt;
any registered recipients, ready for handling like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var EmesaryRecipient =&lt;br /&gt;
{&lt;br /&gt;
     new: func(_ident)&lt;br /&gt;
     {&lt;br /&gt;
         var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
&lt;br /&gt;
         new_class.Receive = func(notification)&lt;br /&gt;
         {&lt;br /&gt;
             if (notification.NotificationType == &amp;quot;GeoEventNotification&amp;quot;)&lt;br /&gt;
             {&lt;br /&gt;
                 print(&amp;quot;received GeoNotification from &amp;quot;,notification.Callsign);&lt;br /&gt;
                 print (&amp;quot; pos=&amp;quot;,notification.Position.lat(),notification.Position.lon(),notification.Position.alt());&lt;br /&gt;
                 print (&amp;quot;  kind=&amp;quot;,notification.Kind, &amp;quot; skind=&amp;quot;,notification.SecondaryKind);&lt;br /&gt;
                 if(notification.FromIncomingBridge)&lt;br /&gt;
                 {&lt;br /&gt;
                     if(notification.Kind == 1)# created&lt;br /&gt;
                     {&lt;br /&gt;
                         if(notification.SecondaryKind &amp;gt;= 48 and notification.SecondaryKind &amp;lt;= 63)&lt;br /&gt;
                         {&lt;br /&gt;
                             # TBD: animate drop tanks&lt;br /&gt;
                         }&lt;br /&gt;
                     }&lt;br /&gt;
                 }&lt;br /&gt;
                 return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
             }&lt;br /&gt;
             return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
         };&lt;br /&gt;
         new_class.Response = ANSPN46ActiveResponseNotification.new(&amp;quot;ARA-63&amp;quot;);&lt;br /&gt;
         return new_class;&lt;br /&gt;
     },&lt;br /&gt;
};&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
# Instantiate receiver.&lt;br /&gt;
var recipient = EmesaryRecipient.new(&amp;quot;F-15-recipient&amp;quot;);&lt;br /&gt;
emesary.GlobalTransmitter.Register(recipient);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== C++ Port ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{WIP}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
The C++ version should be compatible with the Nasal port, i.e. so that the same Emesary notifications, transmitter and recipients can be used in scripting space and native code, it would make sense to look at the [[Nasal/CppBind]] framework to accomplish that.&lt;br /&gt;
&lt;br /&gt;
For the time being, $SG_SRC/canvas/layout/NasalWidget.cxx demonstrates how a C++  &amp;quot;interface&amp;quot; (base class) can be overridden from scripting space by using a corresponding wrapper (see $FG_ROOT/Nasal/canvas/gui/Widget.nas).&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
With Richard's Emesary system now being ported to Nasal, it would actually make sense to look at it with a focus on FGPythonSys, i.e. how this could be moved to C++ space, and reused by the whole [[Talk:FGPythonSys|FGScriptingSys interface]] we've been talking about, because that could make timers, and listeners, entirely unnecessary - while providing the option to run scripts asynchronously from the main loop.&lt;br /&gt;
It would even be possible to come up with a Canvas mode where a Canvas (FBO) is '''only''' updated using an Emesary transmitter, which would mean that these updates could be processed in a background thread, and that OSG could be also much more aggressive about updating Canvas elements/FBOs concurrently.&lt;br /&gt;
Note that there is nothing Nasal specific about Emesary - it's just a way to come up with a decoupled design that lets components act with eachother without having to know much/anything about their internals, and this kind of decoupling would also be useful for any HLA efforts, because HLA would be just one kind of transport, and one that could greatly benefit from having this separation in place.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=284945#p284945 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: FGPython an propose for Python as an nasal alternative &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Hooray &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 12th, 2016 &lt;br /&gt;
  |added  =  May 12th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Advanced Weather/MP ===&lt;br /&gt;
{{Main article|Advanced_weather#Connection_with_the_multiplayer_system}}&lt;br /&gt;
&lt;br /&gt;
Richard's Emesary framework would be ideal for this sort of thing. The changes AW side would be modest - basically a shift to a dedicated random number generator, a routine to build a tile based on incoming information, one to store and encode the meta-data of tiles already created and that'd basically be it.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35491937/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Traffic 2020: Towards a new Development&lt;br /&gt;
 Model for FlightGear AI Traffic &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Nov 15th, 2016 &lt;br /&gt;
  |added  =  Nov 15th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Howto:Implementing a PID Controller in Nasal]]&lt;br /&gt;
* [[Multiplayer]]&lt;br /&gt;
* [[Dual Control]]&lt;br /&gt;
* [[Howto:Using FlightGear as an Image Generator (IG)]]&lt;br /&gt;
* [[Scripted AI Objects]]&lt;br /&gt;
* [[Canvas MFD Framework]]&lt;br /&gt;
* [[NavDisplay]]&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Collection of examples discussed on the forum.&lt;br /&gt;
=== MP Traffic feeds (injection) ===&lt;br /&gt;
* https://forum.flightgear.org/viewtopic.php?f=27&amp;amp;t=29355&amp;amp;p=282755#p282431&lt;br /&gt;
&lt;br /&gt;
== JavaScript port ==&lt;br /&gt;
[[File:Emesary-in-firefox-via-instant-cquotes.png|thumb|Richard's [[Emesary]] MPI system ported to JavaScript, running in Firefox as part of the [[Instant-Cquotes]] script]]&lt;br /&gt;
Torsten is successfully using JavaScript via nodejs for a private project with FlightGear. Communication with FGFS runs via websocket and the http/fgcommand interface, everything works as one would expect; the same technique would be possible with Python or any other scripting language that supports websockets, http-get, http-post and has some support for JSON (python has, ruby has, lua has).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34792963/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] A FGPythonSys implementation: The embedded&lt;br /&gt;
 Python interpreter as a FlightGear subsystem. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Almost every system should be able to run completely independently of the frame rate. What of course would be mandatory is to sync properties at well defined time stamps, this is what the RTI takes care of. &amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34796183/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 26th, 2016 &lt;br /&gt;
  |added  =  Jan 26th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instead of adding just-another-feature we need to strip it down to getting a fast and constand fps rendering engine. Everything else needs to run outside the main loop and has to interact with the core by, say HLA/RTI or whatever IPC we have.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34793778/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] A FGPythonSys implementation: The embedded&lt;br /&gt;
 Python interpreter as a FlightGear subsystem. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{WIP}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt; //---------------------------------------------------------------------------&lt;br /&gt;
 //&lt;br /&gt;
 //	Title                : EMESARY inter-object communication&lt;br /&gt;
 //&lt;br /&gt;
 //	File Type            : Implementation File&lt;br /&gt;
 //&lt;br /&gt;
 //	Description          : Provides generic inter-object communication. For an object to receive a message it&lt;br /&gt;
 //	                     : must first register with an instance of a Transmitter, and provide a Receive method&lt;br /&gt;
 //&lt;br /&gt;
 //	                     : To send a message use a Transmitter with an object. That's all there is to it.&lt;br /&gt;
 //  &lt;br /&gt;
 //  References           : http://www.chateau-logic.com/content/class-based-inter-object-communication&lt;br /&gt;
 //                       : http://chateau-logic.com/content/emesary-efficient-inter-object-communication-using-interfaces-and-inheritance&lt;br /&gt;
 //                       : http://chateau-logic.com/content/c-wpf-application-plumbing-using-emesary&lt;br /&gt;
 //&lt;br /&gt;
 //	Author               : Richard Harrison (richard@zaretto.com)&lt;br /&gt;
 //&lt;br /&gt;
 //	Creation Date        : 29 January 2016&lt;br /&gt;
 //&lt;br /&gt;
 //	Version              : 4.8&lt;br /&gt;
 //&lt;br /&gt;
 //  Copyright � 2016 Richard Harrison           Released under GPL V2&lt;br /&gt;
 //&lt;br /&gt;
 //---------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
function print () {&lt;br /&gt;
 var i, msg=&amp;quot;&amp;quot;;&lt;br /&gt;
 for(i=0; i&amp;lt;arguments.length; i++) &lt;br /&gt;
   msg += arguments[i];&lt;br /&gt;
 console.log(msg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function inherit(parent) {&lt;br /&gt;
    return Object.create(parent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var emesary = (function() {&lt;br /&gt;
&lt;br /&gt;
var Transmitter =&lt;br /&gt;
{&lt;br /&gt;
    ReceiptStatus_OK : 0,          // Processing completed successfully&lt;br /&gt;
    ReceiptStatus_Fail : 1,        // Processing resulted in at least one failure&lt;br /&gt;
    ReceiptStatus_Abort : 2,       // Fatal error, stop processing any further recipieints of this message. Implicitly failed.&lt;br /&gt;
    ReceiptStatus_Finished : 3,    // Definitive completion - do not send message to any further recipieints&lt;br /&gt;
    ReceiptStatus_NotProcessed : 4,// Return value when method doesn't process a message.&lt;br /&gt;
    ReceiptStatus_Pending : 5,     // Message sent with indeterminate return status as processing underway&lt;br /&gt;
    ReceiptStatus_PendingFinished : 6,// Message definitively handled, status indeterminate. The message will not be sent any further&lt;br /&gt;
&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Transmitter);&lt;br /&gt;
        new_class.Recipients = [];&lt;br /&gt;
        new_class.Ident = _ident;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Add a recipient to receive notifications from this transmitter&lt;br /&gt;
    Register: function (recipient)&lt;br /&gt;
    {&lt;br /&gt;
        this.Recipients.push(recipient);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Stops a recipient from receiving notifications from this transmitter.&lt;br /&gt;
    DeRegister: function(todelete_recipient)&lt;br /&gt;
    {&lt;br /&gt;
        var out_idx = 0;&lt;br /&gt;
        var element_deleted = 0;&lt;br /&gt;
&lt;br /&gt;
        for (var idx = 0; idx &amp;lt; this.RecipientCount(); idx += 1)&lt;br /&gt;
        {&lt;br /&gt;
            if (this.Recipients[idx] != todelete_recipient)&lt;br /&gt;
            {&lt;br /&gt;
                this.Recipients[out_idx] = this.Recipients[idx];&lt;br /&gt;
                out_idx = out_idx + 1;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                element_deleted = 1;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (element_deleted)&lt;br /&gt;
            this.Recipients.pop();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    RecipientCount: function ()&lt;br /&gt;
    {&lt;br /&gt;
        return this.Recipients.length;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    PrintRecipients: function ()&lt;br /&gt;
    {&lt;br /&gt;
        print(&amp;quot;Recipient list&amp;quot;);&lt;br /&gt;
        for (var idx = 0; idx &amp;lt; this.RecipientCount(); idx += 1)&lt;br /&gt;
            print(&amp;quot;Recpient &amp;quot;,idx,&amp;quot; &amp;quot;,this.Recipients[idx].Ident);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Notify all registered recipients. Stop when receipt status of abort || finished are received.&lt;br /&gt;
    // The receipt status from this method will be &lt;br /&gt;
    //  - OK &amp;gt; message handled&lt;br /&gt;
    //  - Fail &amp;gt; message not handled. A status of Abort from a recipient will result in our status&lt;br /&gt;
    //           being fail as Abort means that the message was not and cannot be handled, and&lt;br /&gt;
    //           allows for usages such as access controls.&lt;br /&gt;
    NotifyAll: function(message)&lt;br /&gt;
    {&lt;br /&gt;
        var return_status = Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
	var recipient;&lt;br /&gt;
	&lt;br /&gt;
        this.Recipients.forEach( function(recipient, index, array) &lt;br /&gt;
        {&lt;br /&gt;
            if (recipient.Active)&lt;br /&gt;
            {&lt;br /&gt;
            var rstat = recipient.Receive(message);&lt;br /&gt;
            if(rstat == Transmitter.ReceiptStatus_Fail)&lt;br /&gt;
            {&lt;br /&gt;
                return_status = Transmitter.ReceiptStatus_Fail;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Pending)&lt;br /&gt;
            {&lt;br /&gt;
                return_status = Transmitter.ReceiptStatus_Pending;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_PendingFinished)&lt;br /&gt;
            {&lt;br /&gt;
                return rstat;&lt;br /&gt;
            }&lt;br /&gt;
//            else if(rstat == Transmitter.ReceiptStatus_NotProcessed)&lt;br /&gt;
//            {&lt;br /&gt;
//                ;&lt;br /&gt;
//            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_OK)&lt;br /&gt;
            {&lt;br /&gt;
                if (return_status == Transmitter.ReceiptStatus_NotProcessed)&lt;br /&gt;
                    return_status = rstat;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Abort)&lt;br /&gt;
            {&lt;br /&gt;
                return Transmitter.ReceiptStatus_Abort;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Finished)&lt;br /&gt;
            {&lt;br /&gt;
                return Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        });&lt;br /&gt;
        return return_status;&lt;br /&gt;
    },&lt;br /&gt;
    // Returns true if a return value from NotifyAll is to be considered a failure.&lt;br /&gt;
    IsFailed: function(receiptStatus)&lt;br /&gt;
    {&lt;br /&gt;
        // Failed is either Fail || Abort.&lt;br /&gt;
        // NotProcessed isn't a failure because it hasn't been processed.&lt;br /&gt;
        if (receiptStatus == Transmitter.ReceiptStatus_Fail || receiptStatus == Transmitter.ReceiptStatus_Abort)&lt;br /&gt;
            return 1;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
//&lt;br /&gt;
// Base class for Notifications. By convention a Notification has a type and a value.&lt;br /&gt;
//   SubClasses can add extra properties || methods.&lt;br /&gt;
var Notification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_type, _value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Notification);&lt;br /&gt;
        new_class.Value = _value;&lt;br /&gt;
        new_class.Type = _type;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Recipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Recipient);&lt;br /&gt;
        if (_ident === undefined || _ident === &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            _ident = id(new_class);&lt;br /&gt;
            print(&amp;quot;ERROR: Ident required when creating a recipient, defaulting to &amp;quot;,_ident);&lt;br /&gt;
        }&lt;br /&gt;
        return Recipient.construct(_ident, new_class);&lt;br /&gt;
    },&lt;br /&gt;
    construct: function(_ident, new_class)&lt;br /&gt;
    {&lt;br /&gt;
        new_class.Ident = _ident;&lt;br /&gt;
        new_class.Active = 1;&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
    {&lt;br /&gt;
        print(&amp;quot;ERROR: Receive function not implemented in recipient &amp;quot;,this.Ident);&lt;br /&gt;
        return Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	Transmitter: Transmitter,&lt;br /&gt;
	Notification: Notification,&lt;br /&gt;
	Recipient: Recipient&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Instantiate a Global Transmitter&lt;br /&gt;
var GlobalTransmitter =  emesary.Transmitter.new(&amp;quot;GlobalTransmitter&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 //---------------------------------------------------------------------------&lt;br /&gt;
 //&lt;br /&gt;
 //	Title                : EMESARY tests&lt;br /&gt;
 //&lt;br /&gt;
 //	File Type            : Implementation File&lt;br /&gt;
 //&lt;br /&gt;
 //	Author               : Richard Harrison (richard@zaretto.com)&lt;br /&gt;
 //&lt;br /&gt;
 //	Creation Date        : 29 January 2016&lt;br /&gt;
 //&lt;br /&gt;
 //  Copyright � 2016 Richard Harrison           Released under GPL V2&lt;br /&gt;
 //&lt;br /&gt;
 //---------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Emesary tests&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var TestFailCount = 0;&lt;br /&gt;
var TestSuccessCount = 0;&lt;br /&gt;
&lt;br /&gt;
var TestNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;TestNotification&amp;quot;, _value);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
var TestNotProcessedNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;TestNotProcessedNotification&amp;quot;, _value);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
var RadarReturnNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value, _x, _y, _z)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;RadarReturnNotification&amp;quot;, _value);&lt;br /&gt;
        new_class.x = _x;&lt;br /&gt;
        new_class.y = _y;&lt;br /&gt;
        new_class.z = _z;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var TestRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
	console.log(new_class);&lt;br /&gt;
        new_class.count = 0;&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;TestNotification&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                this.count = this.count + 1;&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var TestRadarRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;RadarReturnNotification&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                print(&amp;quot; :: Test recipient &amp;quot;,this.Ident, &amp;quot; recv:&amp;quot;,notification.Type,&amp;quot; &amp;quot;,notification.Value);&lt;br /&gt;
                print(&amp;quot; ::   &amp;quot;,notification.x, &amp;quot; &amp;quot;, notification.y, &amp;quot; &amp;quot;, notification.z);&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function PerformTest(tid, t)&lt;br /&gt;
{&lt;br /&gt;
    if (t())&lt;br /&gt;
    {&lt;br /&gt;
        TestSuccessCount = TestSuccessCount + 1;&lt;br /&gt;
        print(&amp;quot;  Test [Pass] :&amp;quot;,tid);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        TestFailCount = TestFailCount + 1;&lt;br /&gt;
        print(&amp;quot;  Test [Fail] :&amp;quot;,tid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var tt = TestRecipient.new(&amp;quot;tt recipient&amp;quot;);&lt;br /&gt;
var tt1 = TestRecipient.new(&amp;quot;tt1 recipient1&amp;quot;);&lt;br /&gt;
var tt3 = TestRecipient.new(&amp;quot;tt3 recipient3&amp;quot;);&lt;br /&gt;
var tt2 = TestRadarRecipient.new(&amp;quot;tt2: Radar Test recipient2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Create Notification&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var tn = TestNotification.new(&amp;quot;Test notification&amp;quot;); &lt;br /&gt;
                return tn.Type == &amp;quot;TestNotification&amp;quot; &amp;amp;&amp;amp; tn.Value == &amp;quot;Test notification&amp;quot;;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Register tt&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 1; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt1&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt1);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 2; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt2&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt2);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 3; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt3&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt3);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 4; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Notify&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return !emesary.Transmitter.IsFailed(rv) &amp;amp;&amp;amp; rv != emesary.Transmitter.ReceiptStatus_NotProcessed &amp;amp;&amp;amp; tt.count == 1; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;DeRegister tt1&amp;quot;, &lt;br /&gt;
            function () &lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.DeRegister(tt1);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 3; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
tt1_count = tt1.count;&lt;br /&gt;
PerformTest(&amp;quot;NotifyAfterDeregister&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return tt1.count == tt1_count;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
tt.Active = 0;&lt;br /&gt;
tt_count = tt.count;&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Recipient.Active&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return !emesary.Transmitter.IsFailed(rv) &amp;amp;&amp;amp; rv != emesary.Transmitter.ReceiptStatus_NotProcessed &amp;amp;&amp;amp; tt.count == tt_count; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Test Not Processed Notification&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotProcessedNotification.new(&amp;quot;Not Processed&amp;quot;));&lt;br /&gt;
                return rv == emesary.Transmitter.ReceiptStatus_NotProcessed; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GlobalTransmitter.NotifyAll(RadarReturnNotification.new(&amp;quot;Radar notification&amp;quot;, &amp;quot;x0&amp;quot;,&amp;quot;y0&amp;quot;,&amp;quot;z0&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if (!TestFailCount)&lt;br /&gt;
    print(&amp;quot;Emesary: All &amp;quot;,TestSuccessCount,&amp;quot; tests passed\n&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
    print(&amp;quot;Emesary: ERROR: Tests completed: &amp;quot;,TestFailCount,&amp;quot; failed &amp;amp;&amp;amp; &amp;quot;,TestSuccessCount,&amp;quot; passed\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related ==&lt;br /&gt;
* http://chateau-logic.com/content/emesary-multiplayer-bridge-flightgear&lt;br /&gt;
* http://chateau-logic.com/content/emesary-nasal-implementation-flightgear&lt;br /&gt;
* http://emesary.codeplex.com/&lt;br /&gt;
* https://emesary.codeplex.com/documentation&lt;br /&gt;
* http://chateau-logic.com/content/emesary-efficient-inter-object-communication-using-interfaces-and-inheritance&lt;br /&gt;
* {{Search|list|keywords=emesary}}&lt;br /&gt;
* {{Search|forum|keywords=emesary}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Emesary]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Emesary&amp;diff=123912</id>
		<title>Emesary</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Emesary&amp;diff=123912"/>
		<updated>2020-04-18T14:36:32Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Status */ more broken code lines&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stub}}&lt;br /&gt;
&lt;br /&gt;
[[File:Emesary-javascript-port.png|thumb|Emesary ported to Node.js (JavaScript]]&lt;br /&gt;
{{Nasal Navigation}}&lt;br /&gt;
&lt;br /&gt;
Richard Harrison has finished porting his Emesary system to [[Nasal]] and it's now part of the base package. '''Emesary''' is a simple and efficient class-based inter-object communication system to allow decoupled disparate parts of a system to function together without knowing about each. It allows decoupling and removal of dependencies by using notifications to cause actions or to query values.&lt;br /&gt;
&lt;br /&gt;
There are many possible applications for Emesary within the system. It solves the problem of how to connect generic instruments to aircraft that have different implementations and properties that need to be used. Richard has been looking at how to abstract out the interface to the MFD and [[NavDisplay]]. &lt;br /&gt;
&lt;br /&gt;
At the highest level Emesary is a way of communicating information between objects that are otherwise unrelated and possibly separated by a physical (machine, network, process) boundary.&lt;br /&gt;
Two (or more) systems can be connected together by using a bridge; the bridge that Richard implemented uses the generic string properties to transmit the messages transparently (to both the sender and recipient). (documentation is possibly slightly out of date for the most recent developments that are in Richard's fgdata)&lt;br /&gt;
Richard has gotten the transmission of properties working using a new notification type.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is a set of notes at [http://chateau-logic.com/content/emesary-nasal-implementation-flightgear] that explains the whole thing with a worked example (ACLS). &lt;br /&gt;
&lt;br /&gt;
This is in Richard's git repository in his commit, together with the changes to the AI carriers to add ACLS (carrier ILS): https://sourceforge.net/u/r-harrison/fgdata/ci/54165c213f03638a4cb02c848c4f2b234c537f66/ &lt;br /&gt;
&lt;br /&gt;
Richard has plans to extend this to be able to transmit over {{Abbr|mp|Multiplayer}} (probably layered on top of mp-broadcast). It would also probably work quite well with the [[High-Level_Architecture#Federate_Object_Model|HLA FOM]] to give us a way for models to communicate with other models.&amp;lt;ref&amp;gt; {{cite web&lt;br /&gt;
  | url    = http://sourceforge.net/p/flightgear/mailman/message/34985731/&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;[Flightgear-devel] Message passing interface for Nasal&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Richard Harrison&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Apr 1st, 2016&lt;br /&gt;
  | added   = Apr 1st, 2016&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
The longer term direction Richard wants to take is to extend the multiplayer protocol to better handle Emesary notifications bridged over MP; it has significant advantages which he's covered previously.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35777639/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Multiplayer packet truncated &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Apr 9th, 2017 &lt;br /&gt;
  |added  =  Apr 9th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Meanwhile, Richard has nearly finished his improvements to Emesary to make it easy and seamless to transmit properties over MP instead of the of the usual way. This is a two part set of changes, the first part (complete) is to transmit from the master model, the second part is still WIP and relates to the transmission back for dual control.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
  var PropertySyncNotification =&lt;br /&gt;
  {&lt;br /&gt;
     new: func(_ident=&amp;quot;none&amp;quot;, _name=&amp;quot;&amp;quot;, _kind=0, _secondary_kind=0)&lt;br /&gt;
     {&lt;br /&gt;
         var new_class = PropertySyncNotificationBase.new(_ident, _name, _kind, _secondary_kind);&lt;br /&gt;
&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;consumables/fuel/total-fuel-lbs&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;controls/fuel/dump-valve&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;engines/engine[0]/augmentation-burner&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;engines/engine[0]/n1&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;engines/engine[0]/n2&amp;quot;, 1);&lt;br /&gt;
         new_class.addNormProperty(&amp;quot;surface-positions/wing-pos-norm&amp;quot;, 2);&lt;br /&gt;
#... etc ...&lt;br /&gt;
         return new_class;&lt;br /&gt;
     }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# this section sets up the notifications that will be routed and the &lt;br /&gt;
transmitters that are used&lt;br /&gt;
# I've separated out the transmitter that will be used to send the &lt;br /&gt;
properties to enable better control.&lt;br /&gt;
var routedNotifications = [notifications.PropertySyncNotification.new(nil), notifications.GeoEventNotification.new(nil)];&lt;br /&gt;
var bridgedTransmitter = emesary.Transmitter.new(&amp;quot;outgoingBridge&amp;quot;);&lt;br /&gt;
var outgoingBridge = emesary_mp_bridge.OutgoingMPBridge.new(&amp;quot;F-14mp&amp;quot;,routedNotifications, 19, &amp;quot;&amp;quot;, bridgedTransmitter);&lt;br /&gt;
var incomingBridge = emesary_mp_bridge.IncomingMPBridge.startMPBridge(routedNotifications);&lt;br /&gt;
var f14_aircraft_notification = notifications.PropertySyncNotification.new(&amp;quot;F-14&amp;quot;~getprop(&amp;quot;/sim/multiplay/callsign&amp;quot;));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That's all that is required to ship properties between multiplayer modules via Emesary. There is a limit of 128 bytes on a string which limits the amount of outgoing messages. Outgoing notifications are queued and transmitted as space permits. The way the bridge works is to publish the notification, encoded into an MP string, for a period of time to allow for lagging clients and network issues. If a notification IsDistinct then the bridge will transfer just the last message received; otherwise the bridge will transfer all received notifications over MP. In this sense IsDistinct indicates that the contents of the notification are accurate and definitive (e.g. surface position), so the last value is the most accurate. Other notification (e.g. button 12 pushed will always need to be transferred). Obviously using this technique a variable number of properties can be transmitted, and importantly it's up to the modeller to decide what to transmit. There is a flag that I've temporarily added (sim/multiplay/transmit-only-generics) that doesn't transmit the standard properties, just chat and the generics (to make more space in the packet). There can be different types of notifications sent at a different schedule (so you could have a 10 second update of very slow moving items).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Work in progress ==&lt;br /&gt;
What Richard is working on now is how to make (possibly multiple) slaves communicate back to a master craft, initially the F-14 backseat. The design goal is that the same code should work for both the master and the slave, and that there should not need to be any extra logic. At the highest level this would be (master craft): 1. Inside the model bindings a notification is raised, or a property changed that will cause a notification to be raised. 2. The model receives the notification and the appropriate property is changed. 3. The property changed will be sent over Emesary to all slaves. Slaves will not transmit this data back to the master as there is no outgoing bridge configured to do this. For the slave aircraft 1. Inside the model bindings a notification is raised, or a property changed that will cause a notification to be raised. 2. The notification is bridged over MP and received by the master craft.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ALS landing lights visible on the runway from outside views are with FG since 2016.3 or so - same with the technology of lights external to the aircraft specified via relative geometry (used e.g. to illuminate the Shuttle from the ground floodlights during night landings or SRB separation at night). The latter can also  be used for scenery to player or  MP to MP illumination, and Richard is toying with the idea of using the Emesary MP bridge for the job.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=306389#p306389 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: The BK117-B2 &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Mar 5th, 2017 &lt;br /&gt;
  |added  =  Mar 5th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
Any lighting ''always'' requires some form communication between light source and effect assigned to the surface. In Rembrandt, lots of performance is burned to set this up fairly generally via additional passes and buffers. The ALS technique requires you to set this up specifically - so there has to be an information exchange between light and effect - which is what the light manager does for the Shuttle, and which is what Emesary can do more generally between scenery object Nasal snippets and an aircraft.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=306418#p306418 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: The BK117-B2 &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Mar 6th, 2017 &lt;br /&gt;
  |added  =  Mar 6th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are certain things that work better as addons, and with the work Richard has been doing on Emesary FlightGear is in a better position to have integration of addons than it was previously - simply because Emesary removes inter-dependencies.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=318878#p318878 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Serious Request] Making flightgear combat capable. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Sep 15th, 2017 &lt;br /&gt;
  |added  =  Sep 15th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Most of the work that Richard did to the MP protocol - extending the number of properties available and improving the efficiency of transfer came out of the need for the OPRF aircraft to transmit more properties - but is something that has much wider applications. Equally Emesary developments are coming along nicely - we should soon (next few months) see Emesary used on the OPRF fleet to allow models to communicate with each other in a more structured way to provide chaff, flares, radar, missiles, bombs, link16, damage etc.&lt;br /&gt;
&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=318872#p318872 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Serious Request] Making flightgear combat capable. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Sep 15th, 2017 &lt;br /&gt;
  |added  =  Sep 15th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To work over MP properly the model needs to use the existing property transfer over MP (e.g. in sim/multiplay/generic/). &lt;br /&gt;
The best and possibly easiest way to do this is using Emesary with a multiplayer bridge to transmit this (transparently) using a GeoEventNotification. &amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=312137#p312137 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: Synchronization between 2 pc is not reliable &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 9th, 2017 &lt;br /&gt;
  |added  =  Jun 9th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
We all agree having a good IPC mechanism for distributing the simulation state across threads/processes/network is critical&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Properties are much too fine-grained for exposing via HLA. Properties, and subsystems communicating using them, are implementation details of particular HLA federate, not something we’d expose across the federation.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Most solutions that don’t involve fine-grained locking of each property ultimately equate to '''message passing''' anyway&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besides, there's the '''ownship''' assumption hard-coded all over the place - for example, right now subsystems like the replay (flight recorder) system only record and replay your &amp;quot;own&amp;quot; aircraft flight dynamics. &lt;br /&gt;
&lt;br /&gt;
It would be a significant change/addition and somewhat non-trivial to capture all the data for all the AI objects and replay them as well.  &lt;br /&gt;
&lt;br /&gt;
We'd have to decide if the recording and playback mechanism should be part of the AI object or something external that grabs the data and then somehow can force the AI object back through &lt;br /&gt;
it's original path during playback. &amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/8980739/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A similar problem arises when you have a multi viewer environment where you want to interact with the carrier or when you watch AI traffic across the views ..&lt;br /&gt;
&lt;br /&gt;
In this case each viewer has its own carrier AI traffic. That means the can move independently. The same applies to multiplayer mode.&lt;br /&gt;
&lt;br /&gt;
We need some generic code which is able to track SGSubsystems including their child subsystems and transfer their relevant states over the network. The same interface could be used to store replay replay logs. &amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/8980743/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
=== Transmitter ===&lt;br /&gt;
=== Notification ===&lt;br /&gt;
=== Recipient ===&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
=== Loading the framework ===&lt;br /&gt;
The Emesary framework is now part of the base package and available automatically. There is nothing special to be done to load it.&lt;br /&gt;
&lt;br /&gt;
=== Setting up a transmitter ===&lt;br /&gt;
{{Note|Usually, you will just want to use the existing globalTransmitter}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var myTransmitter =  emesary.Transmitter.new(&amp;quot;myTransmitter&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting up a notification ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var HelloNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: func(message)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;Hello&amp;quot;, message);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting up a receiver ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var HelloRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: func(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
        new_class.count = 0;&lt;br /&gt;
        new_class.Receive = func(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;Hello&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                me.count = me.count + 1;&lt;br /&gt;
                print(&amp;quot;Hello message received:&amp;quot;, notification.message);&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registering a receiver ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var receiver = HelloRecipient.new(&amp;quot;my test receiver&amp;quot;);&lt;br /&gt;
myTransmitter.Register(receiver);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notification ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
myTransmitter.NotifyAll( HelloNotification.new(&amp;quot;world !&amp;quot;) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer bridge ==&lt;br /&gt;
Richard has the Emesary multiplayer bridge working ref: http://chateau-logic.com/content/emesary-multiplayer-bridge-flightgear &amp;lt;ref&amp;gt; {{cite web&lt;br /&gt;
  | url    = http://sourceforge.net/p/flightgear/mailman/message/35040437/&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;Re: [Flightgear-devel] Message passing interface for Nasal&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Richard Harrison&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Apr 25th, 2016&lt;br /&gt;
  | added   = Apr 25th, 2016&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code is in the branch of fgdata: https://sourceforge.net/u/r-harrison/fgdata/ci/next-emesary-mp-bridge/tree/ &lt;br /&gt;
* Nasal/emesary.nas &lt;br /&gt;
* Nasal/emesary_mp_bridge.nas &lt;br /&gt;
* Nasal/notifications.nas&lt;br /&gt;
&lt;br /&gt;
The multiplayer bridge allows notifications to be routed over MP. The model creates an incoming bridge specifying the notifications that are to be received and the bridge will messages from multiplayer models. The elegance of the bridge is that neither the sender nor the receiver need to know about each other; all notifications just appear in the recipient method where they can be handled. Each aircraft would have one (or more recipients) and just handle the incoming message.&lt;br /&gt;
&lt;br /&gt;
Create an incoming and outgoing in a model with the following lines.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var routedNotifications = [notifications.GeoEventNotification.new(nil)];&lt;br /&gt;
var outgoingBridge = emesary_mp_bridge.OutgoingMPBridge.new(&amp;quot;F-15mp&amp;quot;,routedNotifications);&lt;br /&gt;
var incomingBridge = emesary_mp_bridge.IncomingMPBridge.startMPBridge(routedNotifications);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then any GeoEventNotification will arrive via MP and the transmitter in &lt;br /&gt;
any registered recipients, ready for handling like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var EmesaryRecipient =&lt;br /&gt;
{&lt;br /&gt;
     new: func(_ident)&lt;br /&gt;
     {&lt;br /&gt;
         var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
&lt;br /&gt;
         new_class.Receive = func(notification)&lt;br /&gt;
         {&lt;br /&gt;
             if (notification.NotificationType == &amp;quot;GeoEventNotification&amp;quot;)&lt;br /&gt;
             {&lt;br /&gt;
                 print(&amp;quot;received GeoNotification from &amp;quot;,notification.Callsign);&lt;br /&gt;
                 print (&amp;quot; pos=&amp;quot;,notification.Position.lat(),notification.Position.lon(),notification.Position.alt());&lt;br /&gt;
                 print (&amp;quot;  kind=&amp;quot;,notification.Kind, &amp;quot; skind=&amp;quot;,notification.SecondaryKind);&lt;br /&gt;
                 if(notification.FromIncomingBridge)&lt;br /&gt;
                 {&lt;br /&gt;
                     if(notification.Kind == 1)# created&lt;br /&gt;
                     {&lt;br /&gt;
                         if(notification.SecondaryKind &amp;gt;= 48 and notification.SecondaryKind &amp;lt;= 63)&lt;br /&gt;
                         {&lt;br /&gt;
                             # TBD: animate drop tanks&lt;br /&gt;
                         }&lt;br /&gt;
                     }&lt;br /&gt;
                 }&lt;br /&gt;
                 return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
             }&lt;br /&gt;
             return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
         };&lt;br /&gt;
         new_class.Response = ANSPN46ActiveResponseNotification.new(&amp;quot;ARA-63&amp;quot;);&lt;br /&gt;
         return new_class;&lt;br /&gt;
     },&lt;br /&gt;
};&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
# Instantiate receiver.&lt;br /&gt;
var recipient = EmesaryRecipient.new(&amp;quot;F-15-recipient&amp;quot;);&lt;br /&gt;
emesary.GlobalTransmitter.Register(recipient);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== C++ Port ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{WIP}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
The C++ version should be compatible with the Nasal port, i.e. so that the same Emesary notifications, transmitter and recipients can be used in scripting space and native code, it would make sense to look at the [[Nasal/CppBind]] framework to accomplish that.&lt;br /&gt;
&lt;br /&gt;
For the time being, $SG_SRC/canvas/layout/NasalWidget.cxx demonstrates how a C++  &amp;quot;interface&amp;quot; (base class) can be overridden from scripting space by using a corresponding wrapper (see $FG_ROOT/Nasal/canvas/gui/Widget.nas).&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
With Richard's Emesary system now being ported to Nasal, it would actually make sense to look at it with a focus on FGPythonSys, i.e. how this could be moved to C++ space, and reused by the whole [[Talk:FGPythonSys|FGScriptingSys interface]] we've been talking about, because that could make timers, and listeners, entirely unnecessary - while providing the option to run scripts asynchronously from the main loop.&lt;br /&gt;
It would even be possible to come up with a Canvas mode where a Canvas (FBO) is '''only''' updated using an Emesary transmitter, which would mean that these updates could be processed in a background thread, and that OSG could be also much more aggressive about updating Canvas elements/FBOs concurrently.&lt;br /&gt;
Note that there is nothing Nasal specific about Emesary - it's just a way to come up with a decoupled design that lets components act with eachother without having to know much/anything about their internals, and this kind of decoupling would also be useful for any HLA efforts, because HLA would be just one kind of transport, and one that could greatly benefit from having this separation in place.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=284945#p284945 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: FGPython an propose for Python as an nasal alternative &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Hooray &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 12th, 2016 &lt;br /&gt;
  |added  =  May 12th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Advanced Weather/MP ===&lt;br /&gt;
{{Main article|Advanced_weather#Connection_with_the_multiplayer_system}}&lt;br /&gt;
&lt;br /&gt;
Richard's Emesary framework would be ideal for this sort of thing. The changes AW side would be modest - basically a shift to a dedicated random number generator, a routine to build a tile based on incoming information, one to store and encode the meta-data of tiles already created and that'd basically be it.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35491937/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Traffic 2020: Towards a new Development&lt;br /&gt;
 Model for FlightGear AI Traffic &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Nov 15th, 2016 &lt;br /&gt;
  |added  =  Nov 15th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Howto:Implementing a PID Controller in Nasal]]&lt;br /&gt;
* [[Multiplayer]]&lt;br /&gt;
* [[Dual Control]]&lt;br /&gt;
* [[Howto:Using FlightGear as an Image Generator (IG)]]&lt;br /&gt;
* [[Scripted AI Objects]]&lt;br /&gt;
* [[Canvas MFD Framework]]&lt;br /&gt;
* [[NavDisplay]]&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Collection of examples discussed on the forum.&lt;br /&gt;
=== MP Traffic feeds (injection) ===&lt;br /&gt;
* https://forum.flightgear.org/viewtopic.php?f=27&amp;amp;t=29355&amp;amp;p=282755#p282431&lt;br /&gt;
&lt;br /&gt;
== JavaScript port ==&lt;br /&gt;
[[File:Emesary-in-firefox-via-instant-cquotes.png|thumb|Richard's [[Emesary]] MPI system ported to JavaScript, running in Firefox as part of the [[Instant-Cquotes]] script]]&lt;br /&gt;
Torsten is successfully using JavaScript via nodejs for a private project with FlightGear. Communication with FGFS runs via websocket and the http/fgcommand interface, everything works as one would expect; the same technique would be possible with Python or any other scripting language that supports websockets, http-get, http-post and has some support for JSON (python has, ruby has, lua has).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34792963/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] A FGPythonSys implementation: The embedded&lt;br /&gt;
 Python interpreter as a FlightGear subsystem. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Almost every system should be able to run completely independently of the frame rate. What of course would be mandatory is to sync properties at well defined time stamps, this is what the RTI takes care of. &amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34796183/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 26th, 2016 &lt;br /&gt;
  |added  =  Jan 26th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instead of adding just-another-feature we need to strip it down to getting a fast and constand fps rendering engine. Everything else needs to run outside the main loop and has to interact with the core by, say HLA/RTI or whatever IPC we have.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34793778/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] A FGPythonSys implementation: The embedded&lt;br /&gt;
 Python interpreter as a FlightGear subsystem. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{WIP}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt; //---------------------------------------------------------------------------&lt;br /&gt;
 //&lt;br /&gt;
 //	Title                : EMESARY inter-object communication&lt;br /&gt;
 //&lt;br /&gt;
 //	File Type            : Implementation File&lt;br /&gt;
 //&lt;br /&gt;
 //	Description          : Provides generic inter-object communication. For an object to receive a message it&lt;br /&gt;
 //	                     : must first register with an instance of a Transmitter, and provide a Receive method&lt;br /&gt;
 //&lt;br /&gt;
 //	                     : To send a message use a Transmitter with an object. That's all there is to it.&lt;br /&gt;
 //  &lt;br /&gt;
 //  References           : http://www.chateau-logic.com/content/class-based-inter-object-communication&lt;br /&gt;
 //                       : http://chateau-logic.com/content/emesary-efficient-inter-object-communication-using-interfaces-and-inheritance&lt;br /&gt;
 //                       : http://chateau-logic.com/content/c-wpf-application-plumbing-using-emesary&lt;br /&gt;
 //&lt;br /&gt;
 //	Author               : Richard Harrison (richard@zaretto.com)&lt;br /&gt;
 //&lt;br /&gt;
 //	Creation Date        : 29 January 2016&lt;br /&gt;
 //&lt;br /&gt;
 //	Version              : 4.8&lt;br /&gt;
 //&lt;br /&gt;
 //  Copyright � 2016 Richard Harrison           Released under GPL V2&lt;br /&gt;
 //&lt;br /&gt;
 //---------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
function print () {&lt;br /&gt;
 var i, msg=&amp;quot;&amp;quot;;&lt;br /&gt;
 for(i=0; i&amp;lt;arguments.length; i++) &lt;br /&gt;
   msg += arguments[i];&lt;br /&gt;
 console.log(msg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function inherit(parent) {&lt;br /&gt;
    return Object.create(parent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var emesary = (function() {&lt;br /&gt;
&lt;br /&gt;
var Transmitter =&lt;br /&gt;
{&lt;br /&gt;
    ReceiptStatus_OK : 0,          // Processing completed successfully&lt;br /&gt;
    ReceiptStatus_Fail : 1,        // Processing resulted in at least one failure&lt;br /&gt;
    ReceiptStatus_Abort : 2,       // Fatal error, stop processing any further recipieints of this message. Implicitly failed.&lt;br /&gt;
    ReceiptStatus_Finished : 3,    // Definitive completion - do not send message to any further recipieints&lt;br /&gt;
    ReceiptStatus_NotProcessed : 4,// Return value when method doesn't process a message.&lt;br /&gt;
    ReceiptStatus_Pending : 5,     // Message sent with indeterminate return status as processing underway&lt;br /&gt;
    ReceiptStatus_PendingFinished : 6,// Message definitively handled, status indeterminate. The message will not be sent any further&lt;br /&gt;
&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Transmitter);&lt;br /&gt;
        new_class.Recipients = [];&lt;br /&gt;
        new_class.Ident = _ident;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Add a recipient to receive notifications from this transmitter&lt;br /&gt;
    Register: function (recipient)&lt;br /&gt;
    {&lt;br /&gt;
        this.Recipients.push(recipient);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Stops a recipient from receiving notifications from this transmitter.&lt;br /&gt;
    DeRegister: function(todelete_recipient)&lt;br /&gt;
    {&lt;br /&gt;
        var out_idx = 0;&lt;br /&gt;
        var element_deleted = 0;&lt;br /&gt;
&lt;br /&gt;
        for (var idx = 0; idx &amp;lt; this.RecipientCount(); idx += 1)&lt;br /&gt;
        {&lt;br /&gt;
            if (this.Recipients[idx] != todelete_recipient)&lt;br /&gt;
            {&lt;br /&gt;
                this.Recipients[out_idx] = this.Recipients[idx];&lt;br /&gt;
                out_idx = out_idx + 1;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                element_deleted = 1;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (element_deleted)&lt;br /&gt;
            this.Recipients.pop();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    RecipientCount: function ()&lt;br /&gt;
    {&lt;br /&gt;
        return this.Recipients.length;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    PrintRecipients: function ()&lt;br /&gt;
    {&lt;br /&gt;
        print(&amp;quot;Recipient list&amp;quot;);&lt;br /&gt;
        for (var idx = 0; idx &amp;lt; this.RecipientCount(); idx += 1)&lt;br /&gt;
            print(&amp;quot;Recpient &amp;quot;,idx,&amp;quot; &amp;quot;,this.Recipients[idx].Ident);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Notify all registered recipients. Stop when receipt status of abort || finished are received.&lt;br /&gt;
    // The receipt status from this method will be &lt;br /&gt;
    //  - OK &amp;gt; message handled&lt;br /&gt;
    //  - Fail &amp;gt; message not handled. A status of Abort from a recipient will result in our status&lt;br /&gt;
    //           being fail as Abort means that the message was not and cannot be handled, and&lt;br /&gt;
    //           allows for usages such as access controls.&lt;br /&gt;
    NotifyAll: function(message)&lt;br /&gt;
    {&lt;br /&gt;
        var return_status = Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
	var recipient;&lt;br /&gt;
	&lt;br /&gt;
        this.Recipients.forEach( function(recipient, index, array) &lt;br /&gt;
        {&lt;br /&gt;
            if (recipient.Active)&lt;br /&gt;
            {&lt;br /&gt;
            var rstat = recipient.Receive(message);&lt;br /&gt;
            if(rstat == Transmitter.ReceiptStatus_Fail)&lt;br /&gt;
            {&lt;br /&gt;
                return_status = Transmitter.ReceiptStatus_Fail;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Pending)&lt;br /&gt;
            {&lt;br /&gt;
                return_status = Transmitter.ReceiptStatus_Pending;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_PendingFinished)&lt;br /&gt;
            {&lt;br /&gt;
                return rstat;&lt;br /&gt;
            }&lt;br /&gt;
//            else if(rstat == Transmitter.ReceiptStatus_NotProcessed)&lt;br /&gt;
//            {&lt;br /&gt;
//                ;&lt;br /&gt;
//            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_OK)&lt;br /&gt;
            {&lt;br /&gt;
                if (return_status == Transmitter.ReceiptStatus_NotProcessed)&lt;br /&gt;
                    return_status = rstat;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Abort)&lt;br /&gt;
            {&lt;br /&gt;
                return Transmitter.ReceiptStatus_Abort;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Finished)&lt;br /&gt;
            {&lt;br /&gt;
                return Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        });&lt;br /&gt;
        return return_status;&lt;br /&gt;
    },&lt;br /&gt;
    // Returns true if a return value from NotifyAll is to be considered a failure.&lt;br /&gt;
    IsFailed: function(receiptStatus)&lt;br /&gt;
    {&lt;br /&gt;
        // Failed is either Fail || Abort.&lt;br /&gt;
        // NotProcessed isn't a failure because it hasn't been processed.&lt;br /&gt;
        if (receiptStatus == Transmitter.ReceiptStatus_Fail || receiptStatus == Transmitter.ReceiptStatus_Abort)&lt;br /&gt;
            return 1;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
//&lt;br /&gt;
// Base class for Notifications. By convention a Notification has a type and a value.&lt;br /&gt;
//   SubClasses can add extra properties || methods.&lt;br /&gt;
var Notification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_type, _value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Notification);&lt;br /&gt;
        new_class.Value = _value;&lt;br /&gt;
        new_class.Type = _type;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Recipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Recipient);&lt;br /&gt;
        if (_ident === undefined || _ident === &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            _ident = id(new_class);&lt;br /&gt;
            print(&amp;quot;ERROR: Ident required when creating a recipient, defaulting to &amp;quot;,_ident);&lt;br /&gt;
        }&lt;br /&gt;
        return Recipient.construct(_ident, new_class);&lt;br /&gt;
    },&lt;br /&gt;
    construct: function(_ident, new_class)&lt;br /&gt;
    {&lt;br /&gt;
        new_class.Ident = _ident;&lt;br /&gt;
        new_class.Active = 1;&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
    {&lt;br /&gt;
        print(&amp;quot;ERROR: Receive function not implemented in recipient &amp;quot;,this.Ident);&lt;br /&gt;
        return Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	Transmitter: Transmitter,&lt;br /&gt;
	Notification: Notification,&lt;br /&gt;
	Recipient: Recipient&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Instantiate a Global Transmitter&lt;br /&gt;
var GlobalTransmitter =  emesary.Transmitter.new(&amp;quot;GlobalTransmitter&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 //---------------------------------------------------------------------------&lt;br /&gt;
 //&lt;br /&gt;
 //	Title                : EMESARY tests&lt;br /&gt;
 //&lt;br /&gt;
 //	File Type            : Implementation File&lt;br /&gt;
 //&lt;br /&gt;
 //	Author               : Richard Harrison (richard@zaretto.com)&lt;br /&gt;
 //&lt;br /&gt;
 //	Creation Date        : 29 January 2016&lt;br /&gt;
 //&lt;br /&gt;
 //  Copyright � 2016 Richard Harrison           Released under GPL V2&lt;br /&gt;
 //&lt;br /&gt;
 //---------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Emesary tests&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var TestFailCount = 0;&lt;br /&gt;
var TestSuccessCount = 0;&lt;br /&gt;
&lt;br /&gt;
var TestNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;TestNotification&amp;quot;, _value);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
var TestNotProcessedNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;TestNotProcessedNotification&amp;quot;, _value);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
var RadarReturnNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value, _x, _y, _z)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;RadarReturnNotification&amp;quot;, _value);&lt;br /&gt;
        new_class.x = _x;&lt;br /&gt;
        new_class.y = _y;&lt;br /&gt;
        new_class.z = _z;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var TestRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
	console.log(new_class);&lt;br /&gt;
        new_class.count = 0;&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;TestNotification&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                this.count = this.count + 1;&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var TestRadarRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;RadarReturnNotification&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                print(&amp;quot; :: Test recipient &amp;quot;,this.Ident, &amp;quot; recv:&amp;quot;,notification.Type,&amp;quot; &amp;quot;,notification.Value);&lt;br /&gt;
                print(&amp;quot; ::   &amp;quot;,notification.x, &amp;quot; &amp;quot;, notification.y, &amp;quot; &amp;quot;, notification.z);&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function PerformTest(tid, t)&lt;br /&gt;
{&lt;br /&gt;
    if (t())&lt;br /&gt;
    {&lt;br /&gt;
        TestSuccessCount = TestSuccessCount + 1;&lt;br /&gt;
        print(&amp;quot;  Test [Pass] :&amp;quot;,tid);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        TestFailCount = TestFailCount + 1;&lt;br /&gt;
        print(&amp;quot;  Test [Fail] :&amp;quot;,tid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var tt = TestRecipient.new(&amp;quot;tt recipient&amp;quot;);&lt;br /&gt;
var tt1 = TestRecipient.new(&amp;quot;tt1 recipient1&amp;quot;);&lt;br /&gt;
var tt3 = TestRecipient.new(&amp;quot;tt3 recipient3&amp;quot;);&lt;br /&gt;
var tt2 = TestRadarRecipient.new(&amp;quot;tt2: Radar Test recipient2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Create Notification&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var tn = TestNotification.new(&amp;quot;Test notification&amp;quot;); &lt;br /&gt;
                return tn.Type == &amp;quot;TestNotification&amp;quot; &amp;amp;&amp;amp; tn.Value == &amp;quot;Test notification&amp;quot;;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Register tt&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 1; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt1&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt1);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 2; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt2&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt2);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 3; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt3&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt3);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 4; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Notify&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return !emesary.Transmitter.IsFailed(rv) &amp;amp;&amp;amp; rv != emesary.Transmitter.ReceiptStatus_NotProcessed &amp;amp;&amp;amp; tt.count == 1; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;DeRegister tt1&amp;quot;, &lt;br /&gt;
            function () &lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.DeRegister(tt1);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 3; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
tt1_count = tt1.count;&lt;br /&gt;
PerformTest(&amp;quot;NotifyAfterDeregister&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return tt1.count == tt1_count;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
tt.Active = 0;&lt;br /&gt;
tt_count = tt.count;&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Recipient.Active&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return !emesary.Transmitter.IsFailed(rv) &amp;amp;&amp;amp; rv != emesary.Transmitter.ReceiptStatus_NotProcessed &amp;amp;&amp;amp; tt.count == tt_count; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Test Not Processed Notification&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotProcessedNotification.new(&amp;quot;Not Processed&amp;quot;));&lt;br /&gt;
                return rv == emesary.Transmitter.ReceiptStatus_NotProcessed; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GlobalTransmitter.NotifyAll(RadarReturnNotification.new(&amp;quot;Radar notification&amp;quot;, &amp;quot;x0&amp;quot;,&amp;quot;y0&amp;quot;,&amp;quot;z0&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if (!TestFailCount)&lt;br /&gt;
    print(&amp;quot;Emesary: All &amp;quot;,TestSuccessCount,&amp;quot; tests passed\n&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
    print(&amp;quot;Emesary: ERROR: Tests completed: &amp;quot;,TestFailCount,&amp;quot; failed &amp;amp;&amp;amp; &amp;quot;,TestSuccessCount,&amp;quot; passed\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related ==&lt;br /&gt;
* http://chateau-logic.com/content/emesary-multiplayer-bridge-flightgear&lt;br /&gt;
* http://chateau-logic.com/content/emesary-nasal-implementation-flightgear&lt;br /&gt;
* http://emesary.codeplex.com/&lt;br /&gt;
* https://emesary.codeplex.com/documentation&lt;br /&gt;
* http://chateau-logic.com/content/emesary-efficient-inter-object-communication-using-interfaces-and-inheritance&lt;br /&gt;
* {{Search|list|keywords=emesary}}&lt;br /&gt;
* {{Search|forum|keywords=emesary}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Emesary]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Emesary&amp;diff=123911</id>
		<title>Emesary</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Emesary&amp;diff=123911"/>
		<updated>2020-04-18T14:34:15Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Multiplayer bridge */ more broken code lines&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stub}}&lt;br /&gt;
&lt;br /&gt;
[[File:Emesary-javascript-port.png|thumb|Emesary ported to Node.js (JavaScript]]&lt;br /&gt;
{{Nasal Navigation}}&lt;br /&gt;
&lt;br /&gt;
Richard Harrison has finished porting his Emesary system to [[Nasal]] and it's now part of the base package. '''Emesary''' is a simple and efficient class-based inter-object communication system to allow decoupled disparate parts of a system to function together without knowing about each. It allows decoupling and removal of dependencies by using notifications to cause actions or to query values.&lt;br /&gt;
&lt;br /&gt;
There are many possible applications for Emesary within the system. It solves the problem of how to connect generic instruments to aircraft that have different implementations and properties that need to be used. Richard has been looking at how to abstract out the interface to the MFD and [[NavDisplay]]. &lt;br /&gt;
&lt;br /&gt;
At the highest level Emesary is a way of communicating information between objects that are otherwise unrelated and possibly separated by a physical (machine, network, process) boundary.&lt;br /&gt;
Two (or more) systems can be connected together by using a bridge; the bridge that Richard implemented uses the generic string properties to transmit the messages transparently (to both the sender and recipient). (documentation is possibly slightly out of date for the most recent developments that are in Richard's fgdata)&lt;br /&gt;
Richard has gotten the transmission of properties working using a new notification type.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is a set of notes at [http://chateau-logic.com/content/emesary-nasal-implementation-flightgear] that explains the whole thing with a worked example (ACLS). &lt;br /&gt;
&lt;br /&gt;
This is in Richard's git repository in his commit, together with the changes to the AI carriers to add ACLS (carrier ILS): https://sourceforge.net/u/r-harrison/fgdata/ci/54165c213f03638a4cb02c848c4f2b234c537f66/ &lt;br /&gt;
&lt;br /&gt;
Richard has plans to extend this to be able to transmit over {{Abbr|mp|Multiplayer}} (probably layered on top of mp-broadcast). It would also probably work quite well with the [[High-Level_Architecture#Federate_Object_Model|HLA FOM]] to give us a way for models to communicate with other models.&amp;lt;ref&amp;gt; {{cite web&lt;br /&gt;
  | url    = http://sourceforge.net/p/flightgear/mailman/message/34985731/&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;[Flightgear-devel] Message passing interface for Nasal&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Richard Harrison&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Apr 1st, 2016&lt;br /&gt;
  | added   = Apr 1st, 2016&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
The longer term direction Richard wants to take is to extend the multiplayer protocol to better handle Emesary notifications bridged over MP; it has significant advantages which he's covered previously.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35777639/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Multiplayer packet truncated &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Apr 9th, 2017 &lt;br /&gt;
  |added  =  Apr 9th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Meanwhile, Richard has nearly finished his improvements to Emesary to make it easy and seamless to transmit properties over MP instead of the of the usual way. This is a two part set of changes, the first part (complete) is to transmit from the master model, the second part is still WIP and relates to the transmission back for dual control.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
  var PropertySyncNotification =&lt;br /&gt;
  {&lt;br /&gt;
     new: func(_ident=&amp;quot;none&amp;quot;, _name=&amp;quot;&amp;quot;, _kind=0, _secondary_kind=0)&lt;br /&gt;
     {&lt;br /&gt;
         var new_class = PropertySyncNotificationBase.new(_ident, _name, &lt;br /&gt;
_kind, _secondary_kind);&lt;br /&gt;
&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;consumables/fuel/total-fuel-lbs&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;controls/fuel/dump-valve&amp;quot;, 1);&lt;br /&gt;
new_class.addIntProperty(&amp;quot;engines/engine[0]/augmentation-burner&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;engines/engine[0]/n1&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;engines/engine[0]/n2&amp;quot;, 1);&lt;br /&gt;
         new_class.addNormProperty(&amp;quot;surface-positions/wing-pos-norm&amp;quot;, 2);&lt;br /&gt;
#... etc ...&lt;br /&gt;
         return new_class;&lt;br /&gt;
     }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# this section sets up the notifications that will be routed and the &lt;br /&gt;
transmitters that are used&lt;br /&gt;
# I've separated out the transmitter that will be used to send the &lt;br /&gt;
properties to enable better control.&lt;br /&gt;
var routedNotifications = &lt;br /&gt;
[notifications.PropertySyncNotification.new(nil), &lt;br /&gt;
notifications.GeoEventNotification.new(nil)];&lt;br /&gt;
var bridgedTransmitter = emesary.Transmitter.new(&amp;quot;outgoingBridge&amp;quot;);&lt;br /&gt;
var outgoingBridge = &lt;br /&gt;
emesary_mp_bridge.OutgoingMPBridge.new(&amp;quot;F-14mp&amp;quot;,routedNotifications, 19, &lt;br /&gt;
&amp;quot;&amp;quot;, bridgedTransmitter);&lt;br /&gt;
var incomingBridge = &lt;br /&gt;
emesary_mp_bridge.IncomingMPBridge.startMPBridge(routedNotifications);&lt;br /&gt;
var f14_aircraft_notification = &lt;br /&gt;
notifications.PropertySyncNotification.new(&amp;quot;F-14&amp;quot;~getprop(&amp;quot;/sim/multiplay/callsign&amp;quot;));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That's all that is required to ship properties between multiplayer modules via Emesary. There is a limit of 128 bytes on a string which limits the amount of outgoing messages. Outgoing notifications are queued and transmitted as space permits. The way the bridge works is to publish the notification, encoded into an MP string, for a period of time to allow for lagging clients and network issues. If a notification IsDistinct then the bridge will transfer just the last message received; otherwise the bridge will transfer all received notifications over MP. In this sense IsDistinct indicates that the contents of the notification are accurate and definitive (e.g. surface position), so the last value is the most accurate. Other notification (e.g. button 12 pushed will always need to be transferred). Obviously using this technique a variable number of properties can be transmitted, and importantly it's up to the modeller to decide what to transmit. There is a flag that I've temporarily added (sim/multiplay/transmit-only-generics) that doesn't transmit the standard properties, just chat and the generics (to make more space in the packet). There can be different types of notifications sent at a different schedule (so you could have a 10 second update of very slow moving items).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Work in progress ==&lt;br /&gt;
What Richard is working on now is how to make (possibly multiple) slaves communicate back to a master craft, initially the F-14 backseat. The design goal is that the same code should work for both the master and the slave, and that there should not need to be any extra logic. At the highest level this would be (master craft): 1. Inside the model bindings a notification is raised, or a property changed that will cause a notification to be raised. 2. The model receives the notification and the appropriate property is changed. 3. The property changed will be sent over Emesary to all slaves. Slaves will not transmit this data back to the master as there is no outgoing bridge configured to do this. For the slave aircraft 1. Inside the model bindings a notification is raised, or a property changed that will cause a notification to be raised. 2. The notification is bridged over MP and received by the master craft.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ALS landing lights visible on the runway from outside views are with FG since 2016.3 or so - same with the technology of lights external to the aircraft specified via relative geometry (used e.g. to illuminate the Shuttle from the ground floodlights during night landings or SRB separation at night). The latter can also  be used for scenery to player or  MP to MP illumination, and Richard is toying with the idea of using the Emesary MP bridge for the job.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=306389#p306389 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: The BK117-B2 &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Mar 5th, 2017 &lt;br /&gt;
  |added  =  Mar 5th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
Any lighting ''always'' requires some form communication between light source and effect assigned to the surface. In Rembrandt, lots of performance is burned to set this up fairly generally via additional passes and buffers. The ALS technique requires you to set this up specifically - so there has to be an information exchange between light and effect - which is what the light manager does for the Shuttle, and which is what Emesary can do more generally between scenery object Nasal snippets and an aircraft.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=306418#p306418 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: The BK117-B2 &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Mar 6th, 2017 &lt;br /&gt;
  |added  =  Mar 6th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are certain things that work better as addons, and with the work Richard has been doing on Emesary FlightGear is in a better position to have integration of addons than it was previously - simply because Emesary removes inter-dependencies.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=318878#p318878 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Serious Request] Making flightgear combat capable. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Sep 15th, 2017 &lt;br /&gt;
  |added  =  Sep 15th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Most of the work that Richard did to the MP protocol - extending the number of properties available and improving the efficiency of transfer came out of the need for the OPRF aircraft to transmit more properties - but is something that has much wider applications. Equally Emesary developments are coming along nicely - we should soon (next few months) see Emesary used on the OPRF fleet to allow models to communicate with each other in a more structured way to provide chaff, flares, radar, missiles, bombs, link16, damage etc.&lt;br /&gt;
&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=318872#p318872 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Serious Request] Making flightgear combat capable. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Sep 15th, 2017 &lt;br /&gt;
  |added  =  Sep 15th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To work over MP properly the model needs to use the existing property transfer over MP (e.g. in sim/multiplay/generic/). &lt;br /&gt;
The best and possibly easiest way to do this is using Emesary with a multiplayer bridge to transmit this (transparently) using a GeoEventNotification. &amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=312137#p312137 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: Synchronization between 2 pc is not reliable &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 9th, 2017 &lt;br /&gt;
  |added  =  Jun 9th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
We all agree having a good IPC mechanism for distributing the simulation state across threads/processes/network is critical&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Properties are much too fine-grained for exposing via HLA. Properties, and subsystems communicating using them, are implementation details of particular HLA federate, not something we’d expose across the federation.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Most solutions that don’t involve fine-grained locking of each property ultimately equate to '''message passing''' anyway&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besides, there's the '''ownship''' assumption hard-coded all over the place - for example, right now subsystems like the replay (flight recorder) system only record and replay your &amp;quot;own&amp;quot; aircraft flight dynamics. &lt;br /&gt;
&lt;br /&gt;
It would be a significant change/addition and somewhat non-trivial to capture all the data for all the AI objects and replay them as well.  &lt;br /&gt;
&lt;br /&gt;
We'd have to decide if the recording and playback mechanism should be part of the AI object or something external that grabs the data and then somehow can force the AI object back through &lt;br /&gt;
it's original path during playback. &amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/8980739/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A similar problem arises when you have a multi viewer environment where you want to interact with the carrier or when you watch AI traffic across the views ..&lt;br /&gt;
&lt;br /&gt;
In this case each viewer has its own carrier AI traffic. That means the can move independently. The same applies to multiplayer mode.&lt;br /&gt;
&lt;br /&gt;
We need some generic code which is able to track SGSubsystems including their child subsystems and transfer their relevant states over the network. The same interface could be used to store replay replay logs. &amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/8980743/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
=== Transmitter ===&lt;br /&gt;
=== Notification ===&lt;br /&gt;
=== Recipient ===&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
=== Loading the framework ===&lt;br /&gt;
The Emesary framework is now part of the base package and available automatically. There is nothing special to be done to load it.&lt;br /&gt;
&lt;br /&gt;
=== Setting up a transmitter ===&lt;br /&gt;
{{Note|Usually, you will just want to use the existing globalTransmitter}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var myTransmitter =  emesary.Transmitter.new(&amp;quot;myTransmitter&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting up a notification ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var HelloNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: func(message)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;Hello&amp;quot;, message);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting up a receiver ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var HelloRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: func(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
        new_class.count = 0;&lt;br /&gt;
        new_class.Receive = func(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;Hello&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                me.count = me.count + 1;&lt;br /&gt;
                print(&amp;quot;Hello message received:&amp;quot;, notification.message);&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registering a receiver ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var receiver = HelloRecipient.new(&amp;quot;my test receiver&amp;quot;);&lt;br /&gt;
myTransmitter.Register(receiver);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notification ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
myTransmitter.NotifyAll( HelloNotification.new(&amp;quot;world !&amp;quot;) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer bridge ==&lt;br /&gt;
Richard has the Emesary multiplayer bridge working ref: http://chateau-logic.com/content/emesary-multiplayer-bridge-flightgear &amp;lt;ref&amp;gt; {{cite web&lt;br /&gt;
  | url    = http://sourceforge.net/p/flightgear/mailman/message/35040437/&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;Re: [Flightgear-devel] Message passing interface for Nasal&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Richard Harrison&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Apr 25th, 2016&lt;br /&gt;
  | added   = Apr 25th, 2016&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code is in the branch of fgdata: https://sourceforge.net/u/r-harrison/fgdata/ci/next-emesary-mp-bridge/tree/ &lt;br /&gt;
* Nasal/emesary.nas &lt;br /&gt;
* Nasal/emesary_mp_bridge.nas &lt;br /&gt;
* Nasal/notifications.nas&lt;br /&gt;
&lt;br /&gt;
The multiplayer bridge allows notifications to be routed over MP. The model creates an incoming bridge specifying the notifications that are to be received and the bridge will messages from multiplayer models. The elegance of the bridge is that neither the sender nor the receiver need to know about each other; all notifications just appear in the recipient method where they can be handled. Each aircraft would have one (or more recipients) and just handle the incoming message.&lt;br /&gt;
&lt;br /&gt;
Create an incoming and outgoing in a model with the following lines.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var routedNotifications = [notifications.GeoEventNotification.new(nil)];&lt;br /&gt;
var outgoingBridge = emesary_mp_bridge.OutgoingMPBridge.new(&amp;quot;F-15mp&amp;quot;,routedNotifications);&lt;br /&gt;
var incomingBridge = emesary_mp_bridge.IncomingMPBridge.startMPBridge(routedNotifications);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then any GeoEventNotification will arrive via MP and the transmitter in &lt;br /&gt;
any registered recipients, ready for handling like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var EmesaryRecipient =&lt;br /&gt;
{&lt;br /&gt;
     new: func(_ident)&lt;br /&gt;
     {&lt;br /&gt;
         var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
&lt;br /&gt;
         new_class.Receive = func(notification)&lt;br /&gt;
         {&lt;br /&gt;
             if (notification.NotificationType == &amp;quot;GeoEventNotification&amp;quot;)&lt;br /&gt;
             {&lt;br /&gt;
                 print(&amp;quot;received GeoNotification from &amp;quot;,notification.Callsign);&lt;br /&gt;
                 print (&amp;quot; pos=&amp;quot;,notification.Position.lat(),notification.Position.lon(),notification.Position.alt());&lt;br /&gt;
                 print (&amp;quot;  kind=&amp;quot;,notification.Kind, &amp;quot; skind=&amp;quot;,notification.SecondaryKind);&lt;br /&gt;
                 if(notification.FromIncomingBridge)&lt;br /&gt;
                 {&lt;br /&gt;
                     if(notification.Kind == 1)# created&lt;br /&gt;
                     {&lt;br /&gt;
                         if(notification.SecondaryKind &amp;gt;= 48 and notification.SecondaryKind &amp;lt;= 63)&lt;br /&gt;
                         {&lt;br /&gt;
                             # TBD: animate drop tanks&lt;br /&gt;
                         }&lt;br /&gt;
                     }&lt;br /&gt;
                 }&lt;br /&gt;
                 return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
             }&lt;br /&gt;
             return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
         };&lt;br /&gt;
         new_class.Response = ANSPN46ActiveResponseNotification.new(&amp;quot;ARA-63&amp;quot;);&lt;br /&gt;
         return new_class;&lt;br /&gt;
     },&lt;br /&gt;
};&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
# Instantiate receiver.&lt;br /&gt;
var recipient = EmesaryRecipient.new(&amp;quot;F-15-recipient&amp;quot;);&lt;br /&gt;
emesary.GlobalTransmitter.Register(recipient);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== C++ Port ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{WIP}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
The C++ version should be compatible with the Nasal port, i.e. so that the same Emesary notifications, transmitter and recipients can be used in scripting space and native code, it would make sense to look at the [[Nasal/CppBind]] framework to accomplish that.&lt;br /&gt;
&lt;br /&gt;
For the time being, $SG_SRC/canvas/layout/NasalWidget.cxx demonstrates how a C++  &amp;quot;interface&amp;quot; (base class) can be overridden from scripting space by using a corresponding wrapper (see $FG_ROOT/Nasal/canvas/gui/Widget.nas).&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
With Richard's Emesary system now being ported to Nasal, it would actually make sense to look at it with a focus on FGPythonSys, i.e. how this could be moved to C++ space, and reused by the whole [[Talk:FGPythonSys|FGScriptingSys interface]] we've been talking about, because that could make timers, and listeners, entirely unnecessary - while providing the option to run scripts asynchronously from the main loop.&lt;br /&gt;
It would even be possible to come up with a Canvas mode where a Canvas (FBO) is '''only''' updated using an Emesary transmitter, which would mean that these updates could be processed in a background thread, and that OSG could be also much more aggressive about updating Canvas elements/FBOs concurrently.&lt;br /&gt;
Note that there is nothing Nasal specific about Emesary - it's just a way to come up with a decoupled design that lets components act with eachother without having to know much/anything about their internals, and this kind of decoupling would also be useful for any HLA efforts, because HLA would be just one kind of transport, and one that could greatly benefit from having this separation in place.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=284945#p284945 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: FGPython an propose for Python as an nasal alternative &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Hooray &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 12th, 2016 &lt;br /&gt;
  |added  =  May 12th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Advanced Weather/MP ===&lt;br /&gt;
{{Main article|Advanced_weather#Connection_with_the_multiplayer_system}}&lt;br /&gt;
&lt;br /&gt;
Richard's Emesary framework would be ideal for this sort of thing. The changes AW side would be modest - basically a shift to a dedicated random number generator, a routine to build a tile based on incoming information, one to store and encode the meta-data of tiles already created and that'd basically be it.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35491937/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Traffic 2020: Towards a new Development&lt;br /&gt;
 Model for FlightGear AI Traffic &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Nov 15th, 2016 &lt;br /&gt;
  |added  =  Nov 15th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Howto:Implementing a PID Controller in Nasal]]&lt;br /&gt;
* [[Multiplayer]]&lt;br /&gt;
* [[Dual Control]]&lt;br /&gt;
* [[Howto:Using FlightGear as an Image Generator (IG)]]&lt;br /&gt;
* [[Scripted AI Objects]]&lt;br /&gt;
* [[Canvas MFD Framework]]&lt;br /&gt;
* [[NavDisplay]]&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Collection of examples discussed on the forum.&lt;br /&gt;
=== MP Traffic feeds (injection) ===&lt;br /&gt;
* https://forum.flightgear.org/viewtopic.php?f=27&amp;amp;t=29355&amp;amp;p=282755#p282431&lt;br /&gt;
&lt;br /&gt;
== JavaScript port ==&lt;br /&gt;
[[File:Emesary-in-firefox-via-instant-cquotes.png|thumb|Richard's [[Emesary]] MPI system ported to JavaScript, running in Firefox as part of the [[Instant-Cquotes]] script]]&lt;br /&gt;
Torsten is successfully using JavaScript via nodejs for a private project with FlightGear. Communication with FGFS runs via websocket and the http/fgcommand interface, everything works as one would expect; the same technique would be possible with Python or any other scripting language that supports websockets, http-get, http-post and has some support for JSON (python has, ruby has, lua has).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34792963/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] A FGPythonSys implementation: The embedded&lt;br /&gt;
 Python interpreter as a FlightGear subsystem. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Almost every system should be able to run completely independently of the frame rate. What of course would be mandatory is to sync properties at well defined time stamps, this is what the RTI takes care of. &amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34796183/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 26th, 2016 &lt;br /&gt;
  |added  =  Jan 26th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instead of adding just-another-feature we need to strip it down to getting a fast and constand fps rendering engine. Everything else needs to run outside the main loop and has to interact with the core by, say HLA/RTI or whatever IPC we have.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34793778/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] A FGPythonSys implementation: The embedded&lt;br /&gt;
 Python interpreter as a FlightGear subsystem. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{WIP}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt; //---------------------------------------------------------------------------&lt;br /&gt;
 //&lt;br /&gt;
 //	Title                : EMESARY inter-object communication&lt;br /&gt;
 //&lt;br /&gt;
 //	File Type            : Implementation File&lt;br /&gt;
 //&lt;br /&gt;
 //	Description          : Provides generic inter-object communication. For an object to receive a message it&lt;br /&gt;
 //	                     : must first register with an instance of a Transmitter, and provide a Receive method&lt;br /&gt;
 //&lt;br /&gt;
 //	                     : To send a message use a Transmitter with an object. That's all there is to it.&lt;br /&gt;
 //  &lt;br /&gt;
 //  References           : http://www.chateau-logic.com/content/class-based-inter-object-communication&lt;br /&gt;
 //                       : http://chateau-logic.com/content/emesary-efficient-inter-object-communication-using-interfaces-and-inheritance&lt;br /&gt;
 //                       : http://chateau-logic.com/content/c-wpf-application-plumbing-using-emesary&lt;br /&gt;
 //&lt;br /&gt;
 //	Author               : Richard Harrison (richard@zaretto.com)&lt;br /&gt;
 //&lt;br /&gt;
 //	Creation Date        : 29 January 2016&lt;br /&gt;
 //&lt;br /&gt;
 //	Version              : 4.8&lt;br /&gt;
 //&lt;br /&gt;
 //  Copyright � 2016 Richard Harrison           Released under GPL V2&lt;br /&gt;
 //&lt;br /&gt;
 //---------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
function print () {&lt;br /&gt;
 var i, msg=&amp;quot;&amp;quot;;&lt;br /&gt;
 for(i=0; i&amp;lt;arguments.length; i++) &lt;br /&gt;
   msg += arguments[i];&lt;br /&gt;
 console.log(msg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function inherit(parent) {&lt;br /&gt;
    return Object.create(parent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var emesary = (function() {&lt;br /&gt;
&lt;br /&gt;
var Transmitter =&lt;br /&gt;
{&lt;br /&gt;
    ReceiptStatus_OK : 0,          // Processing completed successfully&lt;br /&gt;
    ReceiptStatus_Fail : 1,        // Processing resulted in at least one failure&lt;br /&gt;
    ReceiptStatus_Abort : 2,       // Fatal error, stop processing any further recipieints of this message. Implicitly failed.&lt;br /&gt;
    ReceiptStatus_Finished : 3,    // Definitive completion - do not send message to any further recipieints&lt;br /&gt;
    ReceiptStatus_NotProcessed : 4,// Return value when method doesn't process a message.&lt;br /&gt;
    ReceiptStatus_Pending : 5,     // Message sent with indeterminate return status as processing underway&lt;br /&gt;
    ReceiptStatus_PendingFinished : 6,// Message definitively handled, status indeterminate. The message will not be sent any further&lt;br /&gt;
&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Transmitter);&lt;br /&gt;
        new_class.Recipients = [];&lt;br /&gt;
        new_class.Ident = _ident;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Add a recipient to receive notifications from this transmitter&lt;br /&gt;
    Register: function (recipient)&lt;br /&gt;
    {&lt;br /&gt;
        this.Recipients.push(recipient);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Stops a recipient from receiving notifications from this transmitter.&lt;br /&gt;
    DeRegister: function(todelete_recipient)&lt;br /&gt;
    {&lt;br /&gt;
        var out_idx = 0;&lt;br /&gt;
        var element_deleted = 0;&lt;br /&gt;
&lt;br /&gt;
        for (var idx = 0; idx &amp;lt; this.RecipientCount(); idx += 1)&lt;br /&gt;
        {&lt;br /&gt;
            if (this.Recipients[idx] != todelete_recipient)&lt;br /&gt;
            {&lt;br /&gt;
                this.Recipients[out_idx] = this.Recipients[idx];&lt;br /&gt;
                out_idx = out_idx + 1;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                element_deleted = 1;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (element_deleted)&lt;br /&gt;
            this.Recipients.pop();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    RecipientCount: function ()&lt;br /&gt;
    {&lt;br /&gt;
        return this.Recipients.length;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    PrintRecipients: function ()&lt;br /&gt;
    {&lt;br /&gt;
        print(&amp;quot;Recipient list&amp;quot;);&lt;br /&gt;
        for (var idx = 0; idx &amp;lt; this.RecipientCount(); idx += 1)&lt;br /&gt;
            print(&amp;quot;Recpient &amp;quot;,idx,&amp;quot; &amp;quot;,this.Recipients[idx].Ident);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Notify all registered recipients. Stop when receipt status of abort || finished are received.&lt;br /&gt;
    // The receipt status from this method will be &lt;br /&gt;
    //  - OK &amp;gt; message handled&lt;br /&gt;
    //  - Fail &amp;gt; message not handled. A status of Abort from a recipient will result in our status&lt;br /&gt;
    //           being fail as Abort means that the message was not and cannot be handled, and&lt;br /&gt;
    //           allows for usages such as access controls.&lt;br /&gt;
    NotifyAll: function(message)&lt;br /&gt;
    {&lt;br /&gt;
        var return_status = Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
	var recipient;&lt;br /&gt;
	&lt;br /&gt;
        this.Recipients.forEach( function(recipient, index, array) &lt;br /&gt;
        {&lt;br /&gt;
            if (recipient.Active)&lt;br /&gt;
            {&lt;br /&gt;
            var rstat = recipient.Receive(message);&lt;br /&gt;
            if(rstat == Transmitter.ReceiptStatus_Fail)&lt;br /&gt;
            {&lt;br /&gt;
                return_status = Transmitter.ReceiptStatus_Fail;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Pending)&lt;br /&gt;
            {&lt;br /&gt;
                return_status = Transmitter.ReceiptStatus_Pending;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_PendingFinished)&lt;br /&gt;
            {&lt;br /&gt;
                return rstat;&lt;br /&gt;
            }&lt;br /&gt;
//            else if(rstat == Transmitter.ReceiptStatus_NotProcessed)&lt;br /&gt;
//            {&lt;br /&gt;
//                ;&lt;br /&gt;
//            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_OK)&lt;br /&gt;
            {&lt;br /&gt;
                if (return_status == Transmitter.ReceiptStatus_NotProcessed)&lt;br /&gt;
                    return_status = rstat;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Abort)&lt;br /&gt;
            {&lt;br /&gt;
                return Transmitter.ReceiptStatus_Abort;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Finished)&lt;br /&gt;
            {&lt;br /&gt;
                return Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        });&lt;br /&gt;
        return return_status;&lt;br /&gt;
    },&lt;br /&gt;
    // Returns true if a return value from NotifyAll is to be considered a failure.&lt;br /&gt;
    IsFailed: function(receiptStatus)&lt;br /&gt;
    {&lt;br /&gt;
        // Failed is either Fail || Abort.&lt;br /&gt;
        // NotProcessed isn't a failure because it hasn't been processed.&lt;br /&gt;
        if (receiptStatus == Transmitter.ReceiptStatus_Fail || receiptStatus == Transmitter.ReceiptStatus_Abort)&lt;br /&gt;
            return 1;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
//&lt;br /&gt;
// Base class for Notifications. By convention a Notification has a type and a value.&lt;br /&gt;
//   SubClasses can add extra properties || methods.&lt;br /&gt;
var Notification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_type, _value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Notification);&lt;br /&gt;
        new_class.Value = _value;&lt;br /&gt;
        new_class.Type = _type;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Recipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Recipient);&lt;br /&gt;
        if (_ident === undefined || _ident === &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            _ident = id(new_class);&lt;br /&gt;
            print(&amp;quot;ERROR: Ident required when creating a recipient, defaulting to &amp;quot;,_ident);&lt;br /&gt;
        }&lt;br /&gt;
        return Recipient.construct(_ident, new_class);&lt;br /&gt;
    },&lt;br /&gt;
    construct: function(_ident, new_class)&lt;br /&gt;
    {&lt;br /&gt;
        new_class.Ident = _ident;&lt;br /&gt;
        new_class.Active = 1;&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
    {&lt;br /&gt;
        print(&amp;quot;ERROR: Receive function not implemented in recipient &amp;quot;,this.Ident);&lt;br /&gt;
        return Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	Transmitter: Transmitter,&lt;br /&gt;
	Notification: Notification,&lt;br /&gt;
	Recipient: Recipient&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Instantiate a Global Transmitter&lt;br /&gt;
var GlobalTransmitter =  emesary.Transmitter.new(&amp;quot;GlobalTransmitter&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 //---------------------------------------------------------------------------&lt;br /&gt;
 //&lt;br /&gt;
 //	Title                : EMESARY tests&lt;br /&gt;
 //&lt;br /&gt;
 //	File Type            : Implementation File&lt;br /&gt;
 //&lt;br /&gt;
 //	Author               : Richard Harrison (richard@zaretto.com)&lt;br /&gt;
 //&lt;br /&gt;
 //	Creation Date        : 29 January 2016&lt;br /&gt;
 //&lt;br /&gt;
 //  Copyright � 2016 Richard Harrison           Released under GPL V2&lt;br /&gt;
 //&lt;br /&gt;
 //---------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Emesary tests&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var TestFailCount = 0;&lt;br /&gt;
var TestSuccessCount = 0;&lt;br /&gt;
&lt;br /&gt;
var TestNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;TestNotification&amp;quot;, _value);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
var TestNotProcessedNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;TestNotProcessedNotification&amp;quot;, _value);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
var RadarReturnNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value, _x, _y, _z)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;RadarReturnNotification&amp;quot;, _value);&lt;br /&gt;
        new_class.x = _x;&lt;br /&gt;
        new_class.y = _y;&lt;br /&gt;
        new_class.z = _z;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var TestRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
	console.log(new_class);&lt;br /&gt;
        new_class.count = 0;&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;TestNotification&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                this.count = this.count + 1;&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var TestRadarRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;RadarReturnNotification&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                print(&amp;quot; :: Test recipient &amp;quot;,this.Ident, &amp;quot; recv:&amp;quot;,notification.Type,&amp;quot; &amp;quot;,notification.Value);&lt;br /&gt;
                print(&amp;quot; ::   &amp;quot;,notification.x, &amp;quot; &amp;quot;, notification.y, &amp;quot; &amp;quot;, notification.z);&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function PerformTest(tid, t)&lt;br /&gt;
{&lt;br /&gt;
    if (t())&lt;br /&gt;
    {&lt;br /&gt;
        TestSuccessCount = TestSuccessCount + 1;&lt;br /&gt;
        print(&amp;quot;  Test [Pass] :&amp;quot;,tid);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        TestFailCount = TestFailCount + 1;&lt;br /&gt;
        print(&amp;quot;  Test [Fail] :&amp;quot;,tid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var tt = TestRecipient.new(&amp;quot;tt recipient&amp;quot;);&lt;br /&gt;
var tt1 = TestRecipient.new(&amp;quot;tt1 recipient1&amp;quot;);&lt;br /&gt;
var tt3 = TestRecipient.new(&amp;quot;tt3 recipient3&amp;quot;);&lt;br /&gt;
var tt2 = TestRadarRecipient.new(&amp;quot;tt2: Radar Test recipient2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Create Notification&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var tn = TestNotification.new(&amp;quot;Test notification&amp;quot;); &lt;br /&gt;
                return tn.Type == &amp;quot;TestNotification&amp;quot; &amp;amp;&amp;amp; tn.Value == &amp;quot;Test notification&amp;quot;;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Register tt&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 1; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt1&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt1);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 2; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt2&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt2);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 3; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt3&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt3);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 4; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Notify&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return !emesary.Transmitter.IsFailed(rv) &amp;amp;&amp;amp; rv != emesary.Transmitter.ReceiptStatus_NotProcessed &amp;amp;&amp;amp; tt.count == 1; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;DeRegister tt1&amp;quot;, &lt;br /&gt;
            function () &lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.DeRegister(tt1);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 3; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
tt1_count = tt1.count;&lt;br /&gt;
PerformTest(&amp;quot;NotifyAfterDeregister&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return tt1.count == tt1_count;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
tt.Active = 0;&lt;br /&gt;
tt_count = tt.count;&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Recipient.Active&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return !emesary.Transmitter.IsFailed(rv) &amp;amp;&amp;amp; rv != emesary.Transmitter.ReceiptStatus_NotProcessed &amp;amp;&amp;amp; tt.count == tt_count; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Test Not Processed Notification&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotProcessedNotification.new(&amp;quot;Not Processed&amp;quot;));&lt;br /&gt;
                return rv == emesary.Transmitter.ReceiptStatus_NotProcessed; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GlobalTransmitter.NotifyAll(RadarReturnNotification.new(&amp;quot;Radar notification&amp;quot;, &amp;quot;x0&amp;quot;,&amp;quot;y0&amp;quot;,&amp;quot;z0&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if (!TestFailCount)&lt;br /&gt;
    print(&amp;quot;Emesary: All &amp;quot;,TestSuccessCount,&amp;quot; tests passed\n&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
    print(&amp;quot;Emesary: ERROR: Tests completed: &amp;quot;,TestFailCount,&amp;quot; failed &amp;amp;&amp;amp; &amp;quot;,TestSuccessCount,&amp;quot; passed\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related ==&lt;br /&gt;
* http://chateau-logic.com/content/emesary-multiplayer-bridge-flightgear&lt;br /&gt;
* http://chateau-logic.com/content/emesary-nasal-implementation-flightgear&lt;br /&gt;
* http://emesary.codeplex.com/&lt;br /&gt;
* https://emesary.codeplex.com/documentation&lt;br /&gt;
* http://chateau-logic.com/content/emesary-efficient-inter-object-communication-using-interfaces-and-inheritance&lt;br /&gt;
* {{Search|list|keywords=emesary}}&lt;br /&gt;
* {{Search|forum|keywords=emesary}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Emesary]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Emesary&amp;diff=123910</id>
		<title>Emesary</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Emesary&amp;diff=123910"/>
		<updated>2020-04-18T14:31:43Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Multiplayer bridge */ fix broken code lines&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stub}}&lt;br /&gt;
&lt;br /&gt;
[[File:Emesary-javascript-port.png|thumb|Emesary ported to Node.js (JavaScript]]&lt;br /&gt;
{{Nasal Navigation}}&lt;br /&gt;
&lt;br /&gt;
Richard Harrison has finished porting his Emesary system to [[Nasal]] and it's now part of the base package. '''Emesary''' is a simple and efficient class-based inter-object communication system to allow decoupled disparate parts of a system to function together without knowing about each. It allows decoupling and removal of dependencies by using notifications to cause actions or to query values.&lt;br /&gt;
&lt;br /&gt;
There are many possible applications for Emesary within the system. It solves the problem of how to connect generic instruments to aircraft that have different implementations and properties that need to be used. Richard has been looking at how to abstract out the interface to the MFD and [[NavDisplay]]. &lt;br /&gt;
&lt;br /&gt;
At the highest level Emesary is a way of communicating information between objects that are otherwise unrelated and possibly separated by a physical (machine, network, process) boundary.&lt;br /&gt;
Two (or more) systems can be connected together by using a bridge; the bridge that Richard implemented uses the generic string properties to transmit the messages transparently (to both the sender and recipient). (documentation is possibly slightly out of date for the most recent developments that are in Richard's fgdata)&lt;br /&gt;
Richard has gotten the transmission of properties working using a new notification type.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is a set of notes at [http://chateau-logic.com/content/emesary-nasal-implementation-flightgear] that explains the whole thing with a worked example (ACLS). &lt;br /&gt;
&lt;br /&gt;
This is in Richard's git repository in his commit, together with the changes to the AI carriers to add ACLS (carrier ILS): https://sourceforge.net/u/r-harrison/fgdata/ci/54165c213f03638a4cb02c848c4f2b234c537f66/ &lt;br /&gt;
&lt;br /&gt;
Richard has plans to extend this to be able to transmit over {{Abbr|mp|Multiplayer}} (probably layered on top of mp-broadcast). It would also probably work quite well with the [[High-Level_Architecture#Federate_Object_Model|HLA FOM]] to give us a way for models to communicate with other models.&amp;lt;ref&amp;gt; {{cite web&lt;br /&gt;
  | url    = http://sourceforge.net/p/flightgear/mailman/message/34985731/&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;[Flightgear-devel] Message passing interface for Nasal&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Richard Harrison&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Apr 1st, 2016&lt;br /&gt;
  | added   = Apr 1st, 2016&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
The longer term direction Richard wants to take is to extend the multiplayer protocol to better handle Emesary notifications bridged over MP; it has significant advantages which he's covered previously.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35777639/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Multiplayer packet truncated &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Apr 9th, 2017 &lt;br /&gt;
  |added  =  Apr 9th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Meanwhile, Richard has nearly finished his improvements to Emesary to make it easy and seamless to transmit properties over MP instead of the of the usual way. This is a two part set of changes, the first part (complete) is to transmit from the master model, the second part is still WIP and relates to the transmission back for dual control.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
  var PropertySyncNotification =&lt;br /&gt;
  {&lt;br /&gt;
     new: func(_ident=&amp;quot;none&amp;quot;, _name=&amp;quot;&amp;quot;, _kind=0, _secondary_kind=0)&lt;br /&gt;
     {&lt;br /&gt;
         var new_class = PropertySyncNotificationBase.new(_ident, _name, &lt;br /&gt;
_kind, _secondary_kind);&lt;br /&gt;
&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;consumables/fuel/total-fuel-lbs&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;controls/fuel/dump-valve&amp;quot;, 1);&lt;br /&gt;
new_class.addIntProperty(&amp;quot;engines/engine[0]/augmentation-burner&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;engines/engine[0]/n1&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;engines/engine[0]/n2&amp;quot;, 1);&lt;br /&gt;
         new_class.addNormProperty(&amp;quot;surface-positions/wing-pos-norm&amp;quot;, 2);&lt;br /&gt;
#... etc ...&lt;br /&gt;
         return new_class;&lt;br /&gt;
     }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# this section sets up the notifications that will be routed and the &lt;br /&gt;
transmitters that are used&lt;br /&gt;
# I've separated out the transmitter that will be used to send the &lt;br /&gt;
properties to enable better control.&lt;br /&gt;
var routedNotifications = &lt;br /&gt;
[notifications.PropertySyncNotification.new(nil), &lt;br /&gt;
notifications.GeoEventNotification.new(nil)];&lt;br /&gt;
var bridgedTransmitter = emesary.Transmitter.new(&amp;quot;outgoingBridge&amp;quot;);&lt;br /&gt;
var outgoingBridge = &lt;br /&gt;
emesary_mp_bridge.OutgoingMPBridge.new(&amp;quot;F-14mp&amp;quot;,routedNotifications, 19, &lt;br /&gt;
&amp;quot;&amp;quot;, bridgedTransmitter);&lt;br /&gt;
var incomingBridge = &lt;br /&gt;
emesary_mp_bridge.IncomingMPBridge.startMPBridge(routedNotifications);&lt;br /&gt;
var f14_aircraft_notification = &lt;br /&gt;
notifications.PropertySyncNotification.new(&amp;quot;F-14&amp;quot;~getprop(&amp;quot;/sim/multiplay/callsign&amp;quot;));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That's all that is required to ship properties between multiplayer modules via Emesary. There is a limit of 128 bytes on a string which limits the amount of outgoing messages. Outgoing notifications are queued and transmitted as space permits. The way the bridge works is to publish the notification, encoded into an MP string, for a period of time to allow for lagging clients and network issues. If a notification IsDistinct then the bridge will transfer just the last message received; otherwise the bridge will transfer all received notifications over MP. In this sense IsDistinct indicates that the contents of the notification are accurate and definitive (e.g. surface position), so the last value is the most accurate. Other notification (e.g. button 12 pushed will always need to be transferred). Obviously using this technique a variable number of properties can be transmitted, and importantly it's up to the modeller to decide what to transmit. There is a flag that I've temporarily added (sim/multiplay/transmit-only-generics) that doesn't transmit the standard properties, just chat and the generics (to make more space in the packet). There can be different types of notifications sent at a different schedule (so you could have a 10 second update of very slow moving items).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Work in progress ==&lt;br /&gt;
What Richard is working on now is how to make (possibly multiple) slaves communicate back to a master craft, initially the F-14 backseat. The design goal is that the same code should work for both the master and the slave, and that there should not need to be any extra logic. At the highest level this would be (master craft): 1. Inside the model bindings a notification is raised, or a property changed that will cause a notification to be raised. 2. The model receives the notification and the appropriate property is changed. 3. The property changed will be sent over Emesary to all slaves. Slaves will not transmit this data back to the master as there is no outgoing bridge configured to do this. For the slave aircraft 1. Inside the model bindings a notification is raised, or a property changed that will cause a notification to be raised. 2. The notification is bridged over MP and received by the master craft.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ALS landing lights visible on the runway from outside views are with FG since 2016.3 or so - same with the technology of lights external to the aircraft specified via relative geometry (used e.g. to illuminate the Shuttle from the ground floodlights during night landings or SRB separation at night). The latter can also  be used for scenery to player or  MP to MP illumination, and Richard is toying with the idea of using the Emesary MP bridge for the job.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=306389#p306389 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: The BK117-B2 &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Mar 5th, 2017 &lt;br /&gt;
  |added  =  Mar 5th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
Any lighting ''always'' requires some form communication between light source and effect assigned to the surface. In Rembrandt, lots of performance is burned to set this up fairly generally via additional passes and buffers. The ALS technique requires you to set this up specifically - so there has to be an information exchange between light and effect - which is what the light manager does for the Shuttle, and which is what Emesary can do more generally between scenery object Nasal snippets and an aircraft.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=306418#p306418 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: The BK117-B2 &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Mar 6th, 2017 &lt;br /&gt;
  |added  =  Mar 6th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are certain things that work better as addons, and with the work Richard has been doing on Emesary FlightGear is in a better position to have integration of addons than it was previously - simply because Emesary removes inter-dependencies.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=318878#p318878 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Serious Request] Making flightgear combat capable. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Sep 15th, 2017 &lt;br /&gt;
  |added  =  Sep 15th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Most of the work that Richard did to the MP protocol - extending the number of properties available and improving the efficiency of transfer came out of the need for the OPRF aircraft to transmit more properties - but is something that has much wider applications. Equally Emesary developments are coming along nicely - we should soon (next few months) see Emesary used on the OPRF fleet to allow models to communicate with each other in a more structured way to provide chaff, flares, radar, missiles, bombs, link16, damage etc.&lt;br /&gt;
&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=318872#p318872 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Serious Request] Making flightgear combat capable. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Sep 15th, 2017 &lt;br /&gt;
  |added  =  Sep 15th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To work over MP properly the model needs to use the existing property transfer over MP (e.g. in sim/multiplay/generic/). &lt;br /&gt;
The best and possibly easiest way to do this is using Emesary with a multiplayer bridge to transmit this (transparently) using a GeoEventNotification. &amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=312137#p312137 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: Synchronization between 2 pc is not reliable &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 9th, 2017 &lt;br /&gt;
  |added  =  Jun 9th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
We all agree having a good IPC mechanism for distributing the simulation state across threads/processes/network is critical&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Properties are much too fine-grained for exposing via HLA. Properties, and subsystems communicating using them, are implementation details of particular HLA federate, not something we’d expose across the federation.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Most solutions that don’t involve fine-grained locking of each property ultimately equate to '''message passing''' anyway&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besides, there's the '''ownship''' assumption hard-coded all over the place - for example, right now subsystems like the replay (flight recorder) system only record and replay your &amp;quot;own&amp;quot; aircraft flight dynamics. &lt;br /&gt;
&lt;br /&gt;
It would be a significant change/addition and somewhat non-trivial to capture all the data for all the AI objects and replay them as well.  &lt;br /&gt;
&lt;br /&gt;
We'd have to decide if the recording and playback mechanism should be part of the AI object or something external that grabs the data and then somehow can force the AI object back through &lt;br /&gt;
it's original path during playback. &amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/8980739/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A similar problem arises when you have a multi viewer environment where you want to interact with the carrier or when you watch AI traffic across the views ..&lt;br /&gt;
&lt;br /&gt;
In this case each viewer has its own carrier AI traffic. That means the can move independently. The same applies to multiplayer mode.&lt;br /&gt;
&lt;br /&gt;
We need some generic code which is able to track SGSubsystems including their child subsystems and transfer their relevant states over the network. The same interface could be used to store replay replay logs. &amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/8980743/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
=== Transmitter ===&lt;br /&gt;
=== Notification ===&lt;br /&gt;
=== Recipient ===&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
=== Loading the framework ===&lt;br /&gt;
The Emesary framework is now part of the base package and available automatically. There is nothing special to be done to load it.&lt;br /&gt;
&lt;br /&gt;
=== Setting up a transmitter ===&lt;br /&gt;
{{Note|Usually, you will just want to use the existing globalTransmitter}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var myTransmitter =  emesary.Transmitter.new(&amp;quot;myTransmitter&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting up a notification ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var HelloNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: func(message)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;Hello&amp;quot;, message);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting up a receiver ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var HelloRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: func(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
        new_class.count = 0;&lt;br /&gt;
        new_class.Receive = func(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;Hello&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                me.count = me.count + 1;&lt;br /&gt;
                print(&amp;quot;Hello message received:&amp;quot;, notification.message);&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registering a receiver ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var receiver = HelloRecipient.new(&amp;quot;my test receiver&amp;quot;);&lt;br /&gt;
myTransmitter.Register(receiver);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notification ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
myTransmitter.NotifyAll( HelloNotification.new(&amp;quot;world !&amp;quot;) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer bridge ==&lt;br /&gt;
Richard has the Emesary multiplayer bridge working ref: http://chateau-logic.com/content/emesary-multiplayer-bridge-flightgear &amp;lt;ref&amp;gt; {{cite web&lt;br /&gt;
  | url    = http://sourceforge.net/p/flightgear/mailman/message/35040437/&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;Re: [Flightgear-devel] Message passing interface for Nasal&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Richard Harrison&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Apr 25th, 2016&lt;br /&gt;
  | added   = Apr 25th, 2016&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code is in the branch of fgdata: https://sourceforge.net/u/r-harrison/fgdata/ci/next-emesary-mp-bridge/tree/ &lt;br /&gt;
* Nasal/emesary.nas &lt;br /&gt;
* Nasal/emesary_mp_bridge.nas &lt;br /&gt;
* Nasal/notifications.nas&lt;br /&gt;
&lt;br /&gt;
The multiplayer bridge allows notifications to be routed over MP. The model creates an incoming bridge specifying the notifications that are to be received and the bridge will messages from multiplayer models. The elegance of the bridge is that neither the sender nor the receiver need to know about each other; all notifications just appear in the recipient method where they can be handled. Each aircraft would have one (or more recipients) and just handle the incoming message.&lt;br /&gt;
&lt;br /&gt;
Create an incoming and outgoing in a model with the following lines.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var routedNotifications = [notifications.GeoEventNotification.new(nil)];&lt;br /&gt;
var outgoingBridge = &lt;br /&gt;
emesary_mp_bridge.OutgoingMPBridge.new(&amp;quot;F-15mp&amp;quot;,routedNotifications);&lt;br /&gt;
var incomingBridge = &lt;br /&gt;
emesary_mp_bridge.IncomingMPBridge.startMPBridge(routedNotifications);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then any GeoEventNotification will arrive via MP and the transmitter in &lt;br /&gt;
any registered recipients, ready for handling like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var EmesaryRecipient =&lt;br /&gt;
{&lt;br /&gt;
     new: func(_ident)&lt;br /&gt;
     {&lt;br /&gt;
         var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
&lt;br /&gt;
         new_class.Receive = func(notification)&lt;br /&gt;
         {&lt;br /&gt;
             if (notification.NotificationType == &amp;quot;GeoEventNotification&amp;quot;)&lt;br /&gt;
             {&lt;br /&gt;
                 print(&amp;quot;received GeoNotification from &amp;quot;,notification.Callsign);&lt;br /&gt;
                 print (&amp;quot; pos=&amp;quot;,notification.Position.lat(),notification.Position.lon(),notification.Position.alt());&lt;br /&gt;
                 print (&amp;quot;  kind=&amp;quot;,notification.Kind, &amp;quot; skind=&amp;quot;,notification.SecondaryKind);&lt;br /&gt;
                 if(notification.FromIncomingBridge)&lt;br /&gt;
                 {&lt;br /&gt;
                     if(notification.Kind == 1)# created&lt;br /&gt;
                     {&lt;br /&gt;
                         if(notification.SecondaryKind &amp;gt;= 48 and notification.SecondaryKind &amp;lt;= 63)&lt;br /&gt;
                         {&lt;br /&gt;
                             # TBD: animate drop tanks&lt;br /&gt;
                         }&lt;br /&gt;
                     }&lt;br /&gt;
                 }&lt;br /&gt;
                 return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
             }&lt;br /&gt;
             return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
         };&lt;br /&gt;
         new_class.Response = ANSPN46ActiveResponseNotification.new(&amp;quot;ARA-63&amp;quot;);&lt;br /&gt;
         return new_class;&lt;br /&gt;
     },&lt;br /&gt;
};&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
# Instantiate receiver.&lt;br /&gt;
var recipient = EmesaryRecipient.new(&amp;quot;F-15-recipient&amp;quot;);&lt;br /&gt;
emesary.GlobalTransmitter.Register(recipient);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== C++ Port ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{WIP}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
The C++ version should be compatible with the Nasal port, i.e. so that the same Emesary notifications, transmitter and recipients can be used in scripting space and native code, it would make sense to look at the [[Nasal/CppBind]] framework to accomplish that.&lt;br /&gt;
&lt;br /&gt;
For the time being, $SG_SRC/canvas/layout/NasalWidget.cxx demonstrates how a C++  &amp;quot;interface&amp;quot; (base class) can be overridden from scripting space by using a corresponding wrapper (see $FG_ROOT/Nasal/canvas/gui/Widget.nas).&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
With Richard's Emesary system now being ported to Nasal, it would actually make sense to look at it with a focus on FGPythonSys, i.e. how this could be moved to C++ space, and reused by the whole [[Talk:FGPythonSys|FGScriptingSys interface]] we've been talking about, because that could make timers, and listeners, entirely unnecessary - while providing the option to run scripts asynchronously from the main loop.&lt;br /&gt;
It would even be possible to come up with a Canvas mode where a Canvas (FBO) is '''only''' updated using an Emesary transmitter, which would mean that these updates could be processed in a background thread, and that OSG could be also much more aggressive about updating Canvas elements/FBOs concurrently.&lt;br /&gt;
Note that there is nothing Nasal specific about Emesary - it's just a way to come up with a decoupled design that lets components act with eachother without having to know much/anything about their internals, and this kind of decoupling would also be useful for any HLA efforts, because HLA would be just one kind of transport, and one that could greatly benefit from having this separation in place.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=284945#p284945 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: FGPython an propose for Python as an nasal alternative &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Hooray &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 12th, 2016 &lt;br /&gt;
  |added  =  May 12th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Advanced Weather/MP ===&lt;br /&gt;
{{Main article|Advanced_weather#Connection_with_the_multiplayer_system}}&lt;br /&gt;
&lt;br /&gt;
Richard's Emesary framework would be ideal for this sort of thing. The changes AW side would be modest - basically a shift to a dedicated random number generator, a routine to build a tile based on incoming information, one to store and encode the meta-data of tiles already created and that'd basically be it.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35491937/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Traffic 2020: Towards a new Development&lt;br /&gt;
 Model for FlightGear AI Traffic &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Nov 15th, 2016 &lt;br /&gt;
  |added  =  Nov 15th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Howto:Implementing a PID Controller in Nasal]]&lt;br /&gt;
* [[Multiplayer]]&lt;br /&gt;
* [[Dual Control]]&lt;br /&gt;
* [[Howto:Using FlightGear as an Image Generator (IG)]]&lt;br /&gt;
* [[Scripted AI Objects]]&lt;br /&gt;
* [[Canvas MFD Framework]]&lt;br /&gt;
* [[NavDisplay]]&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Collection of examples discussed on the forum.&lt;br /&gt;
=== MP Traffic feeds (injection) ===&lt;br /&gt;
* https://forum.flightgear.org/viewtopic.php?f=27&amp;amp;t=29355&amp;amp;p=282755#p282431&lt;br /&gt;
&lt;br /&gt;
== JavaScript port ==&lt;br /&gt;
[[File:Emesary-in-firefox-via-instant-cquotes.png|thumb|Richard's [[Emesary]] MPI system ported to JavaScript, running in Firefox as part of the [[Instant-Cquotes]] script]]&lt;br /&gt;
Torsten is successfully using JavaScript via nodejs for a private project with FlightGear. Communication with FGFS runs via websocket and the http/fgcommand interface, everything works as one would expect; the same technique would be possible with Python or any other scripting language that supports websockets, http-get, http-post and has some support for JSON (python has, ruby has, lua has).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34792963/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] A FGPythonSys implementation: The embedded&lt;br /&gt;
 Python interpreter as a FlightGear subsystem. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Almost every system should be able to run completely independently of the frame rate. What of course would be mandatory is to sync properties at well defined time stamps, this is what the RTI takes care of. &amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34796183/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 26th, 2016 &lt;br /&gt;
  |added  =  Jan 26th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instead of adding just-another-feature we need to strip it down to getting a fast and constand fps rendering engine. Everything else needs to run outside the main loop and has to interact with the core by, say HLA/RTI or whatever IPC we have.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34793778/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] A FGPythonSys implementation: The embedded&lt;br /&gt;
 Python interpreter as a FlightGear subsystem. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{WIP}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt; //---------------------------------------------------------------------------&lt;br /&gt;
 //&lt;br /&gt;
 //	Title                : EMESARY inter-object communication&lt;br /&gt;
 //&lt;br /&gt;
 //	File Type            : Implementation File&lt;br /&gt;
 //&lt;br /&gt;
 //	Description          : Provides generic inter-object communication. For an object to receive a message it&lt;br /&gt;
 //	                     : must first register with an instance of a Transmitter, and provide a Receive method&lt;br /&gt;
 //&lt;br /&gt;
 //	                     : To send a message use a Transmitter with an object. That's all there is to it.&lt;br /&gt;
 //  &lt;br /&gt;
 //  References           : http://www.chateau-logic.com/content/class-based-inter-object-communication&lt;br /&gt;
 //                       : http://chateau-logic.com/content/emesary-efficient-inter-object-communication-using-interfaces-and-inheritance&lt;br /&gt;
 //                       : http://chateau-logic.com/content/c-wpf-application-plumbing-using-emesary&lt;br /&gt;
 //&lt;br /&gt;
 //	Author               : Richard Harrison (richard@zaretto.com)&lt;br /&gt;
 //&lt;br /&gt;
 //	Creation Date        : 29 January 2016&lt;br /&gt;
 //&lt;br /&gt;
 //	Version              : 4.8&lt;br /&gt;
 //&lt;br /&gt;
 //  Copyright � 2016 Richard Harrison           Released under GPL V2&lt;br /&gt;
 //&lt;br /&gt;
 //---------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
function print () {&lt;br /&gt;
 var i, msg=&amp;quot;&amp;quot;;&lt;br /&gt;
 for(i=0; i&amp;lt;arguments.length; i++) &lt;br /&gt;
   msg += arguments[i];&lt;br /&gt;
 console.log(msg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function inherit(parent) {&lt;br /&gt;
    return Object.create(parent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var emesary = (function() {&lt;br /&gt;
&lt;br /&gt;
var Transmitter =&lt;br /&gt;
{&lt;br /&gt;
    ReceiptStatus_OK : 0,          // Processing completed successfully&lt;br /&gt;
    ReceiptStatus_Fail : 1,        // Processing resulted in at least one failure&lt;br /&gt;
    ReceiptStatus_Abort : 2,       // Fatal error, stop processing any further recipieints of this message. Implicitly failed.&lt;br /&gt;
    ReceiptStatus_Finished : 3,    // Definitive completion - do not send message to any further recipieints&lt;br /&gt;
    ReceiptStatus_NotProcessed : 4,// Return value when method doesn't process a message.&lt;br /&gt;
    ReceiptStatus_Pending : 5,     // Message sent with indeterminate return status as processing underway&lt;br /&gt;
    ReceiptStatus_PendingFinished : 6,// Message definitively handled, status indeterminate. The message will not be sent any further&lt;br /&gt;
&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Transmitter);&lt;br /&gt;
        new_class.Recipients = [];&lt;br /&gt;
        new_class.Ident = _ident;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Add a recipient to receive notifications from this transmitter&lt;br /&gt;
    Register: function (recipient)&lt;br /&gt;
    {&lt;br /&gt;
        this.Recipients.push(recipient);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Stops a recipient from receiving notifications from this transmitter.&lt;br /&gt;
    DeRegister: function(todelete_recipient)&lt;br /&gt;
    {&lt;br /&gt;
        var out_idx = 0;&lt;br /&gt;
        var element_deleted = 0;&lt;br /&gt;
&lt;br /&gt;
        for (var idx = 0; idx &amp;lt; this.RecipientCount(); idx += 1)&lt;br /&gt;
        {&lt;br /&gt;
            if (this.Recipients[idx] != todelete_recipient)&lt;br /&gt;
            {&lt;br /&gt;
                this.Recipients[out_idx] = this.Recipients[idx];&lt;br /&gt;
                out_idx = out_idx + 1;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                element_deleted = 1;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (element_deleted)&lt;br /&gt;
            this.Recipients.pop();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    RecipientCount: function ()&lt;br /&gt;
    {&lt;br /&gt;
        return this.Recipients.length;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    PrintRecipients: function ()&lt;br /&gt;
    {&lt;br /&gt;
        print(&amp;quot;Recipient list&amp;quot;);&lt;br /&gt;
        for (var idx = 0; idx &amp;lt; this.RecipientCount(); idx += 1)&lt;br /&gt;
            print(&amp;quot;Recpient &amp;quot;,idx,&amp;quot; &amp;quot;,this.Recipients[idx].Ident);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Notify all registered recipients. Stop when receipt status of abort || finished are received.&lt;br /&gt;
    // The receipt status from this method will be &lt;br /&gt;
    //  - OK &amp;gt; message handled&lt;br /&gt;
    //  - Fail &amp;gt; message not handled. A status of Abort from a recipient will result in our status&lt;br /&gt;
    //           being fail as Abort means that the message was not and cannot be handled, and&lt;br /&gt;
    //           allows for usages such as access controls.&lt;br /&gt;
    NotifyAll: function(message)&lt;br /&gt;
    {&lt;br /&gt;
        var return_status = Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
	var recipient;&lt;br /&gt;
	&lt;br /&gt;
        this.Recipients.forEach( function(recipient, index, array) &lt;br /&gt;
        {&lt;br /&gt;
            if (recipient.Active)&lt;br /&gt;
            {&lt;br /&gt;
            var rstat = recipient.Receive(message);&lt;br /&gt;
            if(rstat == Transmitter.ReceiptStatus_Fail)&lt;br /&gt;
            {&lt;br /&gt;
                return_status = Transmitter.ReceiptStatus_Fail;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Pending)&lt;br /&gt;
            {&lt;br /&gt;
                return_status = Transmitter.ReceiptStatus_Pending;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_PendingFinished)&lt;br /&gt;
            {&lt;br /&gt;
                return rstat;&lt;br /&gt;
            }&lt;br /&gt;
//            else if(rstat == Transmitter.ReceiptStatus_NotProcessed)&lt;br /&gt;
//            {&lt;br /&gt;
//                ;&lt;br /&gt;
//            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_OK)&lt;br /&gt;
            {&lt;br /&gt;
                if (return_status == Transmitter.ReceiptStatus_NotProcessed)&lt;br /&gt;
                    return_status = rstat;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Abort)&lt;br /&gt;
            {&lt;br /&gt;
                return Transmitter.ReceiptStatus_Abort;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Finished)&lt;br /&gt;
            {&lt;br /&gt;
                return Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        });&lt;br /&gt;
        return return_status;&lt;br /&gt;
    },&lt;br /&gt;
    // Returns true if a return value from NotifyAll is to be considered a failure.&lt;br /&gt;
    IsFailed: function(receiptStatus)&lt;br /&gt;
    {&lt;br /&gt;
        // Failed is either Fail || Abort.&lt;br /&gt;
        // NotProcessed isn't a failure because it hasn't been processed.&lt;br /&gt;
        if (receiptStatus == Transmitter.ReceiptStatus_Fail || receiptStatus == Transmitter.ReceiptStatus_Abort)&lt;br /&gt;
            return 1;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
//&lt;br /&gt;
// Base class for Notifications. By convention a Notification has a type and a value.&lt;br /&gt;
//   SubClasses can add extra properties || methods.&lt;br /&gt;
var Notification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_type, _value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Notification);&lt;br /&gt;
        new_class.Value = _value;&lt;br /&gt;
        new_class.Type = _type;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Recipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Recipient);&lt;br /&gt;
        if (_ident === undefined || _ident === &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            _ident = id(new_class);&lt;br /&gt;
            print(&amp;quot;ERROR: Ident required when creating a recipient, defaulting to &amp;quot;,_ident);&lt;br /&gt;
        }&lt;br /&gt;
        return Recipient.construct(_ident, new_class);&lt;br /&gt;
    },&lt;br /&gt;
    construct: function(_ident, new_class)&lt;br /&gt;
    {&lt;br /&gt;
        new_class.Ident = _ident;&lt;br /&gt;
        new_class.Active = 1;&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
    {&lt;br /&gt;
        print(&amp;quot;ERROR: Receive function not implemented in recipient &amp;quot;,this.Ident);&lt;br /&gt;
        return Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	Transmitter: Transmitter,&lt;br /&gt;
	Notification: Notification,&lt;br /&gt;
	Recipient: Recipient&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Instantiate a Global Transmitter&lt;br /&gt;
var GlobalTransmitter =  emesary.Transmitter.new(&amp;quot;GlobalTransmitter&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 //---------------------------------------------------------------------------&lt;br /&gt;
 //&lt;br /&gt;
 //	Title                : EMESARY tests&lt;br /&gt;
 //&lt;br /&gt;
 //	File Type            : Implementation File&lt;br /&gt;
 //&lt;br /&gt;
 //	Author               : Richard Harrison (richard@zaretto.com)&lt;br /&gt;
 //&lt;br /&gt;
 //	Creation Date        : 29 January 2016&lt;br /&gt;
 //&lt;br /&gt;
 //  Copyright � 2016 Richard Harrison           Released under GPL V2&lt;br /&gt;
 //&lt;br /&gt;
 //---------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Emesary tests&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var TestFailCount = 0;&lt;br /&gt;
var TestSuccessCount = 0;&lt;br /&gt;
&lt;br /&gt;
var TestNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;TestNotification&amp;quot;, _value);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
var TestNotProcessedNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;TestNotProcessedNotification&amp;quot;, _value);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
var RadarReturnNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value, _x, _y, _z)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;RadarReturnNotification&amp;quot;, _value);&lt;br /&gt;
        new_class.x = _x;&lt;br /&gt;
        new_class.y = _y;&lt;br /&gt;
        new_class.z = _z;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var TestRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
	console.log(new_class);&lt;br /&gt;
        new_class.count = 0;&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;TestNotification&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                this.count = this.count + 1;&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var TestRadarRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;RadarReturnNotification&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                print(&amp;quot; :: Test recipient &amp;quot;,this.Ident, &amp;quot; recv:&amp;quot;,notification.Type,&amp;quot; &amp;quot;,notification.Value);&lt;br /&gt;
                print(&amp;quot; ::   &amp;quot;,notification.x, &amp;quot; &amp;quot;, notification.y, &amp;quot; &amp;quot;, notification.z);&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function PerformTest(tid, t)&lt;br /&gt;
{&lt;br /&gt;
    if (t())&lt;br /&gt;
    {&lt;br /&gt;
        TestSuccessCount = TestSuccessCount + 1;&lt;br /&gt;
        print(&amp;quot;  Test [Pass] :&amp;quot;,tid);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        TestFailCount = TestFailCount + 1;&lt;br /&gt;
        print(&amp;quot;  Test [Fail] :&amp;quot;,tid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var tt = TestRecipient.new(&amp;quot;tt recipient&amp;quot;);&lt;br /&gt;
var tt1 = TestRecipient.new(&amp;quot;tt1 recipient1&amp;quot;);&lt;br /&gt;
var tt3 = TestRecipient.new(&amp;quot;tt3 recipient3&amp;quot;);&lt;br /&gt;
var tt2 = TestRadarRecipient.new(&amp;quot;tt2: Radar Test recipient2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Create Notification&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var tn = TestNotification.new(&amp;quot;Test notification&amp;quot;); &lt;br /&gt;
                return tn.Type == &amp;quot;TestNotification&amp;quot; &amp;amp;&amp;amp; tn.Value == &amp;quot;Test notification&amp;quot;;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Register tt&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 1; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt1&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt1);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 2; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt2&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt2);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 3; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt3&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt3);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 4; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Notify&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return !emesary.Transmitter.IsFailed(rv) &amp;amp;&amp;amp; rv != emesary.Transmitter.ReceiptStatus_NotProcessed &amp;amp;&amp;amp; tt.count == 1; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;DeRegister tt1&amp;quot;, &lt;br /&gt;
            function () &lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.DeRegister(tt1);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 3; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
tt1_count = tt1.count;&lt;br /&gt;
PerformTest(&amp;quot;NotifyAfterDeregister&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return tt1.count == tt1_count;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
tt.Active = 0;&lt;br /&gt;
tt_count = tt.count;&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Recipient.Active&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return !emesary.Transmitter.IsFailed(rv) &amp;amp;&amp;amp; rv != emesary.Transmitter.ReceiptStatus_NotProcessed &amp;amp;&amp;amp; tt.count == tt_count; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Test Not Processed Notification&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotProcessedNotification.new(&amp;quot;Not Processed&amp;quot;));&lt;br /&gt;
                return rv == emesary.Transmitter.ReceiptStatus_NotProcessed; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GlobalTransmitter.NotifyAll(RadarReturnNotification.new(&amp;quot;Radar notification&amp;quot;, &amp;quot;x0&amp;quot;,&amp;quot;y0&amp;quot;,&amp;quot;z0&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if (!TestFailCount)&lt;br /&gt;
    print(&amp;quot;Emesary: All &amp;quot;,TestSuccessCount,&amp;quot; tests passed\n&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
    print(&amp;quot;Emesary: ERROR: Tests completed: &amp;quot;,TestFailCount,&amp;quot; failed &amp;amp;&amp;amp; &amp;quot;,TestSuccessCount,&amp;quot; passed\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related ==&lt;br /&gt;
* http://chateau-logic.com/content/emesary-multiplayer-bridge-flightgear&lt;br /&gt;
* http://chateau-logic.com/content/emesary-nasal-implementation-flightgear&lt;br /&gt;
* http://emesary.codeplex.com/&lt;br /&gt;
* https://emesary.codeplex.com/documentation&lt;br /&gt;
* http://chateau-logic.com/content/emesary-efficient-inter-object-communication-using-interfaces-and-inheritance&lt;br /&gt;
* {{Search|list|keywords=emesary}}&lt;br /&gt;
* {{Search|forum|keywords=emesary}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Emesary]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Emesary&amp;diff=123909</id>
		<title>Emesary</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Emesary&amp;diff=123909"/>
		<updated>2020-04-18T14:29:49Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Setting up a transmitter */ spelling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stub}}&lt;br /&gt;
&lt;br /&gt;
[[File:Emesary-javascript-port.png|thumb|Emesary ported to Node.js (JavaScript]]&lt;br /&gt;
{{Nasal Navigation}}&lt;br /&gt;
&lt;br /&gt;
Richard Harrison has finished porting his Emesary system to [[Nasal]] and it's now part of the base package. '''Emesary''' is a simple and efficient class-based inter-object communication system to allow decoupled disparate parts of a system to function together without knowing about each. It allows decoupling and removal of dependencies by using notifications to cause actions or to query values.&lt;br /&gt;
&lt;br /&gt;
There are many possible applications for Emesary within the system. It solves the problem of how to connect generic instruments to aircraft that have different implementations and properties that need to be used. Richard has been looking at how to abstract out the interface to the MFD and [[NavDisplay]]. &lt;br /&gt;
&lt;br /&gt;
At the highest level Emesary is a way of communicating information between objects that are otherwise unrelated and possibly separated by a physical (machine, network, process) boundary.&lt;br /&gt;
Two (or more) systems can be connected together by using a bridge; the bridge that Richard implemented uses the generic string properties to transmit the messages transparently (to both the sender and recipient). (documentation is possibly slightly out of date for the most recent developments that are in Richard's fgdata)&lt;br /&gt;
Richard has gotten the transmission of properties working using a new notification type.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is a set of notes at [http://chateau-logic.com/content/emesary-nasal-implementation-flightgear] that explains the whole thing with a worked example (ACLS). &lt;br /&gt;
&lt;br /&gt;
This is in Richard's git repository in his commit, together with the changes to the AI carriers to add ACLS (carrier ILS): https://sourceforge.net/u/r-harrison/fgdata/ci/54165c213f03638a4cb02c848c4f2b234c537f66/ &lt;br /&gt;
&lt;br /&gt;
Richard has plans to extend this to be able to transmit over {{Abbr|mp|Multiplayer}} (probably layered on top of mp-broadcast). It would also probably work quite well with the [[High-Level_Architecture#Federate_Object_Model|HLA FOM]] to give us a way for models to communicate with other models.&amp;lt;ref&amp;gt; {{cite web&lt;br /&gt;
  | url    = http://sourceforge.net/p/flightgear/mailman/message/34985731/&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;[Flightgear-devel] Message passing interface for Nasal&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Richard Harrison&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Apr 1st, 2016&lt;br /&gt;
  | added   = Apr 1st, 2016&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
The longer term direction Richard wants to take is to extend the multiplayer protocol to better handle Emesary notifications bridged over MP; it has significant advantages which he's covered previously.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35777639/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Multiplayer packet truncated &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Apr 9th, 2017 &lt;br /&gt;
  |added  =  Apr 9th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Meanwhile, Richard has nearly finished his improvements to Emesary to make it easy and seamless to transmit properties over MP instead of the of the usual way. This is a two part set of changes, the first part (complete) is to transmit from the master model, the second part is still WIP and relates to the transmission back for dual control.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
  var PropertySyncNotification =&lt;br /&gt;
  {&lt;br /&gt;
     new: func(_ident=&amp;quot;none&amp;quot;, _name=&amp;quot;&amp;quot;, _kind=0, _secondary_kind=0)&lt;br /&gt;
     {&lt;br /&gt;
         var new_class = PropertySyncNotificationBase.new(_ident, _name, &lt;br /&gt;
_kind, _secondary_kind);&lt;br /&gt;
&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;consumables/fuel/total-fuel-lbs&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;controls/fuel/dump-valve&amp;quot;, 1);&lt;br /&gt;
new_class.addIntProperty(&amp;quot;engines/engine[0]/augmentation-burner&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;engines/engine[0]/n1&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;engines/engine[0]/n2&amp;quot;, 1);&lt;br /&gt;
         new_class.addNormProperty(&amp;quot;surface-positions/wing-pos-norm&amp;quot;, 2);&lt;br /&gt;
#... etc ...&lt;br /&gt;
         return new_class;&lt;br /&gt;
     }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# this section sets up the notifications that will be routed and the &lt;br /&gt;
transmitters that are used&lt;br /&gt;
# I've separated out the transmitter that will be used to send the &lt;br /&gt;
properties to enable better control.&lt;br /&gt;
var routedNotifications = &lt;br /&gt;
[notifications.PropertySyncNotification.new(nil), &lt;br /&gt;
notifications.GeoEventNotification.new(nil)];&lt;br /&gt;
var bridgedTransmitter = emesary.Transmitter.new(&amp;quot;outgoingBridge&amp;quot;);&lt;br /&gt;
var outgoingBridge = &lt;br /&gt;
emesary_mp_bridge.OutgoingMPBridge.new(&amp;quot;F-14mp&amp;quot;,routedNotifications, 19, &lt;br /&gt;
&amp;quot;&amp;quot;, bridgedTransmitter);&lt;br /&gt;
var incomingBridge = &lt;br /&gt;
emesary_mp_bridge.IncomingMPBridge.startMPBridge(routedNotifications);&lt;br /&gt;
var f14_aircraft_notification = &lt;br /&gt;
notifications.PropertySyncNotification.new(&amp;quot;F-14&amp;quot;~getprop(&amp;quot;/sim/multiplay/callsign&amp;quot;));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That's all that is required to ship properties between multiplayer modules via Emesary. There is a limit of 128 bytes on a string which limits the amount of outgoing messages. Outgoing notifications are queued and transmitted as space permits. The way the bridge works is to publish the notification, encoded into an MP string, for a period of time to allow for lagging clients and network issues. If a notification IsDistinct then the bridge will transfer just the last message received; otherwise the bridge will transfer all received notifications over MP. In this sense IsDistinct indicates that the contents of the notification are accurate and definitive (e.g. surface position), so the last value is the most accurate. Other notification (e.g. button 12 pushed will always need to be transferred). Obviously using this technique a variable number of properties can be transmitted, and importantly it's up to the modeller to decide what to transmit. There is a flag that I've temporarily added (sim/multiplay/transmit-only-generics) that doesn't transmit the standard properties, just chat and the generics (to make more space in the packet). There can be different types of notifications sent at a different schedule (so you could have a 10 second update of very slow moving items).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Work in progress ==&lt;br /&gt;
What Richard is working on now is how to make (possibly multiple) slaves communicate back to a master craft, initially the F-14 backseat. The design goal is that the same code should work for both the master and the slave, and that there should not need to be any extra logic. At the highest level this would be (master craft): 1. Inside the model bindings a notification is raised, or a property changed that will cause a notification to be raised. 2. The model receives the notification and the appropriate property is changed. 3. The property changed will be sent over Emesary to all slaves. Slaves will not transmit this data back to the master as there is no outgoing bridge configured to do this. For the slave aircraft 1. Inside the model bindings a notification is raised, or a property changed that will cause a notification to be raised. 2. The notification is bridged over MP and received by the master craft.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ALS landing lights visible on the runway from outside views are with FG since 2016.3 or so - same with the technology of lights external to the aircraft specified via relative geometry (used e.g. to illuminate the Shuttle from the ground floodlights during night landings or SRB separation at night). The latter can also  be used for scenery to player or  MP to MP illumination, and Richard is toying with the idea of using the Emesary MP bridge for the job.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=306389#p306389 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: The BK117-B2 &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Mar 5th, 2017 &lt;br /&gt;
  |added  =  Mar 5th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
Any lighting ''always'' requires some form communication between light source and effect assigned to the surface. In Rembrandt, lots of performance is burned to set this up fairly generally via additional passes and buffers. The ALS technique requires you to set this up specifically - so there has to be an information exchange between light and effect - which is what the light manager does for the Shuttle, and which is what Emesary can do more generally between scenery object Nasal snippets and an aircraft.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=306418#p306418 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: The BK117-B2 &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Mar 6th, 2017 &lt;br /&gt;
  |added  =  Mar 6th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are certain things that work better as addons, and with the work Richard has been doing on Emesary FlightGear is in a better position to have integration of addons than it was previously - simply because Emesary removes inter-dependencies.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=318878#p318878 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Serious Request] Making flightgear combat capable. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Sep 15th, 2017 &lt;br /&gt;
  |added  =  Sep 15th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Most of the work that Richard did to the MP protocol - extending the number of properties available and improving the efficiency of transfer came out of the need for the OPRF aircraft to transmit more properties - but is something that has much wider applications. Equally Emesary developments are coming along nicely - we should soon (next few months) see Emesary used on the OPRF fleet to allow models to communicate with each other in a more structured way to provide chaff, flares, radar, missiles, bombs, link16, damage etc.&lt;br /&gt;
&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=318872#p318872 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Serious Request] Making flightgear combat capable. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Sep 15th, 2017 &lt;br /&gt;
  |added  =  Sep 15th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To work over MP properly the model needs to use the existing property transfer over MP (e.g. in sim/multiplay/generic/). &lt;br /&gt;
The best and possibly easiest way to do this is using Emesary with a multiplayer bridge to transmit this (transparently) using a GeoEventNotification. &amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=312137#p312137 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: Synchronization between 2 pc is not reliable &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 9th, 2017 &lt;br /&gt;
  |added  =  Jun 9th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
We all agree having a good IPC mechanism for distributing the simulation state across threads/processes/network is critical&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Properties are much too fine-grained for exposing via HLA. Properties, and subsystems communicating using them, are implementation details of particular HLA federate, not something we’d expose across the federation.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Most solutions that don’t involve fine-grained locking of each property ultimately equate to '''message passing''' anyway&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besides, there's the '''ownship''' assumption hard-coded all over the place - for example, right now subsystems like the replay (flight recorder) system only record and replay your &amp;quot;own&amp;quot; aircraft flight dynamics. &lt;br /&gt;
&lt;br /&gt;
It would be a significant change/addition and somewhat non-trivial to capture all the data for all the AI objects and replay them as well.  &lt;br /&gt;
&lt;br /&gt;
We'd have to decide if the recording and playback mechanism should be part of the AI object or something external that grabs the data and then somehow can force the AI object back through &lt;br /&gt;
it's original path during playback. &amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/8980739/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A similar problem arises when you have a multi viewer environment where you want to interact with the carrier or when you watch AI traffic across the views ..&lt;br /&gt;
&lt;br /&gt;
In this case each viewer has its own carrier AI traffic. That means the can move independently. The same applies to multiplayer mode.&lt;br /&gt;
&lt;br /&gt;
We need some generic code which is able to track SGSubsystems including their child subsystems and transfer their relevant states over the network. The same interface could be used to store replay replay logs. &amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/8980743/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
=== Transmitter ===&lt;br /&gt;
=== Notification ===&lt;br /&gt;
=== Recipient ===&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
=== Loading the framework ===&lt;br /&gt;
The Emesary framework is now part of the base package and available automatically. There is nothing special to be done to load it.&lt;br /&gt;
&lt;br /&gt;
=== Setting up a transmitter ===&lt;br /&gt;
{{Note|Usually, you will just want to use the existing globalTransmitter}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var myTransmitter =  emesary.Transmitter.new(&amp;quot;myTransmitter&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting up a notification ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var HelloNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: func(message)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;Hello&amp;quot;, message);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting up a receiver ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var HelloRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: func(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
        new_class.count = 0;&lt;br /&gt;
        new_class.Receive = func(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;Hello&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                me.count = me.count + 1;&lt;br /&gt;
                print(&amp;quot;Hello message received:&amp;quot;, notification.message);&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registering a receiver ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var receiver = HelloRecipient.new(&amp;quot;my test receiver&amp;quot;);&lt;br /&gt;
myTransmitter.Register(receiver);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notification ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
myTransmitter.NotifyAll( HelloNotification.new(&amp;quot;world !&amp;quot;) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer bridge ==&lt;br /&gt;
Richard has the Emesary multiplayer bridge working ref: http://chateau-logic.com/content/emesary-multiplayer-bridge-flightgear &amp;lt;ref&amp;gt; {{cite web&lt;br /&gt;
  | url    = http://sourceforge.net/p/flightgear/mailman/message/35040437/&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;Re: [Flightgear-devel] Message passing interface for Nasal&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Richard Harrison&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Apr 25th, 2016&lt;br /&gt;
  | added   = Apr 25th, 2016&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code is in the branch of fgdata: https://sourceforge.net/u/r-harrison/fgdata/ci/next-emesary-mp-bridge/tree/ &lt;br /&gt;
* Nasal/emesary.nas &lt;br /&gt;
* Nasal/emesary_mp_bridge.nas &lt;br /&gt;
* Nasal/notifications.nas&lt;br /&gt;
&lt;br /&gt;
The multiplayer bridge allows notifications to be routed over MP. The model creates an incoming bridge specifying the notifications that are to be received and the bridge will messages from multiplayer models. The elegance of the bridge is that neither the sender nor the receiver need to know about each other; all notifications just appear in the recipient method where they can be handled. Each aircraft would have one (or more recipients) and just handle the incoming message.&lt;br /&gt;
&lt;br /&gt;
Create an incoming and outgoing in a model with the following lines.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var routedNotifications = [notifications.GeoEventNotification.new(nil)];&lt;br /&gt;
var outgoingBridge = &lt;br /&gt;
emesary_mp_bridge.OutgoingMPBridge.new(&amp;quot;F-15mp&amp;quot;,routedNotifications);&lt;br /&gt;
var incomingBridge = &lt;br /&gt;
emesary_mp_bridge.IncomingMPBridge.startMPBridge(routedNotifications);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then any GeoEventNotification will arrive via MP and the transmitter in &lt;br /&gt;
any registered recipients, ready for handling like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var EmesaryRecipient =&lt;br /&gt;
{&lt;br /&gt;
     new: func(_ident)&lt;br /&gt;
     {&lt;br /&gt;
         var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
&lt;br /&gt;
         new_class.Receive = func(notification)&lt;br /&gt;
         {&lt;br /&gt;
             if (notification.NotificationType == &amp;quot;GeoEventNotification&amp;quot;)&lt;br /&gt;
             {&lt;br /&gt;
                 print(&amp;quot;received GeoNotification from &lt;br /&gt;
&amp;quot;,notification.Callsign);&lt;br /&gt;
                 print (&amp;quot; &lt;br /&gt;
pos=&amp;quot;,notification.Position.lat(),notification.Position.lon(),notification.Position.alt());&lt;br /&gt;
                 print (&amp;quot;  kind=&amp;quot;,notification.Kind, &amp;quot; &lt;br /&gt;
skind=&amp;quot;,notification.SecondaryKind);&lt;br /&gt;
                 if(notification.FromIncomingBridge)&lt;br /&gt;
                 {&lt;br /&gt;
                     if(notification.Kind == 1)# created&lt;br /&gt;
                     {&lt;br /&gt;
                         if(notification.SecondaryKind &amp;gt;= 48 and &lt;br /&gt;
notification.SecondaryKind &amp;lt;= 63)&lt;br /&gt;
                         {&lt;br /&gt;
                             # TBD: animate drop tanks&lt;br /&gt;
                         }&lt;br /&gt;
                     }&lt;br /&gt;
                 }&lt;br /&gt;
                 return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
             }&lt;br /&gt;
             return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
         };&lt;br /&gt;
         new_class.Response = &lt;br /&gt;
ANSPN46ActiveResponseNotification.new(&amp;quot;ARA-63&amp;quot;);&lt;br /&gt;
         return new_class;&lt;br /&gt;
     },&lt;br /&gt;
};&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
# Instantiate receiver.&lt;br /&gt;
var recipient = EmesaryRecipient.new(&amp;quot;F-15-recipient&amp;quot;);&lt;br /&gt;
emesary.GlobalTransmitter.Register(recipient);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== C++ Port ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{WIP}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
The C++ version should be compatible with the Nasal port, i.e. so that the same Emesary notifications, transmitter and recipients can be used in scripting space and native code, it would make sense to look at the [[Nasal/CppBind]] framework to accomplish that.&lt;br /&gt;
&lt;br /&gt;
For the time being, $SG_SRC/canvas/layout/NasalWidget.cxx demonstrates how a C++  &amp;quot;interface&amp;quot; (base class) can be overridden from scripting space by using a corresponding wrapper (see $FG_ROOT/Nasal/canvas/gui/Widget.nas).&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
With Richard's Emesary system now being ported to Nasal, it would actually make sense to look at it with a focus on FGPythonSys, i.e. how this could be moved to C++ space, and reused by the whole [[Talk:FGPythonSys|FGScriptingSys interface]] we've been talking about, because that could make timers, and listeners, entirely unnecessary - while providing the option to run scripts asynchronously from the main loop.&lt;br /&gt;
It would even be possible to come up with a Canvas mode where a Canvas (FBO) is '''only''' updated using an Emesary transmitter, which would mean that these updates could be processed in a background thread, and that OSG could be also much more aggressive about updating Canvas elements/FBOs concurrently.&lt;br /&gt;
Note that there is nothing Nasal specific about Emesary - it's just a way to come up with a decoupled design that lets components act with eachother without having to know much/anything about their internals, and this kind of decoupling would also be useful for any HLA efforts, because HLA would be just one kind of transport, and one that could greatly benefit from having this separation in place.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=284945#p284945 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: FGPython an propose for Python as an nasal alternative &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Hooray &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 12th, 2016 &lt;br /&gt;
  |added  =  May 12th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Advanced Weather/MP ===&lt;br /&gt;
{{Main article|Advanced_weather#Connection_with_the_multiplayer_system}}&lt;br /&gt;
&lt;br /&gt;
Richard's Emesary framework would be ideal for this sort of thing. The changes AW side would be modest - basically a shift to a dedicated random number generator, a routine to build a tile based on incoming information, one to store and encode the meta-data of tiles already created and that'd basically be it.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35491937/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Traffic 2020: Towards a new Development&lt;br /&gt;
 Model for FlightGear AI Traffic &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Nov 15th, 2016 &lt;br /&gt;
  |added  =  Nov 15th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Howto:Implementing a PID Controller in Nasal]]&lt;br /&gt;
* [[Multiplayer]]&lt;br /&gt;
* [[Dual Control]]&lt;br /&gt;
* [[Howto:Using FlightGear as an Image Generator (IG)]]&lt;br /&gt;
* [[Scripted AI Objects]]&lt;br /&gt;
* [[Canvas MFD Framework]]&lt;br /&gt;
* [[NavDisplay]]&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Collection of examples discussed on the forum.&lt;br /&gt;
=== MP Traffic feeds (injection) ===&lt;br /&gt;
* https://forum.flightgear.org/viewtopic.php?f=27&amp;amp;t=29355&amp;amp;p=282755#p282431&lt;br /&gt;
&lt;br /&gt;
== JavaScript port ==&lt;br /&gt;
[[File:Emesary-in-firefox-via-instant-cquotes.png|thumb|Richard's [[Emesary]] MPI system ported to JavaScript, running in Firefox as part of the [[Instant-Cquotes]] script]]&lt;br /&gt;
Torsten is successfully using JavaScript via nodejs for a private project with FlightGear. Communication with FGFS runs via websocket and the http/fgcommand interface, everything works as one would expect; the same technique would be possible with Python or any other scripting language that supports websockets, http-get, http-post and has some support for JSON (python has, ruby has, lua has).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34792963/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] A FGPythonSys implementation: The embedded&lt;br /&gt;
 Python interpreter as a FlightGear subsystem. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Almost every system should be able to run completely independently of the frame rate. What of course would be mandatory is to sync properties at well defined time stamps, this is what the RTI takes care of. &amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34796183/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 26th, 2016 &lt;br /&gt;
  |added  =  Jan 26th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instead of adding just-another-feature we need to strip it down to getting a fast and constand fps rendering engine. Everything else needs to run outside the main loop and has to interact with the core by, say HLA/RTI or whatever IPC we have.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34793778/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] A FGPythonSys implementation: The embedded&lt;br /&gt;
 Python interpreter as a FlightGear subsystem. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{WIP}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt; //---------------------------------------------------------------------------&lt;br /&gt;
 //&lt;br /&gt;
 //	Title                : EMESARY inter-object communication&lt;br /&gt;
 //&lt;br /&gt;
 //	File Type            : Implementation File&lt;br /&gt;
 //&lt;br /&gt;
 //	Description          : Provides generic inter-object communication. For an object to receive a message it&lt;br /&gt;
 //	                     : must first register with an instance of a Transmitter, and provide a Receive method&lt;br /&gt;
 //&lt;br /&gt;
 //	                     : To send a message use a Transmitter with an object. That's all there is to it.&lt;br /&gt;
 //  &lt;br /&gt;
 //  References           : http://www.chateau-logic.com/content/class-based-inter-object-communication&lt;br /&gt;
 //                       : http://chateau-logic.com/content/emesary-efficient-inter-object-communication-using-interfaces-and-inheritance&lt;br /&gt;
 //                       : http://chateau-logic.com/content/c-wpf-application-plumbing-using-emesary&lt;br /&gt;
 //&lt;br /&gt;
 //	Author               : Richard Harrison (richard@zaretto.com)&lt;br /&gt;
 //&lt;br /&gt;
 //	Creation Date        : 29 January 2016&lt;br /&gt;
 //&lt;br /&gt;
 //	Version              : 4.8&lt;br /&gt;
 //&lt;br /&gt;
 //  Copyright � 2016 Richard Harrison           Released under GPL V2&lt;br /&gt;
 //&lt;br /&gt;
 //---------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
function print () {&lt;br /&gt;
 var i, msg=&amp;quot;&amp;quot;;&lt;br /&gt;
 for(i=0; i&amp;lt;arguments.length; i++) &lt;br /&gt;
   msg += arguments[i];&lt;br /&gt;
 console.log(msg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function inherit(parent) {&lt;br /&gt;
    return Object.create(parent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var emesary = (function() {&lt;br /&gt;
&lt;br /&gt;
var Transmitter =&lt;br /&gt;
{&lt;br /&gt;
    ReceiptStatus_OK : 0,          // Processing completed successfully&lt;br /&gt;
    ReceiptStatus_Fail : 1,        // Processing resulted in at least one failure&lt;br /&gt;
    ReceiptStatus_Abort : 2,       // Fatal error, stop processing any further recipieints of this message. Implicitly failed.&lt;br /&gt;
    ReceiptStatus_Finished : 3,    // Definitive completion - do not send message to any further recipieints&lt;br /&gt;
    ReceiptStatus_NotProcessed : 4,// Return value when method doesn't process a message.&lt;br /&gt;
    ReceiptStatus_Pending : 5,     // Message sent with indeterminate return status as processing underway&lt;br /&gt;
    ReceiptStatus_PendingFinished : 6,// Message definitively handled, status indeterminate. The message will not be sent any further&lt;br /&gt;
&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Transmitter);&lt;br /&gt;
        new_class.Recipients = [];&lt;br /&gt;
        new_class.Ident = _ident;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Add a recipient to receive notifications from this transmitter&lt;br /&gt;
    Register: function (recipient)&lt;br /&gt;
    {&lt;br /&gt;
        this.Recipients.push(recipient);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Stops a recipient from receiving notifications from this transmitter.&lt;br /&gt;
    DeRegister: function(todelete_recipient)&lt;br /&gt;
    {&lt;br /&gt;
        var out_idx = 0;&lt;br /&gt;
        var element_deleted = 0;&lt;br /&gt;
&lt;br /&gt;
        for (var idx = 0; idx &amp;lt; this.RecipientCount(); idx += 1)&lt;br /&gt;
        {&lt;br /&gt;
            if (this.Recipients[idx] != todelete_recipient)&lt;br /&gt;
            {&lt;br /&gt;
                this.Recipients[out_idx] = this.Recipients[idx];&lt;br /&gt;
                out_idx = out_idx + 1;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                element_deleted = 1;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (element_deleted)&lt;br /&gt;
            this.Recipients.pop();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    RecipientCount: function ()&lt;br /&gt;
    {&lt;br /&gt;
        return this.Recipients.length;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    PrintRecipients: function ()&lt;br /&gt;
    {&lt;br /&gt;
        print(&amp;quot;Recipient list&amp;quot;);&lt;br /&gt;
        for (var idx = 0; idx &amp;lt; this.RecipientCount(); idx += 1)&lt;br /&gt;
            print(&amp;quot;Recpient &amp;quot;,idx,&amp;quot; &amp;quot;,this.Recipients[idx].Ident);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Notify all registered recipients. Stop when receipt status of abort || finished are received.&lt;br /&gt;
    // The receipt status from this method will be &lt;br /&gt;
    //  - OK &amp;gt; message handled&lt;br /&gt;
    //  - Fail &amp;gt; message not handled. A status of Abort from a recipient will result in our status&lt;br /&gt;
    //           being fail as Abort means that the message was not and cannot be handled, and&lt;br /&gt;
    //           allows for usages such as access controls.&lt;br /&gt;
    NotifyAll: function(message)&lt;br /&gt;
    {&lt;br /&gt;
        var return_status = Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
	var recipient;&lt;br /&gt;
	&lt;br /&gt;
        this.Recipients.forEach( function(recipient, index, array) &lt;br /&gt;
        {&lt;br /&gt;
            if (recipient.Active)&lt;br /&gt;
            {&lt;br /&gt;
            var rstat = recipient.Receive(message);&lt;br /&gt;
            if(rstat == Transmitter.ReceiptStatus_Fail)&lt;br /&gt;
            {&lt;br /&gt;
                return_status = Transmitter.ReceiptStatus_Fail;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Pending)&lt;br /&gt;
            {&lt;br /&gt;
                return_status = Transmitter.ReceiptStatus_Pending;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_PendingFinished)&lt;br /&gt;
            {&lt;br /&gt;
                return rstat;&lt;br /&gt;
            }&lt;br /&gt;
//            else if(rstat == Transmitter.ReceiptStatus_NotProcessed)&lt;br /&gt;
//            {&lt;br /&gt;
//                ;&lt;br /&gt;
//            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_OK)&lt;br /&gt;
            {&lt;br /&gt;
                if (return_status == Transmitter.ReceiptStatus_NotProcessed)&lt;br /&gt;
                    return_status = rstat;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Abort)&lt;br /&gt;
            {&lt;br /&gt;
                return Transmitter.ReceiptStatus_Abort;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Finished)&lt;br /&gt;
            {&lt;br /&gt;
                return Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        });&lt;br /&gt;
        return return_status;&lt;br /&gt;
    },&lt;br /&gt;
    // Returns true if a return value from NotifyAll is to be considered a failure.&lt;br /&gt;
    IsFailed: function(receiptStatus)&lt;br /&gt;
    {&lt;br /&gt;
        // Failed is either Fail || Abort.&lt;br /&gt;
        // NotProcessed isn't a failure because it hasn't been processed.&lt;br /&gt;
        if (receiptStatus == Transmitter.ReceiptStatus_Fail || receiptStatus == Transmitter.ReceiptStatus_Abort)&lt;br /&gt;
            return 1;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
//&lt;br /&gt;
// Base class for Notifications. By convention a Notification has a type and a value.&lt;br /&gt;
//   SubClasses can add extra properties || methods.&lt;br /&gt;
var Notification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_type, _value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Notification);&lt;br /&gt;
        new_class.Value = _value;&lt;br /&gt;
        new_class.Type = _type;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Recipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Recipient);&lt;br /&gt;
        if (_ident === undefined || _ident === &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            _ident = id(new_class);&lt;br /&gt;
            print(&amp;quot;ERROR: Ident required when creating a recipient, defaulting to &amp;quot;,_ident);&lt;br /&gt;
        }&lt;br /&gt;
        return Recipient.construct(_ident, new_class);&lt;br /&gt;
    },&lt;br /&gt;
    construct: function(_ident, new_class)&lt;br /&gt;
    {&lt;br /&gt;
        new_class.Ident = _ident;&lt;br /&gt;
        new_class.Active = 1;&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
    {&lt;br /&gt;
        print(&amp;quot;ERROR: Receive function not implemented in recipient &amp;quot;,this.Ident);&lt;br /&gt;
        return Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	Transmitter: Transmitter,&lt;br /&gt;
	Notification: Notification,&lt;br /&gt;
	Recipient: Recipient&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Instantiate a Global Transmitter&lt;br /&gt;
var GlobalTransmitter =  emesary.Transmitter.new(&amp;quot;GlobalTransmitter&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 //---------------------------------------------------------------------------&lt;br /&gt;
 //&lt;br /&gt;
 //	Title                : EMESARY tests&lt;br /&gt;
 //&lt;br /&gt;
 //	File Type            : Implementation File&lt;br /&gt;
 //&lt;br /&gt;
 //	Author               : Richard Harrison (richard@zaretto.com)&lt;br /&gt;
 //&lt;br /&gt;
 //	Creation Date        : 29 January 2016&lt;br /&gt;
 //&lt;br /&gt;
 //  Copyright � 2016 Richard Harrison           Released under GPL V2&lt;br /&gt;
 //&lt;br /&gt;
 //---------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Emesary tests&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var TestFailCount = 0;&lt;br /&gt;
var TestSuccessCount = 0;&lt;br /&gt;
&lt;br /&gt;
var TestNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;TestNotification&amp;quot;, _value);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
var TestNotProcessedNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;TestNotProcessedNotification&amp;quot;, _value);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
var RadarReturnNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value, _x, _y, _z)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;RadarReturnNotification&amp;quot;, _value);&lt;br /&gt;
        new_class.x = _x;&lt;br /&gt;
        new_class.y = _y;&lt;br /&gt;
        new_class.z = _z;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var TestRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
	console.log(new_class);&lt;br /&gt;
        new_class.count = 0;&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;TestNotification&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                this.count = this.count + 1;&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var TestRadarRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;RadarReturnNotification&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                print(&amp;quot; :: Test recipient &amp;quot;,this.Ident, &amp;quot; recv:&amp;quot;,notification.Type,&amp;quot; &amp;quot;,notification.Value);&lt;br /&gt;
                print(&amp;quot; ::   &amp;quot;,notification.x, &amp;quot; &amp;quot;, notification.y, &amp;quot; &amp;quot;, notification.z);&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function PerformTest(tid, t)&lt;br /&gt;
{&lt;br /&gt;
    if (t())&lt;br /&gt;
    {&lt;br /&gt;
        TestSuccessCount = TestSuccessCount + 1;&lt;br /&gt;
        print(&amp;quot;  Test [Pass] :&amp;quot;,tid);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        TestFailCount = TestFailCount + 1;&lt;br /&gt;
        print(&amp;quot;  Test [Fail] :&amp;quot;,tid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var tt = TestRecipient.new(&amp;quot;tt recipient&amp;quot;);&lt;br /&gt;
var tt1 = TestRecipient.new(&amp;quot;tt1 recipient1&amp;quot;);&lt;br /&gt;
var tt3 = TestRecipient.new(&amp;quot;tt3 recipient3&amp;quot;);&lt;br /&gt;
var tt2 = TestRadarRecipient.new(&amp;quot;tt2: Radar Test recipient2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Create Notification&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var tn = TestNotification.new(&amp;quot;Test notification&amp;quot;); &lt;br /&gt;
                return tn.Type == &amp;quot;TestNotification&amp;quot; &amp;amp;&amp;amp; tn.Value == &amp;quot;Test notification&amp;quot;;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Register tt&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 1; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt1&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt1);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 2; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt2&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt2);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 3; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt3&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt3);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 4; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Notify&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return !emesary.Transmitter.IsFailed(rv) &amp;amp;&amp;amp; rv != emesary.Transmitter.ReceiptStatus_NotProcessed &amp;amp;&amp;amp; tt.count == 1; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;DeRegister tt1&amp;quot;, &lt;br /&gt;
            function () &lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.DeRegister(tt1);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 3; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
tt1_count = tt1.count;&lt;br /&gt;
PerformTest(&amp;quot;NotifyAfterDeregister&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return tt1.count == tt1_count;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
tt.Active = 0;&lt;br /&gt;
tt_count = tt.count;&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Recipient.Active&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return !emesary.Transmitter.IsFailed(rv) &amp;amp;&amp;amp; rv != emesary.Transmitter.ReceiptStatus_NotProcessed &amp;amp;&amp;amp; tt.count == tt_count; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Test Not Processed Notification&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotProcessedNotification.new(&amp;quot;Not Processed&amp;quot;));&lt;br /&gt;
                return rv == emesary.Transmitter.ReceiptStatus_NotProcessed; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GlobalTransmitter.NotifyAll(RadarReturnNotification.new(&amp;quot;Radar notification&amp;quot;, &amp;quot;x0&amp;quot;,&amp;quot;y0&amp;quot;,&amp;quot;z0&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if (!TestFailCount)&lt;br /&gt;
    print(&amp;quot;Emesary: All &amp;quot;,TestSuccessCount,&amp;quot; tests passed\n&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
    print(&amp;quot;Emesary: ERROR: Tests completed: &amp;quot;,TestFailCount,&amp;quot; failed &amp;amp;&amp;amp; &amp;quot;,TestSuccessCount,&amp;quot; passed\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related ==&lt;br /&gt;
* http://chateau-logic.com/content/emesary-multiplayer-bridge-flightgear&lt;br /&gt;
* http://chateau-logic.com/content/emesary-nasal-implementation-flightgear&lt;br /&gt;
* http://emesary.codeplex.com/&lt;br /&gt;
* https://emesary.codeplex.com/documentation&lt;br /&gt;
* http://chateau-logic.com/content/emesary-efficient-inter-object-communication-using-interfaces-and-inheritance&lt;br /&gt;
* {{Search|list|keywords=emesary}}&lt;br /&gt;
* {{Search|forum|keywords=emesary}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Emesary]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Emesary&amp;diff=123908</id>
		<title>Emesary</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Emesary&amp;diff=123908"/>
		<updated>2020-04-18T14:28:23Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: minor word fixes; remove repeated links and stanzas; paragraph adjustments; proper capitalization of Emesary&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Stub}}&lt;br /&gt;
&lt;br /&gt;
[[File:Emesary-javascript-port.png|thumb|Emesary ported to Node.js (JavaScript]]&lt;br /&gt;
{{Nasal Navigation}}&lt;br /&gt;
&lt;br /&gt;
Richard Harrison has finished porting his Emesary system to [[Nasal]] and it's now part of the base package. '''Emesary''' is a simple and efficient class-based inter-object communication system to allow decoupled disparate parts of a system to function together without knowing about each. It allows decoupling and removal of dependencies by using notifications to cause actions or to query values.&lt;br /&gt;
&lt;br /&gt;
There are many possible applications for Emesary within the system. It solves the problem of how to connect generic instruments to aircraft that have different implementations and properties that need to be used. Richard has been looking at how to abstract out the interface to the MFD and [[NavDisplay]]. &lt;br /&gt;
&lt;br /&gt;
At the highest level Emesary is a way of communicating information between objects that are otherwise unrelated and possibly separated by a physical (machine, network, process) boundary.&lt;br /&gt;
Two (or more) systems can be connected together by using a bridge; the bridge that Richard implemented uses the generic string properties to transmit the messages transparently (to both the sender and recipient). (documentation is possibly slightly out of date for the most recent developments that are in Richard's fgdata)&lt;br /&gt;
Richard has gotten the transmission of properties working using a new notification type.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is a set of notes at [http://chateau-logic.com/content/emesary-nasal-implementation-flightgear] that explains the whole thing with a worked example (ACLS). &lt;br /&gt;
&lt;br /&gt;
This is in Richard's git repository in his commit, together with the changes to the AI carriers to add ACLS (carrier ILS): https://sourceforge.net/u/r-harrison/fgdata/ci/54165c213f03638a4cb02c848c4f2b234c537f66/ &lt;br /&gt;
&lt;br /&gt;
Richard has plans to extend this to be able to transmit over {{Abbr|mp|Multiplayer}} (probably layered on top of mp-broadcast). It would also probably work quite well with the [[High-Level_Architecture#Federate_Object_Model|HLA FOM]] to give us a way for models to communicate with other models.&amp;lt;ref&amp;gt; {{cite web&lt;br /&gt;
  | url    = http://sourceforge.net/p/flightgear/mailman/message/34985731/&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;[Flightgear-devel] Message passing interface for Nasal&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Richard Harrison&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Apr 1st, 2016&lt;br /&gt;
  | added   = Apr 1st, 2016&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
The longer term direction Richard wants to take is to extend the multiplayer protocol to better handle Emesary notifications bridged over MP; it has significant advantages which he's covered previously.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35777639/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Multiplayer packet truncated &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Apr 9th, 2017 &lt;br /&gt;
  |added  =  Apr 9th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Meanwhile, Richard has nearly finished his improvements to Emesary to make it easy and seamless to transmit properties over MP instead of the of the usual way. This is a two part set of changes, the first part (complete) is to transmit from the master model, the second part is still WIP and relates to the transmission back for dual control.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
  var PropertySyncNotification =&lt;br /&gt;
  {&lt;br /&gt;
     new: func(_ident=&amp;quot;none&amp;quot;, _name=&amp;quot;&amp;quot;, _kind=0, _secondary_kind=0)&lt;br /&gt;
     {&lt;br /&gt;
         var new_class = PropertySyncNotificationBase.new(_ident, _name, &lt;br /&gt;
_kind, _secondary_kind);&lt;br /&gt;
&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;consumables/fuel/total-fuel-lbs&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;controls/fuel/dump-valve&amp;quot;, 1);&lt;br /&gt;
new_class.addIntProperty(&amp;quot;engines/engine[0]/augmentation-burner&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;engines/engine[0]/n1&amp;quot;, 1);&lt;br /&gt;
         new_class.addIntProperty(&amp;quot;engines/engine[0]/n2&amp;quot;, 1);&lt;br /&gt;
         new_class.addNormProperty(&amp;quot;surface-positions/wing-pos-norm&amp;quot;, 2);&lt;br /&gt;
#... etc ...&lt;br /&gt;
         return new_class;&lt;br /&gt;
     }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# this section sets up the notifications that will be routed and the &lt;br /&gt;
transmitters that are used&lt;br /&gt;
# I've separated out the transmitter that will be used to send the &lt;br /&gt;
properties to enable better control.&lt;br /&gt;
var routedNotifications = &lt;br /&gt;
[notifications.PropertySyncNotification.new(nil), &lt;br /&gt;
notifications.GeoEventNotification.new(nil)];&lt;br /&gt;
var bridgedTransmitter = emesary.Transmitter.new(&amp;quot;outgoingBridge&amp;quot;);&lt;br /&gt;
var outgoingBridge = &lt;br /&gt;
emesary_mp_bridge.OutgoingMPBridge.new(&amp;quot;F-14mp&amp;quot;,routedNotifications, 19, &lt;br /&gt;
&amp;quot;&amp;quot;, bridgedTransmitter);&lt;br /&gt;
var incomingBridge = &lt;br /&gt;
emesary_mp_bridge.IncomingMPBridge.startMPBridge(routedNotifications);&lt;br /&gt;
var f14_aircraft_notification = &lt;br /&gt;
notifications.PropertySyncNotification.new(&amp;quot;F-14&amp;quot;~getprop(&amp;quot;/sim/multiplay/callsign&amp;quot;));&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
That's all that is required to ship properties between multiplayer modules via Emesary. There is a limit of 128 bytes on a string which limits the amount of outgoing messages. Outgoing notifications are queued and transmitted as space permits. The way the bridge works is to publish the notification, encoded into an MP string, for a period of time to allow for lagging clients and network issues. If a notification IsDistinct then the bridge will transfer just the last message received; otherwise the bridge will transfer all received notifications over MP. In this sense IsDistinct indicates that the contents of the notification are accurate and definitive (e.g. surface position), so the last value is the most accurate. Other notification (e.g. button 12 pushed will always need to be transferred). Obviously using this technique a variable number of properties can be transmitted, and importantly it's up to the modeller to decide what to transmit. There is a flag that I've temporarily added (sim/multiplay/transmit-only-generics) that doesn't transmit the standard properties, just chat and the generics (to make more space in the packet). There can be different types of notifications sent at a different schedule (so you could have a 10 second update of very slow moving items).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Work in progress ==&lt;br /&gt;
What Richard is working on now is how to make (possibly multiple) slaves communicate back to a master craft, initially the F-14 backseat. The design goal is that the same code should work for both the master and the slave, and that there should not need to be any extra logic. At the highest level this would be (master craft): 1. Inside the model bindings a notification is raised, or a property changed that will cause a notification to be raised. 2. The model receives the notification and the appropriate property is changed. 3. The property changed will be sent over Emesary to all slaves. Slaves will not transmit this data back to the master as there is no outgoing bridge configured to do this. For the slave aircraft 1. Inside the model bindings a notification is raised, or a property changed that will cause a notification to be raised. 2. The notification is bridged over MP and received by the master craft.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35894463/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; [Flightgear-devel] Emesary / Multiplayer improvements &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard Harrison &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 14th, 2017 &lt;br /&gt;
  |added  =  Jun 14th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ALS landing lights visible on the runway from outside views are with FG since 2016.3 or so - same with the technology of lights external to the aircraft specified via relative geometry (used e.g. to illuminate the Shuttle from the ground floodlights during night landings or SRB separation at night). The latter can also  be used for scenery to player or  MP to MP illumination, and Richard is toying with the idea of using the Emesary MP bridge for the job.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=306389#p306389 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: The BK117-B2 &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Mar 5th, 2017 &lt;br /&gt;
  |added  =  Mar 5th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
Any lighting ''always'' requires some form communication between light source and effect assigned to the surface. In Rembrandt, lots of performance is burned to set this up fairly generally via additional passes and buffers. The ALS technique requires you to set this up specifically - so there has to be an information exchange between light and effect - which is what the light manager does for the Shuttle, and which is what Emesary can do more generally between scenery object Nasal snippets and an aircraft.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=306418#p306418 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: The BK117-B2 &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Mar 6th, 2017 &lt;br /&gt;
  |added  =  Mar 6th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are certain things that work better as addons, and with the work Richard has been doing on Emesary FlightGear is in a better position to have integration of addons than it was previously - simply because Emesary removes inter-dependencies.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=318878#p318878 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Serious Request] Making flightgear combat capable. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Sep 15th, 2017 &lt;br /&gt;
  |added  =  Sep 15th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Most of the work that Richard did to the MP protocol - extending the number of properties available and improving the efficiency of transfer came out of the need for the OPRF aircraft to transmit more properties - but is something that has much wider applications. Equally Emesary developments are coming along nicely - we should soon (next few months) see Emesary used on the OPRF fleet to allow models to communicate with each other in a more structured way to provide chaff, flares, radar, missiles, bombs, link16, damage etc.&lt;br /&gt;
&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=318872#p318872 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Serious Request] Making flightgear combat capable. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Sep 15th, 2017 &lt;br /&gt;
  |added  =  Sep 15th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To work over MP properly the model needs to use the existing property transfer over MP (e.g. in sim/multiplay/generic/). &lt;br /&gt;
The best and possibly easiest way to do this is using Emesary with a multiplayer bridge to transmit this (transparently) using a GeoEventNotification. &amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=312137#p312137 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: Synchronization between 2 pc is not reliable &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Richard &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 9th, 2017 &lt;br /&gt;
  |added  =  Jun 9th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
We all agree having a good IPC mechanism for distributing the simulation state across threads/processes/network is critical&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Properties are much too fine-grained for exposing via HLA. Properties, and subsystems communicating using them, are implementation details of particular HLA federate, not something we’d expose across the federation.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Most solutions that don’t involve fine-grained locking of each property ultimately equate to '''message passing''' anyway&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34794675/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Besides, there's the '''ownship''' assumption hard-coded all over the place - for example, right now subsystems like the replay (flight recorder) system only record and replay your &amp;quot;own&amp;quot; aircraft flight dynamics. &lt;br /&gt;
&lt;br /&gt;
It would be a significant change/addition and somewhat non-trivial to capture all the data for all the AI objects and replay them as well.  &lt;br /&gt;
&lt;br /&gt;
We'd have to decide if the recording and playback mechanism should be part of the AI object or something external that grabs the data and then somehow can force the AI object back through &lt;br /&gt;
it's original path during playback. &amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/8980739/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A similar problem arises when you have a multi viewer environment where you want to interact with the carrier or when you watch AI traffic across the views ..&lt;br /&gt;
&lt;br /&gt;
In this case each viewer has its own carrier AI traffic. That means the can move independently. The same applies to multiplayer mode.&lt;br /&gt;
&lt;br /&gt;
We need some generic code which is able to track SGSubsystems including their child subsystems and transfer their relevant states over the network. The same interface could be used to store replay replay logs. &amp;lt;ref&amp;gt;https://sourceforge.net/p/flightgear/mailman/message/8980743/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
=== Transmitter ===&lt;br /&gt;
=== Notification ===&lt;br /&gt;
=== Recipient ===&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
=== Loading the framework ===&lt;br /&gt;
The Emesary framework is now part of the base package and available automatically. There is nothing special to be done to load it.&lt;br /&gt;
&lt;br /&gt;
=== Setting up a transmitter ===&lt;br /&gt;
{{Note|Usually, you will just want to use the exixsting globalTransmitter}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var myTransmitter =  emesary.Transmitter.new(&amp;quot;myTransmitter&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting up a notification ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var HelloNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: func(message)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;Hello&amp;quot;, message);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting up a receiver ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var HelloRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: func(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
        new_class.count = 0;&lt;br /&gt;
        new_class.Receive = func(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;Hello&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                me.count = me.count + 1;&lt;br /&gt;
                print(&amp;quot;Hello message received:&amp;quot;, notification.message);&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Registering a receiver ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var receiver = HelloRecipient.new(&amp;quot;my test receiver&amp;quot;);&lt;br /&gt;
myTransmitter.Register(receiver);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Notification ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
myTransmitter.NotifyAll( HelloNotification.new(&amp;quot;world !&amp;quot;) );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer bridge ==&lt;br /&gt;
Richard has the Emesary multiplayer bridge working ref: http://chateau-logic.com/content/emesary-multiplayer-bridge-flightgear &amp;lt;ref&amp;gt; {{cite web&lt;br /&gt;
  | url    = http://sourceforge.net/p/flightgear/mailman/message/35040437/&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;Re: [Flightgear-devel] Message passing interface for Nasal&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Richard Harrison&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Apr 25th, 2016&lt;br /&gt;
  | added   = Apr 25th, 2016&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code is in the branch of fgdata: https://sourceforge.net/u/r-harrison/fgdata/ci/next-emesary-mp-bridge/tree/ &lt;br /&gt;
* Nasal/emesary.nas &lt;br /&gt;
* Nasal/emesary_mp_bridge.nas &lt;br /&gt;
* Nasal/notifications.nas&lt;br /&gt;
&lt;br /&gt;
The multiplayer bridge allows notifications to be routed over MP. The model creates an incoming bridge specifying the notifications that are to be received and the bridge will messages from multiplayer models. The elegance of the bridge is that neither the sender nor the receiver need to know about each other; all notifications just appear in the recipient method where they can be handled. Each aircraft would have one (or more recipients) and just handle the incoming message.&lt;br /&gt;
&lt;br /&gt;
Create an incoming and outgoing in a model with the following lines.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var routedNotifications = [notifications.GeoEventNotification.new(nil)];&lt;br /&gt;
var outgoingBridge = &lt;br /&gt;
emesary_mp_bridge.OutgoingMPBridge.new(&amp;quot;F-15mp&amp;quot;,routedNotifications);&lt;br /&gt;
var incomingBridge = &lt;br /&gt;
emesary_mp_bridge.IncomingMPBridge.startMPBridge(routedNotifications);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
then any GeoEventNotification will arrive via MP and the transmitter in &lt;br /&gt;
any registered recipients, ready for handling like this&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
var EmesaryRecipient =&lt;br /&gt;
{&lt;br /&gt;
     new: func(_ident)&lt;br /&gt;
     {&lt;br /&gt;
         var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
&lt;br /&gt;
         new_class.Receive = func(notification)&lt;br /&gt;
         {&lt;br /&gt;
             if (notification.NotificationType == &amp;quot;GeoEventNotification&amp;quot;)&lt;br /&gt;
             {&lt;br /&gt;
                 print(&amp;quot;received GeoNotification from &lt;br /&gt;
&amp;quot;,notification.Callsign);&lt;br /&gt;
                 print (&amp;quot; &lt;br /&gt;
pos=&amp;quot;,notification.Position.lat(),notification.Position.lon(),notification.Position.alt());&lt;br /&gt;
                 print (&amp;quot;  kind=&amp;quot;,notification.Kind, &amp;quot; &lt;br /&gt;
skind=&amp;quot;,notification.SecondaryKind);&lt;br /&gt;
                 if(notification.FromIncomingBridge)&lt;br /&gt;
                 {&lt;br /&gt;
                     if(notification.Kind == 1)# created&lt;br /&gt;
                     {&lt;br /&gt;
                         if(notification.SecondaryKind &amp;gt;= 48 and &lt;br /&gt;
notification.SecondaryKind &amp;lt;= 63)&lt;br /&gt;
                         {&lt;br /&gt;
                             # TBD: animate drop tanks&lt;br /&gt;
                         }&lt;br /&gt;
                     }&lt;br /&gt;
                 }&lt;br /&gt;
                 return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
             }&lt;br /&gt;
             return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
         };&lt;br /&gt;
         new_class.Response = &lt;br /&gt;
ANSPN46ActiveResponseNotification.new(&amp;quot;ARA-63&amp;quot;);&lt;br /&gt;
         return new_class;&lt;br /&gt;
     },&lt;br /&gt;
};&lt;br /&gt;
#&lt;br /&gt;
#&lt;br /&gt;
# Instantiate receiver.&lt;br /&gt;
var recipient = EmesaryRecipient.new(&amp;quot;F-15-recipient&amp;quot;);&lt;br /&gt;
emesary.GlobalTransmitter.Register(recipient);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== C++ Port ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{WIP}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
The C++ version should be compatible with the Nasal port, i.e. so that the same Emesary notifications, transmitter and recipients can be used in scripting space and native code, it would make sense to look at the [[Nasal/CppBind]] framework to accomplish that.&lt;br /&gt;
&lt;br /&gt;
For the time being, $SG_SRC/canvas/layout/NasalWidget.cxx demonstrates how a C++  &amp;quot;interface&amp;quot; (base class) can be overridden from scripting space by using a corresponding wrapper (see $FG_ROOT/Nasal/canvas/gui/Widget.nas).&lt;br /&gt;
&lt;br /&gt;
== Use Cases ==&lt;br /&gt;
With Richard's Emesary system now being ported to Nasal, it would actually make sense to look at it with a focus on FGPythonSys, i.e. how this could be moved to C++ space, and reused by the whole [[Talk:FGPythonSys|FGScriptingSys interface]] we've been talking about, because that could make timers, and listeners, entirely unnecessary - while providing the option to run scripts asynchronously from the main loop.&lt;br /&gt;
It would even be possible to come up with a Canvas mode where a Canvas (FBO) is '''only''' updated using an Emesary transmitter, which would mean that these updates could be processed in a background thread, and that OSG could be also much more aggressive about updating Canvas elements/FBOs concurrently.&lt;br /&gt;
Note that there is nothing Nasal specific about Emesary - it's just a way to come up with a decoupled design that lets components act with eachother without having to know much/anything about their internals, and this kind of decoupling would also be useful for any HLA efforts, because HLA would be just one kind of transport, and one that could greatly benefit from having this separation in place.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=284945#p284945 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: FGPython an propose for Python as an nasal alternative &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Hooray &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 12th, 2016 &lt;br /&gt;
  |added  =  May 12th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Advanced Weather/MP ===&lt;br /&gt;
{{Main article|Advanced_weather#Connection_with_the_multiplayer_system}}&lt;br /&gt;
&lt;br /&gt;
Richard's Emesary framework would be ideal for this sort of thing. The changes AW side would be modest - basically a shift to a dedicated random number generator, a routine to build a tile based on incoming information, one to store and encode the meta-data of tiles already created and that'd basically be it.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35491937/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Traffic 2020: Towards a new Development&lt;br /&gt;
 Model for FlightGear AI Traffic &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Thorsten Renk &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Nov 15th, 2016 &lt;br /&gt;
  |added  =  Nov 15th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Howto:Implementing a PID Controller in Nasal]]&lt;br /&gt;
* [[Multiplayer]]&lt;br /&gt;
* [[Dual Control]]&lt;br /&gt;
* [[Howto:Using FlightGear as an Image Generator (IG)]]&lt;br /&gt;
* [[Scripted AI Objects]]&lt;br /&gt;
* [[Canvas MFD Framework]]&lt;br /&gt;
* [[NavDisplay]]&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Collection of examples discussed on the forum.&lt;br /&gt;
=== MP Traffic feeds (injection) ===&lt;br /&gt;
* https://forum.flightgear.org/viewtopic.php?f=27&amp;amp;t=29355&amp;amp;p=282755#p282431&lt;br /&gt;
&lt;br /&gt;
== JavaScript port ==&lt;br /&gt;
[[File:Emesary-in-firefox-via-instant-cquotes.png|thumb|Richard's [[Emesary]] MPI system ported to JavaScript, running in Firefox as part of the [[Instant-Cquotes]] script]]&lt;br /&gt;
Torsten is successfully using JavaScript via nodejs for a private project with FlightGear. Communication with FGFS runs via websocket and the http/fgcommand interface, everything works as one would expect; the same technique would be possible with Python or any other scripting language that supports websockets, http-get, http-post and has some support for JSON (python has, ruby has, lua has).&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34792963/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] A FGPythonSys implementation: The embedded&lt;br /&gt;
 Python interpreter as a FlightGear subsystem. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Almost every system should be able to run completely independently of the frame rate. What of course would be mandatory is to sync properties at well defined time stamps, this is what the RTI takes care of. &amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34796183/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] Designing a thread-safe property tree API&lt;br /&gt;
 (was Re: A FGPythonSys implementation: ...) &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 26th, 2016 &lt;br /&gt;
  |added  =  Jan 26th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instead of adding just-another-feature we need to strip it down to getting a fast and constand fps rendering engine. Everything else needs to run outside the main loop and has to interact with the core by, say HLA/RTI or whatever IPC we have.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/34793778/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] A FGPythonSys implementation: The embedded&lt;br /&gt;
 Python interpreter as a FlightGear subsystem. &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; Torsten Dreyer &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jan 25th, 2016 &lt;br /&gt;
  |added  =  Jan 25th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{WIP}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt; //---------------------------------------------------------------------------&lt;br /&gt;
 //&lt;br /&gt;
 //	Title                : EMESARY inter-object communication&lt;br /&gt;
 //&lt;br /&gt;
 //	File Type            : Implementation File&lt;br /&gt;
 //&lt;br /&gt;
 //	Description          : Provides generic inter-object communication. For an object to receive a message it&lt;br /&gt;
 //	                     : must first register with an instance of a Transmitter, and provide a Receive method&lt;br /&gt;
 //&lt;br /&gt;
 //	                     : To send a message use a Transmitter with an object. That's all there is to it.&lt;br /&gt;
 //  &lt;br /&gt;
 //  References           : http://www.chateau-logic.com/content/class-based-inter-object-communication&lt;br /&gt;
 //                       : http://chateau-logic.com/content/emesary-efficient-inter-object-communication-using-interfaces-and-inheritance&lt;br /&gt;
 //                       : http://chateau-logic.com/content/c-wpf-application-plumbing-using-emesary&lt;br /&gt;
 //&lt;br /&gt;
 //	Author               : Richard Harrison (richard@zaretto.com)&lt;br /&gt;
 //&lt;br /&gt;
 //	Creation Date        : 29 January 2016&lt;br /&gt;
 //&lt;br /&gt;
 //	Version              : 4.8&lt;br /&gt;
 //&lt;br /&gt;
 //  Copyright � 2016 Richard Harrison           Released under GPL V2&lt;br /&gt;
 //&lt;br /&gt;
 //---------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
function print () {&lt;br /&gt;
 var i, msg=&amp;quot;&amp;quot;;&lt;br /&gt;
 for(i=0; i&amp;lt;arguments.length; i++) &lt;br /&gt;
   msg += arguments[i];&lt;br /&gt;
 console.log(msg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function inherit(parent) {&lt;br /&gt;
    return Object.create(parent);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var emesary = (function() {&lt;br /&gt;
&lt;br /&gt;
var Transmitter =&lt;br /&gt;
{&lt;br /&gt;
    ReceiptStatus_OK : 0,          // Processing completed successfully&lt;br /&gt;
    ReceiptStatus_Fail : 1,        // Processing resulted in at least one failure&lt;br /&gt;
    ReceiptStatus_Abort : 2,       // Fatal error, stop processing any further recipieints of this message. Implicitly failed.&lt;br /&gt;
    ReceiptStatus_Finished : 3,    // Definitive completion - do not send message to any further recipieints&lt;br /&gt;
    ReceiptStatus_NotProcessed : 4,// Return value when method doesn't process a message.&lt;br /&gt;
    ReceiptStatus_Pending : 5,     // Message sent with indeterminate return status as processing underway&lt;br /&gt;
    ReceiptStatus_PendingFinished : 6,// Message definitively handled, status indeterminate. The message will not be sent any further&lt;br /&gt;
&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Transmitter);&lt;br /&gt;
        new_class.Recipients = [];&lt;br /&gt;
        new_class.Ident = _ident;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Add a recipient to receive notifications from this transmitter&lt;br /&gt;
    Register: function (recipient)&lt;br /&gt;
    {&lt;br /&gt;
        this.Recipients.push(recipient);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Stops a recipient from receiving notifications from this transmitter.&lt;br /&gt;
    DeRegister: function(todelete_recipient)&lt;br /&gt;
    {&lt;br /&gt;
        var out_idx = 0;&lt;br /&gt;
        var element_deleted = 0;&lt;br /&gt;
&lt;br /&gt;
        for (var idx = 0; idx &amp;lt; this.RecipientCount(); idx += 1)&lt;br /&gt;
        {&lt;br /&gt;
            if (this.Recipients[idx] != todelete_recipient)&lt;br /&gt;
            {&lt;br /&gt;
                this.Recipients[out_idx] = this.Recipients[idx];&lt;br /&gt;
                out_idx = out_idx + 1;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                element_deleted = 1;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (element_deleted)&lt;br /&gt;
            this.Recipients.pop();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    RecipientCount: function ()&lt;br /&gt;
    {&lt;br /&gt;
        return this.Recipients.length;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    PrintRecipients: function ()&lt;br /&gt;
    {&lt;br /&gt;
        print(&amp;quot;Recipient list&amp;quot;);&lt;br /&gt;
        for (var idx = 0; idx &amp;lt; this.RecipientCount(); idx += 1)&lt;br /&gt;
            print(&amp;quot;Recpient &amp;quot;,idx,&amp;quot; &amp;quot;,this.Recipients[idx].Ident);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Notify all registered recipients. Stop when receipt status of abort || finished are received.&lt;br /&gt;
    // The receipt status from this method will be &lt;br /&gt;
    //  - OK &amp;gt; message handled&lt;br /&gt;
    //  - Fail &amp;gt; message not handled. A status of Abort from a recipient will result in our status&lt;br /&gt;
    //           being fail as Abort means that the message was not and cannot be handled, and&lt;br /&gt;
    //           allows for usages such as access controls.&lt;br /&gt;
    NotifyAll: function(message)&lt;br /&gt;
    {&lt;br /&gt;
        var return_status = Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
	var recipient;&lt;br /&gt;
	&lt;br /&gt;
        this.Recipients.forEach( function(recipient, index, array) &lt;br /&gt;
        {&lt;br /&gt;
            if (recipient.Active)&lt;br /&gt;
            {&lt;br /&gt;
            var rstat = recipient.Receive(message);&lt;br /&gt;
            if(rstat == Transmitter.ReceiptStatus_Fail)&lt;br /&gt;
            {&lt;br /&gt;
                return_status = Transmitter.ReceiptStatus_Fail;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Pending)&lt;br /&gt;
            {&lt;br /&gt;
                return_status = Transmitter.ReceiptStatus_Pending;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_PendingFinished)&lt;br /&gt;
            {&lt;br /&gt;
                return rstat;&lt;br /&gt;
            }&lt;br /&gt;
//            else if(rstat == Transmitter.ReceiptStatus_NotProcessed)&lt;br /&gt;
//            {&lt;br /&gt;
//                ;&lt;br /&gt;
//            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_OK)&lt;br /&gt;
            {&lt;br /&gt;
                if (return_status == Transmitter.ReceiptStatus_NotProcessed)&lt;br /&gt;
                    return_status = rstat;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Abort)&lt;br /&gt;
            {&lt;br /&gt;
                return Transmitter.ReceiptStatus_Abort;&lt;br /&gt;
            }&lt;br /&gt;
            else if(rstat == Transmitter.ReceiptStatus_Finished)&lt;br /&gt;
            {&lt;br /&gt;
                return Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        });&lt;br /&gt;
        return return_status;&lt;br /&gt;
    },&lt;br /&gt;
    // Returns true if a return value from NotifyAll is to be considered a failure.&lt;br /&gt;
    IsFailed: function(receiptStatus)&lt;br /&gt;
    {&lt;br /&gt;
        // Failed is either Fail || Abort.&lt;br /&gt;
        // NotProcessed isn't a failure because it hasn't been processed.&lt;br /&gt;
        if (receiptStatus == Transmitter.ReceiptStatus_Fail || receiptStatus == Transmitter.ReceiptStatus_Abort)&lt;br /&gt;
            return 1;&lt;br /&gt;
        return 0;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
//&lt;br /&gt;
// Base class for Notifications. By convention a Notification has a type and a value.&lt;br /&gt;
//   SubClasses can add extra properties || methods.&lt;br /&gt;
var Notification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_type, _value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Notification);&lt;br /&gt;
        new_class.Value = _value;&lt;br /&gt;
        new_class.Type = _type;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var Recipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = inherit(Recipient);&lt;br /&gt;
        if (_ident === undefined || _ident === &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            _ident = id(new_class);&lt;br /&gt;
            print(&amp;quot;ERROR: Ident required when creating a recipient, defaulting to &amp;quot;,_ident);&lt;br /&gt;
        }&lt;br /&gt;
        return Recipient.construct(_ident, new_class);&lt;br /&gt;
    },&lt;br /&gt;
    construct: function(_ident, new_class)&lt;br /&gt;
    {&lt;br /&gt;
        new_class.Ident = _ident;&lt;br /&gt;
        new_class.Active = 1;&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
    {&lt;br /&gt;
        print(&amp;quot;ERROR: Receive function not implemented in recipient &amp;quot;,this.Ident);&lt;br /&gt;
        return Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	Transmitter: Transmitter,&lt;br /&gt;
	Notification: Notification,&lt;br /&gt;
	Recipient: Recipient&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
// Instantiate a Global Transmitter&lt;br /&gt;
var GlobalTransmitter =  emesary.Transmitter.new(&amp;quot;GlobalTransmitter&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 //---------------------------------------------------------------------------&lt;br /&gt;
 //&lt;br /&gt;
 //	Title                : EMESARY tests&lt;br /&gt;
 //&lt;br /&gt;
 //	File Type            : Implementation File&lt;br /&gt;
 //&lt;br /&gt;
 //	Author               : Richard Harrison (richard@zaretto.com)&lt;br /&gt;
 //&lt;br /&gt;
 //	Creation Date        : 29 January 2016&lt;br /&gt;
 //&lt;br /&gt;
 //  Copyright � 2016 Richard Harrison           Released under GPL V2&lt;br /&gt;
 //&lt;br /&gt;
 //---------------------------------------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Emesary tests&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
var TestFailCount = 0;&lt;br /&gt;
var TestSuccessCount = 0;&lt;br /&gt;
&lt;br /&gt;
var TestNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;TestNotification&amp;quot;, _value);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
var TestNotProcessedNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;TestNotProcessedNotification&amp;quot;, _value);&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
var RadarReturnNotification =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_value, _x, _y, _z)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Notification.new(&amp;quot;RadarReturnNotification&amp;quot;, _value);&lt;br /&gt;
        new_class.x = _x;&lt;br /&gt;
        new_class.y = _y;&lt;br /&gt;
        new_class.z = _z;&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var TestRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
	console.log(new_class);&lt;br /&gt;
        new_class.count = 0;&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;TestNotification&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                this.count = this.count + 1;&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var TestRadarRecipient =&lt;br /&gt;
{&lt;br /&gt;
    new: function(_ident)&lt;br /&gt;
    {&lt;br /&gt;
        var new_class = emesary.Recipient.new(_ident);&lt;br /&gt;
        new_class.Receive = function(notification)&lt;br /&gt;
        {&lt;br /&gt;
            if (notification.Type == &amp;quot;RadarReturnNotification&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                print(&amp;quot; :: Test recipient &amp;quot;,this.Ident, &amp;quot; recv:&amp;quot;,notification.Type,&amp;quot; &amp;quot;,notification.Value);&lt;br /&gt;
                print(&amp;quot; ::   &amp;quot;,notification.x, &amp;quot; &amp;quot;, notification.y, &amp;quot; &amp;quot;, notification.z);&lt;br /&gt;
                return emesary.Transmitter.ReceiptStatus_OK;&lt;br /&gt;
            }&lt;br /&gt;
            return emesary.Transmitter.ReceiptStatus_NotProcessed;&lt;br /&gt;
        };&lt;br /&gt;
        return new_class;&lt;br /&gt;
    },&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function PerformTest(tid, t)&lt;br /&gt;
{&lt;br /&gt;
    if (t())&lt;br /&gt;
    {&lt;br /&gt;
        TestSuccessCount = TestSuccessCount + 1;&lt;br /&gt;
        print(&amp;quot;  Test [Pass] :&amp;quot;,tid);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        TestFailCount = TestFailCount + 1;&lt;br /&gt;
        print(&amp;quot;  Test [Fail] :&amp;quot;,tid);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var tt = TestRecipient.new(&amp;quot;tt recipient&amp;quot;);&lt;br /&gt;
var tt1 = TestRecipient.new(&amp;quot;tt1 recipient1&amp;quot;);&lt;br /&gt;
var tt3 = TestRecipient.new(&amp;quot;tt3 recipient3&amp;quot;);&lt;br /&gt;
var tt2 = TestRadarRecipient.new(&amp;quot;tt2: Radar Test recipient2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Create Notification&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var tn = TestNotification.new(&amp;quot;Test notification&amp;quot;); &lt;br /&gt;
                return tn.Type == &amp;quot;TestNotification&amp;quot; &amp;amp;&amp;amp; tn.Value == &amp;quot;Test notification&amp;quot;;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Register tt&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 1; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt1&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt1);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 2; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt2&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt2);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 3; &lt;br /&gt;
            });&lt;br /&gt;
PerformTest(&amp;quot;Register tt3&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.Register(tt3);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 4; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Notify&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return !emesary.Transmitter.IsFailed(rv) &amp;amp;&amp;amp; rv != emesary.Transmitter.ReceiptStatus_NotProcessed &amp;amp;&amp;amp; tt.count == 1; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;DeRegister tt1&amp;quot;, &lt;br /&gt;
            function () &lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.DeRegister(tt1);&lt;br /&gt;
                return GlobalTransmitter.RecipientCount() == 3; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
tt1_count = tt1.count;&lt;br /&gt;
PerformTest(&amp;quot;NotifyAfterDeregister&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return tt1.count == tt1_count;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
tt.Active = 0;&lt;br /&gt;
tt_count = tt.count;&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Recipient.Active&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotification.new(&amp;quot;Test notification&amp;quot;));&lt;br /&gt;
                return !emesary.Transmitter.IsFailed(rv) &amp;amp;&amp;amp; rv != emesary.Transmitter.ReceiptStatus_NotProcessed &amp;amp;&amp;amp; tt.count == tt_count; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PerformTest(&amp;quot;Test Not Processed Notification&amp;quot;, &lt;br /&gt;
            function ()&lt;br /&gt;
            {&lt;br /&gt;
                var rv = GlobalTransmitter.NotifyAll(TestNotProcessedNotification.new(&amp;quot;Not Processed&amp;quot;));&lt;br /&gt;
                return rv == emesary.Transmitter.ReceiptStatus_NotProcessed; &lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
GlobalTransmitter.NotifyAll(RadarReturnNotification.new(&amp;quot;Radar notification&amp;quot;, &amp;quot;x0&amp;quot;,&amp;quot;y0&amp;quot;,&amp;quot;z0&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
if (!TestFailCount)&lt;br /&gt;
    print(&amp;quot;Emesary: All &amp;quot;,TestSuccessCount,&amp;quot; tests passed\n&amp;quot;);&lt;br /&gt;
else&lt;br /&gt;
    print(&amp;quot;Emesary: ERROR: Tests completed: &amp;quot;,TestFailCount,&amp;quot; failed &amp;amp;&amp;amp; &amp;quot;,TestSuccessCount,&amp;quot; passed\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related ==&lt;br /&gt;
* http://chateau-logic.com/content/emesary-multiplayer-bridge-flightgear&lt;br /&gt;
* http://chateau-logic.com/content/emesary-nasal-implementation-flightgear&lt;br /&gt;
* http://emesary.codeplex.com/&lt;br /&gt;
* https://emesary.codeplex.com/documentation&lt;br /&gt;
* http://chateau-logic.com/content/emesary-efficient-inter-object-communication-using-interfaces-and-inheritance&lt;br /&gt;
* {{Search|list|keywords=emesary}}&lt;br /&gt;
* {{Search|forum|keywords=emesary}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Emesary]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=TerraGear&amp;diff=122345</id>
		<title>TerraGear</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=TerraGear&amp;diff=122345"/>
		<updated>2020-03-19T22:33:12Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Platform specific */ reformat list slightly and add link to ubuntu 14.04 terragear compilation page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Hatnote|Not to be confused with [[TerraSync]], a tool to download scenery on-the-fly.}}&lt;br /&gt;
&lt;br /&gt;
[[File:TerraGear The Hague wireframe.png|thumb|270px|A wireframe view of detailed [[CORINE]] and [[OSM]] scenery, generated by TerraGear.]]&lt;br /&gt;
'''TerraGear''' is a collection of open-source tools and rendering libraries which can transform publically available GIS data in 3D representations (i.e. 3D models or 3D maps) of the earth for use in real time rendering projects. TerraGear can import 3D data sets such as DEM terrain grids, 2D polygon data sets such as coastlines, city outlines, lake outlines, and 2D raster data sets such as the 1 km NAOO land use/land cover data. It also has tools for generating realistic [[airport]]s, runways, and lighting based on available FAA data. &lt;br /&gt;
&lt;br /&gt;
TerraGear is the primary tool used to generate the [[scenery]] for the [[FlightGear]] project. &lt;br /&gt;
&lt;br /&gt;
Without terragear, it is possible to change Terrain '''textures''' but not terrain '''shapes'''. If you want to change the texture for cities, you change the materials file. If you want to change the coast line, you need terragear.&lt;br /&gt;
Check the material files in directory FGDATA/Material. Identify the material file that includes Montevideo, which is probably latin_american_cities.xml ([[Howto:Regional texturing]] and this page [[Procedural Texturing]]&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://forum.flightgear.org/viewtopic.php?p=311143#p311143 &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: Improving terrain realism &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; ludomotico &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  May 25th, 2017 &lt;br /&gt;
  |added  =  May 25th, 2017 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
For a variety of reasons you might want to build terrain yourself, rather than downloading it from the available scenery on FlightGear. For instance, if you use [[WED]] to create or modify an airport layout, you might wish to see how that modified airport would look in the Scenery before deciding you're happy with the results. And normally, to see and use the airport in the scenery, it's necessary to submit the modifications to the FlighGear scenery staff and then wait untill the next update of the scenery of that area is available via [[TerraSync]] or in the [http://www.flightgear.org/download/scenery/ official FlightGear Scenery] build. If you can build terrain yourself, you can start using it right away.&lt;br /&gt;
&lt;br /&gt;
Maybe the official scenery is too detailed for your slow machine, and you'd like to build terrain using a digital elevation model (DEM) with poorer resolution, to decrease the number of polygons and thus improve your framerates. Or maybe you've got a fantastically fast machine, and you want to build your own terrain using higher resolution vector data (vmap1, Tiger) to get better roads/rivers. For all these reasons learning how to use TerraGear is a good idea.&lt;br /&gt;
&lt;br /&gt;
== Getting TerraGear ==&lt;br /&gt;
=== Using the download_and_compile.sh script (Linux distros using apt) ===&lt;br /&gt;
Get the script download_and_compile.sh if you don't already have it. Copy it into a specific directory, no need to be root.&lt;br /&gt;
{{#tag: syntaxhighlight |&lt;br /&gt;
wget {{fgmeta url|view=raw|path=download_and_compile.sh}}&lt;br /&gt;
mv download_and_compile.sh\?format\=raw download_and_compile.sh&lt;br /&gt;
chmod 755 download_and_compile.sh&lt;br /&gt;
./download_and_compile.sh SIMGEAR TERRAGEAR&lt;br /&gt;
| lang=&amp;quot;bash&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
This will build SIMGEAR (pre-requisite) and TERRAGEAR properly, installing dependencies if necessary and you will be done for the TG compilation part of the process.&lt;br /&gt;
&lt;br /&gt;
=== Pre-compiled builds ===&lt;br /&gt;
* [http://build.flightgear.org:8080/job/TerraGearGUI-Win/lastSuccessfulBuild/artifact/*zip*/archive.zip Latest Windows build], built by the [[FlightGear Build Server]].&lt;br /&gt;
&lt;br /&gt;
:*[[TerraGear_Installation_for_Windows|Detailed Windows Installation Instructions]]&lt;br /&gt;
&lt;br /&gt;
=== Source ===&lt;br /&gt;
The source is hold in a [[Git]] repository at SourceForge..&lt;br /&gt;
{{#tag: syntaxhighlight |&lt;br /&gt;
{{terragear clone|post=flightgear-terragear}}&lt;br /&gt;
| lang=&amp;quot;bash&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
you have to use the stable branch called &amp;quot;scenery/ws2.0&amp;quot;!&lt;br /&gt;
{{terragear url|branch=scenery/ws2.0/~}}&lt;br /&gt;
&lt;br /&gt;
== Compilation ==&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
* TerraGear&lt;br /&gt;
** [[SimGear]] - '''Not''' simgear-cs! (simgear-dev package)&lt;br /&gt;
*** SimGear can be compiled without OSG support thus eliminating many deps, like OSG. Use &amp;quot;-DSIMGEAR_HEADLESS=YES&amp;quot; for a minimal build.&lt;br /&gt;
** [http://www.cgal.org/ CGAL] - For high accuracy geometric calculations&lt;br /&gt;
** [http://www.gdal.org/ libgdal]&lt;br /&gt;
&lt;br /&gt;
=== Building ===&lt;br /&gt;
 cmake . [options]  &lt;br /&gt;
 make install&lt;br /&gt;
&amp;lt;tt&amp;gt;cmake&amp;lt;/tt&amp;gt; options:&lt;br /&gt;
 -DCMAKE_PREFIX_PATH=&amp;quot;/path/to/lib/install/prefix&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Platform specific ===&lt;br /&gt;
* Debian:&amp;lt;br&amp;gt;[[Building FlightGear - Debian#TerraGear]]&lt;br /&gt;
* Gentoo: &amp;lt;tt&amp;gt;emerge -av terragear&amp;lt;/tt&amp;gt;&amp;lt;BR&amp;gt;See [[Building Flightgear - Gentoo]].&lt;br /&gt;
* Ubuntu:&amp;lt;br&amp;gt;[[Building terragear in Ubuntu 910 (32- or 64-bit)]]&amp;lt;br&amp;gt;[[TerraGear compilation - Ubuntu 14.04]]&lt;br /&gt;
&lt;br /&gt;
== GUI Tool ==&lt;br /&gt;
A [[TerraGear GUI]] is available for those that would like to use TerraGear without knowing/using the command line options.&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
* [[Using Terragear]]&lt;br /&gt;
* [[TerraGear CORINE]]&lt;br /&gt;
* [[TerraGear Documentation]]&lt;br /&gt;
* [http://api-docs.freeflightsim.org/terragear/ TerraGear API docs]&lt;br /&gt;
&lt;br /&gt;
{{Terra}}&lt;br /&gt;
{{Building}}&lt;br /&gt;
&lt;br /&gt;
[[Category:TerraGear]]&lt;br /&gt;
&lt;br /&gt;
[[es:TerraGear]]&lt;br /&gt;
[[fr:TerraGear]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Scripted_Compilation_on_Linux_Debian/Ubuntu&amp;diff=121152</id>
		<title>Scripted Compilation on Linux Debian/Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Scripted_Compilation_on_Linux_Debian/Ubuntu&amp;diff=121152"/>
		<updated>2019-11-28T21:40:05Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: remove subversion entries since dnc doesn't use/need svn&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is a Bash script that takes care of downloading and compiling FlightGear and related software from their source code repositories with just one command execution&amp;lt;ref name=&amp;quot;just-one-command&amp;quot;&amp;gt;Due to technical problems on the [https://sourceforge.net/ SourceForge] side, this is currently only true once you have an [[FGData]] clone. See [[User:Rominet|here]] for details.&amp;lt;/ref&amp;gt; for both 32-bit and 64-bit [https://www.debian.org/ Debian]-based systems. Pre-existing versions (if any) of the software installed by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; are not touched at all since the script downloads, builds and installs everything under the directory in which it is launched. You can choose the particular components to download, build and install.&lt;br /&gt;
&lt;br /&gt;
Unless told not to do so, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; installs packages with &amp;lt;tt&amp;gt;apt-get&amp;lt;/tt&amp;gt;. For this reason, it is primarily useful on Debian-based distributions. However, if one disables package installation (using &amp;lt;code&amp;gt;-pn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--sudo=echo&amp;lt;/code&amp;gt;) and installs the corresponding dependencies oneself, it might be useful on other distributions as well.&lt;br /&gt;
&lt;br /&gt;
For hints on using &amp;lt;tt&amp;gt;rpm&amp;lt;/tt&amp;gt;-based distributions such as Redhat, Fedora and CentOS, please see [[CentOS]]. Please also see [[Superbuild]].&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is a [https://www.gnu.org/software/bash/ Bash] script written for [https://www.debian.org/ Debian]-derived distributions ([https://www.ubuntu.com/ Ubuntu], [https://devuan.org/ Devuan], [https://www.linuxmint.com/ Linux Mint], etc.). Its purpose is to automatically install dependencies using the package manager, then build and install FlightGear-related programs.&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; installs most dependencies with &amp;lt;tt&amp;gt;apt-get&amp;lt;/tt&amp;gt; run under &amp;lt;tt&amp;gt;sudo&amp;lt;/tt&amp;gt;.&amp;lt;ref name=&amp;quot;disabling-installation-of-dependencies-via-package-manager&amp;quot;&amp;gt;If you think you already have the dependencies, this installation can be disabled either by using option &amp;lt;code&amp;gt;-pn&amp;lt;/code&amp;gt; or by passing option &amp;lt;code&amp;gt;--sudo=echo&amp;lt;/code&amp;gt; (the latter results in printing the &amp;lt;tt&amp;gt;apt-get&amp;lt;/tt&amp;gt; command line without running it).&amp;lt;/ref&amp;gt; Other dependencies, either because they aren't available in the standard APT repositories, or because of non-option arguments passed to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;, are downloaded and compiled on the fly (this can be the case for [[PLIB]], [[Simgear]] and [[OpenSceneGraph]], for instance—it all depends on the arguments passed to the script).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; works in the directory it is run from: apart from dependencies installed via the package manager, all programs built by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; are installed under the &amp;lt;tt&amp;gt;install&amp;lt;/tt&amp;gt; subdirectory of the directory from which the script was run. In other words, installation of programs by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is clean, very easy to undo and doesn't interfere with other programs on the system.&lt;br /&gt;
&lt;br /&gt;
It is possible to manage several directory trees with &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;; as far as it is concerned, such directory trees are completely independent from each other. For instance, if you run &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;dir1&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;dir2&amp;lt;/tt&amp;gt;, the programs installed under &amp;lt;tt&amp;gt;dir1&amp;lt;/tt&amp;gt; won't “see” those installed under &amp;lt;tt&amp;gt;dir2&amp;lt;/tt&amp;gt;, and vice versa.&lt;br /&gt;
&lt;br /&gt;
Apart from its main purpose, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; can be used to find hopefully up-to-date build-dependency information for FlightGear and related software. You would do so by inspecting [https://sourceforge.net/p/flightgear/fgmeta/ci/next/tree/download_and_compile.sh the script] at the point where it installs packages.&amp;lt;ref name=&amp;quot;note-inspecting-download-and-compile-sh-to-gather-build-dependency-information&amp;quot;&amp;gt;Look for strings such as &amp;lt;tt&amp;gt;zlib1g-dev&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;libglew-dev&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;qt5-default&amp;lt;/tt&amp;gt;.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
Before embarking on building your own FlightGear binaries, you must have already installed the necessary tools to compile the source code with. These preliminary tools are&lt;br /&gt;
&lt;br /&gt;
* build-essential&lt;br /&gt;
* git&lt;br /&gt;
* cmake&lt;br /&gt;
* automake&lt;br /&gt;
&lt;br /&gt;
They can be installed quite simply by running the following command line.&lt;br /&gt;
&lt;br /&gt;
 $ sudo apt-get install build-essential git cmake automake&lt;br /&gt;
&lt;br /&gt;
Once these tools are installed, the download_and_compile.sh script can be run. It will install possibly needed additional tools and libraries as it runs.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span id=&amp;quot;disk-space-requirements-and-build-time&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Disk space requirements and build time ==&lt;br /&gt;
&lt;br /&gt;
As of April 2019, building FlightGear requires about 12 [https://en.wikipedia.org/wiki/Gibibyte GiB] of disk space. Note that this includes downloaded source code for [[SimGear]] and FlightGear, generated build files and the large [[FGData]] repository (about 6 GiB for that one).&lt;br /&gt;
&lt;br /&gt;
With an Intel Core i7 860 CPU (2.80 GHz) purchased in 2009, compiling [[SimGear]] and FlightGear 2019.2 with option &amp;lt;code&amp;gt;-j8&amp;lt;/code&amp;gt; takes about 14 minutes. If you don't have a fast machine and build using only one core, it may require several hours.&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
You can get &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; {{fgmeta source&lt;br /&gt;
| path = download_and_compile.sh&lt;br /&gt;
| text = from FGMeta &lt;br /&gt;
}}. It is contained in the [[FGMeta]] repository, which is maintained by the FlightGear developers. The script can be downloaded from the link given above, however, for easier updates and in order to have the command &amp;lt;code&amp;gt;download_and_compile.sh --version&amp;lt;/code&amp;gt; work as intended, it is recommended to get it as explained [[#getting-download-and-compile-sh-using-an-fgmeta-clone|below]].&lt;br /&gt;
&lt;br /&gt;
In case you build stable versions of FlightGear using the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; option of &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;, remember to update the script before trying to build a new version of FlightGear (see [[#updating-download-and-compile-sh-using-an-fgmeta-clone|Updating &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;]] below). Of course, you can update it more often in order to benefit from new features or bug fixes; this is especially useful if you are building ''next'', that is, the development branch of FlightGear.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span id=&amp;quot;getting-started-with-download-and-compile-sh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Getting started with &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Because of technical problems at SourceForge (cloning [[FGData]] using the https protocol usually fails), the initial setup is unfortunately more complex than it used to be. You'll be guided step by step though, so don't be afraid. Besides, once you have a complete clone of the FGData repository, all future operations will be really easy.&lt;br /&gt;
&lt;br /&gt;
We'll first explain how to get &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; in a way that makes it convenient to update and causes the command &amp;lt;code&amp;gt;download_and_compile.sh --version&amp;lt;/code&amp;gt; to work as intended (the reported “version” is a Git blob id such as &amp;lt;tt&amp;gt;6a5e4f05e2ccf27115eec58313be027b11266097&amp;lt;/tt&amp;gt;&amp;lt;ref name=&amp;quot;note-on-download-and-compile-sh-version-being-a-Git-blob-id&amp;quot;&amp;gt;This looks like, but is ''not'' a Git commit identifier. This kind of “version number” is admittedly not very pretty, but it doesn't pollute Git commits  (the diffs) and is automatically updated by Git every time you update &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; the way we present here; thus, the advantages compensate for the ugliness.&amp;lt;/ref&amp;gt;). Then we'll show how to clone the large FGData repository, and finally give instructions to get FlightGear up and running.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;getting-started-with-download-and-compile-sh-notations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Notations ===&lt;br /&gt;
&lt;br /&gt;
When a command should be run as an unpriviledged user, it will be preceded by a dollar sign:&lt;br /&gt;
 $ whoami&lt;br /&gt;
 toto&lt;br /&gt;
In contrast, a hash sign (#) means that the command must be run with superuser privileges to achieve the desired effect:&lt;br /&gt;
 # whoami&lt;br /&gt;
 root&lt;br /&gt;
&lt;br /&gt;
In order to make instructions easy to understand, two directories (= folders) will be consistently used for the same purpose below:&lt;br /&gt;
* &amp;lt;tt&amp;gt;~/flightgear/fgmeta&amp;lt;/tt&amp;gt; will contain a clone of the [[FGMeta]] repository; therefore, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; will reside in that directory;&lt;br /&gt;
* &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; will be the directory from which we run &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;. In other words, with this setup, a typical sequence of commands could be:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ ~/flightgear/fgmeta/download_and_compile.sh SIMGEAR FGFS DATA&lt;br /&gt;
These are of course just examples. The aforementioned paths are not hardwired anywhere in the script; you are free to choose the directories you want for these purposes.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;getting-download-and-compile-sh-using-an-fgmeta-clone&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Getting &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; the “right way” ===&lt;br /&gt;
&lt;br /&gt;
There are several ways to obtain [https://sourceforge.net/p/flightgear/fgmeta/ci/next/tree/download_and_compile.sh download_and_compile.sh]. The method described here makes it very easy to update the script and causes the command &amp;lt;code&amp;gt;download_and_compile.sh --version&amp;lt;/code&amp;gt; to work as intended.&lt;br /&gt;
&lt;br /&gt;
As explained in [[#getting-started-with-download-and-compile-sh-notations|Notations]], we want to clone the [[FGMeta]] repository in &amp;lt;tt&amp;gt;~/flightgear/fgmeta&amp;lt;/tt&amp;gt;. Let's go:&lt;br /&gt;
 $ mkdir -p ~/flightgear&lt;br /&gt;
 $ cd ~/flightgear&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ git clone https://git.code.sf.net/p/flightgear/fgmeta&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You now have a fresh FGMeta clone in &amp;lt;tt&amp;gt;~/flightgear/fgmeta&amp;lt;/tt&amp;gt; and your brand new &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; script is located in that directory. You can already try it to see the available options:&lt;br /&gt;
&amp;lt;pre&amp;gt;$ ~/flightgear/fgmeta/download_and_compile.sh --help&lt;br /&gt;
download_and_compile.sh [OPTION...] [--] [COMPONENT...]&lt;br /&gt;
Download and compile components belonging to the FlightGear ecosystem.&lt;br /&gt;
&lt;br /&gt;
Without any COMPONENT listed, or if ALL is specified, recompile all&lt;br /&gt;
components listed in the WHATTOBUILDALL variable. Each COMPONENT may&lt;br /&gt;
be one of the following words:&lt;br /&gt;
&lt;br /&gt;
  ALL, CMAKE, OSG, PLIB, OPENRTI, SIMGEAR, FGFS, DATA, FGRUN, FGO, FGX,&lt;br /&gt;
  OPENRADAR, ATCPIE, TERRAGEAR, TERRAGEARGUI&lt;br /&gt;
&lt;br /&gt;
Available options:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
      --version print version and license information, then exit&lt;br /&gt;
&lt;br /&gt;
(...)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;updating-download-and-compile-sh-using-an-fgmeta-clone&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Updating &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Now that you have &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; from the [[FGMeta]] repository, it is very easy to update (this assumes you didn't modify anything yourself inside &amp;lt;tt&amp;gt;~/flightgear/fgmeta&amp;lt;/tt&amp;gt;!):&lt;br /&gt;
 $ cd ~/flightgear/fgmeta &amp;amp;&amp;amp; git pull&lt;br /&gt;
&lt;br /&gt;
If you want to keep updates as easy as we just shown, it is best not to modify &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; yourself. &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; has plenty of options that usually make it unnecessary to modify the script. Just run &amp;lt;code&amp;gt;download_and_compile.sh --help&amp;lt;/code&amp;gt; and learn about the available options when you feel the need to change something. Unless you have special needs that can only be accomodated by modifying &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;, you are invited to skip to the next section.&lt;br /&gt;
&lt;br /&gt;
If you really, ''really'' want to modify &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; while keeping updates easy, a good technique is to add your changes to your FGMeta clone in the form of one or more Git ''commits'' (no need to push them anywhere, commits can remain in your clone). How to do that is beyond the scope of this document, though; read Git tutorials if you want to learn it (there are plenty on the Internet). Once you have committed your changes to your FGMeta clone, make sure the repository is clean (use &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;), then update it with:&lt;br /&gt;
 $ cd ~/flightgear/fgmeta &amp;amp;&amp;amp; git pull --rebase&lt;br /&gt;
This will apply your commits on top of the latest commit of the branch that is currently checked out, which so far contained the official version of &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;. In case your changes conflict with the update, Git will tell you and you'll have to resolve the conflict manually (look for “Git resolve conflict” on your favorite search engine)... or start again from a pristine [[FGMeta]] clone.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;using-download-and-compile-sh-to-build-flightgear&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Building FlightGear ===&lt;br /&gt;
&lt;br /&gt;
For the method described below, you'll need an account at [https://sourceforge.net/ SourceForge] (this is unfortunate, but methods that don't require such an account are either unreliable or insecure, as long as [[FGData]] can't be cloned using the &amp;lt;tt&amp;gt;https&amp;lt;/tt&amp;gt; protocol). If you don't already have one, go to the [https://sourceforge.net/user/registration registration page] and create an account. In all this section, we'll assume that your account name at SourceForge is ''SFusername''.&lt;br /&gt;
&lt;br /&gt;
In what follows, we won't give the full path to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; when showing commands to be run, but you should prepend it to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; whenever you see a &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; command. For instance, if you used the same path as in [[#getting-started-with-download-and-compile-sh-notations|Notations]] and see the command:&lt;br /&gt;
 $ download_and_compile.sh --help&lt;br /&gt;
what you should actually run is:&lt;br /&gt;
 $ ~/flightgear/fgmeta/download_and_compile.sh --help&lt;br /&gt;
&lt;br /&gt;
Apart from this harmless command, ''do not'' run other &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; commands from an arbitrary directory, in particular ''don't'' run them from &amp;lt;tt&amp;gt;~/flightgear/fgmeta&amp;lt;/tt&amp;gt;. This is because '''most other &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; commands write to the current directory''' (&amp;lt;code&amp;gt;download_and_compile.sh --help&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download_and_compile.sh --version&amp;lt;/code&amp;gt; are safe to run from any directory, though).&lt;br /&gt;
&lt;br /&gt;
Of course, it is always possible to make commands shorter by setting up aliases (see tips at the end of [https://sourceforge.net/p/flightgear/mailman/message/36634426/ this message]), by adding the directory containing &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; to your &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; or by creating a symbolink link pointing to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; in a directory that is part of your &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;. This is not necessary, though; do it only if you feel the need (when enabled, persistent shell history is often enough for such things).&lt;br /&gt;
&lt;br /&gt;
{{Note|The following commands should be run from an empty directory&amp;lt;ref name=&amp;quot;dedicated-directory-won-t-stay-empty-forever&amp;quot;&amp;gt;Well, empty before the first time; later, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is going to populate it with plenty of FlightGear files and subdirectories, of course.&amp;lt;/ref&amp;gt; in a partition that has enough free space (see [[#disk-space-requirements-and-build-time | Disk space requirements and build time]]). As explained in [[#getting-started-with-download-and-compile-sh-notations|Notations]], we are going to choose the directory &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; for this purpose, in order to express that the whole directory tree is managed by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;. This is just an example; feel free to choose another directory if you want.&lt;br /&gt;
&lt;br /&gt;
'''Don't run the commands from a non-dedicated directory,''' because it will be filled with files and directories created by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; and the FlightGear, SimGear, etc. build systems. That would be a complete mess! In particular, ''don't'' run the commands from the directory containing your [[FGMeta]] clone.}}&lt;br /&gt;
&lt;br /&gt;
{{Note|As explained in [[#getting-started-with-download-and-compile-sh-notations|Notations]], we assume that your Unix user name (login) is &amp;lt;tt&amp;gt;toto&amp;lt;/tt&amp;gt;. Don't confuse the &amp;lt;tt&amp;gt;sudo&amp;lt;/tt&amp;gt; password prompt (where you need to enter &amp;lt;tt&amp;gt;toto&amp;lt;/tt&amp;gt;'s password) with the password prompt for your SourceForge account! The former appears as&lt;br /&gt;
 [sudo] password for toto:&lt;br /&gt;
whereas the latter is just:&lt;br /&gt;
 Password:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Tip|In case you want to run some other program instead of &amp;lt;tt&amp;gt;sudo&amp;lt;/tt&amp;gt;, this can be done with the &amp;lt;code&amp;gt;--sudo&amp;lt;/code&amp;gt; option of &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;. For instance, in order to see the commands that would be run with sudo without actually running them, you can pass &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;--sudo=echo&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;. Like all other options, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;--sudo&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; must be given ''before'' all arguments that are component names (such as &amp;lt;tt&amp;gt;SIMGEAR&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;FGFS&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;DATA&amp;lt;/tt&amp;gt;, etc.).}}&lt;br /&gt;
&lt;br /&gt;
The package manager used by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; by default is &amp;lt;tt&amp;gt;apt-get&amp;lt;/tt&amp;gt;. You can use another one if you want, as long as it supports the following calls:&lt;br /&gt;
 ''pkg-mgr'' update&lt;br /&gt;
 ''pkg-mgr'' install ''pkg1 pkg2'' ...&lt;br /&gt;
This is the case for &amp;lt;tt&amp;gt;aptitude&amp;lt;/tt&amp;gt; as well as &amp;lt;tt&amp;gt;apt&amp;lt;/tt&amp;gt;. If you want &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; to use &amp;lt;tt&amp;gt;aptitude&amp;lt;/tt&amp;gt;, give it the option &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;--package-manager=aptitude&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; before any of the ''COMPONENT'' arguments.&lt;br /&gt;
&lt;br /&gt;
All options of &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; can be seen by running the following command:&lt;br /&gt;
 $ download_and_compile.sh --help&lt;br /&gt;
Now the instructions we promised you. You have chosen a dedicated directory where all the stuff that is downloaded and built by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; will be stored. This is &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; in our example, and should be empty before you run &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; for the first time. However, it is quite correct to start &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; from the same directory for subsequent runs, even when non-empty (otherwise, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; would automatically reclone the repositories every time you run it; that would be a sheer waste of time and bandwidth).&lt;br /&gt;
&lt;br /&gt;
Ready? Let's go!&lt;br /&gt;
&amp;lt;pre&amp;gt;$ mkdir -p ~/flightgear/dnc-managed&lt;br /&gt;
$ cd ~/flightgear/dnc-managed&lt;br /&gt;
$ download_and_compile.sh --git-clone-site-params SourceForge=ssh:SFusername DATA&lt;br /&gt;
**********************************************************************&lt;br /&gt;
*                                                                    *&lt;br /&gt;
* Warning: a typical SimGear + FlightGear + FGData build requires    *&lt;br /&gt;
* about 12 GiB of disk space. The compilation part may last from a   *&lt;br /&gt;
* few minutes to hours, depending on your computer.                  *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
* Hint: use the -j option if your CPU has several cores, as in:      *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
*         download_and_compile.sh -j$(nproc)                         *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
**********************************************************************&lt;br /&gt;
Running 'apt-get update'...&lt;br /&gt;
[sudo] password for toto:&lt;br /&gt;
&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
Considering a package alternative: libcurl4-openssl-dev libcurl4-gnutls-dev&lt;br /&gt;
Package alternative matched for libcurl4-openssl-dev&lt;br /&gt;
Running 'apt-get install build-essential git libcurl4-openssl-dev cmake'...&lt;br /&gt;
[sudo] password for toto:&lt;br /&gt;
&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
****************************************&lt;br /&gt;
**************** DATA ******************&lt;br /&gt;
****************************************&lt;br /&gt;
Fetching DATA with 'git clone ssh://SFusername@git.code.sf.net/p/flightgear/fgdata'&lt;br /&gt;
Cloning into '.'...&lt;br /&gt;
The authenticity of host 'git.code.sf.net (216.105.38.16)' can't be established.&lt;br /&gt;
ECDSA key fingerprint is SHA256:FeVkoYYBjuQzb5QVAgm3BkmeN5TTgL2qfmqz9tCPRL4.&lt;br /&gt;
Are you sure you want to continue connecting (yes/no)?&lt;br /&gt;
Warning: Permanently added 'git.code.sf.net,216.105.38.16' (ECDSA) to the list of known hosts.&lt;br /&gt;
Connection closed by 216.105.38.16 port 22&lt;br /&gt;
fatal: Could not read from remote repository.&lt;br /&gt;
&lt;br /&gt;
Please make sure you have the correct access rights&lt;br /&gt;
and the repository exists.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above messages are perfectly normal but deserve a little explanation. Here, &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; asked us to confirm that the fingerprint sent by the remote host is that of the real &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt;, as opposed to that of some malicious server ''pretending'' to be &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt;. This confirmation only has to be done once, after which it is remembered thanks to &amp;lt;tt&amp;gt;~/.ssh/known_hosts&amp;lt;/tt&amp;gt;. You should visit the [https://sourceforge.net/p/forge/documentation/SSH%20Key%20Fingerprints/#fingerprint-listing page that gives the host key fingerprint of every publically-accessible SSH server at SourceForge] and carefully check that the fingerprint appearing on your terminal is listed on that page for &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt;, or some matching pattern such as &amp;lt;tt&amp;gt;*.code.sf.net&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the fingerprint that is printed on your terminal is not listed on that page, answer &amp;lt;tt&amp;gt;no&amp;lt;/tt&amp;gt; to the question ''Are you sure you want to continue connecting (yes/no)?'' and copy/paste to flightgear-devel (see [[Mailing lists]]) the above message from &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; that contains the fingerprint sent to you by the remote host which pretends to be &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt;. If this happened, you should stop here and wait for answers from readers of flightgear-devel.&lt;br /&gt;
&lt;br /&gt;
From now on, we'll assume that the fingerprint you received was correct, and therefore that you have answered &amp;lt;tt&amp;gt;yes&amp;lt;/tt&amp;gt; to the ''Are you sure you want to continue connecting (yes/no)?'' question.&lt;br /&gt;
&lt;br /&gt;
In this example, it took us several minutes to verify the fingerprint of the &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt; server and confirm it to &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt;. Because of this delay, &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt; hung up on us and closed the connection. This is absolutely ''not a problem:'' we can just rerun the &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; command with the same arguments as the first time. Since we answered &amp;lt;tt&amp;gt;yes&amp;lt;/tt&amp;gt; to the ''Are you sure you want to continue connecting (yes/no)?'' prompt, the fingerprint of &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt;'s key has been stored in &amp;lt;tt&amp;gt;~/.ssh/known_hosts&amp;lt;/tt&amp;gt;, therefore we won't get this prompt anymore. But if some server claiming to be &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt; presents a host key that has a different fingerprint in the future, &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; will print a big fat warning that the server may belong to an attacker trying to impersonate &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt;. Therefore, this SSH host key verification is very useful to protect us from future attacks (which hopefully won't happen at all).&lt;br /&gt;
&lt;br /&gt;
As said, we just rerun the &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; command with the same arguments:&lt;br /&gt;
&amp;lt;pre&amp;gt;$ download_and_compile.sh --git-clone-site-params SourceForge=ssh:SFusername DATA&lt;br /&gt;
**********************************************************************&lt;br /&gt;
*                                                                    *&lt;br /&gt;
* Warning: a typical SimGear + FlightGear + FGData build requires    *&lt;br /&gt;
* about 12 GiB of disk space. The compilation part may last from a   *&lt;br /&gt;
* few minutes to hours, depending on your computer.                  *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
* Hint: use the -j option if your CPU has several cores, as in:      *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
*         download_and_compile.sh -j$(nproc)                         *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
**********************************************************************&lt;br /&gt;
Running 'apt-get update'...&lt;br /&gt;
[sudo] password for toto:&lt;br /&gt;
&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
Considering a package alternative: libcurl4-openssl-dev libcurl4-gnutls-dev&lt;br /&gt;
Package alternative matched for libcurl4-openssl-dev&lt;br /&gt;
Running 'apt-get install build-essential git libcurl4-openssl-dev cmake'...&lt;br /&gt;
[sudo] password for toto:&lt;br /&gt;
&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
****************************************&lt;br /&gt;
**************** DATA ******************&lt;br /&gt;
****************************************&lt;br /&gt;
Fetching DATA with 'git clone ssh://SFusername@git.code.sf.net/p/flightgear/fgdata'&lt;br /&gt;
Cloning into '.'...&lt;br /&gt;
Password:&amp;lt;/pre&amp;gt;&lt;br /&gt;
As explained above, the preceding prompt is for your SourceForge password (which you could guess from the &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;git clone ssh://SFusername@git.code.sf.net/p/flightgear/fgdata&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; command).&lt;br /&gt;
&amp;lt;pre&amp;gt;remote: Enumerating objects: 67011, done.&lt;br /&gt;
remote: Counting objects: 100% (67011/67011), done.&lt;br /&gt;
remote: Compressing objects: 100% (31342/31342), done.&lt;br /&gt;
remote: Total 67011 (delta 38776), reused 59640 (delta 33570)&lt;br /&gt;
Receiving objects: 100% (67011/67011), 2.60 GiB | 313.00 KiB/s, done.&lt;br /&gt;
Resolving deltas: 100% (38776/38776), done.&lt;br /&gt;
Checking out files: 100% (12959/12959), done.&lt;br /&gt;
Password:&amp;lt;/pre&amp;gt;&lt;br /&gt;
(It will take a fair amount of time to get there, because this is the complete download of [[FGData]].)&amp;lt;br /&amp;gt;&lt;br /&gt;
This is again a prompt for your SourceForge password, because &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; wants to run &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt; in the repository (admittedly, it's a bit dumb after a &amp;lt;tt&amp;gt;clone&amp;lt;/tt&amp;gt; operation—please forgive us). In case you were not monitoring the &amp;lt;tt&amp;gt;clone&amp;lt;/tt&amp;gt; operation, you probably saw the password prompt way after &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt; got bored waiting for you and closed our second connection:&lt;br /&gt;
&amp;lt;pre&amp;gt;Connection closed by 216.105.38.16 port 22&lt;br /&gt;
fatal: Could not read from remote repository.&lt;br /&gt;
&lt;br /&gt;
Please make sure you have the correct access rights&lt;br /&gt;
and the repository exists.&amp;lt;/pre&amp;gt;&lt;br /&gt;
(if not, there should be no error message and you should have a clean FGData clone)&amp;lt;br /&amp;gt;&lt;br /&gt;
No worries. Just as before, simply rerun the command with the same arguments:&lt;br /&gt;
&amp;lt;pre&amp;gt;$ download_and_compile.sh --git-clone-site-params SourceForge=ssh:SFusername DATA&lt;br /&gt;
**********************************************************************&lt;br /&gt;
*                                                                    *&lt;br /&gt;
* Warning: a typical SimGear + FlightGear + FGData build requires    *&lt;br /&gt;
* about 12 GiB of disk space. The compilation part may last from a   *&lt;br /&gt;
* few minutes to hours, depending on your computer.                  *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
* Hint: use the -j option if your CPU has several cores, as in:      *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
*         download_and_compile.sh -j$(nproc)                         *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
**********************************************************************&lt;br /&gt;
Running 'apt-get update'...&lt;br /&gt;
[sudo] password for toto:&lt;br /&gt;
&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
Considering a package alternative: libcurl4-openssl-dev libcurl4-gnutls-dev&lt;br /&gt;
Package alternative matched for libcurl4-openssl-dev&lt;br /&gt;
Running 'apt-get install build-essential git libcurl4-openssl-dev cmake'...&lt;br /&gt;
[sudo] password for toto:&lt;br /&gt;
&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
****************************************&lt;br /&gt;
**************** DATA ******************&lt;br /&gt;
****************************************&lt;br /&gt;
DATA: the repository already exists&lt;br /&gt;
Password:&lt;br /&gt;
Already up to date.&lt;br /&gt;
Current branch next is up to date.&lt;br /&gt;
Already on 'next'&lt;br /&gt;
Your branch is up to date with 'origin/next'.&lt;br /&gt;
All optional package alternatives have found a matching package.&lt;br /&gt;
&lt;br /&gt;
download_and_compile.sh has finished to work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
There we are! You now have a clean, up-to-date [[FGData]] clone in &amp;lt;tt&amp;gt;~/flightgear/dnc-managed/install/flightgear/fgdata&amp;lt;/tt&amp;gt; (remember: &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; is the directory from which you ran &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;). Note this place: the full path of the &amp;lt;tt&amp;gt;~/flightgear/dnc-managed/install/flightgear/fgdata&amp;lt;/tt&amp;gt; directory is your [[$FG_ROOT]].&lt;br /&gt;
&lt;br /&gt;
Now, change the protocol to use for future updates of your FGData clone:&amp;lt;ref name=&amp;quot;changing-the-protocol-for-a-git-remote-manual-method&amp;quot;&amp;gt;Another way would be to manually change the relevant line starting with &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;url = ssh://SFusername@&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; for the &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; remote in the &amp;lt;tt&amp;gt;.git/config&amp;lt;/tt&amp;gt; file that lives inside your repository clone (i.e., &amp;lt;tt&amp;gt;~/flightgear/dnc-managed/install/flightgear/fgdata/.git/config&amp;lt;/tt&amp;gt; in our example).&amp;lt;/ref&amp;gt;&lt;br /&gt;
 (cd install/flightgear/fgdata &amp;amp;&amp;amp; \&lt;br /&gt;
 git remote set-url origin &amp;lt;nowiki&amp;gt;https://git.code.sf.net/p/flightgear/fgdata&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
(you can check at any time the protocol(s) in use with the command &amp;lt;code&amp;gt;git remote -v&amp;lt;/code&amp;gt; run inside a Git repository—in this case, inside the folder &amp;lt;tt&amp;gt;install/flightgear/fgdata&amp;lt;/tt&amp;gt;). As a consequence of this change, all future updates of your FGData clone will use the &amp;lt;tt&amp;gt;https&amp;lt;/tt&amp;gt; protocol, therefore you won't be prompted anymore for your SourceForge password.&lt;br /&gt;
&lt;br /&gt;
All that remains to do is to run, from the same directory as before (&amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; in our example):&lt;br /&gt;
 $ download_and_compile.sh&lt;br /&gt;
or&lt;br /&gt;
 $ download_and_compile.sh -j$(nproc)&lt;br /&gt;
(&amp;lt;code&amp;gt;-j$(nproc)&amp;lt;/code&amp;gt; is “only” useful to save time—see the tip below).&lt;br /&gt;
&lt;br /&gt;
When you don't pass any non-option argument to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; as done here, it takes care of the three base components needed to run FlightGear: &amp;lt;tt&amp;gt;SIMGEAR&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;FGFS&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;DATA&amp;lt;/tt&amp;gt; (these are the component names used by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;, i.e., the final arguments one can optionally give in a &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; command; in normal speech, they correspond to the {{simgear source&lt;br /&gt;
| text = SimGear&lt;br /&gt;
}}, {{flightgear source&lt;br /&gt;
| text = FlightGear&lt;br /&gt;
}} and {{fgdata source&lt;br /&gt;
| text = FGData&lt;br /&gt;
}} repositories). Therefore, the above command is presently exactly equivalent to:&lt;br /&gt;
 $ download_and_compile.sh SIMGEAR FGFS DATA&lt;br /&gt;
&lt;br /&gt;
In case you wanted to build another component such as [[OpenSceneGraph|OSG]], you could add it to the command, like this:&lt;br /&gt;
 $ download_and_compile.sh SIMGEAR FGFS DATA OSG&lt;br /&gt;
&lt;br /&gt;
(With current Debian stable, this is not necessary because it has OpenSceneGraph 3.4. But if your distribution only has an older version, you'll certainly need to select the &amp;lt;tt&amp;gt;OSG&amp;lt;/tt&amp;gt; component like this.)&lt;br /&gt;
&lt;br /&gt;
When the command terminates, you should have a script called &amp;lt;tt&amp;gt;run_fgfs.sh&amp;lt;/tt&amp;gt; in the directory &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; from which you ran &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;. This will be your script to run FlightGear. For instance, in order to start the built-in launcher, you can run the following commands:&amp;lt;ref name=&amp;quot;no-need-to-change-to-dnc-managed-dir-before-starting-generated-scripts&amp;quot;&amp;gt;We give these commands because they are easy to read, but the &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; command is not needed if you use the correct path, as in &amp;lt;code&amp;gt;~/flightgear/dnc-managed/run_fgfs.sh --launcher&amp;lt;/code&amp;gt;.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ ./run_fgfs.sh --launcher&lt;br /&gt;
(You may omit the &amp;lt;code&amp;gt;--launcher&amp;lt;/code&amp;gt; option; this would simply start FlightGear without any launcher, at the default airport and with the default aircraft.)&amp;lt;br /&amp;gt;&lt;br /&gt;
In case you find this tedious to type or have more arguments to pass on a regular basis, you can follow the advice given at the end of [https://sourceforge.net/p/flightgear/mailman/message/36634426/ this message] or use another launcher such as [[FFGo]] (but the [[FlightGear Qt launcher|FlightGear built-in launcher]] started with &amp;lt;code&amp;gt;run_fgfs.sh --launcher&amp;lt;/code&amp;gt; is quite fine, be sure to try it first!).&lt;br /&gt;
&lt;br /&gt;
{{Tip|You can considerably speed up the build process—literally, save hours—by telling &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; to use several cores simultaneously when compiling. With option &amp;lt;code&amp;gt;-j$(nproc)&amp;lt;/code&amp;gt;, compilations will use all cores available on your processor; thus, a typical &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; command is &amp;lt;code&amp;gt;download_and_compile.sh -j$(nproc)&amp;lt;/code&amp;gt;. If you want to use, say, 4 cores, replace &amp;lt;code&amp;gt;-j$(nproc)&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;-j4&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;using-download-and-compile-sh-to-update-flightgear&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Updating FlightGear ===&lt;br /&gt;
&lt;br /&gt;
Just go to the directory from which you you previously ran &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; (&amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; in our example). This is the folder which, if you did a complete run of &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; as shown in the previous section, contains the &amp;lt;tt&amp;gt;run_fgfs.sh&amp;lt;/tt&amp;gt; script and a log file named &amp;lt;tt&amp;gt;compilation_log.txt&amp;lt;/tt&amp;gt; that records what &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; did in its last run. If you wish to update, say, {{simgear source&lt;br /&gt;
| text = SimGear&lt;br /&gt;
}}, {{flightgear source&lt;br /&gt;
| text = FlightGear&lt;br /&gt;
}} and {{fgdata source&lt;br /&gt;
| text = FGData&lt;br /&gt;
}}, simply execute this:&lt;br /&gt;
 $ download_and_compile.sh -pn SIMGEAR FGFS DATA&lt;br /&gt;
We'll explain the &amp;lt;code&amp;gt;-pn&amp;lt;/code&amp;gt; in a minute. &amp;lt;tt&amp;gt;SIMGEAR&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;FGFS&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;DATA&amp;lt;/tt&amp;gt; are called ''components'' in &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; terminology. A component generally corresponds to a software repository, or something close. In fact, since &amp;lt;tt&amp;gt;SIMGEAR&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;FGFS&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;DATA&amp;lt;/tt&amp;gt; are often precisely the components people wish to update, they form the default components set, so that the previous command is equivalent to:&lt;br /&gt;
 $ download_and_compile.sh -pn&lt;br /&gt;
Now about this &amp;lt;code&amp;gt;-pn&amp;lt;/code&amp;gt;. It is equivalent to &amp;lt;code&amp;gt;-p n&amp;lt;/code&amp;gt; and means “don't install packages from my (Linux) distribution” (&amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; means ''yes, please install'', &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; means ''no, don't install''). In case you forgot that, simply run:&lt;br /&gt;
 $ download_and_compile.sh --help&lt;br /&gt;
What does it imply to pass &amp;lt;code&amp;gt;-pn&amp;lt;/code&amp;gt;? This tells &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; to completely skip the step where it checks for needed packages from your distribution and installs them, by default using &amp;lt;tt&amp;gt;apt-get&amp;lt;/tt&amp;gt;. It thus goes straight to the following steps:&lt;br /&gt;
* update each repository corresponding to one of the selected components (&amp;lt;tt&amp;gt;SIMGEAR&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;FGFS&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;DATA&amp;lt;/tt&amp;gt; in our example);&lt;br /&gt;
* compile each selected component that requires compilation;&lt;br /&gt;
* install each selected component in the appropriate place (under &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; according to our [[#getting-started-with-download-and-compile-sh-notations|Notations]]).&lt;br /&gt;
In case you don't have all required dependencies for the selected components, one of them is likely to fail, of course, since by passing &amp;lt;code&amp;gt;-pn&amp;lt;/code&amp;gt; to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;, you forbid it to install these dependencies for you. So, you can also very well update without passing the &amp;lt;code&amp;gt;-pn&amp;lt;/code&amp;gt; option, it will simply take a little longer (the time to check if all dependencies of the selected components are available with &amp;lt;tt&amp;gt;APT&amp;lt;/tt&amp;gt;). In fact, this is '''what you should do if the previous &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; run failed:''' first update &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; (see [[#getting-download-and-compile-sh-using-an-fgmeta-clone|above]]) then run it ''without'' &amp;lt;code&amp;gt;-pn&amp;lt;/code&amp;gt;&amp;lt;ref name=&amp;quot;passing-no-pn-option-equals-passing-py&amp;quot;&amp;gt;Which is the same as passing &amp;lt;code&amp;gt;-py&amp;lt;/code&amp;gt;.&amp;lt;/ref&amp;gt; in case new dependencies have been recently added and you don't have them on your system yet—this would be a very likely cause for the failure.&lt;br /&gt;
&lt;br /&gt;
'''Summary'''&lt;br /&gt;
&lt;br /&gt;
Routine update:&lt;br /&gt;
 $ download_and_compile.sh -pn ''COMPONENT...''&lt;br /&gt;
In case this fails, first update &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; (see [[#getting-download-and-compile-sh-using-an-fgmeta-clone|above]]), then run&lt;br /&gt;
 $ download_and_compile.sh ''COMPONENT...''&lt;br /&gt;
where ''COMPONENT...'' stands for the space-separated list of selected components, and defaults to &amp;lt;tt&amp;gt;SIMGEAR FGFS DATA&amp;lt;/tt&amp;gt; if you don't specify any.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;examining-download-and-compile-sh-history&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Examining the history of &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Looking at the latest commits that affected &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is quite easy with your FGMeta clone:&lt;br /&gt;
 $ cd ~/flightgear/fgmeta&lt;br /&gt;
 $ git log -- download_and_compile.sh&lt;br /&gt;
(then quit by typing &amp;lt;tt&amp;gt;q&amp;lt;/tt&amp;gt;, assuming your &amp;lt;tt&amp;gt;$GIT_PAGER&amp;lt;/tt&amp;gt; is &amp;lt;tt&amp;gt;less&amp;lt;/tt&amp;gt;)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to do the same, but also see the patch for each commit:&lt;br /&gt;
 $ cd ~/flightgear/fgmeta&lt;br /&gt;
 $ git log -p -- download_and_compile.sh&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span id=&amp;quot;list-of-available-components&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; List of available components ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; script is able to download, compile (when applicable) and install the following components:&lt;br /&gt;
&lt;br /&gt;
* ATCPIE (for the [[ATC-pie]] air traffic control simulation program)&lt;br /&gt;
* CMAKE (for the [https://cmake.org/ CMake] build tool—this can be useful in case CMake is too old in your distribution)&lt;br /&gt;
* DATA (for [[FGData]], the main set of data files used by FlightGear)&lt;br /&gt;
* FGFS (for FlightGear itself)&lt;br /&gt;
* FGO (for the [[FGo!]] FlightGear launcher)&lt;br /&gt;
* FGRUN (for the [[Fgrun|FGRun]] FlightGear launcher)&lt;br /&gt;
* FGX (for the [[FGX|FGx]] FlightGear launcher&amp;lt;ref name=&amp;quot;note-on-the-status-of-FGx-support-in-download-and-compile-sh&amp;quot;&amp;gt;Support for FGx in &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; would probably benefit from a code review.&amp;lt;/ref&amp;gt;)&lt;br /&gt;
* OPENRADAR (for the [[OpenRadar]] air traffic control simulation program)&lt;br /&gt;
* OPENRTI (for [[FlightGear HLA support (High Level Architecture)#OpenRTI | OpenRTI]]&amp;lt;ref name=&amp;quot;note-on-the-status-of-OpenRTI-support-in-FG&amp;quot;&amp;gt;Note that OpenRTI is just an optional dependency for [[FlightGear high-level architecture support | HLA support]]. For the time being, you should be just fine building without it. Eventually, the idea is for HLA to replace the existing MP system and even increasingly distribute the FlightGear architecture such that more and more components can be more easily run in separate threads or even separate processes, possibly even on different machines. So this is going to be an important feature for professional users, using several computers and screens to create a comprehensive and immersive simulation environment.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
At the moment, it is probably safe to say that HLA is only of interest to developers and people willing to play with experimental features.&amp;lt;/ref&amp;gt;)&lt;br /&gt;
* OSG (for the [[OpenSceneGraph]] library)&lt;br /&gt;
* PLIB (for the [[PLIB]] library)&lt;br /&gt;
* SIMGEAR (for the [[SimGear]] library—foundation for FlightGear and TerraGear)&lt;br /&gt;
* TERRAGEAR (for the [[TerraGear]] terrain building toolchain)&lt;br /&gt;
* TERRAGEARGUI (for [[TerraGear GUI]], a graphical interface for TerraGear)&lt;br /&gt;
&lt;br /&gt;
Each of the items listed above is a ''component'' in &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; terminology. Components are written in uppercase by convention.&lt;br /&gt;
&lt;br /&gt;
{{Note|The preceding list might not be up-to-date. The up-to-date list of components supported by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; can always be obtained by running &amp;lt;code&amp;gt;download_and_compile.sh --help&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
What is the point of knowing this? Because you may pass component names to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; in order to tell it what you want to download, build and install. By default, only the three essential components SIMGEAR, FGFS and DATA are taken care of, which means that the command:&lt;br /&gt;
 $ download_and_compile.sh&lt;br /&gt;
is equivalent to:&lt;br /&gt;
 $ download_and_compile.sh SIMGEAR FGFS DATA&lt;br /&gt;
&lt;br /&gt;
In case you want to do the same build with just [[OpenSceneGraph]] added, you can use:&lt;br /&gt;
 $ download_and_compile.sh SIMGEAR FGFS DATA OSG&lt;br /&gt;
&lt;br /&gt;
You get the idea. When several components are passed on the same command line, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; chooses a reasonable order for processing, so don't worry about that.&lt;br /&gt;
&lt;br /&gt;
== When building 'next', you may see build errors ==&lt;br /&gt;
&lt;br /&gt;
Keeping in mind that this script compiles sometimes bleeding edge software, it can happen that what was successfully compiling last week, does not compile anymore today. Building the stable version should always work, unless there is a problem with the script.&lt;br /&gt;
&lt;br /&gt;
That said, don't be too afraid of building the development version (called ''next''): this is the one developers use all the time, so kindly asking on the flightgear-devel [[Mailing_lists|mailing list]] in case a problem popped up&amp;lt;ref name=&amp;quot;what-to-provide-when-asking-for-help&amp;quot;&amp;gt;Don't forget in this case to precisely tell what you did and include the &amp;lt;tt&amp;gt;compilation_log.txt&amp;lt;/tt&amp;gt; file written by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;.&amp;lt;/ref&amp;gt; should allow you to find good advice and get the problem quickly fixed, if it's a new one. Conversely, probably not many people (in 2019) build themselves the “stable” version of FlightGear. People who want the stable version can usually have it from their distribution, this is generally easier. On the other hand, those running &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; typically want to build the latest code that FlightGear developers are working on; this is useful when you want to contribute feedback, code, aircraft or scenery based on recent technology, or just want to enjoy the latest features and bugs. ;-)&lt;br /&gt;
&lt;br /&gt;
== Task-specific instructions ==&lt;br /&gt;
&lt;br /&gt;
{{Note|In this section, we assume you've read and followed the advice given in [[#getting-started-with-download-and-compile-sh|Getting started with &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;]].}}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;selecting-the-components-to-work-on&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Selecting the components to build ===&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; downloads or updates, then compiles, [[SimGear]] and FlightGear, and downloads or updates [[FGData]] (by nature, FGData can't be compiled). This is what happens when running:&lt;br /&gt;
 $ download_and_compile.sh&lt;br /&gt;
The preceding command is therefore equivalent to:&lt;br /&gt;
 $ download_and_compile.sh SIMGEAR FGFS DATA&lt;br /&gt;
&lt;br /&gt;
To make &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; take care of other programs or libraries, use non-option arguments naming the ''components'' you want, for instance:&lt;br /&gt;
 $ download_and_compile.sh SIMGEAR FGFS DATA OSG&lt;br /&gt;
SIMGEAR, FGFS, DATA and OSG are the component names respectively corresponding to [[SimGear]], FlightGear, [[FGData]] and [[OpenSceneGraph]] in &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;'s terminology.&lt;br /&gt;
&lt;br /&gt;
A [[#list-of-available-components|list of available components]] is provided on this page, but the fully up-to-date list can always be obtained by running &amp;lt;code&amp;gt;download_and_compile.sh --help&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Choosing between stable and development versions ===&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; fetches code and data from development branches of the source repositories (which sometimes causes compilation or runtime errors). However, it is possible to tell the script to download the latest ”stable” version of each component, for some suitable definition of “stable”. This is by means of the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; option:&lt;br /&gt;
 $ download_and_compile.sh -s ''COMPONENT1 COMPONENT2...''&lt;br /&gt;
&lt;br /&gt;
How does it work?&lt;br /&gt;
* For [[SimGear]], FlightGear and [[FGData]], it uses the most recent stable release branch of the corresponding Git repository.&lt;br /&gt;
* For some components, a known-stable version is hardcoded in &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; and used when the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; option is given&amp;lt;ref name=&amp;quot;components-with-a-known-stable-version-hardcoded-in-download_and_compile_sh&amp;quot;&amp;gt;As of May 2019, apart from SIMGEAR, FGFS and DATA, the only components for which &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; “knows” a stable version are TERRAGEAR and OPENRTI.&amp;lt;/ref&amp;gt; (for instance, the hardcoded information can be the name of a Git branch).&lt;br /&gt;
* For the other components, the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; option has no effect.&lt;br /&gt;
&lt;br /&gt;
{{Warning|In a given folder where &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is run, you should either always use the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; option, or never. Building some components with &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; and others without (all within the same base folder) is not supported.}}&lt;br /&gt;
&lt;br /&gt;
Applying what we just said to the FGFS component (FlightGear) leaves us with two main options:&lt;br /&gt;
* build the latest stable release;&lt;br /&gt;
* build the current development version (bleeding edge), which lives in the {{flightgear source&lt;br /&gt;
| branch = next&lt;br /&gt;
| text = next&lt;br /&gt;
}} branch of the FlightGear repository.&lt;br /&gt;
&lt;br /&gt;
==== Building the latest stable FlightGear release ====&lt;br /&gt;
&lt;br /&gt;
When executing &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;, use the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; option to build the latest stable release: &lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ download_and_compile.sh -s&lt;br /&gt;
&lt;br /&gt;
{{Note|If you decide to use the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; option in a given directory tree, you should use it for all components in that directory tree (SIMGEAR, FGFS, DATA, etc.). Running &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; in a given directory with the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; option for some components and not for others is not supported.}}&lt;br /&gt;
&lt;br /&gt;
==== Building the current FlightGear development version ====&lt;br /&gt;
&lt;br /&gt;
When executing &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; without any option, the development version of every selected component is built:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ download_and_compile.sh&lt;br /&gt;
(In this example, the implicitly-selected components are SIMGEAR, FGFS and DATA, as explained [[#selecting-the-components-to-work-on | above]].)&lt;br /&gt;
&lt;br /&gt;
{{Note|The development version of FlightGear changes on an almost daily basis. It provides the latest features, but is not guaranteed to always work reliably. If you don't want to take the risk of finding new bugs when updating, you may prefer to use the latest stable release.}}&lt;br /&gt;
&lt;br /&gt;
=== Passing custom arguments to CMake ===&lt;br /&gt;
&lt;br /&gt;
Sometimes, when building a program, you may want to enable a feature that is not enabled by default, or disable a feature that is enabled by default. With recent versions of &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; (April 2019 or later), the environment variables &amp;lt;tt&amp;gt;SG_CMAKEARGS&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;FG_CMAKEARGS&amp;lt;/tt&amp;gt; allow one to do that for SimGear and FlightGear. For instance, in order to link SimGear with the system Expat library, you can do:&lt;br /&gt;
 $ SG_CMAKEARGS='-DSYSTEM_EXPAT=ON' download_and_compile.sh SIMGEAR&lt;br /&gt;
Similarly, disabling HID-based input when building FlightGear can be achieved this way:&lt;br /&gt;
 $ FG_CMAKEARGS='-DENABLE_HID_INPUT=OFF' download_and_compile.sh FGFS&lt;br /&gt;
&lt;br /&gt;
{{Note|Such options are typically defined in &amp;lt;tt&amp;gt;CMakeLists.txt&amp;lt;/tt&amp;gt; files, for example {{simgear source&lt;br /&gt;
| path = CMakeLists.txt&lt;br /&gt;
| text = here&lt;br /&gt;
}} for SimGear and {{flightgear source&lt;br /&gt;
| path = CMakeLists.txt&lt;br /&gt;
| text = here&lt;br /&gt;
}} for FlightGear.}}&lt;br /&gt;
&lt;br /&gt;
This can be useful for instance to work around bugs in a part of SimGear or FlightGear that you don't need, but causes a build or runtime failure (see {{forum link|t=35740|text=here}} for example). This is often convenient when using the development version of FlightGear, but doesn't mean such bugs shouldn't be reported!&lt;br /&gt;
&lt;br /&gt;
If you have several such options to pass, just use spaces to separate them inside the quotes:&lt;br /&gt;
 $ FG_CMAKEARGS='-DENABLE_SWIFT=ON -DENABLE_HID_INPUT=OFF' download_and_compile.sh FGFS&lt;br /&gt;
Of course, the same thing can also be achieved this way in Bourne-style shells:&lt;br /&gt;
 $ export FG_CMAKEARGS='-DENABLE_SWIFT=ON -DENABLE_HID_INPUT=OFF'&lt;br /&gt;
 $ download_and_compile.sh FGFS&lt;br /&gt;
&lt;br /&gt;
It is also possible to set both &amp;lt;tt&amp;gt;SG_CMAKEARGS&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;FG_CMAKEARGS&amp;lt;/tt&amp;gt; at the same time for a given &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; run:&lt;br /&gt;
 $ export SG_CMAKEARGS='-DSYSTEM_EXPAT=ON'&lt;br /&gt;
 $ export FG_CMAKEARGS='-DENABLE_SWIFT=ON -DENABLE_HID_INPUT=OFF'&lt;br /&gt;
 $ download_and_compile.sh&lt;br /&gt;
&lt;br /&gt;
=== Launching FlightGear ===&lt;br /&gt;
&lt;br /&gt;
When using &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;, apart from those installed with the package manager, the FlightGear dependencies (which are typically libraries) are not installed system-wide but under the directory from which &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; was run. This makes it possible to easily use, for instance, different [[OpenSceneGraph]], [[SimGear]] and FlightGear versions on a single system—e.g., for testing purposes—but also to have separate build trees (optimized/debug). This is also why you either need to set LD_LIBRARY_PATH to run the built programs, or simply use the scripts created by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; in the directory where it is run, such as &amp;lt;tt&amp;gt;run_fgfs.sh&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;run_fgfs_debug.sh&amp;lt;/tt&amp;gt;: these scripts automatically set up the required environment variables according to your build settings before firing the desired program (e.g., &amp;lt;tt&amp;gt;fgfs&amp;lt;/tt&amp;gt;) with the arguments you provided. &lt;br /&gt;
&lt;br /&gt;
Therefore, the simplest way to run a FlightGear program built by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is to launch the &amp;lt;tt&amp;gt;run_fgfs.sh&amp;lt;/tt&amp;gt; script that &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; created in the directory from which it was run, for example:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ ./run_fgfs.sh --launcher&lt;br /&gt;
&lt;br /&gt;
{{Note|&amp;lt;code&amp;gt;./run_fgfs.sh --launcher&amp;lt;/code&amp;gt; starts FlightGear with its built-in launcher. If you just do &amp;lt;code&amp;gt;./run_fgfs.sh&amp;lt;/code&amp;gt;, FlightGear will be started without any launcher, at the default airport and with the default aircraft.}}&lt;br /&gt;
&lt;br /&gt;
In order to start FlightGear without any launcher, at a given airport (say, [https://en.wikipedia.org/wiki/Paro_Airport Paro airport], whose ICAO code is VQPR) and with a chosen aircraft, you can do:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ ./run_fgfs.sh --airport=VQPR --aircraft=dhc6&lt;br /&gt;
Actually, the directory change is not needed, we only gave it here for readability. Therefore, the following single command does the same:&lt;br /&gt;
 $ ~/flightgear/dnc-managed/run_fgfs.sh --airport=VQPR --aircraft=dhc6&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;avoiding-multiple-downloads-of-fgdata&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Avoiding multiple downloads of FGData ===&lt;br /&gt;
&lt;br /&gt;
Some people use &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; to maintain several directory trees such as the tree starting at &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; in [[#getting-started-with-download-and-compile-sh|Getting started with &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;]] (this can be useful if you want to have one tree with programs compiled in Release mode and another tree where they are built in Debug mode, for instance). This can easily be done by running &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; in each of the directories. But since [[FGData]] is so large, it may be tempting to share a single instance of this repository among several trees. This is not officially supported, but apparently can be made to work with symbolic links.&lt;br /&gt;
&lt;br /&gt;
Let's show how this can be done on an example. Suppose your master copy of FGData is in &amp;lt;tt&amp;gt;~/flightgear/dnc-managed/install/flightgear/fgdata&amp;lt;/tt&amp;gt;. Then the following appears to work:&lt;br /&gt;
 $ mkdir -p ~/flightgear/other-dnc-managed-tree/install/flightgear&lt;br /&gt;
 $ cd ~/flightgear/other-dnc-managed-tree/install/flightgear&lt;br /&gt;
 $ ln -s ../../../dnc-managed/install/flightgear/fgdata&lt;br /&gt;
 $ cd ~/flightgear/other-dnc-managed-tree&lt;br /&gt;
 $ download_and_compile.sh&lt;br /&gt;
&lt;br /&gt;
The last of these commands will use and update the FGData repository present in &amp;lt;tt&amp;gt;~/flightgear/dnc-managed/install/flightgear/fgdata&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Warning|This can only work simply if all trees that share a given FGData repository are from the same release (e.g., current stable or development). Running a “stable“ FlightGear with FGData from the ''next'' branch or the other way round, a development version of FlightGear with FGData from a release branch, doesn't work—and FlightGear should tell you when you start it in such a situation.&lt;br /&gt;
&lt;br /&gt;
That said, people comfortable with Git can check out the correct FGData branch before building or starting FlightGear, for instance:&lt;br /&gt;
 $ cd /path/to/fgdata &amp;amp;&amp;amp; git checkout release/2019.1&lt;br /&gt;
or&lt;br /&gt;
 $ cd /path/to/fgdata &amp;amp;&amp;amp; git checkout next&lt;br /&gt;
So, this is possible but somewhat acrobatic. You've been warned.}}&lt;br /&gt;
&lt;br /&gt;
Note: there is a [[Avoiding multiple downloads of FGData on Linux|wiki article about this subject]], but it is severely outdated as of April 2019.&lt;br /&gt;
&lt;br /&gt;
== Additional programs ==&lt;br /&gt;
&lt;br /&gt;
{{Note|In this section, we assume you've read and followed the advice given in [[#getting-started-with-download-and-compile-sh|Getting started with &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;]].}}&lt;br /&gt;
&lt;br /&gt;
If you wish to get other programs (precisely: download, build and install them), you need to launch &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; with the desired component names as arguments. For instance:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ download_and_compile.sh SIMGEAR FGFS DATA OSG&lt;br /&gt;
&lt;br /&gt;
See [[#list-of-available-components|above]] for the list of available components.&lt;br /&gt;
&lt;br /&gt;
=== TerraGear ===&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; with the TERRAGEAR component in order to build and install the [[TerraGear]] terrain building toolchain:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ download_and_compile.sh TERRAGEAR&lt;br /&gt;
&lt;br /&gt;
This creates the following scripts in &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt;:&lt;br /&gt;
* &amp;lt;tt&amp;gt;run_genapts850.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;run_ogr-decode.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;run_tg-construct.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
These scripts themselves run the corresponding TerraGear tools, as expected.&lt;br /&gt;
&lt;br /&gt;
=== TerraGear GUI ===&lt;br /&gt;
&lt;br /&gt;
[[TerraGear GUI]] is a graphical interface for [[TerraGear]] written with the Qt toolkit (still Qt 4 in 2019, but it works). In order to install it, run &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; with the TERRAGEARGUI component:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ download_and_compile.sh TERRAGEARGUI&lt;br /&gt;
This will create a &amp;lt;tt&amp;gt;run_terrageargui.sh&amp;lt;/tt&amp;gt; script in &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt;, and also a default configuration file &amp;lt;tt&amp;gt;~/.config/TerraGear/TerraGearGUI.conf&amp;lt;/tt&amp;gt;, unless you already have one. This default configuration file contains paths to the TerraGear and [[$FG_ROOT]] directories, assuming you have installed the TERRAGEAR and DATA components.&lt;br /&gt;
&lt;br /&gt;
To run TerraGear GUI:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ ./run_terrageargui.sh&lt;br /&gt;
&lt;br /&gt;
=== FGCom ===&lt;br /&gt;
&lt;br /&gt;
{{Note|[[FGCom]] has been integrated into FlightGear long ago, therefore the following is not needed in general.}}&lt;br /&gt;
&lt;br /&gt;
[[FGCom]] is the system used by FlightGear to simulate radio communications between users. It is automatically built and installed when you tell &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; to take care of the FGFS component. You can launch the standalone FGCom program by using the &amp;lt;tt&amp;gt;run_fgcom.sh&amp;lt;/tt&amp;gt; script:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ ./run_fgcom.sh&lt;br /&gt;
&lt;br /&gt;
=== FGRun ===&lt;br /&gt;
&lt;br /&gt;
{{Note|As of 2019, FGRun has been superseded by the [[FlightGear Qt launcher|FlightGear built-in launcher]]. The built-in launcher is the most actively maintained launcher for FlightGear. Other launchers are [[FFGo]] and [[FGX|FGx]].}}&lt;br /&gt;
&lt;br /&gt;
[[File:fgrun-page2.jpg|thumb|right]]&lt;br /&gt;
Before FlightGear had its built-in launcher (the one you get with &amp;lt;code&amp;gt;run_fgfs.sh --launcher&amp;lt;/code&amp;gt;), many users found comfortable having FlightGear launched by the graphical utility [[Fgrun|FGRun]]. This program is built and installed when &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is run with the FGRUN component. You then have to launch the &amp;lt;tt&amp;gt;run_fgrun.sh&amp;lt;/tt&amp;gt; command, for example:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ ./run_fgrun.sh&lt;br /&gt;
&lt;br /&gt;
FGRun will save its settings in &amp;lt;tt&amp;gt;~/.fltk/flightgear.org/fgrun.prefs&amp;lt;/tt&amp;gt;. You may want to save copies of the preferences customized for stable and next.&lt;br /&gt;
&lt;br /&gt;
=== FGo! ===&lt;br /&gt;
&lt;br /&gt;
{{Note|As of 2019, FGo! is not maintained anymore. You may want to try the built-in launcher (started with &amp;lt;code&amp;gt;run_fgfs.sh --launcher&amp;lt;/code&amp;gt;) or [[FFGo]].}}&lt;br /&gt;
&lt;br /&gt;
[[File:Fgo01.jpg|thumb|left]]&lt;br /&gt;
FGo! is a graphical utility written in [[python]]. It is downloaded and installed when &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is run with the FGO component. You then have to launch the &amp;lt;tt&amp;gt;run_fgo.sh&amp;lt;/tt&amp;gt; command, for example:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ ./run_fgo.sh&lt;br /&gt;
&lt;br /&gt;
Remember that the first time you run it, you have to go to open the ''Preferences'' dialog and set the paths to the &amp;lt;tt&amp;gt;fgfs&amp;lt;/tt&amp;gt; executable and to FGData.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Compilation errors ===&lt;br /&gt;
Here we are, no fear, if you wish to use programs from the cvs/svn/git repositories, you might face compilation errors that will prevent you to have a working copy of one or more of the programs provided by this script. What can be the causes that prevent us from successfully compiling? As far as I know those:&lt;br /&gt;
# Software developers introduce a new functionality with a new piece of code that prevents the compilation under your architecture, this can happen working with cvs/svn/git sources.&lt;br /&gt;
# The program refuses to compile because of a divergence in the libraries on which it depends. For example FlightGear might not compile because OSG has been modified, while OSG itself compiles fine, FG won't.&lt;br /&gt;
# One or more repositories are down and you can't get the library you need. (Both from cvs/svn/git or apt-get)&lt;br /&gt;
&lt;br /&gt;
There is a simple solution to the above errors: wait and relaunch the script after some time (hours or days), if software developers repair or synchronize their code with the newly updated libraries (which generally happens eventually), your FlightGear will compile fine as if the previous error never took place.&lt;br /&gt;
&lt;br /&gt;
Sometimes it happens that the script fails to compile only [[Fgrun|FGRun]], [[FGCom]] or atlas, if you then see the run_fgfs.sh file it means that FlightGear installation was successful and you can safely run it.&lt;br /&gt;
&lt;br /&gt;
=== OpenRTI undefined reference errors ===&lt;br /&gt;
Sometimes due to the way d&amp;amp;c build cleans up projects, linking errors might occur, this is the case with this error &amp;quot;libRTI-NG.so: undefined reference to xxx&amp;quot;, sadly at this point either you need to patch the d&amp;amp;c script to clean OpenRTI with &amp;lt;code&amp;gt;rm -f CMakeCache.txt &amp;amp;&amp;amp; rm -rf CMakeFiles/&amp;lt;/code&amp;gt;, or just start from a clean environment, assuming you are in the parent project directory, you will need to issue this command to clean everything (except FGData):&lt;br /&gt;
 $ rm -rf build/* install/simgear/ install/openrti/ install/flightgear/share/ install/flightgear/bin/&lt;br /&gt;
&lt;br /&gt;
See {{forum link|t=26244|text=this thread}} for more details.&lt;br /&gt;
&lt;br /&gt;
== Options ==&lt;br /&gt;
&lt;br /&gt;
=== Multicore acceleration ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Passing option &amp;lt;code&amp;gt;-j x&amp;lt;/code&amp;gt; to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; (where ''x'' is the number of your CPU cores you wish to assign to the job) will considerably speed up the compilation steps.&lt;br /&gt;
&lt;br /&gt;
=== Advanced options ===&lt;br /&gt;
&lt;br /&gt;
* Build a release version: &amp;lt;code&amp;gt;-b Release&amp;lt;/code&amp;gt;&lt;br /&gt;
* Build a version that should run as fast as a release build, yet has debug information that can be used to post backtraces: &amp;lt;code&amp;gt;-b RelWithDebInfo&amp;lt;/code&amp;gt; (this is the default)&lt;br /&gt;
* Build a full debug version for very complete bug reporting: &amp;lt;code&amp;gt;-b Debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Skip download of distro packages (i.e., by default: &amp;lt;tt&amp;gt;apt-get install ...&amp;lt;/tt&amp;gt;): &amp;lt;code&amp;gt;-p n&amp;lt;/code&amp;gt;&lt;br /&gt;
* Skip retrieving of software updates (i.e., by default: &amp;lt;tt&amp;gt;apt-get update&amp;lt;/tt&amp;gt;): &amp;lt;code&amp;gt;-d n&amp;lt;/code&amp;gt;&lt;br /&gt;
* Skip the configure step (like running [https://cmake.org/ CMake] or [https://www.gnu.org/software/autoconf/ autoconf]'s &amp;lt;tt&amp;gt;./configure&amp;lt;/tt&amp;gt;): &amp;lt;code&amp;gt;-r n&amp;lt;/code&amp;gt;&lt;br /&gt;
* Skip compilation of programs: &amp;lt;code&amp;gt;-c n&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For example, if you are a developer and wish to quickly recompile and reinstall only your own modifications for FlightGear, you can do this:&lt;br /&gt;
 $ download_and_compile.sh -p n -d n -r n FGFS&lt;br /&gt;
&lt;br /&gt;
Note that this is the same as:&lt;br /&gt;
 $ download_and_compile.sh -pn -dn -rn FGFS&lt;br /&gt;
&lt;br /&gt;
This command will only rebuild modified files and reinstall FlightGear. Note that depending on the kind of changes you made, reconfiguring and thus dropping the &amp;lt;code&amp;gt;-d n&amp;lt;/code&amp;gt; option may be necessary, though (this is the case in particular if you added or removed C++ files).&lt;br /&gt;
&lt;br /&gt;
== Optimus technology ==&lt;br /&gt;
If your computer has a GPU with Optimus technology, you need a dedicated script in order to make FlightGear run with the powerful GPU.&lt;br /&gt;
&lt;br /&gt;
After having installed required tools (Bumblebee) you just need to run this command line in your FlightGear installation directory (where you executed &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;):&lt;br /&gt;
 $ sed  's|\./fgfs|optirun ./fgfs|' run_fgfs.sh &amp;gt; run_fgfs_optirun.sh &amp;amp;&amp;amp; chmod +x run_fgfs_optirun.sh&lt;br /&gt;
Now you can run FlightGear with &amp;lt;code&amp;gt;./run_fgfs_optirun.sh&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The same can be done for the [[FlightGear_Launch_Control|FGRun]] launcher:&lt;br /&gt;
 $ sed  's|\./fgrun|optirun ./fgrun|' run_fgrun.sh &amp;gt; run_fgrun_optirun.sh &amp;amp;&amp;amp; chmod +x run_fgrun_optirun.sh&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* {{fgmeta source&lt;br /&gt;
| path = compile-scripts&lt;br /&gt;
| text = Other FlightGear build scripts&lt;br /&gt;
}} present in [[FGMeta]]&lt;br /&gt;
* {{fgmeta source&lt;br /&gt;
| path = fg-from-scratch&lt;br /&gt;
| simplepath = true&lt;br /&gt;
}}&lt;br /&gt;
* [http://geoffmclane.com/fg/fgfs-052.htm Another script] for building FlightGear and all its dependencies in an automated fashion. The page seems a bit oldish, though (as of 2019).&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Building from source]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Script de compilation sous Linux Debian/Ubuntu]]&lt;br /&gt;
[[nl:Compileren met een Script op Linux Debian/Ubuntu]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Scripted_Compilation_on_Linux_Debian/Ubuntu&amp;diff=120572</id>
		<title>Scripted Compilation on Linux Debian/Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Scripted_Compilation_on_Linux_Debian/Ubuntu&amp;diff=120572"/>
		<updated>2019-10-04T17:22:08Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: add prerequisites section since dnc doesn't automatically pull these needed tools if they are not already installed.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is a Bash script that takes care of downloading and compiling FlightGear and related software from their source code repositories with just one command execution&amp;lt;ref name=&amp;quot;just-one-command&amp;quot;&amp;gt;Due to technical problems on the [https://sourceforge.net/ SourceForge] side, this is currently only true once you have an [[FGData]] clone. See [[User:Rominet|here]] for details.&amp;lt;/ref&amp;gt; for both 32-bit and 64-bit [https://www.debian.org/ Debian]-based systems. Pre-existing versions (if any) of the software installed by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; are not touched at all since the script downloads, builds and installs everything under the directory in which it is launched. You can choose the particular components to download, build and install.&lt;br /&gt;
&lt;br /&gt;
Unless told not to do so, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; installs packages with &amp;lt;tt&amp;gt;apt-get&amp;lt;/tt&amp;gt;. For this reason, it is primarily useful on Debian-based distributions. However, if one disables package installation (using &amp;lt;code&amp;gt;-pn&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;--sudo=echo&amp;lt;/code&amp;gt;) and installs the corresponding dependencies oneself, it might be useful on other distributions as well.&lt;br /&gt;
&lt;br /&gt;
For hints on using &amp;lt;tt&amp;gt;rpm&amp;lt;/tt&amp;gt;-based distributions such as Redhat, Fedora and CentOS, please see [[CentOS]]. Please also see [[Superbuild]].&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is a [https://www.gnu.org/software/bash/ Bash] script written for [https://www.debian.org/ Debian]-derived distributions ([https://www.ubuntu.com/ Ubuntu], [https://devuan.org/ Devuan], [https://www.linuxmint.com/ Linux Mint], etc.). Its purpose is to automatically install dependencies using the package manager, then build and install FlightGear-related programs.&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; installs most dependencies with &amp;lt;tt&amp;gt;apt-get&amp;lt;/tt&amp;gt; run under &amp;lt;tt&amp;gt;sudo&amp;lt;/tt&amp;gt;.&amp;lt;ref name=&amp;quot;disabling-installation-of-dependencies-via-package-manager&amp;quot;&amp;gt;If you think you already have the dependencies, this installation can be disabled either by using option &amp;lt;code&amp;gt;-pn&amp;lt;/code&amp;gt; or by passing option &amp;lt;code&amp;gt;--sudo=echo&amp;lt;/code&amp;gt; (the latter results in printing the &amp;lt;tt&amp;gt;apt-get&amp;lt;/tt&amp;gt; command line without running it).&amp;lt;/ref&amp;gt; Other dependencies, either because they aren't available in the standard APT repositories, or because of non-option arguments passed to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;, are downloaded and compiled on the fly (this can be the case for [[PLIB]], [[Simgear]] and [[OpenSceneGraph]], for instance—it all depends on the arguments passed to the script).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; works in the directory it is run from: apart from dependencies installed via the package manager, all programs built by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; are installed under the &amp;lt;tt&amp;gt;install&amp;lt;/tt&amp;gt; subdirectory of the directory from which the script was run. In other words, installation of programs by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is clean, very easy to undo and doesn't interfere with other programs on the system.&lt;br /&gt;
&lt;br /&gt;
It is possible to manage several directory trees with &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;; as far as it is concerned, such directory trees are completely independent from each other. For instance, if you run &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;dir1&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;dir2&amp;lt;/tt&amp;gt;, the programs installed under &amp;lt;tt&amp;gt;dir1&amp;lt;/tt&amp;gt; won't “see” those installed under &amp;lt;tt&amp;gt;dir2&amp;lt;/tt&amp;gt;, and vice versa.&lt;br /&gt;
&lt;br /&gt;
Apart from its main purpose, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; can be used to find hopefully up-to-date build-dependency information for FlightGear and related software. You would do so by inspecting [https://sourceforge.net/p/flightgear/fgmeta/ci/next/tree/download_and_compile.sh the script] at the point where it installs packages.&amp;lt;ref name=&amp;quot;note-inspecting-download-and-compile-sh-to-gather-build-dependency-information&amp;quot;&amp;gt;Look for strings such as &amp;lt;tt&amp;gt;zlib1g-dev&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;libglew-dev&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;qt5-default&amp;lt;/tt&amp;gt;.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
Before embarking on building your own FlightGear binaries, you must have already installed the necessary tools to compile the source code with. These preliminary tools are&lt;br /&gt;
&lt;br /&gt;
* build-essential&lt;br /&gt;
* git&lt;br /&gt;
* subversion&lt;br /&gt;
* cmake&lt;br /&gt;
* automake&lt;br /&gt;
&lt;br /&gt;
They can be installed quite simply by running the following command line.&lt;br /&gt;
&lt;br /&gt;
 $ sudo apt-get install build-essential git subversion cmake automake&lt;br /&gt;
&lt;br /&gt;
Once these tools are installed, the download_and_compile.sh script can be run. It will install possibly needed additional tools and libraries as it runs.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span id=&amp;quot;disk-space-requirements-and-build-time&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Disk space requirements and build time ==&lt;br /&gt;
&lt;br /&gt;
As of April 2019, building FlightGear requires about 12 [https://en.wikipedia.org/wiki/Gibibyte GiB] of disk space. Note that this includes downloaded source code for [[SimGear]] and FlightGear, generated build files and the large [[FGData]] repository (about 6 GiB for that one).&lt;br /&gt;
&lt;br /&gt;
With an Intel Core i7 860 CPU (2.80 GHz) purchased in 2009, compiling [[SimGear]] and FlightGear 2019.2 with option &amp;lt;code&amp;gt;-j8&amp;lt;/code&amp;gt; takes about 14 minutes. If you don't have a fast machine and build using only one core, it may require several hours.&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
You can get &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; {{fgmeta source&lt;br /&gt;
| path = download_and_compile.sh&lt;br /&gt;
| text = from FGMeta &lt;br /&gt;
}}. It is contained in the [[FGMeta]] repository, which is maintained by the FlightGear developers. The script can be downloaded from the link given above, however, for easier updates and in order to have the command &amp;lt;code&amp;gt;download_and_compile.sh --version&amp;lt;/code&amp;gt; work as intended, it is recommended to get it as explained [[#getting-download-and-compile-sh-using-an-fgmeta-clone|below]].&lt;br /&gt;
&lt;br /&gt;
In case you build stable versions of FlightGear using the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; option of &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;, remember to update the script before trying to build a new version of FlightGear (see [[#updating-download-and-compile-sh-using-an-fgmeta-clone|Updating &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;]] below). Of course, you can update it more often in order to benefit from new features or bug fixes; this is especially useful if you are building ''next'', that is, the development branch of FlightGear.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span id=&amp;quot;getting-started-with-download-and-compile-sh&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Getting started with &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Because of technical problems at SourceForge (cloning [[FGData]] using the https protocol usually fails), the initial setup is unfortunately more complex than it used to be. You'll be guided step by step though, so don't be afraid. Besides, once you have a complete clone of the FGData repository, all future operations will be really easy.&lt;br /&gt;
&lt;br /&gt;
We'll first explain how to get &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; in a way that makes it convenient to update and causes the command &amp;lt;code&amp;gt;download_and_compile.sh --version&amp;lt;/code&amp;gt; to work as intended (the reported “version” is a Git blob id such as &amp;lt;tt&amp;gt;6a5e4f05e2ccf27115eec58313be027b11266097&amp;lt;/tt&amp;gt;&amp;lt;ref name=&amp;quot;note-on-download-and-compile-sh-version-being-a-Git-blob-id&amp;quot;&amp;gt;This looks like, but is ''not'' a Git commit identifier. This kind of “version number” is admittedly not very pretty, but it doesn't pollute Git commits  (the diffs) and is automatically updated by Git every time you update &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; the way we present here; thus, the advantages compensate for the ugliness.&amp;lt;/ref&amp;gt;). Then we'll show how to clone the large FGData repository, and finally give instructions to get FlightGear up and running.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;getting-started-with-download-and-compile-sh-notations&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Notations ===&lt;br /&gt;
&lt;br /&gt;
When a command should be run as an unpriviledged user, it will be preceded by a dollar sign:&lt;br /&gt;
 $ whoami&lt;br /&gt;
 toto&lt;br /&gt;
In contrast, a hash sign (#) means that the command must be run with superuser privileges to achieve the desired effect:&lt;br /&gt;
 # whoami&lt;br /&gt;
 root&lt;br /&gt;
&lt;br /&gt;
In order to make instructions easy to understand, two directories (= folders) will be consistently used for the same purpose below:&lt;br /&gt;
* &amp;lt;tt&amp;gt;~/flightgear/fgmeta&amp;lt;/tt&amp;gt; will contain a clone of the [[FGMeta]] repository; therefore, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; will reside in that directory;&lt;br /&gt;
* &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; will be the directory from which we run &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;. In other words, with this setup, a typical sequence of commands could be:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ ~/flightgear/fgmeta/download_and_compile.sh SIMGEAR FGFS DATA&lt;br /&gt;
These are of course just examples. The aforementioned paths are not hardwired anywhere in the script; you are free to choose the directories you want for these purposes.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;getting-download-and-compile-sh-using-an-fgmeta-clone&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Getting &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; the “right way” ===&lt;br /&gt;
&lt;br /&gt;
There are several ways to obtain [https://sourceforge.net/p/flightgear/fgmeta/ci/next/tree/download_and_compile.sh download_and_compile.sh]. The method described here makes it very easy to update the script and causes the command &amp;lt;code&amp;gt;download_and_compile.sh --version&amp;lt;/code&amp;gt; to work as intended.&lt;br /&gt;
&lt;br /&gt;
As explained in [[#getting-started-with-download-and-compile-sh-notations|Notations]], we want to clone the [[FGMeta]] repository in &amp;lt;tt&amp;gt;~/flightgear/fgmeta&amp;lt;/tt&amp;gt;. Let's go:&lt;br /&gt;
 $ mkdir -p ~/flightgear&lt;br /&gt;
 $ cd ~/flightgear&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ git clone https://git.code.sf.net/p/flightgear/fgmeta&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
You now have a fresh FGMeta clone in &amp;lt;tt&amp;gt;~/flightgear/fgmeta&amp;lt;/tt&amp;gt; and your brand new &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; script is located in that directory. You can already try it to see the available options:&lt;br /&gt;
&amp;lt;pre&amp;gt;$ ~/flightgear/fgmeta/download_and_compile.sh --help&lt;br /&gt;
download_and_compile.sh [OPTION...] [--] [COMPONENT...]&lt;br /&gt;
Download and compile components belonging to the FlightGear ecosystem.&lt;br /&gt;
&lt;br /&gt;
Without any COMPONENT listed, or if ALL is specified, recompile all&lt;br /&gt;
components listed in the WHATTOBUILDALL variable. Each COMPONENT may&lt;br /&gt;
be one of the following words:&lt;br /&gt;
&lt;br /&gt;
  ALL, CMAKE, OSG, PLIB, OPENRTI, SIMGEAR, FGFS, DATA, FGRUN, FGO, FGX,&lt;br /&gt;
  OPENRADAR, ATCPIE, TERRAGEAR, TERRAGEARGUI&lt;br /&gt;
&lt;br /&gt;
Available options:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
      --version print version and license information, then exit&lt;br /&gt;
&lt;br /&gt;
(...)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;updating-download-and-compile-sh-using-an-fgmeta-clone&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Updating &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Now that you have &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; from the [[FGMeta]] repository, it is very easy to update (this assumes you didn't modify anything yourself inside &amp;lt;tt&amp;gt;~/flightgear/fgmeta&amp;lt;/tt&amp;gt;!):&lt;br /&gt;
 $ cd ~/flightgear/fgmeta &amp;amp;&amp;amp; git pull&lt;br /&gt;
&lt;br /&gt;
If you want to keep updates as easy as we just shown, it is best not to modify &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; yourself. &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; has plenty of options that usually make it unnecessary to modify the script. Just run &amp;lt;code&amp;gt;download_and_compile.sh --help&amp;lt;/code&amp;gt; and learn about the available options when you feel the need to change something. Unless you have special needs that can only be accomodated by modifying &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;, you are invited to skip to the next section.&lt;br /&gt;
&lt;br /&gt;
If you really, ''really'' want to modify &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; while keeping updates easy, a good technique is to add your changes to your FGMeta clone in the form of one or more Git ''commits'' (no need to push them anywhere, commits can remain in your clone). How to do that is beyond the scope of this document, though; read Git tutorials if you want to learn it (there are plenty on the Internet). Once you have committed your changes to your FGMeta clone, make sure the repository is clean (use &amp;lt;code&amp;gt;git status&amp;lt;/code&amp;gt;), then update it with:&lt;br /&gt;
 $ cd ~/flightgear/fgmeta &amp;amp;&amp;amp; git pull --rebase&lt;br /&gt;
This will apply your commits on top of the latest commit of the branch that is currently checked out, which so far contained the official version of &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;. In case your changes conflict with the update, Git will tell you and you'll have to resolve the conflict manually (look for “Git resolve conflict” on your favorite search engine)... or start again from a pristine [[FGMeta]] clone.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;using-download-and-compile-sh-to-build-flightgear&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Building FlightGear ===&lt;br /&gt;
&lt;br /&gt;
For the method described below, you'll need an account at [https://sourceforge.net/ SourceForge] (this is unfortunate, but methods that don't require such an account are either unreliable or insecure, as long as [[FGData]] can't be cloned using the &amp;lt;tt&amp;gt;https&amp;lt;/tt&amp;gt; protocol). If you don't already have one, go to the [https://sourceforge.net/user/registration registration page] and create an account. In all this section, we'll assume that your account name at SourceForge is ''SFusername''.&lt;br /&gt;
&lt;br /&gt;
In what follows, we won't give the full path to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; when showing commands to be run, but you should prepend it to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; whenever you see a &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; command. For instance, if you used the same path as in [[#getting-started-with-download-and-compile-sh-notations|Notations]] and see the command:&lt;br /&gt;
 $ download_and_compile.sh --help&lt;br /&gt;
what you should actually run is:&lt;br /&gt;
 $ ~/flightgear/fgmeta/download_and_compile.sh --help&lt;br /&gt;
&lt;br /&gt;
Apart from this harmless command, ''do not'' run other &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; commands from an arbitrary directory, in particular ''don't'' run them from &amp;lt;tt&amp;gt;~/flightgear/fgmeta&amp;lt;/tt&amp;gt;. This is because '''most other &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; commands write to the current directory''' (&amp;lt;code&amp;gt;download_and_compile.sh --help&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;download_and_compile.sh --version&amp;lt;/code&amp;gt; are safe to run from any directory, though).&lt;br /&gt;
&lt;br /&gt;
Of course, it is always possible to make commands shorter by setting up aliases (see tips at the end of [https://sourceforge.net/p/flightgear/mailman/message/36634426/ this message]), by adding the directory containing &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; to your &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt; or by creating a symbolink link pointing to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; in a directory that is part of your &amp;lt;tt&amp;gt;PATH&amp;lt;/tt&amp;gt;. This is not necessary, though; do it only if you feel the need (when enabled, persistent shell history is often enough for such things).&lt;br /&gt;
&lt;br /&gt;
{{Note|The following commands should be run from an empty directory&amp;lt;ref name=&amp;quot;dedicated-directory-won-t-stay-empty-forever&amp;quot;&amp;gt;Well, empty before the first time; later, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is going to populate it with plenty of FlightGear files and subdirectories, of course.&amp;lt;/ref&amp;gt; in a partition that has enough free space (see [[#disk-space-requirements-and-build-time | Disk space requirements and build time]]). As explained in [[#getting-started-with-download-and-compile-sh-notations|Notations]], we are going to choose the directory &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; for this purpose, in order to express that the whole directory tree is managed by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;. This is just an example; feel free to choose another directory if you want.&lt;br /&gt;
&lt;br /&gt;
'''Don't run the commands from a non-dedicated directory,''' because it will be filled with files and directories created by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; and the FlightGear, SimGear, etc. build systems. That would be a complete mess! In particular, ''don't'' run the commands from the directory containing your [[FGMeta]] clone.}}&lt;br /&gt;
&lt;br /&gt;
{{Note|As explained in [[#getting-started-with-download-and-compile-sh-notations|Notations]], we assume that your Unix user name (login) is &amp;lt;tt&amp;gt;toto&amp;lt;/tt&amp;gt;. Don't confuse the &amp;lt;tt&amp;gt;sudo&amp;lt;/tt&amp;gt; password prompt (where you need to enter &amp;lt;tt&amp;gt;toto&amp;lt;/tt&amp;gt;'s password) with the password prompt for your SourceForge account! The former appears as&lt;br /&gt;
 [sudo] password for toto:&lt;br /&gt;
whereas the latter is just:&lt;br /&gt;
 Password:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Tip|In case you want to run some other program instead of &amp;lt;tt&amp;gt;sudo&amp;lt;/tt&amp;gt;, this can be done with the &amp;lt;code&amp;gt;--sudo&amp;lt;/code&amp;gt; option of &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;. For instance, in order to see the commands that would be run with sudo without actually running them, you can pass &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;--sudo=echo&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;. Like all other options, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;--sudo&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; must be given ''before'' all arguments that are component names (such as &amp;lt;tt&amp;gt;SIMGEAR&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;FGFS&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;DATA&amp;lt;/tt&amp;gt;, etc.).}}&lt;br /&gt;
&lt;br /&gt;
The package manager used by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; by default is &amp;lt;tt&amp;gt;apt-get&amp;lt;/tt&amp;gt;. You can use another one if you want, as long as it supports the following calls:&lt;br /&gt;
 ''pkg-mgr'' update&lt;br /&gt;
 ''pkg-mgr'' install ''pkg1 pkg2'' ...&lt;br /&gt;
This is the case for &amp;lt;tt&amp;gt;aptitude&amp;lt;/tt&amp;gt; as well as &amp;lt;tt&amp;gt;apt&amp;lt;/tt&amp;gt;. If you want &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; to use &amp;lt;tt&amp;gt;aptitude&amp;lt;/tt&amp;gt;, give it the option &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;--package-manager=aptitude&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; before any of the ''COMPONENT'' arguments.&lt;br /&gt;
&lt;br /&gt;
All options of &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; can be seen by running the following command:&lt;br /&gt;
 $ download_and_compile.sh --help&lt;br /&gt;
Now the instructions we promised you. You have chosen a dedicated directory where all the stuff that is downloaded and built by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; will be stored. This is &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; in our example, and should be empty before you run &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; for the first time. However, it is quite correct to start &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; from the same directory for subsequent runs, even when non-empty (otherwise, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; would automatically reclone the repositories every time you run it; that would be a sheer waste of time and bandwidth).&lt;br /&gt;
&lt;br /&gt;
Ready? Let's go!&lt;br /&gt;
&amp;lt;pre&amp;gt;$ mkdir -p ~/flightgear/dnc-managed&lt;br /&gt;
$ cd ~/flightgear/dnc-managed&lt;br /&gt;
$ download_and_compile.sh --git-clone-site-params SourceForge=ssh:SFusername DATA&lt;br /&gt;
**********************************************************************&lt;br /&gt;
*                                                                    *&lt;br /&gt;
* Warning: a typical SimGear + FlightGear + FGData build requires    *&lt;br /&gt;
* about 12 GiB of disk space. The compilation part may last from a   *&lt;br /&gt;
* few minutes to hours, depending on your computer.                  *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
* Hint: use the -j option if your CPU has several cores, as in:      *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
*         download_and_compile.sh -j$(nproc)                         *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
**********************************************************************&lt;br /&gt;
Running 'apt-get update'...&lt;br /&gt;
[sudo] password for toto:&lt;br /&gt;
&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
Considering a package alternative: libcurl4-openssl-dev libcurl4-gnutls-dev&lt;br /&gt;
Package alternative matched for libcurl4-openssl-dev&lt;br /&gt;
Running 'apt-get install build-essential git libcurl4-openssl-dev cmake'...&lt;br /&gt;
[sudo] password for toto:&lt;br /&gt;
&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
****************************************&lt;br /&gt;
**************** DATA ******************&lt;br /&gt;
****************************************&lt;br /&gt;
Fetching DATA with 'git clone ssh://SFusername@git.code.sf.net/p/flightgear/fgdata'&lt;br /&gt;
Cloning into '.'...&lt;br /&gt;
The authenticity of host 'git.code.sf.net (216.105.38.16)' can't be established.&lt;br /&gt;
ECDSA key fingerprint is SHA256:FeVkoYYBjuQzb5QVAgm3BkmeN5TTgL2qfmqz9tCPRL4.&lt;br /&gt;
Are you sure you want to continue connecting (yes/no)?&lt;br /&gt;
Warning: Permanently added 'git.code.sf.net,216.105.38.16' (ECDSA) to the list of known hosts.&lt;br /&gt;
Connection closed by 216.105.38.16 port 22&lt;br /&gt;
fatal: Could not read from remote repository.&lt;br /&gt;
&lt;br /&gt;
Please make sure you have the correct access rights&lt;br /&gt;
and the repository exists.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above messages are perfectly normal but deserve a little explanation. Here, &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; asked us to confirm that the fingerprint sent by the remote host is that of the real &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt;, as opposed to that of some malicious server ''pretending'' to be &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt;. This confirmation only has to be done once, after which it is remembered thanks to &amp;lt;tt&amp;gt;~/.ssh/known_hosts&amp;lt;/tt&amp;gt;. You should visit the [https://sourceforge.net/p/forge/documentation/SSH%20Key%20Fingerprints/#fingerprint-listing page that gives the host key fingerprint of every publically-accessible SSH server at SourceForge] and carefully check that the fingerprint appearing on your terminal is listed on that page for &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt;, or some matching pattern such as &amp;lt;tt&amp;gt;*.code.sf.net&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If the fingerprint that is printed on your terminal is not listed on that page, answer &amp;lt;tt&amp;gt;no&amp;lt;/tt&amp;gt; to the question ''Are you sure you want to continue connecting (yes/no)?'' and copy/paste to flightgear-devel (see [[Mailing lists]]) the above message from &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; that contains the fingerprint sent to you by the remote host which pretends to be &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt;. If this happened, you should stop here and wait for answers from readers of flightgear-devel.&lt;br /&gt;
&lt;br /&gt;
From now on, we'll assume that the fingerprint you received was correct, and therefore that you have answered &amp;lt;tt&amp;gt;yes&amp;lt;/tt&amp;gt; to the ''Are you sure you want to continue connecting (yes/no)?'' question.&lt;br /&gt;
&lt;br /&gt;
In this example, it took us several minutes to verify the fingerprint of the &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt; server and confirm it to &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt;. Because of this delay, &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt; hung up on us and closed the connection. This is absolutely ''not a problem:'' we can just rerun the &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; command with the same arguments as the first time. Since we answered &amp;lt;tt&amp;gt;yes&amp;lt;/tt&amp;gt; to the ''Are you sure you want to continue connecting (yes/no)?'' prompt, the fingerprint of &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt;'s key has been stored in &amp;lt;tt&amp;gt;~/.ssh/known_hosts&amp;lt;/tt&amp;gt;, therefore we won't get this prompt anymore. But if some server claiming to be &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt; presents a host key that has a different fingerprint in the future, &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; will print a big fat warning that the server may belong to an attacker trying to impersonate &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt;. Therefore, this SSH host key verification is very useful to protect us from future attacks (which hopefully won't happen at all).&lt;br /&gt;
&lt;br /&gt;
As said, we just rerun the &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; command with the same arguments:&lt;br /&gt;
&amp;lt;pre&amp;gt;$ download_and_compile.sh --git-clone-site-params SourceForge=ssh:SFusername DATA&lt;br /&gt;
**********************************************************************&lt;br /&gt;
*                                                                    *&lt;br /&gt;
* Warning: a typical SimGear + FlightGear + FGData build requires    *&lt;br /&gt;
* about 12 GiB of disk space. The compilation part may last from a   *&lt;br /&gt;
* few minutes to hours, depending on your computer.                  *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
* Hint: use the -j option if your CPU has several cores, as in:      *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
*         download_and_compile.sh -j$(nproc)                         *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
**********************************************************************&lt;br /&gt;
Running 'apt-get update'...&lt;br /&gt;
[sudo] password for toto:&lt;br /&gt;
&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
Considering a package alternative: libcurl4-openssl-dev libcurl4-gnutls-dev&lt;br /&gt;
Package alternative matched for libcurl4-openssl-dev&lt;br /&gt;
Running 'apt-get install build-essential git libcurl4-openssl-dev cmake'...&lt;br /&gt;
[sudo] password for toto:&lt;br /&gt;
&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
****************************************&lt;br /&gt;
**************** DATA ******************&lt;br /&gt;
****************************************&lt;br /&gt;
Fetching DATA with 'git clone ssh://SFusername@git.code.sf.net/p/flightgear/fgdata'&lt;br /&gt;
Cloning into '.'...&lt;br /&gt;
Password:&amp;lt;/pre&amp;gt;&lt;br /&gt;
As explained above, the preceding prompt is for your SourceForge password (which you could guess from the &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;git clone ssh://SFusername@git.code.sf.net/p/flightgear/fgdata&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; command).&lt;br /&gt;
&amp;lt;pre&amp;gt;remote: Enumerating objects: 67011, done.&lt;br /&gt;
remote: Counting objects: 100% (67011/67011), done.&lt;br /&gt;
remote: Compressing objects: 100% (31342/31342), done.&lt;br /&gt;
remote: Total 67011 (delta 38776), reused 59640 (delta 33570)&lt;br /&gt;
Receiving objects: 100% (67011/67011), 2.60 GiB | 313.00 KiB/s, done.&lt;br /&gt;
Resolving deltas: 100% (38776/38776), done.&lt;br /&gt;
Checking out files: 100% (12959/12959), done.&lt;br /&gt;
Password:&amp;lt;/pre&amp;gt;&lt;br /&gt;
(It will take a fair amount of time to get there, because this is the complete download of [[FGData]].)&amp;lt;br /&amp;gt;&lt;br /&gt;
This is again a prompt for your SourceForge password, because &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; wants to run &amp;lt;code&amp;gt;git pull --rebase&amp;lt;/code&amp;gt; in the repository (admittedly, it's a bit dumb after a &amp;lt;tt&amp;gt;clone&amp;lt;/tt&amp;gt; operation—please forgive us). In case you were not monitoring the &amp;lt;tt&amp;gt;clone&amp;lt;/tt&amp;gt; operation, you probably saw the password prompt way after &amp;lt;tt&amp;gt;git.code.sf.net&amp;lt;/tt&amp;gt; got bored waiting for you and closed our second connection:&lt;br /&gt;
&amp;lt;pre&amp;gt;Connection closed by 216.105.38.16 port 22&lt;br /&gt;
fatal: Could not read from remote repository.&lt;br /&gt;
&lt;br /&gt;
Please make sure you have the correct access rights&lt;br /&gt;
and the repository exists.&amp;lt;/pre&amp;gt;&lt;br /&gt;
(if not, there should be no error message and you should have a clean FGData clone)&amp;lt;br /&amp;gt;&lt;br /&gt;
No worries. Just as before, simply rerun the command with the same arguments:&lt;br /&gt;
&amp;lt;pre&amp;gt;$ download_and_compile.sh --git-clone-site-params SourceForge=ssh:SFusername DATA&lt;br /&gt;
**********************************************************************&lt;br /&gt;
*                                                                    *&lt;br /&gt;
* Warning: a typical SimGear + FlightGear + FGData build requires    *&lt;br /&gt;
* about 12 GiB of disk space. The compilation part may last from a   *&lt;br /&gt;
* few minutes to hours, depending on your computer.                  *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
* Hint: use the -j option if your CPU has several cores, as in:      *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
*         download_and_compile.sh -j$(nproc)                         *&lt;br /&gt;
*                                                                    *&lt;br /&gt;
**********************************************************************&lt;br /&gt;
Running 'apt-get update'...&lt;br /&gt;
[sudo] password for toto:&lt;br /&gt;
&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
Considering a package alternative: libcurl4-openssl-dev libcurl4-gnutls-dev&lt;br /&gt;
Package alternative matched for libcurl4-openssl-dev&lt;br /&gt;
Running 'apt-get install build-essential git libcurl4-openssl-dev cmake'...&lt;br /&gt;
[sudo] password for toto:&lt;br /&gt;
&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
****************************************&lt;br /&gt;
**************** DATA ******************&lt;br /&gt;
****************************************&lt;br /&gt;
DATA: the repository already exists&lt;br /&gt;
Password:&lt;br /&gt;
Already up to date.&lt;br /&gt;
Current branch next is up to date.&lt;br /&gt;
Already on 'next'&lt;br /&gt;
Your branch is up to date with 'origin/next'.&lt;br /&gt;
All optional package alternatives have found a matching package.&lt;br /&gt;
&lt;br /&gt;
download_and_compile.sh has finished to work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
There we are! You now have a clean, up-to-date [[FGData]] clone in &amp;lt;tt&amp;gt;~/flightgear/dnc-managed/install/flightgear/fgdata&amp;lt;/tt&amp;gt; (remember: &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; is the directory from which you ran &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;). Note this place: the full path of the &amp;lt;tt&amp;gt;~/flightgear/dnc-managed/install/flightgear/fgdata&amp;lt;/tt&amp;gt; directory is your [[$FG_ROOT]].&lt;br /&gt;
&lt;br /&gt;
Now, change the protocol to use for future updates of your FGData clone:&amp;lt;ref name=&amp;quot;changing-the-protocol-for-a-git-remote-manual-method&amp;quot;&amp;gt;Another way would be to manually change the relevant line starting with &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;url = ssh://SFusername@&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; for the &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt; remote in the &amp;lt;tt&amp;gt;.git/config&amp;lt;/tt&amp;gt; file that lives inside your repository clone (i.e., &amp;lt;tt&amp;gt;~/flightgear/dnc-managed/install/flightgear/fgdata/.git/config&amp;lt;/tt&amp;gt; in our example).&amp;lt;/ref&amp;gt;&lt;br /&gt;
 (cd install/flightgear/fgdata &amp;amp;&amp;amp; \&lt;br /&gt;
 git remote set-url origin &amp;lt;nowiki&amp;gt;https://git.code.sf.net/p/flightgear/fgdata&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
(you can check at any time the protocol(s) in use with the command &amp;lt;code&amp;gt;git remote -v&amp;lt;/code&amp;gt; run inside a Git repository—in this case, inside the folder &amp;lt;tt&amp;gt;install/flightgear/fgdata&amp;lt;/tt&amp;gt;). As a consequence of this change, all future updates of your FGData clone will use the &amp;lt;tt&amp;gt;https&amp;lt;/tt&amp;gt; protocol, therefore you won't be prompted anymore for your SourceForge password.&lt;br /&gt;
&lt;br /&gt;
All that remains to do is to run, from the same directory as before (&amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; in our example):&lt;br /&gt;
 $ download_and_compile.sh&lt;br /&gt;
or&lt;br /&gt;
 $ download_and_compile.sh -j$(nproc)&lt;br /&gt;
(&amp;lt;code&amp;gt;-j$(nproc)&amp;lt;/code&amp;gt; is “only” useful to save time—see the tip below).&lt;br /&gt;
&lt;br /&gt;
When you don't pass any non-option argument to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; as done here, it takes care of the three base components needed to run FlightGear: &amp;lt;tt&amp;gt;SIMGEAR&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;FGFS&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;DATA&amp;lt;/tt&amp;gt; (these are the component names used by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;, i.e., the final arguments one can optionally give in a &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; command; in normal speech, they correspond to the {{simgear source&lt;br /&gt;
| text = SimGear&lt;br /&gt;
}}, {{flightgear source&lt;br /&gt;
| text = FlightGear&lt;br /&gt;
}} and {{fgdata source&lt;br /&gt;
| text = FGData&lt;br /&gt;
}} repositories). Therefore, the above command is presently exactly equivalent to:&lt;br /&gt;
 $ download_and_compile.sh SIMGEAR FGFS DATA&lt;br /&gt;
&lt;br /&gt;
In case you wanted to build another component such as [[OpenSceneGraph|OSG]], you could add it to the command, like this:&lt;br /&gt;
 $ download_and_compile.sh SIMGEAR FGFS DATA OSG&lt;br /&gt;
&lt;br /&gt;
(With current Debian stable, this is not necessary because it has OpenSceneGraph 3.4. But if your distribution only has an older version, you'll certainly need to select the &amp;lt;tt&amp;gt;OSG&amp;lt;/tt&amp;gt; component like this.)&lt;br /&gt;
&lt;br /&gt;
When the command terminates, you should have a script called &amp;lt;tt&amp;gt;run_fgfs.sh&amp;lt;/tt&amp;gt; in the directory &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; from which you ran &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;. This will be your script to run FlightGear. For instance, in order to start the built-in launcher, you can run the following commands:&amp;lt;ref name=&amp;quot;no-need-to-change-to-dnc-managed-dir-before-starting-generated-scripts&amp;quot;&amp;gt;We give these commands because they are easy to read, but the &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; command is not needed if you use the correct path, as in &amp;lt;code&amp;gt;~/flightgear/dnc-managed/run_fgfs.sh --launcher&amp;lt;/code&amp;gt;.&amp;lt;/ref&amp;gt;&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ ./run_fgfs.sh --launcher&lt;br /&gt;
(You may omit the &amp;lt;code&amp;gt;--launcher&amp;lt;/code&amp;gt; option; this would simply start FlightGear without any launcher, at the default airport and with the default aircraft.)&amp;lt;br /&amp;gt;&lt;br /&gt;
In case you find this tedious to type or have more arguments to pass on a regular basis, you can follow the advice given at the end of [https://sourceforge.net/p/flightgear/mailman/message/36634426/ this message] or use another launcher such as [[FFGo]] (but the [[FlightGear Qt launcher|FlightGear built-in launcher]] started with &amp;lt;code&amp;gt;run_fgfs.sh --launcher&amp;lt;/code&amp;gt; is quite fine, be sure to try it first!).&lt;br /&gt;
&lt;br /&gt;
{{Tip|You can considerably speed up the build process—literally, save hours—by telling &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; to use several cores simultaneously when compiling. With option &amp;lt;code&amp;gt;-j$(nproc)&amp;lt;/code&amp;gt;, compilations will use all cores available on your processor; thus, a typical &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; command is &amp;lt;code&amp;gt;download_and_compile.sh -j$(nproc)&amp;lt;/code&amp;gt;. If you want to use, say, 4 cores, replace &amp;lt;code&amp;gt;-j$(nproc)&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;-j4&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;using-download-and-compile-sh-to-update-flightgear&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Updating FlightGear ===&lt;br /&gt;
&lt;br /&gt;
Just go to the directory from which you you previously ran &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; (&amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; in our example). This is the folder which, if you did a complete run of &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; as shown in the previous section, contains the &amp;lt;tt&amp;gt;run_fgfs.sh&amp;lt;/tt&amp;gt; script and a log file named &amp;lt;tt&amp;gt;compilation_log.txt&amp;lt;/tt&amp;gt; that records what &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; did in its last run. If you wish to update, say, {{simgear source&lt;br /&gt;
| text = SimGear&lt;br /&gt;
}}, {{flightgear source&lt;br /&gt;
| text = FlightGear&lt;br /&gt;
}} and {{fgdata source&lt;br /&gt;
| text = FGData&lt;br /&gt;
}}, simply execute this:&lt;br /&gt;
 $ download_and_compile.sh -pn SIMGEAR FGFS DATA&lt;br /&gt;
We'll explain the &amp;lt;code&amp;gt;-pn&amp;lt;/code&amp;gt; in a minute. &amp;lt;tt&amp;gt;SIMGEAR&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;FGFS&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;DATA&amp;lt;/tt&amp;gt; are called ''components'' in &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; terminology. A component generally corresponds to a software repository, or something close. In fact, since &amp;lt;tt&amp;gt;SIMGEAR&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;FGFS&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;DATA&amp;lt;/tt&amp;gt; are often precisely the components people wish to update, they form the default components set, so that the previous command is equivalent to:&lt;br /&gt;
 $ download_and_compile.sh -pn&lt;br /&gt;
Now about this &amp;lt;code&amp;gt;-pn&amp;lt;/code&amp;gt;. It is equivalent to &amp;lt;code&amp;gt;-p n&amp;lt;/code&amp;gt; and means “don't install packages from my (Linux) distribution” (&amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; means ''yes, please install'', &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; means ''no, don't install''). In case you forgot that, simply run:&lt;br /&gt;
 $ download_and_compile.sh --help&lt;br /&gt;
What does it imply to pass &amp;lt;code&amp;gt;-pn&amp;lt;/code&amp;gt;? This tells &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; to completely skip the step where it checks for needed packages from your distribution and installs them, by default using &amp;lt;tt&amp;gt;apt-get&amp;lt;/tt&amp;gt;. It thus goes straight to the following steps:&lt;br /&gt;
* update each repository corresponding to one of the selected components (&amp;lt;tt&amp;gt;SIMGEAR&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;FGFS&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;DATA&amp;lt;/tt&amp;gt; in our example);&lt;br /&gt;
* compile each selected component that requires compilation;&lt;br /&gt;
* install each selected component in the appropriate place (under &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; according to our [[#getting-started-with-download-and-compile-sh-notations|Notations]]).&lt;br /&gt;
In case you don't have all required dependencies for the selected components, one of them is likely to fail, of course, since by passing &amp;lt;code&amp;gt;-pn&amp;lt;/code&amp;gt; to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;, you forbid it to install these dependencies for you. So, you can also very well update without passing the &amp;lt;code&amp;gt;-pn&amp;lt;/code&amp;gt; option, it will simply take a little longer (the time to check if all dependencies of the selected components are available with &amp;lt;tt&amp;gt;APT&amp;lt;/tt&amp;gt;). In fact, this is '''what you should do if the previous &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; run failed:''' first update &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; (see [[#getting-download-and-compile-sh-using-an-fgmeta-clone|above]]) then run it ''without'' &amp;lt;code&amp;gt;-pn&amp;lt;/code&amp;gt;&amp;lt;ref name=&amp;quot;passing-no-pn-option-equals-passing-py&amp;quot;&amp;gt;Which is the same as passing &amp;lt;code&amp;gt;-py&amp;lt;/code&amp;gt;.&amp;lt;/ref&amp;gt; in case new dependencies have been recently added and you don't have them on your system yet—this would be a very likely cause for the failure.&lt;br /&gt;
&lt;br /&gt;
'''Summary'''&lt;br /&gt;
&lt;br /&gt;
Routine update:&lt;br /&gt;
 $ download_and_compile.sh -pn ''COMPONENT...''&lt;br /&gt;
In case this fails, first update &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; (see [[#getting-download-and-compile-sh-using-an-fgmeta-clone|above]]), then run&lt;br /&gt;
 $ download_and_compile.sh ''COMPONENT...''&lt;br /&gt;
where ''COMPONENT...'' stands for the space-separated list of selected components, and defaults to &amp;lt;tt&amp;gt;SIMGEAR FGFS DATA&amp;lt;/tt&amp;gt; if you don't specify any.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;examining-download-and-compile-sh-history&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Examining the history of &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Looking at the latest commits that affected &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is quite easy with your FGMeta clone:&lt;br /&gt;
 $ cd ~/flightgear/fgmeta&lt;br /&gt;
 $ git log -- download_and_compile.sh&lt;br /&gt;
(then quit by typing &amp;lt;tt&amp;gt;q&amp;lt;/tt&amp;gt;, assuming your &amp;lt;tt&amp;gt;$GIT_PAGER&amp;lt;/tt&amp;gt; is &amp;lt;tt&amp;gt;less&amp;lt;/tt&amp;gt;)&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order to do the same, but also see the patch for each commit:&lt;br /&gt;
 $ cd ~/flightgear/fgmeta&lt;br /&gt;
 $ git log -p -- download_and_compile.sh&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;span id=&amp;quot;list-of-available-components&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; List of available components ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; script is able to download, compile (when applicable) and install the following components:&lt;br /&gt;
&lt;br /&gt;
* ATCPIE (for the [[ATC-pie]] air traffic control simulation program)&lt;br /&gt;
* CMAKE (for the [https://cmake.org/ CMake] build tool—this can be useful in case CMake is too old in your distribution)&lt;br /&gt;
* DATA (for [[FGData]], the main set of data files used by FlightGear)&lt;br /&gt;
* FGFS (for FlightGear itself)&lt;br /&gt;
* FGO (for the [[FGo!]] FlightGear launcher)&lt;br /&gt;
* FGRUN (for the [[Fgrun|FGRun]] FlightGear launcher)&lt;br /&gt;
* FGX (for the [[FGX|FGx]] FlightGear launcher&amp;lt;ref name=&amp;quot;note-on-the-status-of-FGx-support-in-download-and-compile-sh&amp;quot;&amp;gt;Support for FGx in &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; would probably benefit from a code review.&amp;lt;/ref&amp;gt;)&lt;br /&gt;
* OPENRADAR (for the [[OpenRadar]] air traffic control simulation program)&lt;br /&gt;
* OPENRTI (for [[FlightGear HLA support (High Level Architecture)#OpenRTI | OpenRTI]]&amp;lt;ref name=&amp;quot;note-on-the-status-of-OpenRTI-support-in-FG&amp;quot;&amp;gt;Note that OpenRTI is just an optional dependency for [[FlightGear high-level architecture support | HLA support]]. For the time being, you should be just fine building without it. Eventually, the idea is for HLA to replace the existing MP system and even increasingly distribute the FlightGear architecture such that more and more components can be more easily run in separate threads or even separate processes, possibly even on different machines. So this is going to be an important feature for professional users, using several computers and screens to create a comprehensive and immersive simulation environment.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
At the moment, it is probably safe to say that HLA is only of interest to developers and people willing to play with experimental features.&amp;lt;/ref&amp;gt;)&lt;br /&gt;
* OSG (for the [[OpenSceneGraph]] library)&lt;br /&gt;
* PLIB (for the [[PLIB]] library)&lt;br /&gt;
* SIMGEAR (for the [[SimGear]] library—foundation for FlightGear and TerraGear)&lt;br /&gt;
* TERRAGEAR (for the [[TerraGear]] terrain building toolchain)&lt;br /&gt;
* TERRAGEARGUI (for [[TerraGear GUI]], a graphical interface for TerraGear)&lt;br /&gt;
&lt;br /&gt;
Each of the items listed above is a ''component'' in &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; terminology. Components are written in uppercase by convention.&lt;br /&gt;
&lt;br /&gt;
{{Note|The preceding list might not be up-to-date. The up-to-date list of components supported by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; can always be obtained by running &amp;lt;code&amp;gt;download_and_compile.sh --help&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
What is the point of knowing this? Because you may pass component names to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; in order to tell it what you want to download, build and install. By default, only the three essential components SIMGEAR, FGFS and DATA are taken care of, which means that the command:&lt;br /&gt;
 $ download_and_compile.sh&lt;br /&gt;
is equivalent to:&lt;br /&gt;
 $ download_and_compile.sh SIMGEAR FGFS DATA&lt;br /&gt;
&lt;br /&gt;
In case you want to do the same build with just [[OpenSceneGraph]] added, you can use:&lt;br /&gt;
 $ download_and_compile.sh SIMGEAR FGFS DATA OSG&lt;br /&gt;
&lt;br /&gt;
You get the idea. When several components are passed on the same command line, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; chooses a reasonable order for processing, so don't worry about that.&lt;br /&gt;
&lt;br /&gt;
== When building 'next', you may see build errors ==&lt;br /&gt;
&lt;br /&gt;
Keeping in mind that this script compiles sometimes bleeding edge software, it can happen that what was successfully compiling last week, does not compile anymore today. Building the stable version should always work, unless there is a problem with the script.&lt;br /&gt;
&lt;br /&gt;
That said, don't be too afraid of building the development version (called ''next''): this is the one developers use all the time, so kindly asking on the flightgear-devel [[Mailing_lists|mailing list]] in case a problem popped up&amp;lt;ref name=&amp;quot;what-to-provide-when-asking-for-help&amp;quot;&amp;gt;Don't forget in this case to precisely tell what you did and include the &amp;lt;tt&amp;gt;compilation_log.txt&amp;lt;/tt&amp;gt; file written by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;.&amp;lt;/ref&amp;gt; should allow you to find good advice and get the problem quickly fixed, if it's a new one. Conversely, probably not many people (in 2019) build themselves the “stable” version of FlightGear. People who want the stable version can usually have it from their distribution, this is generally easier. On the other hand, those running &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; typically want to build the latest code that FlightGear developers are working on; this is useful when you want to contribute feedback, code, aircraft or scenery based on recent technology, or just want to enjoy the latest features and bugs. ;-)&lt;br /&gt;
&lt;br /&gt;
== Task-specific instructions ==&lt;br /&gt;
&lt;br /&gt;
{{Note|In this section, we assume you've read and followed the advice given in [[#getting-started-with-download-and-compile-sh|Getting started with &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;]].}}&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;selecting-the-components-to-work-on&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Selecting the components to build ===&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; downloads or updates, then compiles, [[SimGear]] and FlightGear, and downloads or updates [[FGData]] (by nature, FGData can't be compiled). This is what happens when running:&lt;br /&gt;
 $ download_and_compile.sh&lt;br /&gt;
The preceding command is therefore equivalent to:&lt;br /&gt;
 $ download_and_compile.sh SIMGEAR FGFS DATA&lt;br /&gt;
&lt;br /&gt;
To make &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; take care of other programs or libraries, use non-option arguments naming the ''components'' you want, for instance:&lt;br /&gt;
 $ download_and_compile.sh SIMGEAR FGFS DATA OSG&lt;br /&gt;
SIMGEAR, FGFS, DATA and OSG are the component names respectively corresponding to [[SimGear]], FlightGear, [[FGData]] and [[OpenSceneGraph]] in &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;'s terminology.&lt;br /&gt;
&lt;br /&gt;
A [[#list-of-available-components|list of available components]] is provided on this page, but the fully up-to-date list can always be obtained by running &amp;lt;code&amp;gt;download_and_compile.sh --help&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Choosing between stable and development versions ===&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; fetches code and data from development branches of the source repositories (which sometimes causes compilation or runtime errors). However, it is possible to tell the script to download the latest ”stable” version of each component, for some suitable definition of “stable”. This is by means of the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; option:&lt;br /&gt;
 $ download_and_compile.sh -s ''COMPONENT1 COMPONENT2...''&lt;br /&gt;
&lt;br /&gt;
How does it work?&lt;br /&gt;
* For [[SimGear]], FlightGear and [[FGData]], it uses the most recent stable release branch of the corresponding Git repository.&lt;br /&gt;
* For some components, a known-stable version is hardcoded in &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; and used when the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; option is given&amp;lt;ref name=&amp;quot;components-with-a-known-stable-version-hardcoded-in-download_and_compile_sh&amp;quot;&amp;gt;As of May 2019, apart from SIMGEAR, FGFS and DATA, the only components for which &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; “knows” a stable version are TERRAGEAR and OPENRTI.&amp;lt;/ref&amp;gt; (for instance, the hardcoded information can be the name of a Git branch).&lt;br /&gt;
* For the other components, the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; option has no effect.&lt;br /&gt;
&lt;br /&gt;
{{Warning|In a given folder where &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is run, you should either always use the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; option, or never. Building some components with &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; and others without (all within the same base folder) is not supported.}}&lt;br /&gt;
&lt;br /&gt;
Applying what we just said to the FGFS component (FlightGear) leaves us with two main options:&lt;br /&gt;
* build the latest stable release;&lt;br /&gt;
* build the current development version (bleeding edge), which lives in the {{flightgear source&lt;br /&gt;
| branch = next&lt;br /&gt;
| text = next&lt;br /&gt;
}} branch of the FlightGear repository.&lt;br /&gt;
&lt;br /&gt;
==== Building the latest stable FlightGear release ====&lt;br /&gt;
&lt;br /&gt;
When executing &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;, use the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; option to build the latest stable release: &lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ download_and_compile.sh -s&lt;br /&gt;
&lt;br /&gt;
{{Note|If you decide to use the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; option in a given directory tree, you should use it for all components in that directory tree (SIMGEAR, FGFS, DATA, etc.). Running &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; in a given directory with the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; option for some components and not for others is not supported.}}&lt;br /&gt;
&lt;br /&gt;
==== Building the current FlightGear development version ====&lt;br /&gt;
&lt;br /&gt;
When executing &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; without any option, the development version of every selected component is built:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ download_and_compile.sh&lt;br /&gt;
(In this example, the implicitly-selected components are SIMGEAR, FGFS and DATA, as explained [[#selecting-the-components-to-work-on | above]].)&lt;br /&gt;
&lt;br /&gt;
{{Note|The development version of FlightGear changes on an almost daily basis. It provides the latest features, but is not guaranteed to always work reliably. If you don't want to take the risk of finding new bugs when updating, you may prefer to use the latest stable release.}}&lt;br /&gt;
&lt;br /&gt;
=== Passing custom arguments to CMake ===&lt;br /&gt;
&lt;br /&gt;
Sometimes, when building a program, you may want to enable a feature that is not enabled by default, or disable a feature that is enabled by default. With recent versions of &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; (April 2019 or later), the environment variables &amp;lt;tt&amp;gt;SG_CMAKEARGS&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;FG_CMAKEARGS&amp;lt;/tt&amp;gt; allow one to do that for SimGear and FlightGear. For instance, in order to link SimGear with the system Expat library, you can do:&lt;br /&gt;
 $ SG_CMAKEARGS='-DSYSTEM_EXPAT=ON' download_and_compile.sh SIMGEAR&lt;br /&gt;
Similarly, disabling HID-based input when building FlightGear can be achieved this way:&lt;br /&gt;
 $ FG_CMAKEARGS='-DENABLE_HID_INPUT=OFF' download_and_compile.sh FGFS&lt;br /&gt;
&lt;br /&gt;
{{Note|Such options are typically defined in &amp;lt;tt&amp;gt;CMakeLists.txt&amp;lt;/tt&amp;gt; files, for example {{simgear source&lt;br /&gt;
| path = CMakeLists.txt&lt;br /&gt;
| text = here&lt;br /&gt;
}} for SimGear and {{flightgear source&lt;br /&gt;
| path = CMakeLists.txt&lt;br /&gt;
| text = here&lt;br /&gt;
}} for FlightGear.}}&lt;br /&gt;
&lt;br /&gt;
This can be useful for instance to work around bugs in a part of SimGear or FlightGear that you don't need, but causes a build or runtime failure (see {{forum link|t=35740|text=here}} for example). This is often convenient when using the development version of FlightGear, but doesn't mean such bugs shouldn't be reported!&lt;br /&gt;
&lt;br /&gt;
If you have several such options to pass, just use spaces to separate them inside the quotes:&lt;br /&gt;
 $ FG_CMAKEARGS='-DENABLE_SWIFT=ON -DENABLE_HID_INPUT=OFF' download_and_compile.sh FGFS&lt;br /&gt;
Of course, the same thing can also be achieved this way in Bourne-style shells:&lt;br /&gt;
 $ export FG_CMAKEARGS='-DENABLE_SWIFT=ON -DENABLE_HID_INPUT=OFF'&lt;br /&gt;
 $ download_and_compile.sh FGFS&lt;br /&gt;
&lt;br /&gt;
It is also possible to set both &amp;lt;tt&amp;gt;SG_CMAKEARGS&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;FG_CMAKEARGS&amp;lt;/tt&amp;gt; at the same time for a given &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; run:&lt;br /&gt;
 $ export SG_CMAKEARGS='-DSYSTEM_EXPAT=ON'&lt;br /&gt;
 $ export FG_CMAKEARGS='-DENABLE_SWIFT=ON -DENABLE_HID_INPUT=OFF'&lt;br /&gt;
 $ download_and_compile.sh&lt;br /&gt;
&lt;br /&gt;
=== Launching FlightGear ===&lt;br /&gt;
&lt;br /&gt;
When using &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;, apart from those installed with the package manager, the FlightGear dependencies (which are typically libraries) are not installed system-wide but under the directory from which &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; was run. This makes it possible to easily use, for instance, different [[OpenSceneGraph]], [[SimGear]] and FlightGear versions on a single system—e.g., for testing purposes—but also to have separate build trees (optimized/debug). This is also why you either need to set LD_LIBRARY_PATH to run the built programs, or simply use the scripts created by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; in the directory where it is run, such as &amp;lt;tt&amp;gt;run_fgfs.sh&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;run_fgfs_debug.sh&amp;lt;/tt&amp;gt;: these scripts automatically set up the required environment variables according to your build settings before firing the desired program (e.g., &amp;lt;tt&amp;gt;fgfs&amp;lt;/tt&amp;gt;) with the arguments you provided. &lt;br /&gt;
&lt;br /&gt;
Therefore, the simplest way to run a FlightGear program built by &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is to launch the &amp;lt;tt&amp;gt;run_fgfs.sh&amp;lt;/tt&amp;gt; script that &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; created in the directory from which it was run, for example:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ ./run_fgfs.sh --launcher&lt;br /&gt;
&lt;br /&gt;
{{Note|&amp;lt;code&amp;gt;./run_fgfs.sh --launcher&amp;lt;/code&amp;gt; starts FlightGear with its built-in launcher. If you just do &amp;lt;code&amp;gt;./run_fgfs.sh&amp;lt;/code&amp;gt;, FlightGear will be started without any launcher, at the default airport and with the default aircraft.}}&lt;br /&gt;
&lt;br /&gt;
In order to start FlightGear without any launcher, at a given airport (say, [https://en.wikipedia.org/wiki/Paro_Airport Paro airport], whose ICAO code is VQPR) and with a chosen aircraft, you can do:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ ./run_fgfs.sh --airport=VQPR --aircraft=dhc6&lt;br /&gt;
Actually, the directory change is not needed, we only gave it here for readability. Therefore, the following single command does the same:&lt;br /&gt;
 $ ~/flightgear/dnc-managed/run_fgfs.sh --airport=VQPR --aircraft=dhc6&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;span id=&amp;quot;avoiding-multiple-downloads-of-fgdata&amp;quot;&amp;gt;&amp;lt;/span&amp;gt; Avoiding multiple downloads of FGData ===&lt;br /&gt;
&lt;br /&gt;
Some people use &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; to maintain several directory trees such as the tree starting at &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt; in [[#getting-started-with-download-and-compile-sh|Getting started with &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;]] (this can be useful if you want to have one tree with programs compiled in Release mode and another tree where they are built in Debug mode, for instance). This can easily be done by running &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; in each of the directories. But since [[FGData]] is so large, it may be tempting to share a single instance of this repository among several trees. This is not officially supported, but apparently can be made to work with symbolic links.&lt;br /&gt;
&lt;br /&gt;
Let's show how this can be done on an example. Suppose your master copy of FGData is in &amp;lt;tt&amp;gt;~/flightgear/dnc-managed/install/flightgear/fgdata&amp;lt;/tt&amp;gt;. Then the following appears to work:&lt;br /&gt;
 $ mkdir -p ~/flightgear/other-dnc-managed-tree/install/flightgear&lt;br /&gt;
 $ cd ~/flightgear/other-dnc-managed-tree/install/flightgear&lt;br /&gt;
 $ ln -s ../../../dnc-managed/install/flightgear/fgdata&lt;br /&gt;
 $ cd ~/flightgear/other-dnc-managed-tree&lt;br /&gt;
 $ download_and_compile.sh&lt;br /&gt;
&lt;br /&gt;
The last of these commands will use and update the FGData repository present in &amp;lt;tt&amp;gt;~/flightgear/dnc-managed/install/flightgear/fgdata&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Warning|This can only work simply if all trees that share a given FGData repository are from the same release (e.g., current stable or development). Running a “stable“ FlightGear with FGData from the ''next'' branch or the other way round, a development version of FlightGear with FGData from a release branch, doesn't work—and FlightGear should tell you when you start it in such a situation.&lt;br /&gt;
&lt;br /&gt;
That said, people comfortable with Git can check out the correct FGData branch before building or starting FlightGear, for instance:&lt;br /&gt;
 $ cd /path/to/fgdata &amp;amp;&amp;amp; git checkout release/2019.1&lt;br /&gt;
or&lt;br /&gt;
 $ cd /path/to/fgdata &amp;amp;&amp;amp; git checkout next&lt;br /&gt;
So, this is possible but somewhat acrobatic. You've been warned.}}&lt;br /&gt;
&lt;br /&gt;
Note: there is a [[Avoiding multiple downloads of FGData on Linux|wiki article about this subject]], but it is severely outdated as of April 2019.&lt;br /&gt;
&lt;br /&gt;
== Additional programs ==&lt;br /&gt;
&lt;br /&gt;
{{Note|In this section, we assume you've read and followed the advice given in [[#getting-started-with-download-and-compile-sh|Getting started with &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;]].}}&lt;br /&gt;
&lt;br /&gt;
If you wish to get other programs (precisely: download, build and install them), you need to launch &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; with the desired component names as arguments. For instance:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ download_and_compile.sh SIMGEAR FGFS DATA OSG&lt;br /&gt;
&lt;br /&gt;
See [[#list-of-available-components|above]] for the list of available components.&lt;br /&gt;
&lt;br /&gt;
=== TerraGear ===&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; with the TERRAGEAR component in order to build and install the [[TerraGear]] terrain building toolchain:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ download_and_compile.sh TERRAGEAR&lt;br /&gt;
&lt;br /&gt;
This creates the following scripts in &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt;:&lt;br /&gt;
* &amp;lt;tt&amp;gt;run_genapts850.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;run_ogr-decode.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;run_tg-construct.sh&amp;lt;/tt&amp;gt;&lt;br /&gt;
These scripts themselves run the corresponding TerraGear tools, as expected.&lt;br /&gt;
&lt;br /&gt;
=== TerraGear GUI ===&lt;br /&gt;
&lt;br /&gt;
[[TerraGear GUI]] is a graphical interface for [[TerraGear]] written with the Qt toolkit (still Qt 4 in 2019, but it works). In order to install it, run &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; with the TERRAGEARGUI component:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ download_and_compile.sh TERRAGEARGUI&lt;br /&gt;
This will create a &amp;lt;tt&amp;gt;run_terrageargui.sh&amp;lt;/tt&amp;gt; script in &amp;lt;tt&amp;gt;~/flightgear/dnc-managed&amp;lt;/tt&amp;gt;, and also a default configuration file &amp;lt;tt&amp;gt;~/.config/TerraGear/TerraGearGUI.conf&amp;lt;/tt&amp;gt;, unless you already have one. This default configuration file contains paths to the TerraGear and [[$FG_ROOT]] directories, assuming you have installed the TERRAGEAR and DATA components.&lt;br /&gt;
&lt;br /&gt;
To run TerraGear GUI:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ ./run_terrageargui.sh&lt;br /&gt;
&lt;br /&gt;
=== FGCom ===&lt;br /&gt;
&lt;br /&gt;
{{Note|[[FGCom]] has been integrated into FlightGear long ago, therefore the following is not needed in general.}}&lt;br /&gt;
&lt;br /&gt;
[[FGCom]] is the system used by FlightGear to simulate radio communications between users. It is automatically built and installed when you tell &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; to take care of the FGFS component. You can launch the standalone FGCom program by using the &amp;lt;tt&amp;gt;run_fgcom.sh&amp;lt;/tt&amp;gt; script:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ ./run_fgcom.sh&lt;br /&gt;
&lt;br /&gt;
=== FGRun ===&lt;br /&gt;
&lt;br /&gt;
{{Note|As of 2019, FGRun has been superseded by the [[FlightGear Qt launcher|FlightGear built-in launcher]]. The built-in launcher is the most actively maintained launcher for FlightGear. Other launchers are [[FFGo]] and [[FGX|FGx]].}}&lt;br /&gt;
&lt;br /&gt;
[[File:fgrun-page2.jpg|thumb|right]]&lt;br /&gt;
Before FlightGear had its built-in launcher (the one you get with &amp;lt;code&amp;gt;run_fgfs.sh --launcher&amp;lt;/code&amp;gt;), many users found comfortable having FlightGear launched by the graphical utility [[Fgrun|FGRun]]. This program is built and installed when &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is run with the FGRUN component. You then have to launch the &amp;lt;tt&amp;gt;run_fgrun.sh&amp;lt;/tt&amp;gt; command, for example:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ ./run_fgrun.sh&lt;br /&gt;
&lt;br /&gt;
FGRun will save its settings in &amp;lt;tt&amp;gt;~/.fltk/flightgear.org/fgrun.prefs&amp;lt;/tt&amp;gt;. You may want to save copies of the preferences customized for stable and next.&lt;br /&gt;
&lt;br /&gt;
=== FGo! ===&lt;br /&gt;
&lt;br /&gt;
{{Note|As of 2019, FGo! is not maintained anymore. You may want to try the built-in launcher (started with &amp;lt;code&amp;gt;run_fgfs.sh --launcher&amp;lt;/code&amp;gt;) or [[FFGo]].}}&lt;br /&gt;
&lt;br /&gt;
[[File:Fgo01.jpg|thumb|left]]&lt;br /&gt;
FGo! is a graphical utility written in [[python]]. It is downloaded and installed when &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; is run with the FGO component. You then have to launch the &amp;lt;tt&amp;gt;run_fgo.sh&amp;lt;/tt&amp;gt; command, for example:&lt;br /&gt;
 $ cd ~/flightgear/dnc-managed&lt;br /&gt;
 $ ./run_fgo.sh&lt;br /&gt;
&lt;br /&gt;
Remember that the first time you run it, you have to go to open the ''Preferences'' dialog and set the paths to the &amp;lt;tt&amp;gt;fgfs&amp;lt;/tt&amp;gt; executable and to FGData.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Compilation errors ===&lt;br /&gt;
Here we are, no fear, if you wish to use programs from the cvs/svn/git repositories, you might face compilation errors that will prevent you to have a working copy of one or more of the programs provided by this script. What can be the causes that prevent us from successfully compiling? As far as I know those:&lt;br /&gt;
# Software developers introduce a new functionality with a new piece of code that prevents the compilation under your architecture, this can happen working with cvs/svn/git sources.&lt;br /&gt;
# The program refuses to compile because of a divergence in the libraries on which it depends. For example FlightGear might not compile because OSG has been modified, while OSG itself compiles fine, FG won't.&lt;br /&gt;
# One or more repositories are down and you can't get the library you need. (Both from cvs/svn/git or apt-get)&lt;br /&gt;
&lt;br /&gt;
There is a simple solution to the above errors: wait and relaunch the script after some time (hours or days), if software developers repair or synchronize their code with the newly updated libraries (which generally happens eventually), your FlightGear will compile fine as if the previous error never took place.&lt;br /&gt;
&lt;br /&gt;
Sometimes it happens that the script fails to compile only [[Fgrun|FGRun]], [[FGCom]] or atlas, if you then see the run_fgfs.sh file it means that FlightGear installation was successful and you can safely run it.&lt;br /&gt;
&lt;br /&gt;
=== OpenRTI undefined reference errors ===&lt;br /&gt;
Sometimes due to the way d&amp;amp;c build cleans up projects, linking errors might occur, this is the case with this error &amp;quot;libRTI-NG.so: undefined reference to xxx&amp;quot;, sadly at this point either you need to patch the d&amp;amp;c script to clean OpenRTI with &amp;lt;code&amp;gt;rm -f CMakeCache.txt &amp;amp;&amp;amp; rm -rf CMakeFiles/&amp;lt;/code&amp;gt;, or just start from a clean environment, assuming you are in the parent project directory, you will need to issue this command to clean everything (except FGData):&lt;br /&gt;
 $ rm -rf build/* install/simgear/ install/openrti/ install/flightgear/share/ install/flightgear/bin/&lt;br /&gt;
&lt;br /&gt;
See {{forum link|t=26244|text=this thread}} for more details.&lt;br /&gt;
&lt;br /&gt;
== Options ==&lt;br /&gt;
&lt;br /&gt;
=== Multicore acceleration ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Passing option &amp;lt;code&amp;gt;-j x&amp;lt;/code&amp;gt; to &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt; (where ''x'' is the number of your CPU cores you wish to assign to the job) will considerably speed up the compilation steps.&lt;br /&gt;
&lt;br /&gt;
=== Advanced options ===&lt;br /&gt;
&lt;br /&gt;
* Build a release version: &amp;lt;code&amp;gt;-b Release&amp;lt;/code&amp;gt;&lt;br /&gt;
* Build a version that should run as fast as a release build, yet has debug information that can be used to post backtraces: &amp;lt;code&amp;gt;-b RelWithDebInfo&amp;lt;/code&amp;gt; (this is the default)&lt;br /&gt;
* Build a full debug version for very complete bug reporting: &amp;lt;code&amp;gt;-b Debug&amp;lt;/code&amp;gt;&lt;br /&gt;
* Skip download of distro packages (i.e., by default: &amp;lt;tt&amp;gt;apt-get install ...&amp;lt;/tt&amp;gt;): &amp;lt;code&amp;gt;-p n&amp;lt;/code&amp;gt;&lt;br /&gt;
* Skip retrieving of software updates (i.e., by default: &amp;lt;tt&amp;gt;apt-get update&amp;lt;/tt&amp;gt;): &amp;lt;code&amp;gt;-d n&amp;lt;/code&amp;gt;&lt;br /&gt;
* Skip the configure step (like running [https://cmake.org/ CMake] or [https://www.gnu.org/software/autoconf/ autoconf]'s &amp;lt;tt&amp;gt;./configure&amp;lt;/tt&amp;gt;): &amp;lt;code&amp;gt;-r n&amp;lt;/code&amp;gt;&lt;br /&gt;
* Skip compilation of programs: &amp;lt;code&amp;gt;-c n&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
For example, if you are a developer and wish to quickly recompile and reinstall only your own modifications for FlightGear, you can do this:&lt;br /&gt;
 $ download_and_compile.sh -p n -d n -r n FGFS&lt;br /&gt;
&lt;br /&gt;
Note that this is the same as:&lt;br /&gt;
 $ download_and_compile.sh -pn -dn -rn FGFS&lt;br /&gt;
&lt;br /&gt;
This command will only rebuild modified files and reinstall FlightGear. Note that depending on the kind of changes you made, reconfiguring and thus dropping the &amp;lt;code&amp;gt;-d n&amp;lt;/code&amp;gt; option may be necessary, though (this is the case in particular if you added or removed C++ files).&lt;br /&gt;
&lt;br /&gt;
== Optimus technology ==&lt;br /&gt;
If your computer has a GPU with Optimus technology, you need a dedicated script in order to make FlightGear run with the powerful GPU.&lt;br /&gt;
&lt;br /&gt;
After having installed required tools (Bumblebee) you just need to run this command line in your FlightGear installation directory (where you executed &amp;lt;tt&amp;gt;download_and_compile.sh&amp;lt;/tt&amp;gt;):&lt;br /&gt;
 $ sed  's|\./fgfs|optirun ./fgfs|' run_fgfs.sh &amp;gt; run_fgfs_optirun.sh &amp;amp;&amp;amp; chmod +x run_fgfs_optirun.sh&lt;br /&gt;
Now you can run FlightGear with &amp;lt;code&amp;gt;./run_fgfs_optirun.sh&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The same can be done for the [[FlightGear_Launch_Control|FGRun]] launcher:&lt;br /&gt;
 $ sed  's|\./fgrun|optirun ./fgrun|' run_fgrun.sh &amp;gt; run_fgrun_optirun.sh &amp;amp;&amp;amp; chmod +x run_fgrun_optirun.sh&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* {{fgmeta source&lt;br /&gt;
| path = compile-scripts&lt;br /&gt;
| text = Other FlightGear build scripts&lt;br /&gt;
}} present in [[FGMeta]]&lt;br /&gt;
* {{fgmeta source&lt;br /&gt;
| path = fg-from-scratch&lt;br /&gt;
| simplepath = true&lt;br /&gt;
}}&lt;br /&gt;
* [http://geoffmclane.com/fg/fgfs-052.htm Another script] for building FlightGear and all its dependencies in an automated fashion. The page seems a bit oldish, though (as of 2019).&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Building from source]]&lt;br /&gt;
&lt;br /&gt;
[[fr:Script de compilation sous Linux Debian/Ubuntu]]&lt;br /&gt;
[[nl:Compileren met een Script op Linux Debian/Ubuntu]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Talk:Zeppelin_LZ_121_Nordstern&amp;diff=119783</id>
		<title>Talk:Zeppelin LZ 121 Nordstern</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Talk:Zeppelin_LZ_121_Nordstern&amp;diff=119783"/>
		<updated>2019-08-13T22:19:28Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Engine Management */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Engine Management ====&lt;br /&gt;
How do you start the engines?&lt;br /&gt;
[[User:Wkitty42|Wkitty42]] ([[User talk:Wkitty42|talk]]) 09:26, 13 August 2019 (EDT)&lt;br /&gt;
&lt;br /&gt;
Last time I tried it was by setting magnetos, mixture rich and run the starter. Possibly I needed to increase the throttle quite a bit too? There are no special parts coded for. [[User:AndersG|AndersG]] ([[User talk:AndersG|talk]]) 15:13, 13 August 2019 (EDT)&lt;br /&gt;
&lt;br /&gt;
i'll have to try playing with it some more... i had trouble with the Zeppelin NT but did get it started after i wrote on its talk page... i forget exactly what i had to do but it was increasing the throttle or something more than i had already increased it... that was several hours ago and i've forgotten now... the engines do seem to take some cranking over for a bit before they do start...&lt;br /&gt;
[[User:Wkitty42|Wkitty42]] ([[User talk:Wkitty42|talk]]) 18:19, 13 August 2019 (EDT)&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Talk:Zeppelin_NT&amp;diff=119724</id>
		<title>Talk:Zeppelin NT</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Talk:Zeppelin_NT&amp;diff=119724"/>
		<updated>2019-08-13T13:54:57Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: how do you start the engines?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Engine Management ====&lt;br /&gt;
How do you start the engines?&lt;br /&gt;
[[User:Wkitty42|Wkitty42]] ([[User talk:Wkitty42|talk]]) 09:54, 13 August 2019 (EDT)&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Talk:Zeppelin_LZ_121_Nordstern&amp;diff=119723</id>
		<title>Talk:Zeppelin LZ 121 Nordstern</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Talk:Zeppelin_LZ_121_Nordstern&amp;diff=119723"/>
		<updated>2019-08-13T13:26:57Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: how do you start the engines?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==== Engine Management ====&lt;br /&gt;
How do you start the engines?&lt;br /&gt;
[[User:Wkitty42|Wkitty42]] ([[User talk:Wkitty42|talk]]) 09:26, 13 August 2019 (EDT)&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=119363</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=119363"/>
		<updated>2019-07-02T21:05:38Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: move HUD options to HUD section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]].&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== General Options ====&lt;br /&gt;
&lt;br /&gt;
 --help, -h                   Show the most relevant command line options&lt;br /&gt;
 --verbose, -v                Show all command line options when combined with --help or -h&lt;br /&gt;
 --fg-root=path               Specify the root data path&lt;br /&gt;
 --fg-scenery=path[:path...]  Specify the base scenery path;&lt;br /&gt;
                                Defaults to [[$FG_ROOT]]/Scenery&lt;br /&gt;
 --fg-aircraft=path           Specify additional aircraft directory path(s)&lt;br /&gt;
                                (alternatively, you can use --aircraft-dir to&lt;br /&gt;
                                target a specific aircraft in a given&lt;br /&gt;
                                directory)&lt;br /&gt;
 --language=code              Select the language for this session&lt;br /&gt;
 --launcher                   Enable Qt launcher &lt;br /&gt;
 --disable-splash-screen      Disable splash screen&lt;br /&gt;
 --enable-splash-screen       Enable splash screen&lt;br /&gt;
 --disable-mouse-pointer      Disable extra mouse pointer&lt;br /&gt;
 --enable-mouse-pointer       Enable extra mouse pointer&lt;br /&gt;
                                (i.e. for full screen Voodoo based cards)&lt;br /&gt;
 --disable-random-objects     Exclude random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --enable-random-objects      Include random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --disable-ai-models          Disable the AI subsystem.&lt;br /&gt;
                                (This also disables showing the models of other&lt;br /&gt;
                                 multiplayer aircraft)&lt;br /&gt;
 --enable-ai-models           Enable the AI subsystem.&lt;br /&gt;
 --disable-ai-traffic         Disable the autogenerated traffic subsystem.&lt;br /&gt;
 --enable-ai-traffic          Enable the autogenerated traffic subsystem.&lt;br /&gt;
 --disable-freeze             Start in a running state&lt;br /&gt;
 --enable-freeze              Start in a frozen state&lt;br /&gt;
 --disable-fuel-freeze        Fuel is consumed normally&lt;br /&gt;
 --enable-fuel-freeze         Fuel tank quantity forced to remain constant&lt;br /&gt;
 --disable-clock-freeze       Clock advances normally&lt;br /&gt;
 --enable-clock-freeze        Do not advance clock&lt;br /&gt;
 --enable-auto-coordination   Enable auto coordination - rudder and&lt;br /&gt;
                              ailerons will be controlled together&lt;br /&gt;
 --disable-auto-coordination  Disable auto coordination (default)&lt;br /&gt;
 --browser-app=path           Specify path to your web browser&lt;br /&gt;
 --prop:foo=bar               Set property named &amp;quot;foo&amp;quot; to value &amp;quot;bar&amp;quot;&lt;br /&gt;
 --config=path                Load additional properties from path&lt;br /&gt;
 --units-feet                 Use feet for distances&lt;br /&gt;
 --units-meters               Use meters for distances&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
&lt;br /&gt;
 --disable-panel              Disable instrument panel&lt;br /&gt;
 --enable-panel               Enable instrument panel&lt;br /&gt;
 --disable-sound              Disable sound effects&lt;br /&gt;
 --enable-sound               Enable sound effects&lt;br /&gt;
 --ai-scenario=scenario       Add and enable a new scenario. Multiple options&lt;br /&gt;
                              are allowed. Scenarios are in /[[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
==== Aircraft ====&lt;br /&gt;
&lt;br /&gt;
 --aircraft=name              Select an aircraft profile as defined by a top&lt;br /&gt;
                              level -set.xml&lt;br /&gt;
 --aircraft-dir=path          Specify the exact directory to use for the&lt;br /&gt;
                              aircraft (normally not required, but may be&lt;br /&gt;
                              useful). Interpreted relatively to the&lt;br /&gt;
                              current directory. Causes the &amp;lt;path-cache&amp;gt;&lt;br /&gt;
                              from autosave_X_Y.xml, as well as&lt;br /&gt;
                              --fg-aircraft options and the FG_AIRCRAFT&lt;br /&gt;
                              environment variable to be bypassed.&lt;br /&gt;
 --show-aircraft              Print a list of the currently available&lt;br /&gt;
                              aircraft types&lt;br /&gt;
&lt;br /&gt;
==== Flight Model ====&lt;br /&gt;
&lt;br /&gt;
 --fdm=name                   Select the core flight dynamics model&lt;br /&gt;
                              Can be one of jsb, larcsim, yasim, magic,&lt;br /&gt;
                              balloon, ada, external, or null&lt;br /&gt;
 --aero=name                  Select aircraft aerodynamics model to load&lt;br /&gt;
 --model-hz=n                 Run the FDM this rate (iterations per second)&lt;br /&gt;
 --speed=n                    Run the FDM 'n' times faster than real time&lt;br /&gt;
 --notrim                     Do NOT attempt to trim the model&lt;br /&gt;
                              (only with fdm=jsbsim)&lt;br /&gt;
 --on-ground                  Start at ground level (default)&lt;br /&gt;
 --in-air                     Start in air (implied when using --altitude)&lt;br /&gt;
&lt;br /&gt;
==== Initial Position and Orientation ====&lt;br /&gt;
&lt;br /&gt;
 --airport=ID                 Specify airport (e.g. KOAK)&lt;br /&gt;
 --runway=rwy_no              Specify starting runway (must also specify an&lt;br /&gt;
                              airport)&lt;br /&gt;
 --vor=ID                     Specify starting position relative to a VOR&lt;br /&gt;
 --ndb=ID                     Specify starting position relative to an NDB&lt;br /&gt;
 --fix=ID                     Specify starting position relative to a fix&lt;br /&gt;
 --parkpos=NAME               Specify a gate at the airport (e.g. 747d11)&lt;br /&gt;
 --offset-distance=nm         Specify distance to reference point (statute&lt;br /&gt;
                              miles)&lt;br /&gt;
 --offset-azimuth=degrees     Specify heading to reference point&lt;br /&gt;
 --lon=degrees                Starting longitude (west = -)&lt;br /&gt;
 --lat=degrees                Starting latitude (south = -)&lt;br /&gt;
 --altitude=value             Starting altitude&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --heading=degrees            Specify heading (yaw) angle (Psi)&lt;br /&gt;
 --roll=degrees               Specify roll angle (Phi)&lt;br /&gt;
 --pitch=degrees              Specify pitch angle (Theta)&lt;br /&gt;
 --uBody=units_per_sec        Specify velocity along the body X axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vBody=units_per_sec        Specify velocity along the body Y axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --wBody=units_per_sec        Specify velocity along the body Z axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vc=knots                   Specify initial airspeed&lt;br /&gt;
 --mach=num                   Specify initial mach number&lt;br /&gt;
 --glideslope=degrees         Specify flight path angle (can be positive)&lt;br /&gt;
 --roc=fpm                    Specify initial climb rate (can be negative)&lt;br /&gt;
&lt;br /&gt;
==== Rendering Options ====&lt;br /&gt;
&lt;br /&gt;
 --bpp=depth                  Specify the bits per pixel&lt;br /&gt;
 --fog-disable                Disable fog/haze&lt;br /&gt;
 --fog-fastest                Enable fastest fog/haze&lt;br /&gt;
 --fog-nicest                 Enable nicest fog/haze&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --disable-enhanced-lighting  Disable enhanced runway lighting&lt;br /&gt;
 --enable-enhanced-lighting   Enable enhanced runway lighting&lt;br /&gt;
 --season=winter              Enable snow covered scenery&lt;br /&gt;
 --disable-distance-attenuation&lt;br /&gt;
                              Disable runway light distance attenuation&lt;br /&gt;
 --enable-distance-attenuation&lt;br /&gt;
                              Enable runway light distance attenuation&lt;br /&gt;
 --disable-specular-highlight&lt;br /&gt;
                              Disable specular reflections on textured&lt;br /&gt;
                              objects&lt;br /&gt;
 --enable-specular-highlight  Enable specular reflections on textured objects&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --fov=degrees                Specify field of view angle&lt;br /&gt;
 --disable-fullscreen         Disable fullscreen mode&lt;br /&gt;
 --enable-fullscreen          Enable fullscreen mode&lt;br /&gt;
 --shading-flat               Enable flat shading&lt;br /&gt;
 --shading-smooth             Enable smooth shading&lt;br /&gt;
 --disable-wireframe          Disable wireframe drawing mode&lt;br /&gt;
 --enable-wireframe           Enable wireframe drawing mode&lt;br /&gt;
 --geometry=WxH               Specify window geometry/resolution (640x480, etc)&lt;br /&gt;
 --view-offset=value          Specify the default forward view direction as&lt;br /&gt;
                              an offset from straight ahead. Allowable values&lt;br /&gt;
                              are LEFT, RIGHT, CENTER, or a specific number&lt;br /&gt;
                              in degrees&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --texture-filtering=number   Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
==== Hud Options ====&lt;br /&gt;
&lt;br /&gt;
 --disable-hud                Disable Heads Up Display (HUD)&lt;br /&gt;
 --enable-hud                 Enable Heads Up Display (HUD)&lt;br /&gt;
 --disable-anti-alias-hud     Disable anti-aliased HUD&lt;br /&gt;
 --enable-anti-alias-hud      Enable anti-aliased HUD&lt;br /&gt;
 --disable-hud-3d             Disable 3D HUD&lt;br /&gt;
 --enable-hud-3d              Enable 3D HUD&lt;br /&gt;
 --hud-tris                   Hud displays number of triangles rendered&lt;br /&gt;
 --hud-culled                 Hud displays percentage of triangles culled&lt;br /&gt;
&lt;br /&gt;
==== Time Options ====&lt;br /&gt;
&lt;br /&gt;
 --timeofday={dawn,noon,dusk,midnight}&lt;br /&gt;
                              Specify a time of day&lt;br /&gt;
 --time-offset=[+-]hh:mm:ss   Add this time offset&lt;br /&gt;
 --time-match-real            Synchronize time with current time at chosen airport&lt;br /&gt;
 --time-match-local           Synchronize time with system time of computer&lt;br /&gt;
 --start-date-sys=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              system time&lt;br /&gt;
 --start-date-gmt=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Greenwich Mean Time&lt;br /&gt;
 --start-date-lat=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Local Aircraft Time&lt;br /&gt;
&lt;br /&gt;
==== Network Options ====&lt;br /&gt;
&lt;br /&gt;
 --httpd=port                 Enable http server on the specified port&lt;br /&gt;
 --telnet=port                Enable telnet server on the specified port&lt;br /&gt;
 --jpg-httpd=port             Enable screen shot http server on the specified&lt;br /&gt;
                                port&lt;br /&gt;
&lt;br /&gt;
==== MultiPlayer Options ====&lt;br /&gt;
&lt;br /&gt;
 --callsign                   assign a unique name to a player&lt;br /&gt;
 --multiplay={in|out},hz,address,port&lt;br /&gt;
                              Specify multipilot communication settings&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
==== Route/Way Point Options ====&lt;br /&gt;
&lt;br /&gt;
 --wp=ID[@alt]                Specify a waypoint for the GC autopilot;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --flight-plan=file           Read all waypoints from a file&lt;br /&gt;
&lt;br /&gt;
==== IO Options ====&lt;br /&gt;
&lt;br /&gt;
 --generic=params             Open connection using a predefined&lt;br /&gt;
                              communication interface and a preselected&lt;br /&gt;
                              communication protocol&lt;br /&gt;
 --garmin=params              Open connection using the Garmin GPS protocol&lt;br /&gt;
 --joyclient=params           Open connection to an Agwagon joystick&lt;br /&gt;
 --jsclient=params            Open connection to a remote joystick&lt;br /&gt;
 --native-ctrls=params        Open connection using the FG Native Controls&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native-fdm=params          Open connection using the FG Native FDM&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native=params              Open connection using the FG Native protocol&lt;br /&gt;
 --nmea=params                Open connection using the NMEA protocol&lt;br /&gt;
 --opengc=params              Open connection using the OpenGC protocol&lt;br /&gt;
 --props=params               Open connection using the interactive property&lt;br /&gt;
                              manager (LEGACY/DEAD DO NOT USE same as --telnet)&lt;br /&gt;
 --pve=params                 Open connection using the PVE protocol&lt;br /&gt;
 --ray=params                 Open connection using the Ray Woodworth motion&lt;br /&gt;
                              chair protocol&lt;br /&gt;
 --rul=params                 Open connection using the RUL protocol&lt;br /&gt;
 --atc610x                    Enable atc610x interface&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: --generic=\\.\COM10,out,1,/tmp/data.xml,myproto&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
==== Avionics Options ====&lt;br /&gt;
&lt;br /&gt;
 --com1=frequency             Set the COM1 radio frequency.&lt;br /&gt;
 --com2=frequency             Set the COM2 radio frequency.&lt;br /&gt;
 --nav1=[radial:]frequency    Set the NAV1 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --nav2=[radial:]frequency    Set the NAV2 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --adf=[rotation:]frequency   Set the ADF radio frequency, optionally&lt;br /&gt;
                              preceded by a card rotation.&lt;br /&gt;
 --dme={nav1|nav2|frequency}  Slave the ADF to one of the NAV radios, or set&lt;br /&gt;
                              its internal frequency.&lt;br /&gt;
&lt;br /&gt;
==== Environment Options ====&lt;br /&gt;
&lt;br /&gt;
 --disable-real-weather-fetch Disable METAR based real weather fetching&lt;br /&gt;
 --enable-real-weather-fetch  Enable METAR based real weather fetching (this&lt;br /&gt;
                              requires an open internet connection)&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
 --random-wind&lt;br /&gt;
 --metar=&amp;quot;metar string&amp;quot;       Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
==== Situation Options ====&lt;br /&gt;
&lt;br /&gt;
 --failure={pitot|static|system|vacuum}&lt;br /&gt;
                              Fail the pitot, static, vacuum, or electrical&lt;br /&gt;
                              system (repeat the option for multiple system&lt;br /&gt;
                              failures).&lt;br /&gt;
&lt;br /&gt;
==== Debugging Options ====&lt;br /&gt;
&lt;br /&gt;
 --log-level={bulk|debug|info|warn|alert}&lt;br /&gt;
                              Set the logging level for this session.&lt;br /&gt;
                              0=verbose, 5=alerts only&lt;br /&gt;
 --pid=/pathto/some/file.pid  Write current PID into file.&lt;br /&gt;
 --trace-read=property        Trace the reads for a property;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --trace-write=property       Trace the writes for a property;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
&lt;br /&gt;
=== Source files ===&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User_talk:Wkitty42&amp;diff=118054</id>
		<title>User talk:Wkitty42</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User_talk:Wkitty42&amp;diff=118054"/>
		<updated>2019-05-03T12:53:49Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: added welcome to the wiki template&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Welcome to the wiki |name=Waldo | non-manual=foo }}&lt;br /&gt;
&lt;br /&gt;
= Welcome =&lt;br /&gt;
this is my talk page. be nice. that is all.&lt;br /&gt;
&lt;br /&gt;
--[[User:Wkitty42|Wkitty42]] ([[User talk:Wkitty42|talk]]) 08:53, 21 April 2016 (EDT)&lt;br /&gt;
&lt;br /&gt;
== Using Template:Convert ==&lt;br /&gt;
&lt;br /&gt;
while looking at the [[Lockheed_Martin_F-35B_Lightning_II]], i noted the use of units that we could automatically have converted for us using the [https://en.wikipedia.org/wiki/Template:Convert convert template] from wikipedia... i'm assuming that we can do that, right? so below is an example of how it would be used and how it would look... i've left the original entry in place for final result comparison...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
=== Performance Data ===&lt;br /&gt;
* '''Maximum Speed:''' 1,200 mph {{convert|1200|mph|kt|abbr=on}}&lt;br /&gt;
* '''Rate of climb:''' classified&lt;br /&gt;
* '''Service Ceiling:''' 60,000 ft {{convert|60000|ft|m|abbr=on}}&lt;br /&gt;
* '''Range:''' 1,200 mi {{convert|1200|mi|km|abbr=on}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::=== Performance Data ===&lt;br /&gt;
::* '''Maximum Speed:''' 1,200 mph {{convert|1200|mph|kt|abbr=on}}&lt;br /&gt;
::* '''Rate of climb:''' classified&lt;br /&gt;
::* '''Service Ceiling:''' 60,000 ft {{convert|60000|ft|m|abbr=on}}&lt;br /&gt;
::* '''Range:''' 1,200 mi {{convert|1200|mi|km|abbr=on}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strike&amp;gt;side note: i wish i could figure out how to do code tags like on the forum :( &amp;lt;/strike&amp;gt;&lt;br /&gt;
:thanks, Hooray. it ain't in the menu bar at the top so i didn't see it :)&lt;br /&gt;
:--[[User:Wkitty42|Wkitty42]] ([[User talk:Wkitty42|talk]]) 15:38, 5 September 2017 (EDT)&lt;br /&gt;
&lt;br /&gt;
:: so the other day i was doing some code stuff in this wiki and be damned if i didn't forget how to do code blocks again... i finally found another page that had the syntax-highlight or whatever tags in it and that helped a lot... those, too, needed to be added to the help thing in the editing box... there was a time on another wiki where i'd open the help in a separate window so i could ALT-Tab back and forth to see all the various editing options and then apply them to what i was entering...&lt;br /&gt;
&lt;br /&gt;
:: --[[User:Wkitty42|Wkitty42]] ([[User talk:Wkitty42|talk]]) 10:11, 4 August 2018 (EDT)&lt;br /&gt;
&lt;br /&gt;
== Creating sandboxes (user page subpages) ==&lt;br /&gt;
I saw your post mostly about page creation and sandboxes in [https://forum.flightgear.org/viewtopic.php?p=334335#p334335 this forum post].  I am very happy you asked that question (which indicates it probably can be highlighted better in the help pages).&lt;br /&gt;
&lt;br /&gt;
A sandbox is pretty much a subpage to your user page, in essence with the page name &amp;lt;code&amp;gt;User:Wkitty42/Name of subpage&amp;lt;/code&amp;gt;.  The way I usually create them  is that I search for them and then click the blue link '''[http://wiki.flightgear.org/index.php?title=User:Wkitty42/Name_of_subpage&amp;amp;action=edit Start the User:Wkitty42/Name of subpage page]''' in the page that pops up telling that there is no such page (yet).&lt;br /&gt;
&lt;br /&gt;
When using templates you are working on you will have to use template links slightly differently, as they are not in the template namespace. instead of &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Name of subpage}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; you will need to do like this &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{User:Wkitty42/Name of subpage}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you forget to link to the pages on your user page, you can try the [What links here http://wiki.flightgear.org/Special:WhatLinksHere/User_talk:Wkitty42] link in the menu on the left.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It will be interesting to see what you do with this. :-)&lt;br /&gt;
&lt;br /&gt;
—[[User:Johan G|Johan G]] ([[User_talk:Johan_G|Talk]] | [[Special:Contributions/Johan_G|contribs]]) 03:36, 4 August 2018 (EDT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:hey, Johan... yes, it probably could be hilighted better... even as a wikipedia editor at times, i've never done anything like these sandboxes... i appreciate the explanation... i guess what i should do now is to go to your page and try to find the convert template thing you did, copy it over here into a similar sandbox and then see if i can make it do the conversions like i spoke of above?&lt;br /&gt;
&lt;br /&gt;
:TBH, i don't have a clue what i would do with it other than, right now, trying this template thing ;)&lt;br /&gt;
&lt;br /&gt;
:--[[User:Wkitty42|Wkitty42]] ([[User talk:Wkitty42|talk]]) 10:01, 4 August 2018 (EDT)&lt;br /&gt;
&lt;br /&gt;
:: yeah, trying this template thing as well as a sandbox page... [[User:Wkitty42/playing with convert template|right here]]&lt;br /&gt;
&lt;br /&gt;
:: --[[User:Wkitty42|Wkitty42]] ([[User talk:Wkitty42|talk]]) 11:01, 4 August 2018 (EDT)&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Commonly_used_debugging_tools&amp;diff=117701</id>
		<title>Commonly used debugging tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Commonly_used_debugging_tools&amp;diff=117701"/>
		<updated>2019-03-30T17:05:36Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Finding fgfs.log */  removed the line saying to navigate to $FG_HOME since the full path is already given in the locations...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{stub}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are some relatively simple but '''commonly used debugging tools''' that might answer questions of for example why your installation of FlightGear will not run properly or at all, why an aircraft might have problems or why flying in a certain area always cause FlightGear crashes.&lt;br /&gt;
&lt;br /&gt;
The more useful of those tool are the console window (also known as the &amp;quot;black box&amp;quot; or confusingly the &amp;quot;command line&amp;quot;), the &amp;lt;code&amp;gt;fgfs.log&amp;lt;/code&amp;gt; file and the property browser.&lt;br /&gt;
&lt;br /&gt;
There are of course times when these will not do, and sometimes one would have to compile FlightGear from source ''and'' add some additional debugging features to find some bugs.&lt;br /&gt;
&lt;br /&gt;
== Debug level setting ==&lt;br /&gt;
Before we go any further we should mention the ''debug level'' setting (also known as ''log level'').  When FlightGear runs it will output information on various things.  As a default only things that are expected to cause troubles are output, but by setting a higher debug level more information will be shown.  At the highest debug level one can expect FlightGear to run slow due to all the debug output.&lt;br /&gt;
&lt;br /&gt;
=== Debug levels ===&lt;br /&gt;
There are five debug levels:&lt;br /&gt;
; Bulk:   Will output very frequent messages.  Using this setting might slow down FlightGear a lot, but might show problems not otherwise found.&lt;br /&gt;
; Debug:  Will output less frequent debug messages.&lt;br /&gt;
; Info:   Will output informatory messages.&lt;br /&gt;
; Warn:   Will output messages about possibly impeding problems.&lt;br /&gt;
; Alert:  Will output messages about very possibly impeding problems.  This is the default level.&lt;br /&gt;
&lt;br /&gt;
=== Setting the debug level ===&lt;br /&gt;
==== FGRun ====&lt;br /&gt;
In FGRun go to the last page click {{key press|Advanced...}} then, in the list to the left, click &amp;quot;Debug&amp;quot; and then chose the desired debug level in the list.&lt;br /&gt;
&lt;br /&gt;
==== Command line ====&lt;br /&gt;
{{note|Debug levels must be lowercase.  For example &amp;lt;code&amp;gt;debug&amp;lt;/code&amp;gt;, not &amp;lt;code&amp;gt;&amp;lt;s&amp;gt;&amp;amp;ensp;Debug&amp;amp;ensp;&amp;lt;/s&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
Add &amp;lt;code&amp;gt;--log-level=''debug level''&amp;lt;/code&amp;gt; to your command line.&lt;br /&gt;
&lt;br /&gt;
== The console window ==&lt;br /&gt;
Before FlightGear 2.6 this was always opened in a separate window when starting FlightGear through the [[FGRun]] wizard, but these days it is normally hidden and can be shown by ticking a checkbox, &amp;quot;Show command line&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== fgfs.log ==&lt;br /&gt;
The startup log file contains nearly the same information that is output on the console.&lt;br /&gt;
&lt;br /&gt;
The goal of adding the log file was to capture some debugging output in a way that is robust for users, i.e just works, and works ‘historically’, i.e is useful when a problem occurs since it was already enabled. The level is fixed at INFO because a lower level wouldn’t contain enough detail for debugging, but a higher level (SG_DEBUG) the files would be huge for a long FG session. This is my decision of course and it can be changed if people are happy with 100MB+ text files in their FG_HOME. Or we add a new option to set the file-log-level, but again the intention was for this feature to be as automatic as possible.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
  |url    =  https://sourceforge.net/p/flightgear/mailman/message/35144644/ &lt;br /&gt;
  |title  =  &amp;lt;nowiki&amp;gt; Re: [Flightgear-devel] fgfs.log &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |author =  &amp;lt;nowiki&amp;gt; James Turner &amp;lt;/nowiki&amp;gt; &lt;br /&gt;
  |date   =  Jun 8th, 2016 &lt;br /&gt;
  |added  =  Jun 8th, 2016 &lt;br /&gt;
  |script_version = 0.40 &lt;br /&gt;
  }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Finding fgfs.log ===&lt;br /&gt;
; Mac:      &amp;lt;code&amp;gt;~/Library/Application Support/FlightGear/fgfs.log&amp;lt;/code&amp;gt;&lt;br /&gt;
; Windows:  &amp;lt;code&amp;gt;C:\Users\''user name''\AppData\Roaming\flightgear.org\fgfs.log&amp;lt;/code&amp;gt;&lt;br /&gt;
; Linux:    &amp;lt;code&amp;gt;~/.fgfs/fgfs.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The property browser ==&lt;br /&gt;
{{main article|Property browser}}&lt;br /&gt;
The property browser is a tool useful for many purposes.  It might for example tell if a property is tied and can not be written to.&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
* [[Property browser]]&lt;br /&gt;
* [[Howto:Understand console output]]&lt;br /&gt;
* [[:Category:Troubleshooting]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
* [https://gitorious.org:443/fg/simgear/source/deceee899771b82b0568319863b3812b272c926d:simgear/debug/debug_types.h#L44 The debug levels as mentioned in the source code]&lt;br /&gt;
&lt;br /&gt;
[[Category:Troubleshooting]]&lt;br /&gt;
[[Category:Aircraft enhancement]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Multiplayer&amp;diff=115843</id>
		<title>Howto:Multiplayer</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Multiplayer&amp;diff=115843"/>
		<updated>2018-08-12T11:01:01Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Using multiplayer from the command line */ re-enforce not using existing callsigns - line copied from another section of this page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The '''multiplayer''' feature of [[FlightGear]] makes it possible to see other pilots and vice-versa. This makes it possible to fly in formation, perform [[mid-air refueling]] with tankers controlled by real people or contact real [[air traffic control|air traffic controllers]] to ask for guidance.&lt;br /&gt;
&lt;br /&gt;
Multiplayer may cause extreme [[troubleshooting performance issues|framerate drops]] during the loading of aircraft models, especially heavy models such as the [[Boeing 777]] or [[Airbus A320neo]]. It is suggested to fly in locations other than the default [[San Francisco International Airport]], as there are often lots of pilots in the area who are often new, and do not follow ATC, or respect traffic.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Callsigns can be a maximum of seven characters.&lt;br /&gt;
* You might want to check the [[#Known issues|Known issues]] section.&lt;br /&gt;
&lt;br /&gt;
== Connecting to Multiplayer ==&lt;br /&gt;
=== Built-in launcher and in-sim dialog ===&lt;br /&gt;
[[File:Multiplayer settings dialog.jpg|thumb|Multiplayer settings dialog]]&lt;br /&gt;
The easiest way to get online is to use the [[FlightGear Qt launcher|built-in launcher]] or the in-sim Multiplayer dialog. All you need to do is enter a callsign and select a server from the menu. Press Connect to go online.&lt;br /&gt;
&lt;br /&gt;
=== Using FGRun ===&lt;br /&gt;
==== From the main page ====&lt;br /&gt;
[[File:Multiplayer.jpg|thumb|Multiplayer settings in [[FGRun]]]]&lt;br /&gt;
# Select your [[aircraft]] and starting airport as normal in [[FGRun]].&lt;br /&gt;
# On the last screen, tick the &amp;quot;Multiplayer&amp;quot; box. Also make sure that the &amp;quot;AI models&amp;quot; box is checked or you will not be able to see the other pilots' aircraft.&lt;br /&gt;
# Enter the …&lt;br /&gt;
#* '''Callsign''' of your choice.&lt;br /&gt;
#* '''Hostname:''' Enter &amp;lt;code&amp;gt;mpserverXX.flightgear.org&amp;lt;/code&amp;gt; (with &amp;lt;code&amp;gt;XX&amp;lt;/code&amp;gt; being the [[#Servers|server number]]).&lt;br /&gt;
#* '''In/Out:''' Set both ports to 5000.&lt;br /&gt;
# Click {{button|Run}} to start FlightGear.&lt;br /&gt;
&lt;br /&gt;
To confirm that it's working, you can go to the multiplayer map at http://mpmap02.flightgear.org/ (in Hong Kong). Once FlightGear has started, you will notice chat messages that say &amp;quot;Hello&amp;quot; indicating pilots that are online.  They will also pop up when a pilot joins the MP network.  You can change this message by editing this line in &amp;lt;tt&amp;gt;''[http://sourceforge.net/p/flightgear/fgdata/ci/next/tree/preferences.xml#l763 $FG_ROOT/preferences.xml]''&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chat type=&amp;quot;string&amp;quot; preserve=&amp;quot;y&amp;quot;&amp;gt;Hello&amp;lt;/chat&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You may wish to use a different server, especially one closer to you. &lt;br /&gt;
&lt;br /&gt;
==== From Network Settings ====&lt;br /&gt;
[[File:FGRun Advanced dialog - Network.png|thumb|The &amp;lt;tt&amp;gt;Network&amp;lt;/tt&amp;gt; tab of the Advanced Options dialog in [[FGRun]] (in [[Changelog 3.2|FlightGear 3.2.0]]).]]&lt;br /&gt;
You can also change multiplayer settings in the &amp;lt;tt&amp;gt;Network&amp;lt;/tt&amp;gt; tab of FGRun's Advanced Options.&lt;br /&gt;
&lt;br /&gt;
# On the last page, click {{button|Advanced}}.&lt;br /&gt;
# Click &amp;lt;tt&amp;gt;Network&amp;lt;/tt&amp;gt; in the left column.&lt;br /&gt;
# In the &amp;lt;tt&amp;gt;Multiplayer Options&amp;lt;/tt&amp;gt; area …&lt;br /&gt;
#* Type your desired callsign into the box.&lt;br /&gt;
#* Set the parameters for the two other boxes; see [[#Using multiplayer from the command line|below]] for correct syntax.&lt;br /&gt;
#* Click {{button|OK}}, then run FlightGear.&lt;br /&gt;
&lt;br /&gt;
=== Using multiplayer from the command line ===&lt;br /&gt;
When running FlightGear from the [[command line]], you can specify multiplayer settings.  The two arguments are as follows:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
--multiplay=direction,10,ip.address,port&lt;br /&gt;
--callsign=anything&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obviously, &amp;lt;code&amp;gt;--callsign&amp;lt;/code&amp;gt; can be anything you wish but it must be limited to 7 (seven) characters in length counting any dashes. If your callsign is too long, it will be cut off in the various displays where it is shown. Generally speaking, callsigns are of the form X-XXXXX. Check [https://fgtracker.ml/ this page] to see whether your callsign is already in use or not. Do not pick a callsign that is already used, as that will create problems! Please don't leave your callsign as &amp;quot;CALLSIG&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are four arguments to &amp;lt;code&amp;gt;--multiplay&amp;lt;/code&amp;gt;:&lt;br /&gt;
; direction&lt;br /&gt;
: Either &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;out&amp;lt;/code&amp;gt;.  &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; tells FlightGear to listen to packets of data coming in through the specified '''port'''.  &amp;lt;code&amp;gt;out&amp;lt;/code&amp;gt; tells FlightGear to send data out through the '''port'''.&lt;br /&gt;
&lt;br /&gt;
; ip.address&lt;br /&gt;
: IP address of network interface being used by FlightGear.  If left blank, FlightGear will listen to all network interfaces.  If '''direction''' is set to &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;, FlightGear will listen to ''only'' this IP address.&lt;br /&gt;
&lt;br /&gt;
; port&lt;br /&gt;
: Port that data is either being sent or received through.  Usually set to &amp;lt;code&amp;gt;5000&amp;lt;/code&amp;gt; and above.&lt;br /&gt;
&lt;br /&gt;
== Advanced usage of multiplayer ==&lt;br /&gt;
=== Local setup for testing ===&lt;br /&gt;
It is possible to set up a local multiplayer network between two FlightGear instances ''without'' using a [[FGMS|multiplayer server]].  All you need to do is map each I/O port of one instance to the corresponding port(s) of the other instance:&lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |A socket connection requires not only an IP address, but also a port number for each side of the link - imagine a port number like a &amp;quot;mailbox&amp;quot; sitting at the address. This mailbox is used by the communicating processes to send out and receive &amp;quot;messages&amp;quot;. Different processes (even when possibly identical programs) will need to use different port numbers when running. Because open ports ({{=}}mailboxes) cannot be shared.&lt;br /&gt;
Thus, you need to modify the client-side port settings for each additional instance that you are running on the same machine, and map the output port of one instance to the input port of the other instance (and vice versa). &lt;br /&gt;
  |{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=83068#p83068&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: 2 FGFS instances / 1 win7 running same time with MP?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Thu Jun 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Command line parameters for the first instance:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
--multiplay=out,10,127.0.0.1,5000 --multiplay=in,10,127.0.0.1,5001 --callsign=Test1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Command line parameters for the second instance:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
--multiplay=out,10,127.0.0.1,5001 --multiplay=in,10,127.0.0.1,5000 --callsign=Test2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use this kind of setup to test multiplayer related features or troubleshoot multiplayer related bug reports that may be otherwise hard to reproduce over MP.  As you can't access the configuration of other people's FlightGear, this technique allows you to have complete control over FlightGear's settings.&lt;br /&gt;
&lt;br /&gt;
[[File:Direct-p2p-multiplayer-setup.png|800px|Screenshot demonstrating a &amp;quot;peer-to-peer&amp;quot; setup between two FlightGear instances running on the same machine via localhost (127.0.0.1) without any multiplayer server.]]&lt;br /&gt;
&lt;br /&gt;
You can add an arbitrary number of channels to mirror your flight onto other servers, e.g. to a private fgms (FlightGear Multiplayer Server) using &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
--multiplay=out,10,my.private.server.ip,5000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, the &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; argument above tells FG to listen '''only''' on the loopback/local interface - it will not receive packets arriving on the other network interface(s). If you want to also bind to other interfaces, just omit the IP address by using  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
--multiplay=in,10,,5000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check [https://fgtracker.ml/ this page] to see whether your callsign is already in use or not. Do not pick a callsign that is already used, as that will create problems!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Now, going more slowly for those who are completely lost... ====&lt;br /&gt;
{{Note|This section may contain out of date or inaccurate information.}}&lt;br /&gt;
This section ''ought'' to be unnecessary now with recent versions of the FG server. If you have problems though, it won't hurt to follow through.&lt;br /&gt;
&lt;br /&gt;
First of all, you need to know the IP address of the network interface you'll be using for multiplayer FG. &lt;br /&gt;
&lt;br /&gt;
If your Internet connection is via an ADSL modem that plugs directly into your computer, you should be able to find your IP address by visiting http://www.whatismyip.com. &lt;br /&gt;
{{Note|Your {{Abbr|ISP|Internet Service Provider}} might not give you the same IP address each time.}}&lt;br /&gt;
&lt;br /&gt;
If your connection is via an Ethernet connector or by a wireless link.&lt;br /&gt;
&lt;br /&gt;
* '''Linux:''' Log in as root and run &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt; in the terminal. In the text that is returned, you should to look for an interface name such as &amp;lt;code&amp;gt;eth0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;wlan0&amp;lt;/code&amp;gt;.  Finally, look in the text below the interface name for &amp;lt;code&amp;gt;inet addr:ip.address&amp;lt;/code&amp;gt;.  For example, this should read something like &amp;lt;code&amp;gt;inet addr:192.168.0.150&amp;lt;/code&amp;gt;.&lt;br /&gt;
* '''Windows:'''&lt;br /&gt;
** '''Windows XP or later:''' Start Command Prompt and &amp;lt;code&amp;gt;ipconfig&amp;lt;/code&amp;gt; into the terminal.  Write the IP address down.&lt;br /&gt;
** '''Windows 98''', click start, run, and type &amp;quot;winipcfg&amp;quot; to get information about your IP address.&lt;br /&gt;
&lt;br /&gt;
Now, all that remains is to configure your router to forward UDP port 5000 to the IP address you've just found. This is not something that can be described in step-by-step detail, because each manufacturer's configuration interfaces differ greatly. Some tips are given here – if you get stuck, ask nicely on the [[FlightGear IRC channel]] for help (details on the FlightGear website).&lt;br /&gt;
&lt;br /&gt;
You should know how to log on to your router's configuration page, usually via a web browser. You are looking for settings pertaining to &amp;quot;port forwarding,&amp;quot; &amp;quot;virtual server,&amp;quot; &amp;quot;Forwarding Rules,&amp;quot; or similar. When you have found the relevant settings, you need to add a rule that forwards port 5000 to the IP address you discovered earlier. If there is a choice given, ensure it is UDP ports that are forwarded. If there is no choice, you may assume that both TCP and UDP are being forwarded. Save your configuration, and most routers will probably then need to be rebooted to apply the changes.&lt;br /&gt;
&lt;br /&gt;
{{Note|BSD users: If you are using a ADSL modem, you might have to put the port forward command into the ppp.conf file rather than firewall. This is because the firewall script will only run each time the machine is booted rather than the ppp line coming back online.}}&lt;br /&gt;
&lt;br /&gt;
Finally, start FG using the command line given right at the start (if you're using the Windows launcher you will find entry boxes for Multiplayer arguments – insert the relevant details there). You will end up with something like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;other arguments&amp;gt; --callsign=test --multiplay=in,10,192.168.0.2,5000 --multiplay=out,10,mpserver05.flightgear.org,5000 --airport=KSFO --runway=28R --aircraft=hunter &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Choose your own callsign, but check [https://fgtracker.ml/ this page] first to see whether your desired callsign is already in use or not. Do not pick a callsign that is already used, as that will create problems!&lt;br /&gt;
&lt;br /&gt;
Once you have started FG, you should, if others are flying, see messages in the terminal from which FG was started, similar to the following;&lt;br /&gt;
&lt;br /&gt;
 Initialising john51a using 'Aircraft/ufo/Models/ufo.xml'  &lt;br /&gt;
 FGMultiplayRxMgr::ProcessRxData - Add new player. IP: 10.0.0.36,  &lt;br /&gt;
 Call: john51a,model: Aircraft/ufo/Models/ufo.xml &lt;br /&gt;
&lt;br /&gt;
You MUST give your local, behind-the-router IP address for multiplayer to work. Trust me on this one!&lt;br /&gt;
&lt;br /&gt;
You should check that your firewall is not causing problems - either turn it off ''temporarily'' or add an exception to allow incoming connections on port 5000.&lt;br /&gt;
&lt;br /&gt;
If it's still just not working for you, ask nicely on the [[FlightGear IRC channel|IRC channel]] or the [http://forum.flightgear.org/ forum] and someone should be able to assist.&lt;br /&gt;
&lt;br /&gt;
=== Multiple connections per computer ===&lt;br /&gt;
It is possible to run multiple FlightGear instances on a single computer and connect them all to the multiplayer network. However, this requires some extras to keep in mind:&lt;br /&gt;
# Both instances use the same &amp;lt;code&amp;gt;out&amp;lt;/code&amp;gt; port.&lt;br /&gt;
# One instance uses &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; port &amp;lt;code&amp;gt;5001&amp;lt;/code&amp;gt;, the other port &amp;lt;code&amp;gt;5002&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Both instances have unique callsigns.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Optional collision detection in multiplayer ===&lt;br /&gt;
&lt;br /&gt;
A patch has been added to FlightGear (since Version 3.5) to allow optional collision detection in multiplayer. To enable collision detection, start FlightGear with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
--prop:bool:/sim/multiplay/hot=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Those who are able to patch FGData themselves, can download [http://sourceforge.net/p/flightgear/mailman/attachment/CAHs0wcrEwYZvXTddcUaH0ZMfmVNvEWRap8MXOrEoKybUDO58sQ%40mail.gmail.com/3/ mp-hot-fgdata.patch], which adds a checkbox to the Multiplayer Settings dialog to enable or disable the collision detection at runtime.&lt;br /&gt;
&lt;br /&gt;
== Multiplayer chat ==&lt;br /&gt;
{{Main article|Chat Menu}}&lt;br /&gt;
&lt;br /&gt;
To chat with other pilots, go to the &amp;lt;tt&amp;gt;Multiplayer&amp;lt;/tt&amp;gt; menu and select &amp;lt;tt&amp;gt;Chat Menu&amp;lt;/tt&amp;gt; at the bottom of the menu. Note that the other pilots may not have their chat box open nor chat messages enabled, so they may not see your messages.&lt;br /&gt;
&lt;br /&gt;
The shortcut for chatting is {{Key press|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;}} (hyphen).  This will bring up some text in the upper-left of the FlightGear window.  By pressing the corresponding number keys, you can send pre-made messages.  Pressing {{Key press|1}} will let you type in a custom message, which you can send by pressing enter. By default, other people's messages are displayed at the top of FlightGear's window for a few seconds, but it will appear for a much longer time in the window at &amp;lt;tt&amp;gt;Network &amp;gt; Chat&amp;lt;/tt&amp;gt;. So if you think you have missed anything, go check there.&lt;br /&gt;
&lt;br /&gt;
== Dealing with abusive behavior ==&lt;br /&gt;
Should you become victim of abusive or annoying behavior by any pilot, you have option to ignore him or her. To activate the ignore function open the &amp;lt;tt&amp;gt;Multiplayer &amp;gt; Pilot list&amp;lt;/tt&amp;gt; dialog and click the &amp;lt;tt&amp;gt;ignore&amp;lt;/tt&amp;gt; button next to the pilot's callsign. This will prevent chat messages from the ignored pilot appearing and prevent his aircraft from appearing (unless you are using FlightGear v2.2 or older).&lt;br /&gt;
&lt;br /&gt;
== Multiplayer map ==&lt;br /&gt;
[[File:MP_Server.jpg|thumb|300px|[[MPMap]] screenshot]]&lt;br /&gt;
{{Main article|MPMap}}&lt;br /&gt;
&lt;br /&gt;
There is a very nice online map which displays the location of online pilots at [http://mpmap02.flightgear.org mpmap02]. You will also find this useful to check that you are successfully connecting to the server, as well as looking up navaids, waypoints, airports, frequencies, weather, and more!&lt;br /&gt;
&lt;br /&gt;
== Servers ==&lt;br /&gt;
The multiplayer servers are interconnected.  With few exceptions you ''do not'' need to connect to a specific server in order to see other pilots who are on that server. For best performance, you should connect to the server that is either geographically closest to you, has the lowest latency (ping time), or is the least busy.&lt;br /&gt;
{{tip|Use [http://mpmap01.flightgear.org/mpstatus/ this link] to check if the MP servers are online. Page is automatically generated.  The [[#In-sim Dialog|in-sim dialog]] will only display servers that are available.}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Server address&lt;br /&gt;
! Status&lt;br /&gt;
! Location &lt;br /&gt;
! Tracked (by [http://fgtracker.ml fgtracker.ml] unless otherwise specified) &lt;br /&gt;
! Maintainer &lt;br /&gt;
! Maintainer's [[IRC]] name &lt;br /&gt;
! Maintainer's [http://flightgear.org/forums forum] name&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| mpserver01.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| Germany&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Oliver Schröder&lt;br /&gt;
| os&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver02.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| Los Angeles, USA&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Lloyd Stevens&lt;br /&gt;
| ls4680&lt;br /&gt;
| ls4680&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver03.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| Germany &lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Hergen&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| [https://mpserver03.flightgear.org mpserver03.flightgear.org]&lt;br /&gt;
|-&lt;br /&gt;
| mpserver04.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| UK&lt;br /&gt;
| {{no}}&lt;br /&gt;
| Jon Stockill&lt;br /&gt;
| Nav&lt;br /&gt;
| [http://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=738 JonS]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver05.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Chicago, USA&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Brant&lt;br /&gt;
| IonCannon218&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-       &lt;br /&gt;
| mpserver06.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Berlin, Germany&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Sven Teichmann&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| [http://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=11839 D-SAMI]&lt;br /&gt;
| Unlimited traffic&lt;br /&gt;
|-       &lt;br /&gt;
| mpserver07.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Wisconsin, USA&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Tom Betka&lt;br /&gt;
| TB&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Offline&lt;br /&gt;
|-       &lt;br /&gt;
| mpserver08.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Frankfurt am Main, Germany&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Roland&lt;br /&gt;
| Quix0r&lt;br /&gt;
| [http://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=7512 Quix0r]&lt;br /&gt;
| 10 TByte traffic, mostly short pings&lt;br /&gt;
|-&lt;br /&gt;
| mpserver09.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Köln, Germany&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Daniel Vigano&lt;br /&gt;
| Fauchi95&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Offline&lt;br /&gt;
|-&lt;br /&gt;
| mpserver10.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Montpellier, France&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{usr|Xiii|Alexis Bory}}&lt;br /&gt;
| xiii&lt;br /&gt;
| [http://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=884 xiii]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver11.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Vilnius, Lithuania&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Darius&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| [http://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=1122 ffg]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver12.org&lt;br /&gt;
| {{no}}&lt;br /&gt;
| Amsterdam, the Netherlands&lt;br /&gt;
| {{no}} ([http://mpserver12.org mpserver12.org])&lt;br /&gt;
| Rob&lt;br /&gt;
| evilslut&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Formerly mpserver12.flightgear.org&amp;lt;ref&amp;gt;http://forum.flightgear.org/viewtopic.php?f=27&amp;amp;t=27453&amp;amp;start=60#p258435&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| mpserver13.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| Beauvais, France&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Charles Ingels&lt;br /&gt;
| charles&lt;br /&gt;
| [http://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=1592 cbz-026]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver14.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| UK&lt;br /&gt;
| {{no}}&lt;br /&gt;
| Pete&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver15.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| North Point, Hong Kong&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Hazuki Amamiya&lt;br /&gt;
| Hazuki&lt;br /&gt;
| [https://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=8400 Hazuki]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver16.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| Kansas City, Missouri, USA&lt;br /&gt;
| {{no}}&lt;br /&gt;
| Rob Dosogne&lt;br /&gt;
| truthsolo&lt;br /&gt;
| [http://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=9926 truthsolo]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver17.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Cluj, Romania&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Marius&lt;br /&gt;
| tuxum&lt;br /&gt;
| [http://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=11636 tuxum]&lt;br /&gt;
| Offline&lt;br /&gt;
|-&lt;br /&gt;
| mpserver18.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Germany&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver19.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| London, UK&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Dr. R0ckso&lt;br /&gt;
| drr0ckso&lt;br /&gt;
| [https://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=21111 drR0ckso]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver20.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| South San Francisco, California, USA&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Marisa Giancarla&lt;br /&gt;
| marisag&lt;br /&gt;
| [https://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=21604 marisag]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver21.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| Tokyo, Japan&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Marisa Giancarla&lt;br /&gt;
| marisag&lt;br /&gt;
| [https://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=21604 marisag]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver51.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| Atlanta, Georgia, USA&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Dr. R0ckso&lt;br /&gt;
| drr0ckso&lt;br /&gt;
| [https://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=21111 drR0ckso]&lt;br /&gt;
| Radio horizon is 414 miles&lt;br /&gt;
|-&lt;br /&gt;
| mpserver87.megaf.info&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| Paris, France&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Megaf&lt;br /&gt;
| Megaf&lt;br /&gt;
| [https://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=21017 Megaf]&lt;br /&gt;
| Not linked to others yet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Geographic locations of the servers are also available at [http://goo.gl/maps/jBwUd Google Maps].&lt;br /&gt;
&lt;br /&gt;
If you are interested in hosting your own multiplayer server, you may want to check out [[Howto: Set up a multiplayer server]].&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
=== Fibertel (Argentina) ===&lt;br /&gt;
In December 2014, it was reported that UDP connection through port 5000 was not possible for users whose ISP was {{Wikipedia|Fibertel}} (Argentina).&lt;br /&gt;
&lt;br /&gt;
Fibertel Argentina apparently uses the port for setup purposes. &amp;quot;It should be open for the user but it might not be fully functional.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Port 5000 is a generic port, and neither FlightGear nor the {{Wikipedia|UPnP}} protocol are an &amp;quot;official&amp;quot; usage of the port.  &lt;br /&gt;
&lt;br /&gt;
A solution would be to spread the ports between the servers; e.g., mpserver01.flightgear.org → 5001, mpserver02.flightgear.org → 5002&lt;br /&gt;
&lt;br /&gt;
See also the [http://forum.flightgear.org/viewtopic.php?f=27&amp;amp;t=24754 forum thread] and {{issue|1617}}.&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
* [[FlightGear Multiplayer Server]]&lt;br /&gt;
* [[Howto: Set up a multiplayer server]]&lt;br /&gt;
* [[Multiplayer protocol]]&lt;br /&gt;
* [[Howto:Transmit_properties_over_MP]]&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Multiplayer]]&lt;br /&gt;
[[Category:Howto|Multiplayer]]&lt;br /&gt;
&lt;br /&gt;
[[de:Howto: Multiplayer]]&lt;br /&gt;
[[es:Howto: Multijugador]]&lt;br /&gt;
[[fr:Howto: Multijoueur]]&lt;br /&gt;
[[it:Come fare:Multiplayer]]&lt;br /&gt;
[[nl:Howto: Multiplayer]]&lt;br /&gt;
[[pl:Konfiguracja trybu multiplayer]]&lt;br /&gt;
[[pt:Tutorial de Multiplayer]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Multiplayer&amp;diff=115842</id>
		<title>Howto:Multiplayer</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Multiplayer&amp;diff=115842"/>
		<updated>2018-08-12T10:55:27Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Using multiplayer from the command line */  note that callsign is limited to 7 characters in length&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The '''multiplayer''' feature of [[FlightGear]] makes it possible to see other pilots and vice-versa. This makes it possible to fly in formation, perform [[mid-air refueling]] with tankers controlled by real people or contact real [[air traffic control|air traffic controllers]] to ask for guidance.&lt;br /&gt;
&lt;br /&gt;
Multiplayer may cause extreme [[troubleshooting performance issues|framerate drops]] during the loading of aircraft models, especially heavy models such as the [[Boeing 777]] or [[Airbus A320neo]]. It is suggested to fly in locations other than the default [[San Francisco International Airport]], as there are often lots of pilots in the area who are often new, and do not follow ATC, or respect traffic.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* Callsigns can be a maximum of seven characters.&lt;br /&gt;
* You might want to check the [[#Known issues|Known issues]] section.&lt;br /&gt;
&lt;br /&gt;
== Connecting to Multiplayer ==&lt;br /&gt;
=== Built-in launcher and in-sim dialog ===&lt;br /&gt;
[[File:Multiplayer settings dialog.jpg|thumb|Multiplayer settings dialog]]&lt;br /&gt;
The easiest way to get online is to use the [[FlightGear Qt launcher|built-in launcher]] or the in-sim Multiplayer dialog. All you need to do is enter a callsign and select a server from the menu. Press Connect to go online.&lt;br /&gt;
&lt;br /&gt;
=== Using FGRun ===&lt;br /&gt;
==== From the main page ====&lt;br /&gt;
[[File:Multiplayer.jpg|thumb|Multiplayer settings in [[FGRun]]]]&lt;br /&gt;
# Select your [[aircraft]] and starting airport as normal in [[FGRun]].&lt;br /&gt;
# On the last screen, tick the &amp;quot;Multiplayer&amp;quot; box. Also make sure that the &amp;quot;AI models&amp;quot; box is checked or you will not be able to see the other pilots' aircraft.&lt;br /&gt;
# Enter the …&lt;br /&gt;
#* '''Callsign''' of your choice.&lt;br /&gt;
#* '''Hostname:''' Enter &amp;lt;code&amp;gt;mpserverXX.flightgear.org&amp;lt;/code&amp;gt; (with &amp;lt;code&amp;gt;XX&amp;lt;/code&amp;gt; being the [[#Servers|server number]]).&lt;br /&gt;
#* '''In/Out:''' Set both ports to 5000.&lt;br /&gt;
# Click {{button|Run}} to start FlightGear.&lt;br /&gt;
&lt;br /&gt;
To confirm that it's working, you can go to the multiplayer map at http://mpmap02.flightgear.org/ (in Hong Kong). Once FlightGear has started, you will notice chat messages that say &amp;quot;Hello&amp;quot; indicating pilots that are online.  They will also pop up when a pilot joins the MP network.  You can change this message by editing this line in &amp;lt;tt&amp;gt;''[http://sourceforge.net/p/flightgear/fgdata/ci/next/tree/preferences.xml#l763 $FG_ROOT/preferences.xml]''&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;chat type=&amp;quot;string&amp;quot; preserve=&amp;quot;y&amp;quot;&amp;gt;Hello&amp;lt;/chat&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
You may wish to use a different server, especially one closer to you. &lt;br /&gt;
&lt;br /&gt;
==== From Network Settings ====&lt;br /&gt;
[[File:FGRun Advanced dialog - Network.png|thumb|The &amp;lt;tt&amp;gt;Network&amp;lt;/tt&amp;gt; tab of the Advanced Options dialog in [[FGRun]] (in [[Changelog 3.2|FlightGear 3.2.0]]).]]&lt;br /&gt;
You can also change multiplayer settings in the &amp;lt;tt&amp;gt;Network&amp;lt;/tt&amp;gt; tab of FGRun's Advanced Options.&lt;br /&gt;
&lt;br /&gt;
# On the last page, click {{button|Advanced}}.&lt;br /&gt;
# Click &amp;lt;tt&amp;gt;Network&amp;lt;/tt&amp;gt; in the left column.&lt;br /&gt;
# In the &amp;lt;tt&amp;gt;Multiplayer Options&amp;lt;/tt&amp;gt; area …&lt;br /&gt;
#* Type your desired callsign into the box.&lt;br /&gt;
#* Set the parameters for the two other boxes; see [[#Using multiplayer from the command line|below]] for correct syntax.&lt;br /&gt;
#* Click {{button|OK}}, then run FlightGear.&lt;br /&gt;
&lt;br /&gt;
=== Using multiplayer from the command line ===&lt;br /&gt;
When running FlightGear from the [[command line]], you can specify multiplayer settings.  The two arguments are as follows:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
--multiplay=direction,10,ip.address,port&lt;br /&gt;
--callsign=anything&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Obviously, &amp;lt;code&amp;gt;--callsign&amp;lt;/code&amp;gt; can be anything you wish but it must be limited to 7 (seven) characters in length counting any dashes. If your callsign is too long, it will be cut off in the various displays where it is shown. Generally speaking, callsigns are of the form X-XXXXX. Please don't leave your callsign as &amp;quot;CALLSIG&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
There are four arguments to &amp;lt;code&amp;gt;--multiplay&amp;lt;/code&amp;gt;:&lt;br /&gt;
; direction&lt;br /&gt;
: Either &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;out&amp;lt;/code&amp;gt;.  &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; tells FlightGear to listen to packets of data coming in through the specified '''port'''.  &amp;lt;code&amp;gt;out&amp;lt;/code&amp;gt; tells FlightGear to send data out through the '''port'''.&lt;br /&gt;
&lt;br /&gt;
; ip.address&lt;br /&gt;
: IP address of network interface being used by FlightGear.  If left blank, FlightGear will listen to all network interfaces.  If '''direction''' is set to &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt;, FlightGear will listen to ''only'' this IP address.&lt;br /&gt;
&lt;br /&gt;
; port&lt;br /&gt;
: Port that data is either being sent or received through.  Usually set to &amp;lt;code&amp;gt;5000&amp;lt;/code&amp;gt; and above.&lt;br /&gt;
&lt;br /&gt;
== Advanced usage of multiplayer ==&lt;br /&gt;
=== Local setup for testing ===&lt;br /&gt;
It is possible to set up a local multiplayer network between two FlightGear instances ''without'' using a [[FGMS|multiplayer server]].  All you need to do is map each I/O port of one instance to the corresponding port(s) of the other instance:&lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |A socket connection requires not only an IP address, but also a port number for each side of the link - imagine a port number like a &amp;quot;mailbox&amp;quot; sitting at the address. This mailbox is used by the communicating processes to send out and receive &amp;quot;messages&amp;quot;. Different processes (even when possibly identical programs) will need to use different port numbers when running. Because open ports ({{=}}mailboxes) cannot be shared.&lt;br /&gt;
Thus, you need to modify the client-side port settings for each additional instance that you are running on the same machine, and map the output port of one instance to the input port of the other instance (and vice versa). &lt;br /&gt;
  |{{cite web |url=http://forum.flightgear.org/viewtopic.php?p=83068#p83068&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: 2 FGFS instances / 1 win7 running same time with MP?&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Hooray&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;Thu Jun 10&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Command line parameters for the first instance:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
--multiplay=out,10,127.0.0.1,5000 --multiplay=in,10,127.0.0.1,5001 --callsign=Test1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Command line parameters for the second instance:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
--multiplay=out,10,127.0.0.1,5001 --multiplay=in,10,127.0.0.1,5000 --callsign=Test2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use this kind of setup to test multiplayer related features or troubleshoot multiplayer related bug reports that may be otherwise hard to reproduce over MP.  As you can't access the configuration of other people's FlightGear, this technique allows you to have complete control over FlightGear's settings.&lt;br /&gt;
&lt;br /&gt;
[[File:Direct-p2p-multiplayer-setup.png|800px|Screenshot demonstrating a &amp;quot;peer-to-peer&amp;quot; setup between two FlightGear instances running on the same machine via localhost (127.0.0.1) without any multiplayer server.]]&lt;br /&gt;
&lt;br /&gt;
You can add an arbitrary number of channels to mirror your flight onto other servers, e.g. to a private fgms (FlightGear Multiplayer Server) using &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
--multiplay=out,10,my.private.server.ip,5000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additionally, the &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; argument above tells FG to listen '''only''' on the loopback/local interface - it will not receive packets arriving on the other network interface(s). If you want to also bind to other interfaces, just omit the IP address by using  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
--multiplay=in,10,,5000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Check [https://fgtracker.ml/ this page] to see whether your callsign is already in use or not. Do not pick a callsign that is already used, as that will create problems!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Now, going more slowly for those who are completely lost... ====&lt;br /&gt;
{{Note|This section may contain out of date or inaccurate information.}}&lt;br /&gt;
This section ''ought'' to be unnecessary now with recent versions of the FG server. If you have problems though, it won't hurt to follow through.&lt;br /&gt;
&lt;br /&gt;
First of all, you need to know the IP address of the network interface you'll be using for multiplayer FG. &lt;br /&gt;
&lt;br /&gt;
If your Internet connection is via an ADSL modem that plugs directly into your computer, you should be able to find your IP address by visiting http://www.whatismyip.com. &lt;br /&gt;
{{Note|Your {{Abbr|ISP|Internet Service Provider}} might not give you the same IP address each time.}}&lt;br /&gt;
&lt;br /&gt;
If your connection is via an Ethernet connector or by a wireless link.&lt;br /&gt;
&lt;br /&gt;
* '''Linux:''' Log in as root and run &amp;lt;code&amp;gt;ifconfig&amp;lt;/code&amp;gt; in the terminal. In the text that is returned, you should to look for an interface name such as &amp;lt;code&amp;gt;eth0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;wlan0&amp;lt;/code&amp;gt;.  Finally, look in the text below the interface name for &amp;lt;code&amp;gt;inet addr:ip.address&amp;lt;/code&amp;gt;.  For example, this should read something like &amp;lt;code&amp;gt;inet addr:192.168.0.150&amp;lt;/code&amp;gt;.&lt;br /&gt;
* '''Windows:'''&lt;br /&gt;
** '''Windows XP or later:''' Start Command Prompt and &amp;lt;code&amp;gt;ipconfig&amp;lt;/code&amp;gt; into the terminal.  Write the IP address down.&lt;br /&gt;
** '''Windows 98''', click start, run, and type &amp;quot;winipcfg&amp;quot; to get information about your IP address.&lt;br /&gt;
&lt;br /&gt;
Now, all that remains is to configure your router to forward UDP port 5000 to the IP address you've just found. This is not something that can be described in step-by-step detail, because each manufacturer's configuration interfaces differ greatly. Some tips are given here – if you get stuck, ask nicely on the [[FlightGear IRC channel]] for help (details on the FlightGear website).&lt;br /&gt;
&lt;br /&gt;
You should know how to log on to your router's configuration page, usually via a web browser. You are looking for settings pertaining to &amp;quot;port forwarding,&amp;quot; &amp;quot;virtual server,&amp;quot; &amp;quot;Forwarding Rules,&amp;quot; or similar. When you have found the relevant settings, you need to add a rule that forwards port 5000 to the IP address you discovered earlier. If there is a choice given, ensure it is UDP ports that are forwarded. If there is no choice, you may assume that both TCP and UDP are being forwarded. Save your configuration, and most routers will probably then need to be rebooted to apply the changes.&lt;br /&gt;
&lt;br /&gt;
{{Note|BSD users: If you are using a ADSL modem, you might have to put the port forward command into the ppp.conf file rather than firewall. This is because the firewall script will only run each time the machine is booted rather than the ppp line coming back online.}}&lt;br /&gt;
&lt;br /&gt;
Finally, start FG using the command line given right at the start (if you're using the Windows launcher you will find entry boxes for Multiplayer arguments – insert the relevant details there). You will end up with something like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; enclose=&amp;quot;div&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;other arguments&amp;gt; --callsign=test --multiplay=in,10,192.168.0.2,5000 --multiplay=out,10,mpserver05.flightgear.org,5000 --airport=KSFO --runway=28R --aircraft=hunter &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Choose your own callsign, but check [https://fgtracker.ml/ this page] first to see whether your desired callsign is already in use or not. Do not pick a callsign that is already used, as that will create problems!&lt;br /&gt;
&lt;br /&gt;
Once you have started FG, you should, if others are flying, see messages in the terminal from which FG was started, similar to the following;&lt;br /&gt;
&lt;br /&gt;
 Initialising john51a using 'Aircraft/ufo/Models/ufo.xml'  &lt;br /&gt;
 FGMultiplayRxMgr::ProcessRxData - Add new player. IP: 10.0.0.36,  &lt;br /&gt;
 Call: john51a,model: Aircraft/ufo/Models/ufo.xml &lt;br /&gt;
&lt;br /&gt;
You MUST give your local, behind-the-router IP address for multiplayer to work. Trust me on this one!&lt;br /&gt;
&lt;br /&gt;
You should check that your firewall is not causing problems - either turn it off ''temporarily'' or add an exception to allow incoming connections on port 5000.&lt;br /&gt;
&lt;br /&gt;
If it's still just not working for you, ask nicely on the [[FlightGear IRC channel|IRC channel]] or the [http://forum.flightgear.org/ forum] and someone should be able to assist.&lt;br /&gt;
&lt;br /&gt;
=== Multiple connections per computer ===&lt;br /&gt;
It is possible to run multiple FlightGear instances on a single computer and connect them all to the multiplayer network. However, this requires some extras to keep in mind:&lt;br /&gt;
# Both instances use the same &amp;lt;code&amp;gt;out&amp;lt;/code&amp;gt; port.&lt;br /&gt;
# One instance uses &amp;lt;code&amp;gt;in&amp;lt;/code&amp;gt; port &amp;lt;code&amp;gt;5001&amp;lt;/code&amp;gt;, the other port &amp;lt;code&amp;gt;5002&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Both instances have unique callsigns.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Optional collision detection in multiplayer ===&lt;br /&gt;
&lt;br /&gt;
A patch has been added to FlightGear (since Version 3.5) to allow optional collision detection in multiplayer. To enable collision detection, start FlightGear with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
--prop:bool:/sim/multiplay/hot=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Those who are able to patch FGData themselves, can download [http://sourceforge.net/p/flightgear/mailman/attachment/CAHs0wcrEwYZvXTddcUaH0ZMfmVNvEWRap8MXOrEoKybUDO58sQ%40mail.gmail.com/3/ mp-hot-fgdata.patch], which adds a checkbox to the Multiplayer Settings dialog to enable or disable the collision detection at runtime.&lt;br /&gt;
&lt;br /&gt;
== Multiplayer chat ==&lt;br /&gt;
{{Main article|Chat Menu}}&lt;br /&gt;
&lt;br /&gt;
To chat with other pilots, go to the &amp;lt;tt&amp;gt;Multiplayer&amp;lt;/tt&amp;gt; menu and select &amp;lt;tt&amp;gt;Chat Menu&amp;lt;/tt&amp;gt; at the bottom of the menu. Note that the other pilots may not have their chat box open nor chat messages enabled, so they may not see your messages.&lt;br /&gt;
&lt;br /&gt;
The shortcut for chatting is {{Key press|&amp;lt;nowiki&amp;gt;-&amp;lt;/nowiki&amp;gt;}} (hyphen).  This will bring up some text in the upper-left of the FlightGear window.  By pressing the corresponding number keys, you can send pre-made messages.  Pressing {{Key press|1}} will let you type in a custom message, which you can send by pressing enter. By default, other people's messages are displayed at the top of FlightGear's window for a few seconds, but it will appear for a much longer time in the window at &amp;lt;tt&amp;gt;Network &amp;gt; Chat&amp;lt;/tt&amp;gt;. So if you think you have missed anything, go check there.&lt;br /&gt;
&lt;br /&gt;
== Dealing with abusive behavior ==&lt;br /&gt;
Should you become victim of abusive or annoying behavior by any pilot, you have option to ignore him or her. To activate the ignore function open the &amp;lt;tt&amp;gt;Multiplayer &amp;gt; Pilot list&amp;lt;/tt&amp;gt; dialog and click the &amp;lt;tt&amp;gt;ignore&amp;lt;/tt&amp;gt; button next to the pilot's callsign. This will prevent chat messages from the ignored pilot appearing and prevent his aircraft from appearing (unless you are using FlightGear v2.2 or older).&lt;br /&gt;
&lt;br /&gt;
== Multiplayer map ==&lt;br /&gt;
[[File:MP_Server.jpg|thumb|300px|[[MPMap]] screenshot]]&lt;br /&gt;
{{Main article|MPMap}}&lt;br /&gt;
&lt;br /&gt;
There is a very nice online map which displays the location of online pilots at [http://mpmap02.flightgear.org mpmap02]. You will also find this useful to check that you are successfully connecting to the server, as well as looking up navaids, waypoints, airports, frequencies, weather, and more!&lt;br /&gt;
&lt;br /&gt;
== Servers ==&lt;br /&gt;
The multiplayer servers are interconnected.  With few exceptions you ''do not'' need to connect to a specific server in order to see other pilots who are on that server. For best performance, you should connect to the server that is either geographically closest to you, has the lowest latency (ping time), or is the least busy.&lt;br /&gt;
{{tip|Use [http://mpmap01.flightgear.org/mpstatus/ this link] to check if the MP servers are online. Page is automatically generated.  The [[#In-sim Dialog|in-sim dialog]] will only display servers that are available.}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Server address&lt;br /&gt;
! Status&lt;br /&gt;
! Location &lt;br /&gt;
! Tracked (by [http://fgtracker.ml fgtracker.ml] unless otherwise specified) &lt;br /&gt;
! Maintainer &lt;br /&gt;
! Maintainer's [[IRC]] name &lt;br /&gt;
! Maintainer's [http://flightgear.org/forums forum] name&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| mpserver01.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| Germany&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Oliver Schröder&lt;br /&gt;
| os&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver02.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| Los Angeles, USA&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Lloyd Stevens&lt;br /&gt;
| ls4680&lt;br /&gt;
| ls4680&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver03.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| Germany &lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Hergen&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| [https://mpserver03.flightgear.org mpserver03.flightgear.org]&lt;br /&gt;
|-&lt;br /&gt;
| mpserver04.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| UK&lt;br /&gt;
| {{no}}&lt;br /&gt;
| Jon Stockill&lt;br /&gt;
| Nav&lt;br /&gt;
| [http://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=738 JonS]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver05.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Chicago, USA&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Brant&lt;br /&gt;
| IonCannon218&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-       &lt;br /&gt;
| mpserver06.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Berlin, Germany&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Sven Teichmann&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| [http://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=11839 D-SAMI]&lt;br /&gt;
| Unlimited traffic&lt;br /&gt;
|-       &lt;br /&gt;
| mpserver07.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Wisconsin, USA&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Tom Betka&lt;br /&gt;
| TB&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Offline&lt;br /&gt;
|-       &lt;br /&gt;
| mpserver08.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Frankfurt am Main, Germany&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Roland&lt;br /&gt;
| Quix0r&lt;br /&gt;
| [http://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=7512 Quix0r]&lt;br /&gt;
| 10 TByte traffic, mostly short pings&lt;br /&gt;
|-&lt;br /&gt;
| mpserver09.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Köln, Germany&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Daniel Vigano&lt;br /&gt;
| Fauchi95&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Offline&lt;br /&gt;
|-&lt;br /&gt;
| mpserver10.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Montpellier, France&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{usr|Xiii|Alexis Bory}}&lt;br /&gt;
| xiii&lt;br /&gt;
| [http://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=884 xiii]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver11.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Vilnius, Lithuania&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Darius&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| [http://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=1122 ffg]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver12.org&lt;br /&gt;
| {{no}}&lt;br /&gt;
| Amsterdam, the Netherlands&lt;br /&gt;
| {{no}} ([http://mpserver12.org mpserver12.org])&lt;br /&gt;
| Rob&lt;br /&gt;
| evilslut&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Formerly mpserver12.flightgear.org&amp;lt;ref&amp;gt;http://forum.flightgear.org/viewtopic.php?f=27&amp;amp;t=27453&amp;amp;start=60#p258435&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| mpserver13.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| Beauvais, France&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Charles Ingels&lt;br /&gt;
| charles&lt;br /&gt;
| [http://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=1592 cbz-026]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver14.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| UK&lt;br /&gt;
| {{no}}&lt;br /&gt;
| Pete&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver15.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| North Point, Hong Kong&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Hazuki Amamiya&lt;br /&gt;
| Hazuki&lt;br /&gt;
| [https://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=8400 Hazuki]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver16.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| Kansas City, Missouri, USA&lt;br /&gt;
| {{no}}&lt;br /&gt;
| Rob Dosogne&lt;br /&gt;
| truthsolo&lt;br /&gt;
| [http://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=9926 truthsolo]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver17.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Cluj, Romania&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| Marius&lt;br /&gt;
| tuxum&lt;br /&gt;
| [http://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=11636 tuxum]&lt;br /&gt;
| Offline&lt;br /&gt;
|-&lt;br /&gt;
| mpserver18.flightgear.org&lt;br /&gt;
| {{no|Down}}&lt;br /&gt;
| Germany&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
| {{N/a}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver19.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| London, UK&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Dr. R0ckso&lt;br /&gt;
| drr0ckso&lt;br /&gt;
| [https://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=21111 drR0ckso]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver20.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| South San Francisco, California, USA&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Marisa Giancarla&lt;br /&gt;
| marisag&lt;br /&gt;
| [https://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=21604 marisag]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver21.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| Tokyo, Japan&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Marisa Giancarla&lt;br /&gt;
| marisag&lt;br /&gt;
| [https://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=21604 marisag]&lt;br /&gt;
| {{N/a|None}}&lt;br /&gt;
|-&lt;br /&gt;
| mpserver51.flightgear.org&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| Atlanta, Georgia, USA&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Dr. R0ckso&lt;br /&gt;
| drr0ckso&lt;br /&gt;
| [https://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=21111 drR0ckso]&lt;br /&gt;
| Radio horizon is 414 miles&lt;br /&gt;
|-&lt;br /&gt;
| mpserver87.megaf.info&lt;br /&gt;
| {{yes|Up}}&lt;br /&gt;
| Paris, France&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Megaf&lt;br /&gt;
| Megaf&lt;br /&gt;
| [https://forum.flightgear.org/memberlist.php?mode=viewprofile&amp;amp;u=21017 Megaf]&lt;br /&gt;
| Not linked to others yet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Geographic locations of the servers are also available at [http://goo.gl/maps/jBwUd Google Maps].&lt;br /&gt;
&lt;br /&gt;
If you are interested in hosting your own multiplayer server, you may want to check out [[Howto: Set up a multiplayer server]].&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
=== Fibertel (Argentina) ===&lt;br /&gt;
In December 2014, it was reported that UDP connection through port 5000 was not possible for users whose ISP was {{Wikipedia|Fibertel}} (Argentina).&lt;br /&gt;
&lt;br /&gt;
Fibertel Argentina apparently uses the port for setup purposes. &amp;quot;It should be open for the user but it might not be fully functional.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Port 5000 is a generic port, and neither FlightGear nor the {{Wikipedia|UPnP}} protocol are an &amp;quot;official&amp;quot; usage of the port.  &lt;br /&gt;
&lt;br /&gt;
A solution would be to spread the ports between the servers; e.g., mpserver01.flightgear.org → 5001, mpserver02.flightgear.org → 5002&lt;br /&gt;
&lt;br /&gt;
See also the [http://forum.flightgear.org/viewtopic.php?f=27&amp;amp;t=24754 forum thread] and {{issue|1617}}.&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
* [[FlightGear Multiplayer Server]]&lt;br /&gt;
* [[Howto: Set up a multiplayer server]]&lt;br /&gt;
* [[Multiplayer protocol]]&lt;br /&gt;
* [[Howto:Transmit_properties_over_MP]]&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Multiplayer]]&lt;br /&gt;
[[Category:Howto|Multiplayer]]&lt;br /&gt;
&lt;br /&gt;
[[de:Howto: Multiplayer]]&lt;br /&gt;
[[es:Howto: Multijugador]]&lt;br /&gt;
[[fr:Howto: Multijoueur]]&lt;br /&gt;
[[it:Come fare:Multiplayer]]&lt;br /&gt;
[[nl:Howto: Multiplayer]]&lt;br /&gt;
[[pl:Konfiguracja trybu multiplayer]]&lt;br /&gt;
[[pt:Tutorial de Multiplayer]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Troubleshooting_crashes&amp;diff=115836</id>
		<title>Troubleshooting crashes</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Troubleshooting_crashes&amp;diff=115836"/>
		<updated>2018-08-11T18:39:26Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* The standard procedure */ link to existing page with log level options and explanation...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Troubleshooting}}&lt;br /&gt;
{{note|'''This article is valid for FlightGear versions: 2.6, 2.8, 2.10, 2.12, 3.0+'''. Help us in keeping this article up to date! If you're facing some crash not listed here and manage to solve it, '''please add it to a proper section''', so that other can benefit from your experience!}}&lt;br /&gt;
&lt;br /&gt;
Crashes are never easy to troubleshoot. It's very likely that you'll need to experiment a bit to find out the cause, or at least to provide useful feedback. In fact issues depend a lot on things like hardware components, driver support and so on. Developers can't work on your machine, so you'll need to provide them with some specific information. This article will guide you in that.&lt;br /&gt;
&lt;br /&gt;
If not only FlightGear, but the whole system crashes, or freezes, please refer to [[System Crashes]].&lt;br /&gt;
&lt;br /&gt;
If in the end you like bug hunting, please consider helping in [[Volunteer#Pre-Release Testers|testing future releases]].&lt;br /&gt;
&lt;br /&gt;
== Known problems ==&lt;br /&gt;
Before diving into the real troubleshooting, first try to see if one of the following is your case. This could be a huge time saver!&lt;br /&gt;
&lt;br /&gt;
'''If your problem is not listed here, please consider adding it after you have solved it! Others like you will be grateful!'''&lt;br /&gt;
&lt;br /&gt;
=== Optimus/Hybrid graphics technologies for laptops ===&lt;br /&gt;
If FlightGear crashes with &lt;br /&gt;
 Unknown exception in the main loop. Aborting... &lt;br /&gt;
 Possible cause: Not enough space&lt;br /&gt;
and you happen to have a laptop with Optimus Technology (NVidia) or Hybrid Graphics technology (ATI) onboard, you'll find some help at [[Troubleshooting performance issues#Operating system and driver setup]]. (Note that the problem is treated there because it's mostly cause of low performance.)&lt;br /&gt;
&lt;br /&gt;
=== World Scenery 2.0 and 32-bit machines ===&lt;br /&gt;
[[World Scenery]] 2.0 (the one with [[CORINE]] and [[OpenStreetMap]] data) highly raised memory requirements with respect to the previous version. Basically, with 4GB of RAM once you could safely use a visibility of a hundred kilometers; with Scenery 2.0, 4GB is barely enough for 10 km. A 32-bit machine can't use more than that memory, and simply kills FlightGear when it asks for more. To verify this, reduce your visibility (in-sim with ''View &amp;gt; Level of Detail adjustment'' and set ''Bare'' to 5000 m) and see if it stops crashing. You can also check memory consumption with the tools provided by your OS.&lt;br /&gt;
&lt;br /&gt;
Sadly, the solution is keeping a low visibility, or moving to a 64-bit machine with at least 8GB of RAM, which can provide even 45km of visibility. If you're feeling &amp;quot;hackish&amp;quot;, you can try the solution reported at [[Unexpected Crashes with Scenery ver.2]].&lt;br /&gt;
&lt;br /&gt;
=== Old graphics cards and FlightGear 2.10 ===&lt;br /&gt;
If you're using FlightGear 2.10, you're seeing crashes during simulator startup (without seeing the actual aircraft/scenery), and you're using an old enough graphics card, it is possible that your crash is due to a bug in that FG version and to your card lacking [[Shader|GLSL]] support. This bug would prevent using FG even with shaders off! Ironically, this bug comes from a feature introduced to help troubleshooting bugs.&lt;br /&gt;
&lt;br /&gt;
So, if you're on 2.10 and think your card could be old enough, try the minimal startup configuration below: if it keeps crashing, that's definitely it. The bug was solved immediately later (ver. 2.11)&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting your crash ==&lt;br /&gt;
FlightGear crashes are due to a number of reasons, not necessarily to bugs in its code. After all, it works &amp;quot;out of the box&amp;quot; for most users, so if something's broken it's often a system-specific issue, and yet again, it could be a system configuration that the developers couldn't test - [[Volunteer#Pre-Release Testers|you can help with that]]!)&lt;br /&gt;
&lt;br /&gt;
It's just as well possible that the FlightGear default settings are not supported with your hardware/drivers. Since version 2.6, FlightGear will assume support for certain features that hardware older than 4-5 years might not give (especially graphics cards), so the default settings need to be customized to disable all unsupported features. See [[Troubleshooting performance issues]], [[Problematic Video Cards]] and [[FlightGear Hardware Recommendations]] for more details.&lt;br /&gt;
&lt;br /&gt;
=== Preliminary check ===&lt;br /&gt;
Make sure you've got the newest driver for your video card installed and running without errors. A suggestion for a thorough updating procedure can be found at [[Graphics drivers configuration]]. '''Before proceeding any further, please make sure that you are actually able to run other OpenGL-based software/simulators/games, unrelated to FlightGear!'''&lt;br /&gt;
&lt;br /&gt;
=== The standard procedure ===&lt;br /&gt;
Given the above, it is important to start up FlightGear with a '''minimal startup profile''', with ''all'' eye candy and features disabled (so that FG won't crash due to lack of support for them) and start re-enabling them step by step to see what's supported by your hardware. You may want to [[Commonly used debugging tools#Debug level setting|raise the FlightGear log level]], so that you get to see where the program stops starting/working, and what it was doing before it got terminated. This procedure will also help in [[troubleshooting performance issues]].&lt;br /&gt;
&lt;br /&gt;
These settings use the simple UFO and a suitable scenery location to rule out aircraft or scenery as a cause for crashes. Don't even touch the aircraft and location settings (airport, azimuth, offset) until you have really fixed everything else already. Working step by step is the only real way, so don't bite off more than you can chew.&lt;br /&gt;
&lt;br /&gt;
If you find it looks like the Windows &amp;quot;compatibility mode&amp;quot; that you boot into after a crash, then you understand perfectly what we're doing here. However it's not as straightforward to do, so if in trouble [http://forum.flightgear.org/viewforum.php?f=17 ask for support at the forum]!&lt;br /&gt;
&lt;br /&gt;
=== Minimal startup profile ===&lt;br /&gt;
{{Note|If you find any other settings causing a massive improvement of performance/compatibility, please feel free to add those below, so that others can benefit from your findings.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot;&amp;gt;&lt;br /&gt;
Tweaking-nvidia-settings1.png|Tweaking nvidia settings to obtain higher frame rates by disabling vsync to blank&lt;br /&gt;
Tweaking-nvidia-settings2.png|Tweaking Nvidia Powermizer to obtain higher frame rates&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Depending on the hardware specs of the target platform, adjusting the threading mode of FG/OSG may also help: [[Howto:Activate multi core and multi GPU support]]. (If you don't know what we're talking about, you can safely leave it as it is.)&lt;br /&gt;
&lt;br /&gt;
You can directly use a custom [[Fgfsrc]] file for the following sections or parse the following lines to the console (separated by one empty character, e.g. a space) after &amp;quot;FGFS&amp;quot; or set the respective options in [[Fgrun]] or in [[FlightGear configuration via XML|one of FlightGear's XML configuration files]]. &lt;br /&gt;
&lt;br /&gt;
Please make sure to rename/delete your autosave and fgfsrc files prior to trying these settings, or your local settings would possibly override these settings.&lt;br /&gt;
{{Startup Profile|name=minimal|version=3.2}}&lt;br /&gt;
&lt;br /&gt;
{{Tip|Beginning with FlightGear 3.1+, you can also toggle individual scenegraph traversal masks on/off (these can be changed at runtime using the [[Property browser]]:&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;--prop:/sim/sceneryloaded-override=1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;--prop:/sim/rendering/draw-mask/terrain=0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;--prop:/sim/rendering/draw-mask/aircraft=0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;--prop:/sim/rendering/draw-mask/models=0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;--prop:/sim/rendering/draw-mask/clouds=0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
If you're running on Windows, you can use the following batch file to start the simulator using the minimal profile. Open Notepad, copy and paste the following lines and save the file on the Desktop (name it ''fgminimal.bat''); change ''C:\Program Files\FlightGear'' to the directory you installed FlightGear in and change ''Win64'' to ''Win32'' if you are using the 32-bit version.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@echo off&lt;br /&gt;
&amp;quot;C:\Program Files\FlightGear\bin\Win64\fgfs.exe&amp;quot; --fg-root=&amp;quot;C:\Program Files\FlightGear\data&amp;quot; --ignore-autosave --airport=ksfo --offset-distance=4000 --offset-azimuth=90 --altitude=500 --heading=0 --model-hz=60 --disable-random-objects --prop:/sim/rendering/texture-compression=off --prop:/sim/rendering/quality-level=0 --prop:/sim/rendering/shaders/quality-level=0 --disable-ai-traffic --prop:/sim/ai/enabled=0 --aircraft=ufo --disable-sound --prop:/sim/rendering/random-vegetation=0 --prop:/sim/rendering/random-buildings=0 --disable-specular-highlight --disable-ai-models --disable-clouds --disable-clouds3d --fog-fastest --visibility=5000 --disable-distance-attenuation --disable-enhanced-lighting --disable-real-weather-fetch --prop:/sim/rendering/particles=0 --prop:/sim/rendering/multi-sample-buffers=1 --prop:/sim/rendering/multi-samples=2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Double-click the batch file to start FlightGear.&lt;br /&gt;
&lt;br /&gt;
Using these settings, frame rates between 400-500 fps and a steady frame spacing (latency) of 3-11 ms, can be achieved on a notebook from 2007 (1024x768). Disabling wireframe mode lowers the framerate by about 50-80 fps. The window should be up and running (fully initialized) within 3-5 seconds, even on moderately old hardware (absent a navcache rebuild).&lt;br /&gt;
&lt;br /&gt;
[[File:Fgfs28-bare-bones.png|thumb |FlightGear 2.10 bare bones on 2006-era hardware (NVIDIA 7600GO)]]&lt;br /&gt;
[[File:Screen shot minimal startup profile without textures 2.12.png|thumb |FG 2.12 zero eyecandy mode on 2009-era hardware (NVIDIA 260M)]]&lt;br /&gt;
[[File:Screen shot minimal startup profile with textures in 2.12.png|thumb |FG 2.12 minimal eye candy mode on 2009-era hardware (NVIDIA 260M)]]&lt;br /&gt;
&lt;br /&gt;
As can be seen, additional resources can be freed by flying in areas without scenery (ocean tiles), by using simple aircraft like the ufo, and by using a HUD instead of a 2D/3D cockpit panel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
=== Minimal Rembrandt Startup Profile ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
--enable-rembrandt&lt;br /&gt;
--prop:/sim/rendering/rembrandt/ambient-occlusion-buffers=false&lt;br /&gt;
--prop:/sim/rendering/shadows/map-size=1024&lt;br /&gt;
--prop:/sim/rendering/shadows/num-cascades=1&lt;br /&gt;
--airport=ksfo&lt;br /&gt;
--offset-distance=4000&lt;br /&gt;
--offset-azimuth=90&lt;br /&gt;
--altitude=500&lt;br /&gt;
--heading=0&lt;br /&gt;
--model-hz=60&lt;br /&gt;
--disable-random-objects&lt;br /&gt;
--prop:/sim/rendering/texture-compression=off&lt;br /&gt;
--prop:/sim/rendering/quality-level=1&lt;br /&gt;
--prop:/sim/rendering/shaders/quality-level=1&lt;br /&gt;
--disable-ai-traffic&lt;br /&gt;
--prop:/sim/ai/enabled=0&lt;br /&gt;
--aircraft=ufo&lt;br /&gt;
--disable-sound&lt;br /&gt;
--prop:/sim/rendering/random-vegetation=0&lt;br /&gt;
--prop:/sim/rendering/random-buildings=0&lt;br /&gt;
--disable-specular-highlight&lt;br /&gt;
--disable-ai-models &lt;br /&gt;
--disable-clouds&lt;br /&gt;
--disable-clouds3d&lt;br /&gt;
--disable-textures&lt;br /&gt;
--fog-fastest&lt;br /&gt;
--visibility=5000&lt;br /&gt;
--disable-distance-attenuation&lt;br /&gt;
--disable-enhanced-lighting&lt;br /&gt;
--disable-real-weather-fetch &lt;br /&gt;
--prop:/sim/rendering/particles=0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
(Again, the point not being to look good, but just to start up without crashing or extreme lag)&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reporting incompatible default settings ===&lt;br /&gt;
Once you have located and identified settings that seem to cause reproducible issues with your hardware, it would be a good idea to report these settings using the issue tracker, so that these can hopefully be made optional in the upcoming release: http://flightgear-bugs.googlecode.com/&lt;br /&gt;
&lt;br /&gt;
=== Tracking RAM utilization ===&lt;br /&gt;
[[File:Fg-3.2-minimal-settings.png|400px|Screen shot showing FlightGear 3.2 using the minimal startup profile with frame spacing and frame counter displayed.]]&lt;br /&gt;
&lt;br /&gt;
{{WIP}}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |My measurements (below) suggest that terrain mesh (as loaded at &amp;quot;bare&amp;quot; &amp;lt;br/&amp;gt;&lt;br /&gt;
LOD) is the dominant memory user, with only small contributions from the &amp;lt;br/&amp;gt;&lt;br /&gt;
aircraft, terrain textures, and random objects/trees/buildings.&lt;br /&gt;
  |{{cite web |url=http://sourceforge.net/p/flightgear/mailman/message/32445574/&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: [Flightgear-devel] Memory consumption reduction&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Rebecca N. Palmer&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;2014-06-11&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |In Ubuntu 64-bit, measured using System Monitor after it stabilizes (~1min)&amp;lt;br/&amp;gt;&lt;br /&gt;
Except as stated, c172p stationary on KSFO 28R, night, Terrasync &amp;lt;br/&amp;gt;&lt;br /&gt;
scenery, default settings (regional textures, LOD range 1500/9000/30000)&amp;lt;br/&amp;gt;&lt;br /&gt;
baseline: 2.3-2.4GB&amp;lt;br/&amp;gt;&lt;br /&gt;
Changing shader effects level or enabling/disabling random &amp;lt;br/&amp;gt;&lt;br /&gt;
objects/trees/buildings: no significant change&amp;lt;br/&amp;gt;&lt;br /&gt;
Global texture set: 2.2GB&amp;lt;br/&amp;gt;&lt;br /&gt;
DDS texture set: 2.2GB&amp;lt;br/&amp;gt;&lt;br /&gt;
Global texture set, no Textures.high: 2.1GB (and some missing effects &amp;lt;br/&amp;gt;&lt;br /&gt;
textures, as they don't have the &amp;quot;try Textures.high first, then &amp;lt;br/&amp;gt;&lt;br /&gt;
Textures&amp;quot; fallback mechanism)&amp;lt;br/&amp;gt;&lt;br /&gt;
LOD range 1500/9000/10000: 1.4GB&amp;lt;br/&amp;gt;&lt;br /&gt;
LOD range 1500/2000/30000: 2.3GB&amp;lt;br/&amp;gt;&lt;br /&gt;
LOD range 500/9000/30000: 2.3GB&amp;lt;br/&amp;gt;&lt;br /&gt;
1.0 scenery (from flightgear-data 3.0 due to above issue): 1.1GB&amp;lt;br/&amp;gt;&lt;br /&gt;
Ocean location: 0.75GB&amp;lt;br/&amp;gt;&lt;br /&gt;
F-14: 2.1GB&amp;lt;br/&amp;gt;&lt;br /&gt;
777-200: 2.6GB&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  |{{cite web |url=http://sourceforge.net/p/flightgear/mailman/message/32445574/&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: [Flightgear-devel] Memory consumption reduction&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Rebecca N. Palmer&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;2014-06-11&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[File:Fg-3.2-RAM-utilization-in-minimal-mode.png|right|500px|htop showing FlightGear 3.2 RAM utilization when in minimal startup mode]]&lt;br /&gt;
&lt;br /&gt;
== Further assistance ==&lt;br /&gt;
If you need help with the whole process, please get in touch via the FG forums.&lt;br /&gt;
&lt;br /&gt;
When doing that, please fully document the whole process, i.e. including:&lt;br /&gt;
&lt;br /&gt;
* startup settings (and fgfsrc if used)&lt;br /&gt;
* error messages and warnings (console output)&lt;br /&gt;
* screen shots&lt;br /&gt;
* screen shots showing frame rate, frame spacing, performance monitor, osg on-screen stats (see [[Howto:Use the system monitor]] )&lt;br /&gt;
* use the about dialog to provide other important information&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting Performance Issues ==&lt;br /&gt;
&lt;br /&gt;
If you're able to build from source and don't mind using development looks like the built-in profiler, it would be interesting to see comparison of both builds - ideally using a simple test case with everything else disabled - you could use a pre-recorded flight and/or a flight recorder type to come up with a &amp;quot;test flight&amp;quot;. From our standpoint, it would help tremendously if all features that don't seem to have an effect could be completely disabled, including complex aircraft and scenery/locations. In other words, if you can reproduce the problem using &amp;quot;bare&amp;quot; minimum settings, the resulting log file will be much easier to process.&lt;br /&gt;
&lt;br /&gt;
There's a built-in profiler which you can use to create these profiles: http://wiki.flightgear.org/Built-in_Profiler&lt;br /&gt;
You would then want to use two different build directories, where SG/FG build settings would be identical, but using an older version of OSG: http://wiki.flightgear.org/Building_using_CMake#Multiple_build_directories&lt;br /&gt;
&lt;br /&gt;
For the sake of simplicity there's a so called &amp;quot;minimal startup profile&amp;quot; that you can use: http://wiki.flightgear.org/Howto:Debugging_FlightGear_Crashes#Minimal_startup_profile&lt;br /&gt;
While unlikely, it would be great if the issue could be reproduced that way - but more likely than not, you'll have to re-add a few features and change a few settings, e.g. by using a different location.&lt;br /&gt;
&lt;br /&gt;
Like I said, you could then use the replay system to create an test flight than can be easily reproduced - to get going more quickly, you can also use the built-in route manager to create a simple flight plan and fly the whole thing on autopilot: http://wiki.flightgear.org/Instant_Replay&lt;br /&gt;
&lt;br /&gt;
You can use time warp mode to speed up simulation time and finish more quickly.&lt;br /&gt;
&lt;br /&gt;
Admittedly, all this may seem a bit intimidating and tedious, but once you have such a setup working, you can reuse it over and over again for different startup profiles and provide profiling logs for each.&lt;br /&gt;
We do have a number of people interested in adding features to support benchmarking/profiling workflows natively:&lt;br /&gt;
&lt;br /&gt;
http://wiki.flightgear.org/FlightGear_Benchmark&lt;br /&gt;
http://wiki.flightgear.org/Testing&lt;br /&gt;
&lt;br /&gt;
If that's something you'd like to pursue, feel free to get in touch - it is definitely a worthwhile thing, even regardless of any OSG specific issues, as it will also help with unrelated performance issues.&lt;br /&gt;
Obviously, there's a bit of a steep learning curve involved, which is why it's normally only core developers that build multiple versions against different OSG versions and run the profiler.&lt;br /&gt;
But once you are able to build from source, you have already completed the most difficult step - everything else is fairly straightforward in comparison - as as you can probably tell, creating test flights using the route manager and/or flight recorder also isn't exactly rocket science.&lt;br /&gt;
&lt;br /&gt;
However, before you do anything, I'd suggest to check first if you've possibly changed your driver, or if you can install a newer version&lt;br /&gt;
&lt;br /&gt;
== Debugging Segfaults &amp;amp; Obtaining Backtraces ==&lt;br /&gt;
{{Note|This section is currently Linux/gdb specific. Any help in updating it to become less platform/OS/debugger-specific would be greatly appreciated!}}&lt;br /&gt;
&lt;br /&gt;
A '''segfault''' is another word for &amp;quot;crash&amp;quot;, it's a so called &amp;quot;segmentation fault&amp;quot;, where the program is doing things that it wasn't designed to do, such as accessing invalid memory for example, so that the operating system will terminate the process because its behavior is no longer valid/correct. These '''segfaults''' will typically happen due to coding errors, either in FlightGear or one of its dependencies (libraries like SimGear, plib, OpenSceneGraph or OpenAL). &lt;br /&gt;
&lt;br /&gt;
A typical segfault may look like this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Initializing splash screen&lt;br /&gt;
Splash screen progress init&lt;br /&gt;
Tungsten Graphics, Inc.&lt;br /&gt;
Mesa DRI R200 (RV250 4C66) x86/MMX/SSE2 TCL DRI2&lt;br /&gt;
1.3 Mesa 9.1.1&lt;br /&gt;
&lt;br /&gt;
Program received signal SIGSEGV, Segmentation fault.&lt;br /&gt;
0xb71467e6 in __strlen_sse2_bsf () from /usr/lib/libc.so.6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The last two lines are basically showing the actual crash, anything shown earlier is normally just an indicator how far the code could proceed shortly before the crash actually occurred.  &lt;br /&gt;
&lt;br /&gt;
In order to see what was going on when the crash occurred, you'll need to build a binary with '''debugging symbols''' enabled/included, usually this includes FlightGear and SimGear - and possibly even OSG (OpenSceneGraph, normally only if your crash happens inside rendering related code).&lt;br /&gt;
&lt;br /&gt;
A so called '''backtrace''' is basically pretty much like a flight data recorder tape/log that is used to conduct a post-crash analysis.&lt;br /&gt;
&lt;br /&gt;
A binary with debugging symbols included will contain additional information that helps developers track down what was causing a certain crash, such as for example the file name, function, line number, variable that was accessed before the crash happened. This is analogous to how a FDR/CVR on an airplane records certain parameters like position, orientation, altitude, velocities, configuration, cockpit conversations etc. This can also be used by developers to see who is responsible for a certain segfault/bug, i.e. which commit introduced the bug.&lt;br /&gt;
&lt;br /&gt;
Debugging FlightGear crashes is significantly simplified by having access to such runtime data, because we can basically go back in time and see what the FlightGear program was doing shortly before the crash.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, logging all this data by default has a certain run-time overhead and requires additional tools and knowledge, so it is usually too costly and not done, FlightGear will by default be heavily optimized by your compiler and not include code logging important debugging/post-crash parameters, for the sake of better performance. &lt;br /&gt;
.&lt;br /&gt;
However, as developers, we do appreciate all efforts to provide meaningful bug reports, and a reproducible bug including a good crash analysis, i.e. a so called '''backtrace''' is as good as it gets, and the likelihood of a certain bug being examined and fixed is significantly higher when the bug report includes both,  a '''backtrace''', and a set of steps to reproduce the error reliably. &lt;br /&gt;
&lt;br /&gt;
A good way to to provide a reproducible test case is using the [[Replay]]/flight recorder system to create a flight recorder tape that triggers the crash, alternatively, consider providing a &amp;quot;flight plan&amp;quot; that triggers the crash - ideally, without it being aircraft specific, i.e. reproducible using aircraft like the ufo&lt;br /&gt;
&lt;br /&gt;
Thus, you'll want to reconfigure your SimGear/FlightGear ($SG_SRC &amp;amp; $FG_SRC) source trees using the '''-CMAKE_BUILD_TYPE=RelWithDebInfo''' switch, for details please refer to: [[Building using CMake#Debug_Builds]]. It is a good idea not to touch your existing build trees for this, but instead create an additional directory hierarchy for your debugging binary, please see [[Building using CMake#Multiple build directories]] for details. &lt;br /&gt;
&lt;br /&gt;
Once you have rebuilt and relinked SimGear and FlightGear, you'll want to use a debugger like '''gdb''' to run your new binary. It does help to have a good way to reproduce a crash, such as using certain startup/runtime settings. For the sake of simplicity it is usually a good idea to disable all unrelated features and subsystems/settings, this includes complex aircraft and complex scenery locations (airports) if possible. For details, refer to the minimal startup profile detailed in this article.&lt;br /&gt;
&lt;br /&gt;
# For gdb to be available, you'll normally have to use your package manager (apt, yum, yast etc) and install the &amp;quot;gdb&amp;quot; package first.&lt;br /&gt;
# next, you'd navigate to your build directory where your '''fgfs''' debug binary is located&lt;br /&gt;
# you'd then, run gdb&lt;br /&gt;
# via the gdb shell, you can specify the file to be used via '''file src/Main/fgfs'''&lt;br /&gt;
# this will preload the binary and its dependencies&lt;br /&gt;
# to actually run the file, you would use the '''run''' command&lt;br /&gt;
# you'll normally want to pass arguments right behind '''run''', especially the mandatory ones (i.e. to specify $FG_ROOT)&lt;br /&gt;
# creating a simple .[[Fgfsrc]] file helps for the sake of simplicity&lt;br /&gt;
# once the segfault/crash occurs, you'll want to run '''backtrace''' (with '''bt''' being the shorter equivalent)&lt;br /&gt;
# only if that isn't conclusive, use  '''thread apply all bt full''' instead to get a full backtrace for all threads (background tasks)&lt;br /&gt;
# please use the issue tracker to post your backtrace&lt;br /&gt;
&lt;br /&gt;
This is what a typical backtrace may look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gdb&amp;quot;&amp;gt;(gdb) thread apply all bt&lt;br /&gt;
&lt;br /&gt;
Thread 1 (Thread 0xb66c4740 (LWP 10908)):&lt;br /&gt;
#0  0xb71467e6 in __strlen_sse2_bsf () from /usr/lib/libc.so.6&lt;br /&gt;
#1  0x0886c080 in copy_string (s=s@entry=0x0)&lt;br /&gt;
    at /home/cesar/compilation/pkg/simgear/2.10.0/src/simgear-2.10.0/simgear/props/props.cxx:161&lt;br /&gt;
#2  0x08870550 in set_string (val=0x0, this=0x8dd55b8)&lt;br /&gt;
    at /home/cesar/compilation/pkg/simgear/2.10.0/src/simgear-2.10.0/simgear/props/props.cxx:524&lt;br /&gt;
#3  SGPropertyNode::setStringValue (this=0x8dd55b8, value=0x0)&lt;br /&gt;
    at /home/cesar/compilation/pkg/simgear/2.10.0/src/simgear-2.10.0/simgear/props/props.cxx:1587&lt;br /&gt;
#4  0x08326ae1 in (anonymous namespace)::GeneralInitOperation::run (this=0x8bdea48, gc=0x8be4310)&lt;br /&gt;
    at /home/cesar/compilation/pkg/flightgear/2.10.0/src/flightgear-2.10.0/src/GUI/gui.cxx:123&lt;br /&gt;
#5  0x085c2b7b in flightgear::GraphicsContextOperation::operator() (this=0x8bdea48, gc=0x8be4310)&lt;br /&gt;
    at /home/cesar/compilation/pkg/flightgear/2.10.0/src/flightgear-2.10.0/src/Viewer/WindowSystemAdapter.cxx:41&lt;br /&gt;
#6  0xb78ca246 in osg::GraphicsOperation::operator()(osg::Object*) () from /usr/lib/libosg.so.80&lt;br /&gt;
#7  0xb78c7784 in osg::GraphicsContext::runOperations() () from /usr/lib/libosg.so.80&lt;br /&gt;
#8  0xb7b29fe2 in osgViewer::ViewerBase::renderingTraversals() () from /usr/lib/libosgViewer.so.80&lt;br /&gt;
#9  0xb7b2707c in osgViewer::ViewerBase::frame(double) () from /usr/lib/libosgViewer.so.80&lt;br /&gt;
#10 0x085c4841 in fgOSMainLoop ()&lt;br /&gt;
    at /home/cesar/compilation/pkg/flightgear/2.10.0/src/flightgear-2.10.0/src/Viewer/fg_os_osgviewer.cxx:286&lt;br /&gt;
#11 0x082221fa in fgMainInit (argc=32, argv=0xbffff494)&lt;br /&gt;
    at /home/cesar/compilation/pkg/flightgear/2.10.0/src/flightgear-2.10.0/src/Main/main.cxx:339&lt;br /&gt;
#12 0x081e71ee in main (argc=32, argv=0xbffff494)&lt;br /&gt;
    at /home/cesar/compilation/pkg/flightgear/2.10.0/src/flightgear-2.10.0/src/Main/bootstrap.cxx:251&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As can be seen, the first few lines basically show exactly what happened, and where it happened, while all the subsequent lines are basically showing the callgraph, i.e. how the piece of code got triggered. For example, FlightGear started in bootstrap.cxx line 251, then called into main.cxx (line 339), at which point the osgviewer setup took place. Next, there are a few lines that  do not contain a lot of interesting info, because those are all library calls into OSG - things are starting to be interesting again around line #5, where FlightGear specific code is getting called again. As can be seen in this particular example, the actual segfault was triggered in a SimGear operation here, which was due to a NULL pointer.&lt;br /&gt;
&lt;br /&gt;
At first, this may look a bit confusing and even intimidating, but it does make sense to people familiar with C++ and FlightGear/SimGear - so even if you cannot understand a single thing, just post such output on the issue tracker, so that others can have a look. We'll ask for additional information if necessary.&lt;br /&gt;
&lt;br /&gt;
However, at times it may be nearly impossible to see what actually goes in in FG these days simply because there's too many disparate parts involved here. For example, in the rare instance that our [[Nasal]] scripting interpreter could lead to a segfault, we could potentially see where the C code was using a debugger like gdb – but that wouldn't tell us where we were in the Nasal code. &lt;br /&gt;
&lt;br /&gt;
And that similarly applies to many things, especially things that &amp;quot;jump&amp;quot; boundaries here. Another prime example is property tree listeners - Nasal listeners don't have a backtrace beyond the C code, even if it is triggered directly from a Nasal setprop()/.setValue(), because it passes through C and C++ stack frames and then back into Nasal.&lt;br /&gt;
&lt;br /&gt;
Thus, valgrind/gdb/cachegrind/perftools may be too low-level to be meaningful in most cases, i.e. just look at what's going on in the scenery/aircraft department, here just identifying &amp;quot;hot spots&amp;quot; in terms of code/functions would be a red herring, because the real culprit is typically not at all in the run-time code, but the underlying scenegraph data, such as highly complex textures, 3D models or terrain/scenery. &lt;br /&gt;
&lt;br /&gt;
This can now be easily verified by using Zakalawe's new draw-masks to switch off aircraft/scenery/clouds or AI model rendering.&lt;br /&gt;
&lt;br /&gt;
Having acess to gdb/valgrind etc is one thing, being able to actually run and interpret the results is a completely different thing. &lt;br /&gt;
&lt;br /&gt;
Thus, it is more promising -in the long term- to optionally expose certain info at run-time, so that users can access it to see how their aircraft/scenery/feature/configuration behaves in comparison to some other aircraft/scenery/feature/configuration.&lt;br /&gt;
&lt;br /&gt;
Also, when it comes to using tools like gdb -and especially valgrind- the main challenge is that FlightGear is primarily a GUI application, and it doesn't lend itself it being debugged/profiled or leak-tested in an isolated fashion at all. &lt;br /&gt;
&lt;br /&gt;
For example, for valgrind runs to be useful and straightforward, we would need to be able to minimize what's done inside fg_init.cxx so that we can disable things not needed, but also even run FlightGear in a [[FlightGear Headless|&amp;quot;headless&amp;quot; mode]] without a visible GUI window, so that such tests could be run directly on the build server as part of a regression testing suite. Otherwise, even just running fgfs in valgrind for 10 minutes sim time may turn out to take hours due to the nature of valgrind, i.e. it being an emulator.&lt;br /&gt;
&lt;br /&gt;
valgrind et all are great if you know how to use them, but for end users, these tools are too fine-grained, we would ideally support some per-subsystem or per-feature granularity for end users.&lt;br /&gt;
&lt;br /&gt;
== Using AddressSanitizer ==&lt;br /&gt;
{{FGCquote&lt;br /&gt;
  |AddressSanitizer does a similar job to Valgrind with less overhead &amp;lt;br/&amp;gt;&lt;br /&gt;
(~2.5x memory use, and nearly full speed), but requires recompiling; I &amp;lt;br/&amp;gt;&lt;br /&gt;
haven't seen the crash under it yet (or at all today), if anyone does &amp;lt;br/&amp;gt;&lt;br /&gt;
please post your log.&lt;br /&gt;
  |{{cite web |url=http://sourceforge.net/p/flightgear/mailman/message/32749837/&lt;br /&gt;
     |title=&amp;lt;nowiki&amp;gt;Re: [Flightgear-devel] crash in SGPropertyNode::fireValueChanged&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |author=&amp;lt;nowiki&amp;gt;Rebecca Palmer&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
     |date=&amp;lt;nowiki&amp;gt;2014-08-22&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#this is for Linux with llvm-3.4, libsqlite3-dev, flite1-dev, libhtsengine-dev; it will probably work on Mac (with possibly different  ASAN_SYMBOLIZER_PATH) but not Windows&lt;br /&gt;
&lt;br /&gt;
#simgear&lt;br /&gt;
cmake ../../git/simgear -DCMAKE_BUILD_TYPE=RelWithDebInfo &lt;br /&gt;
-DCMAKE_C_FLAGS=&amp;quot;-fsanitize=address -fno-omit-frame-pointer -O2 -g&amp;quot; &lt;br /&gt;
-DCMAKE_CXX_FLAGS=&amp;quot;-fsanitize=address -fno-omit-frame-pointer -O2 -g&amp;quot; &lt;br /&gt;
-DCMAKE_SHARED_LINKER_FLAGS=&amp;quot;-fsanitize=address -fno-omit-frame-pointer &lt;br /&gt;
-O2 -g&amp;quot; -DCMAKE_VERBOSE_MAKEFILE=1 -DSIMGEAR_SHARED=ON&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
&lt;br /&gt;
#flightgear&lt;br /&gt;
cmake ../../git/flightgear -DCMAKE_BUILD_TYPE=RelWithDebInfo&lt;br /&gt;
-DCMAKE_C_FLAGS=&amp;quot;-fsanitize=address -fno-omit-frame-pointer -O2 -g&amp;quot; &lt;br /&gt;
-DCMAKE_CXX_FLAGS=&amp;quot;-fsanitize=address -fno-omit-frame-pointer -O2 -g&amp;quot; &lt;br /&gt;
-DCMAKE_VERBOSE_MAKEFILE=1 -DSIMGEAR_SHARED=ON -DENABLE_IAX=OFF &lt;br /&gt;
-DENABLE_FGCOM=OFF -DSYSTEM_SQLITE=ON&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
&lt;br /&gt;
#run&lt;br /&gt;
ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-3.4/bin/llvm-symbolizer &lt;br /&gt;
ASAN_OPTIONS=&amp;quot;symbolize=1 alloc_dealloc_mismatch=0&amp;quot; fgfs [options] 2&amp;gt; &lt;br /&gt;
asan_log.txt&lt;br /&gt;
&lt;br /&gt;
#post asan_log.txt to developers mailing list and/or the issue tracker&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The original idea and future developments ==&lt;br /&gt;
Our hope is that we can come up with a fairly safe subset of FlightGear settings that should work for 99% of our users, even on  moderately old hardware. This would enable us to change the FlightGear defaults accordingly, and use these settings as a safe fallback alternative - so that FlightGear should no longer just crash for people without certain hardware/features. &lt;br /&gt;
&lt;br /&gt;
There's a trend to expose more and more information via the property tree, to make the simulator increasingly runtime-configurable, and to allow subsystems to be re-initialized at runtime, so being able to start up FlightGear in some form of &amp;quot;safe&amp;quot; mode is generally a good thing and useful for anybody helping with troubleshooting on the forums, because it helps us exclude many potential problems. In the long run, such a profile could also be used as the foundation for a [[FlightGear Benchmark]] or some scripted regression suite to run FlightGear in a [[FlightGear Headless|headless]] mode to help with release preparations, and [[FGCanvas]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Related ==&lt;br /&gt;
* http://flightgear.org/forums/viewtopic.php?f=37&amp;amp;t=17199&amp;amp;p=165503#p163684&lt;br /&gt;
* [[System Crashes]]&lt;br /&gt;
* [[Hardware Recommendations]]&lt;br /&gt;
* [[Troubleshooting performance issues]]&lt;br /&gt;
* [[Problematic Video Cards]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto|Debugging FlightGear Crashes]]&lt;br /&gt;
[[Category:Troubleshooting]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115827</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115827"/>
		<updated>2018-08-09T15:10:11Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* General Options */ example for --prop&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]].&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== General Options ====&lt;br /&gt;
&lt;br /&gt;
 --help, -h                   Show the most relevant command line options&lt;br /&gt;
 --verbose, -v                Show all command line options when combined with --help or -h&lt;br /&gt;
 --fg-root=path               Specify the root data path&lt;br /&gt;
 --fg-scenery=path[:path...]  Specify the base scenery path;&lt;br /&gt;
                                Defaults to [[$FG_ROOT]]/Scenery&lt;br /&gt;
 --language=code              Select the language for this session&lt;br /&gt;
 --launcher                   Enable Qt launcher &lt;br /&gt;
 --disable-splash-screen      Disable splash screen&lt;br /&gt;
 --enable-splash-screen       Enable splash screen&lt;br /&gt;
 --disable-mouse-pointer      Disable extra mouse pointer&lt;br /&gt;
 --enable-mouse-pointer       Enable extra mouse pointer&lt;br /&gt;
                                (i.e. for full screen Voodoo based cards)&lt;br /&gt;
 --disable-random-objects     Exclude random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --enable-random-objects      Include random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --disable-ai-models          Disable the AI subsystem.&lt;br /&gt;
                                (This also disables showing the models of other&lt;br /&gt;
                                 multiplayer aircraft)&lt;br /&gt;
 --enable-ai-models           Enable the AI subsystem.&lt;br /&gt;
 --disable-ai-traffic         Disable the autogenerated traffic subsystem.&lt;br /&gt;
 --enable-ai-traffic          Enable the autogenerated traffic subsystem.&lt;br /&gt;
 --disable-freeze             Start in a running state&lt;br /&gt;
 --enable-freeze              Start in a frozen state&lt;br /&gt;
 --disable-fuel-freeze        Fuel is consumed normally&lt;br /&gt;
 --enable-fuel-freeze         Fuel tank quantity forced to remain constant&lt;br /&gt;
 --disable-clock-freeze       Clock advances normally&lt;br /&gt;
 --enable-clock-freeze        Do not advance clock&lt;br /&gt;
 --enable-auto-coordination   Enable auto coordination - rudder and&lt;br /&gt;
                              ailerons will be controlled together&lt;br /&gt;
 --disable-auto-coordination  Disable auto coordination (default)&lt;br /&gt;
 --browser-app=path           Specify path to your web browser&lt;br /&gt;
 --prop:foo=bar               Set property named &amp;quot;foo&amp;quot; to value &amp;quot;bar&amp;quot;&lt;br /&gt;
 --config=path                Load additional properties from path&lt;br /&gt;
 --units-feet                 Use feet for distances&lt;br /&gt;
 --units-meters               Use meters for distances&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
&lt;br /&gt;
 --disable-panel              Disable instrument panel&lt;br /&gt;
 --enable-panel               Enable instrument panel&lt;br /&gt;
 --disable-sound              Disable sound effects&lt;br /&gt;
 --enable-sound               Enable sound effects&lt;br /&gt;
 --disable-hud                Disable Heads Up Display (HUD)&lt;br /&gt;
 --enable-hud                 Enable Heads Up Display (HUD)&lt;br /&gt;
 --disable-anti-alias-hud     Disable anti-aliased HUD&lt;br /&gt;
 --enable-anti-alias-hud      Enable anti-aliased HUD&lt;br /&gt;
 --disable-hud-3d             Disable 3D HUD&lt;br /&gt;
 --enable-hud-3d              Enable 3D HUD&lt;br /&gt;
 --ai-scenario=scenario       Add and enable a new scenario. Multiple options&lt;br /&gt;
                              are allowed. Scenarios are in /[[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
==== Aircraft ====&lt;br /&gt;
&lt;br /&gt;
 --aircraft=name              Select an aircraft profile as defined by a top&lt;br /&gt;
                              level -set.xml&lt;br /&gt;
 --aircraft-dir=path          Specify the exact directory to use for the&lt;br /&gt;
                              aircraft (normally not required, but may be&lt;br /&gt;
                              useful). Interpreted relatively to the&lt;br /&gt;
                              current directory. Causes the &amp;lt;path-cache&amp;gt;&lt;br /&gt;
                              from autosave_X_Y.xml, as well as&lt;br /&gt;
                              --fg-aircraft options and the FG_AIRCRAFT&lt;br /&gt;
                              environment variable to be bypassed.&lt;br /&gt;
 --show-aircraft              Print a list of the currently available&lt;br /&gt;
                              aircraft types&lt;br /&gt;
&lt;br /&gt;
==== Flight Model ====&lt;br /&gt;
&lt;br /&gt;
 --fdm=name                   Select the core flight dynamics model&lt;br /&gt;
                              Can be one of jsb, larcsim, yasim, magic,&lt;br /&gt;
                              balloon, ada, external, or null&lt;br /&gt;
 --aero=name                  Select aircraft aerodynamics model to load&lt;br /&gt;
 --model-hz=n                 Run the FDM this rate (iterations per second)&lt;br /&gt;
 --speed=n                    Run the FDM 'n' times faster than real time&lt;br /&gt;
 --notrim                     Do NOT attempt to trim the model&lt;br /&gt;
                              (only with fdm=jsbsim)&lt;br /&gt;
 --on-ground                  Start at ground level (default)&lt;br /&gt;
 --in-air                     Start in air (implied when using --altitude)&lt;br /&gt;
&lt;br /&gt;
==== Initial Position and Orientation ====&lt;br /&gt;
&lt;br /&gt;
 --airport=ID                 Specify airport (e.g. KOAK)&lt;br /&gt;
 --runway=rwy_no              Specify starting runway (must also specify an&lt;br /&gt;
                              airport)&lt;br /&gt;
 --vor=ID                     Specify starting position relative to a VOR&lt;br /&gt;
 --ndb=ID                     Specify starting position relative to an NDB&lt;br /&gt;
 --fix=ID                     Specify starting position relative to a fix&lt;br /&gt;
 --parkpos=NAME               Specify a gate at the airport (e.g. 747d11)&lt;br /&gt;
 --offset-distance=nm         Specify distance to reference point (statute&lt;br /&gt;
                              miles)&lt;br /&gt;
 --offset-azimuth=degrees     Specify heading to reference point&lt;br /&gt;
 --lon=degrees                Starting longitude (west = -)&lt;br /&gt;
 --lat=degrees                Starting latitude (south = -)&lt;br /&gt;
 --altitude=value             Starting altitude&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --heading=degrees            Specify heading (yaw) angle (Psi)&lt;br /&gt;
 --roll=degrees               Specify roll angle (Phi)&lt;br /&gt;
 --pitch=degrees              Specify pitch angle (Theta)&lt;br /&gt;
 --uBody=units_per_sec        Specify velocity along the body X axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vBody=units_per_sec        Specify velocity along the body Y axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --wBody=units_per_sec        Specify velocity along the body Z axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vc=knots                   Specify initial airspeed&lt;br /&gt;
 --mach=num                   Specify initial mach number&lt;br /&gt;
 --glideslope=degrees         Specify flight path angle (can be positive)&lt;br /&gt;
 --roc=fpm                    Specify initial climb rate (can be negative)&lt;br /&gt;
&lt;br /&gt;
==== Rendering Options ====&lt;br /&gt;
&lt;br /&gt;
 --bpp=depth                  Specify the bits per pixel&lt;br /&gt;
 --fog-disable                Disable fog/haze&lt;br /&gt;
 --fog-fastest                Enable fastest fog/haze&lt;br /&gt;
 --fog-nicest                 Enable nicest fog/haze&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --disable-enhanced-lighting  Disable enhanced runway lighting&lt;br /&gt;
 --enable-enhanced-lighting   Enable enhanced runway lighting&lt;br /&gt;
 --season=winter              Enable snow covered scenery&lt;br /&gt;
 --disable-distance-attenuation&lt;br /&gt;
                              Disable runway light distance attenuation&lt;br /&gt;
 --enable-distance-attenuation&lt;br /&gt;
                              Enable runway light distance attenuation&lt;br /&gt;
 --disable-specular-highlight&lt;br /&gt;
                              Disable specular reflections on textured&lt;br /&gt;
                              objects&lt;br /&gt;
 --enable-specular-highlight  Enable specular reflections on textured objects&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --fov=degrees                Specify field of view angle&lt;br /&gt;
 --disable-fullscreen         Disable fullscreen mode&lt;br /&gt;
 --enable-fullscreen          Enable fullscreen mode&lt;br /&gt;
 --shading-flat               Enable flat shading&lt;br /&gt;
 --shading-smooth             Enable smooth shading&lt;br /&gt;
 --disable-wireframe          Disable wireframe drawing mode&lt;br /&gt;
 --enable-wireframe           Enable wireframe drawing mode&lt;br /&gt;
 --geometry=WxH               Specify window geometry (640x480, etc)&lt;br /&gt;
 --view-offset=value          Specify the default forward view direction as&lt;br /&gt;
                              an offset from straight ahead. Allowable values&lt;br /&gt;
                              are LEFT, RIGHT, CENTER, or a specific number&lt;br /&gt;
                              in degrees&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --texture-filtering=number   Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
==== Hud Options ====&lt;br /&gt;
&lt;br /&gt;
 --hud-tris                   Hud displays number of triangles rendered&lt;br /&gt;
 --hud-culled                 Hud displays percentage of triangles culled&lt;br /&gt;
&lt;br /&gt;
==== Time Options ====&lt;br /&gt;
&lt;br /&gt;
 --timeofday={dawn,noon,dusk,midnight}&lt;br /&gt;
                              Specify a time of day&lt;br /&gt;
 --time-offset=[+-]hh:mm:ss   Add this time offset&lt;br /&gt;
 --time-match-real            Synchronize time with current time at chosen airport&lt;br /&gt;
 --time-match-local           Synchronize time with system time of computer&lt;br /&gt;
 --start-date-sys=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              system time&lt;br /&gt;
 --start-date-gmt=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Greenwich Mean Time&lt;br /&gt;
 --start-date-lat=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Local Aircraft Time&lt;br /&gt;
&lt;br /&gt;
==== Network Options ====&lt;br /&gt;
&lt;br /&gt;
 --httpd=port                 Enable http server on the specified port&lt;br /&gt;
 --telnet=port                Enable telnet server on the specified port&lt;br /&gt;
 --jpg-httpd=port             Enable screen shot http server on the specified&lt;br /&gt;
                                port&lt;br /&gt;
&lt;br /&gt;
==== MultiPlayer Options ====&lt;br /&gt;
&lt;br /&gt;
 --callsign                   assign a unique name to a player&lt;br /&gt;
 --multiplay={in|out},hz,address,port&lt;br /&gt;
                              Specify multipilot communication settings&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
==== Route/Way Point Options ====&lt;br /&gt;
&lt;br /&gt;
 --wp=ID[@alt]                Specify a waypoint for the GC autopilot;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --flight-plan=file           Read all waypoints from a file&lt;br /&gt;
&lt;br /&gt;
==== IO Options ====&lt;br /&gt;
&lt;br /&gt;
 --generic=params             Open connection using a predefined&lt;br /&gt;
                              communication interface and a preselected&lt;br /&gt;
                              communication protocol&lt;br /&gt;
 --garmin=params              Open connection using the Garmin GPS protocol&lt;br /&gt;
 --joyclient=params           Open connection to an Agwagon joystick&lt;br /&gt;
 --jsclient=params            Open connection to a remote joystick&lt;br /&gt;
 --native-ctrls=params        Open connection using the FG Native Controls&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native-fdm=params          Open connection using the FG Native FDM&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native=params              Open connection using the FG Native protocol&lt;br /&gt;
 --nmea=params                Open connection using the NMEA protocol&lt;br /&gt;
 --opengc=params              Open connection using the OpenGC protocol&lt;br /&gt;
 --props=params               Open connection using the interactive property&lt;br /&gt;
                              manager (LEGACY/DEAD DO NOT USE same as --telnet)&lt;br /&gt;
 --pve=params                 Open connection using the PVE protocol&lt;br /&gt;
 --ray=params                 Open connection using the Ray Woodworth motion&lt;br /&gt;
                              chair protocol&lt;br /&gt;
 --rul=params                 Open connection using the RUL protocol&lt;br /&gt;
 --atc610x                    Enable atc610x interface&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: --generic=\\.\COM10,out,1,/tmp/data.xml,myproto&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
==== Avionics Options ====&lt;br /&gt;
&lt;br /&gt;
 --com1=frequency             Set the COM1 radio frequency.&lt;br /&gt;
 --com2=frequency             Set the COM2 radio frequency.&lt;br /&gt;
 --nav1=[radial:]frequency    Set the NAV1 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --nav2=[radial:]frequency    Set the NAV2 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --adf=[rotation:]frequency   Set the ADF radio frequency, optionally&lt;br /&gt;
                              preceded by a card rotation.&lt;br /&gt;
 --dme={nav1|nav2|frequency}  Slave the ADF to one of the NAV radios, or set&lt;br /&gt;
                              its internal frequency.&lt;br /&gt;
&lt;br /&gt;
==== Environment Options ====&lt;br /&gt;
&lt;br /&gt;
 --disable-real-weather-fetch Disable METAR based real weather fetching&lt;br /&gt;
 --enable-real-weather-fetch  Enable METAR based real weather fetching (this&lt;br /&gt;
                              requires an open internet connection)&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
 --random-wind&lt;br /&gt;
 --metar=&amp;quot;metar string&amp;quot;       Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
==== Situation Options ====&lt;br /&gt;
&lt;br /&gt;
 --failure={pitot|static|system|vacuum}&lt;br /&gt;
                              Fail the pitot, static, vacuum, or electrical&lt;br /&gt;
                              system (repeat the option for multiple system&lt;br /&gt;
                              failures).&lt;br /&gt;
&lt;br /&gt;
==== Debugging Options ====&lt;br /&gt;
&lt;br /&gt;
 --log-level={bulk|debug|info|warn|alert}&lt;br /&gt;
                              Set the logging level for this session.&lt;br /&gt;
                              0=verbose, 5=alerts only&lt;br /&gt;
 --pid=/pathto/some/file.pid  Write current PID into file.&lt;br /&gt;
 --trace-read=property        Trace the reads for a property;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --trace-write=property       Trace the writes for a property;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
&lt;br /&gt;
=== Source files ===&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115826</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115826"/>
		<updated>2018-08-09T15:08:10Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* General Options */ enable-fullscreen and disable-fullscreen are in Rendering Options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]].&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== General Options ====&lt;br /&gt;
&lt;br /&gt;
 --help, -h                   Show the most relevant command line options&lt;br /&gt;
 --verbose, -v                Show all command line options when combined with --help or -h&lt;br /&gt;
 --fg-root=path               Specify the root data path&lt;br /&gt;
 --fg-scenery=path[:path...]  Specify the base scenery path;&lt;br /&gt;
                                Defaults to [[$FG_ROOT]]/Scenery&lt;br /&gt;
 --language=code              Select the language for this session&lt;br /&gt;
 --launcher                   Enable Qt launcher &lt;br /&gt;
 --disable-splash-screen      Disable splash screen&lt;br /&gt;
 --enable-splash-screen       Enable splash screen&lt;br /&gt;
 --disable-mouse-pointer      Disable extra mouse pointer&lt;br /&gt;
 --enable-mouse-pointer       Enable extra mouse pointer&lt;br /&gt;
                                (i.e. for full screen Voodoo based cards)&lt;br /&gt;
 --disable-random-objects     Exclude random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --enable-random-objects      Include random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --disable-ai-models          Disable the AI subsystem.&lt;br /&gt;
                                (This also disables showing the models of other&lt;br /&gt;
                                 multiplayer aircraft)&lt;br /&gt;
 --enable-ai-models           Enable the AI subsystem.&lt;br /&gt;
 --disable-ai-traffic         Disable the autogenerated traffic subsystem.&lt;br /&gt;
 --enable-ai-traffic          Enable the autogenerated traffic subsystem.&lt;br /&gt;
 --disable-freeze             Start in a running state&lt;br /&gt;
 --enable-freeze              Start in a frozen state&lt;br /&gt;
 --disable-fuel-freeze        Fuel is consumed normally&lt;br /&gt;
 --enable-fuel-freeze         Fuel tank quantity forced to remain constant&lt;br /&gt;
 --disable-clock-freeze       Clock advances normally&lt;br /&gt;
 --enable-clock-freeze        Do not advance clock&lt;br /&gt;
 --enable-auto-coordination   Enable auto coordination - rudder and&lt;br /&gt;
                              ailerons will be controlled together&lt;br /&gt;
 --disable-auto-coordination  Disable auto coordination (default)&lt;br /&gt;
 --browser-app=path           Specify path to your web browser&lt;br /&gt;
 --prop:name=value            Set property  to &lt;br /&gt;
 --config=path                Load additional properties from path&lt;br /&gt;
 --units-feet                 Use feet for distances&lt;br /&gt;
 --units-meters               Use meters for distances&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
&lt;br /&gt;
 --disable-panel              Disable instrument panel&lt;br /&gt;
 --enable-panel               Enable instrument panel&lt;br /&gt;
 --disable-sound              Disable sound effects&lt;br /&gt;
 --enable-sound               Enable sound effects&lt;br /&gt;
 --disable-hud                Disable Heads Up Display (HUD)&lt;br /&gt;
 --enable-hud                 Enable Heads Up Display (HUD)&lt;br /&gt;
 --disable-anti-alias-hud     Disable anti-aliased HUD&lt;br /&gt;
 --enable-anti-alias-hud      Enable anti-aliased HUD&lt;br /&gt;
 --disable-hud-3d             Disable 3D HUD&lt;br /&gt;
 --enable-hud-3d              Enable 3D HUD&lt;br /&gt;
 --ai-scenario=scenario       Add and enable a new scenario. Multiple options&lt;br /&gt;
                              are allowed. Scenarios are in /[[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
==== Aircraft ====&lt;br /&gt;
&lt;br /&gt;
 --aircraft=name              Select an aircraft profile as defined by a top&lt;br /&gt;
                              level -set.xml&lt;br /&gt;
 --aircraft-dir=path          Specify the exact directory to use for the&lt;br /&gt;
                              aircraft (normally not required, but may be&lt;br /&gt;
                              useful). Interpreted relatively to the&lt;br /&gt;
                              current directory. Causes the &amp;lt;path-cache&amp;gt;&lt;br /&gt;
                              from autosave_X_Y.xml, as well as&lt;br /&gt;
                              --fg-aircraft options and the FG_AIRCRAFT&lt;br /&gt;
                              environment variable to be bypassed.&lt;br /&gt;
 --show-aircraft              Print a list of the currently available&lt;br /&gt;
                              aircraft types&lt;br /&gt;
&lt;br /&gt;
==== Flight Model ====&lt;br /&gt;
&lt;br /&gt;
 --fdm=name                   Select the core flight dynamics model&lt;br /&gt;
                              Can be one of jsb, larcsim, yasim, magic,&lt;br /&gt;
                              balloon, ada, external, or null&lt;br /&gt;
 --aero=name                  Select aircraft aerodynamics model to load&lt;br /&gt;
 --model-hz=n                 Run the FDM this rate (iterations per second)&lt;br /&gt;
 --speed=n                    Run the FDM 'n' times faster than real time&lt;br /&gt;
 --notrim                     Do NOT attempt to trim the model&lt;br /&gt;
                              (only with fdm=jsbsim)&lt;br /&gt;
 --on-ground                  Start at ground level (default)&lt;br /&gt;
 --in-air                     Start in air (implied when using --altitude)&lt;br /&gt;
&lt;br /&gt;
==== Initial Position and Orientation ====&lt;br /&gt;
&lt;br /&gt;
 --airport=ID                 Specify airport (e.g. KOAK)&lt;br /&gt;
 --runway=rwy_no              Specify starting runway (must also specify an&lt;br /&gt;
                              airport)&lt;br /&gt;
 --vor=ID                     Specify starting position relative to a VOR&lt;br /&gt;
 --ndb=ID                     Specify starting position relative to an NDB&lt;br /&gt;
 --fix=ID                     Specify starting position relative to a fix&lt;br /&gt;
 --parkpos=NAME               Specify a gate at the airport (e.g. 747d11)&lt;br /&gt;
 --offset-distance=nm         Specify distance to reference point (statute&lt;br /&gt;
                              miles)&lt;br /&gt;
 --offset-azimuth=degrees     Specify heading to reference point&lt;br /&gt;
 --lon=degrees                Starting longitude (west = -)&lt;br /&gt;
 --lat=degrees                Starting latitude (south = -)&lt;br /&gt;
 --altitude=value             Starting altitude&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --heading=degrees            Specify heading (yaw) angle (Psi)&lt;br /&gt;
 --roll=degrees               Specify roll angle (Phi)&lt;br /&gt;
 --pitch=degrees              Specify pitch angle (Theta)&lt;br /&gt;
 --uBody=units_per_sec        Specify velocity along the body X axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vBody=units_per_sec        Specify velocity along the body Y axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --wBody=units_per_sec        Specify velocity along the body Z axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vc=knots                   Specify initial airspeed&lt;br /&gt;
 --mach=num                   Specify initial mach number&lt;br /&gt;
 --glideslope=degrees         Specify flight path angle (can be positive)&lt;br /&gt;
 --roc=fpm                    Specify initial climb rate (can be negative)&lt;br /&gt;
&lt;br /&gt;
==== Rendering Options ====&lt;br /&gt;
&lt;br /&gt;
 --bpp=depth                  Specify the bits per pixel&lt;br /&gt;
 --fog-disable                Disable fog/haze&lt;br /&gt;
 --fog-fastest                Enable fastest fog/haze&lt;br /&gt;
 --fog-nicest                 Enable nicest fog/haze&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --disable-enhanced-lighting  Disable enhanced runway lighting&lt;br /&gt;
 --enable-enhanced-lighting   Enable enhanced runway lighting&lt;br /&gt;
 --season=winter              Enable snow covered scenery&lt;br /&gt;
 --disable-distance-attenuation&lt;br /&gt;
                              Disable runway light distance attenuation&lt;br /&gt;
 --enable-distance-attenuation&lt;br /&gt;
                              Enable runway light distance attenuation&lt;br /&gt;
 --disable-specular-highlight&lt;br /&gt;
                              Disable specular reflections on textured&lt;br /&gt;
                              objects&lt;br /&gt;
 --enable-specular-highlight  Enable specular reflections on textured objects&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --fov=degrees                Specify field of view angle&lt;br /&gt;
 --disable-fullscreen         Disable fullscreen mode&lt;br /&gt;
 --enable-fullscreen          Enable fullscreen mode&lt;br /&gt;
 --shading-flat               Enable flat shading&lt;br /&gt;
 --shading-smooth             Enable smooth shading&lt;br /&gt;
 --disable-wireframe          Disable wireframe drawing mode&lt;br /&gt;
 --enable-wireframe           Enable wireframe drawing mode&lt;br /&gt;
 --geometry=WxH               Specify window geometry (640x480, etc)&lt;br /&gt;
 --view-offset=value          Specify the default forward view direction as&lt;br /&gt;
                              an offset from straight ahead. Allowable values&lt;br /&gt;
                              are LEFT, RIGHT, CENTER, or a specific number&lt;br /&gt;
                              in degrees&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --texture-filtering=number   Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
==== Hud Options ====&lt;br /&gt;
&lt;br /&gt;
 --hud-tris                   Hud displays number of triangles rendered&lt;br /&gt;
 --hud-culled                 Hud displays percentage of triangles culled&lt;br /&gt;
&lt;br /&gt;
==== Time Options ====&lt;br /&gt;
&lt;br /&gt;
 --timeofday={dawn,noon,dusk,midnight}&lt;br /&gt;
                              Specify a time of day&lt;br /&gt;
 --time-offset=[+-]hh:mm:ss   Add this time offset&lt;br /&gt;
 --time-match-real            Synchronize time with current time at chosen airport&lt;br /&gt;
 --time-match-local           Synchronize time with system time of computer&lt;br /&gt;
 --start-date-sys=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              system time&lt;br /&gt;
 --start-date-gmt=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Greenwich Mean Time&lt;br /&gt;
 --start-date-lat=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Local Aircraft Time&lt;br /&gt;
&lt;br /&gt;
==== Network Options ====&lt;br /&gt;
&lt;br /&gt;
 --httpd=port                 Enable http server on the specified port&lt;br /&gt;
 --telnet=port                Enable telnet server on the specified port&lt;br /&gt;
 --jpg-httpd=port             Enable screen shot http server on the specified&lt;br /&gt;
                                port&lt;br /&gt;
&lt;br /&gt;
==== MultiPlayer Options ====&lt;br /&gt;
&lt;br /&gt;
 --callsign                   assign a unique name to a player&lt;br /&gt;
 --multiplay={in|out},hz,address,port&lt;br /&gt;
                              Specify multipilot communication settings&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
==== Route/Way Point Options ====&lt;br /&gt;
&lt;br /&gt;
 --wp=ID[@alt]                Specify a waypoint for the GC autopilot;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --flight-plan=file           Read all waypoints from a file&lt;br /&gt;
&lt;br /&gt;
==== IO Options ====&lt;br /&gt;
&lt;br /&gt;
 --generic=params             Open connection using a predefined&lt;br /&gt;
                              communication interface and a preselected&lt;br /&gt;
                              communication protocol&lt;br /&gt;
 --garmin=params              Open connection using the Garmin GPS protocol&lt;br /&gt;
 --joyclient=params           Open connection to an Agwagon joystick&lt;br /&gt;
 --jsclient=params            Open connection to a remote joystick&lt;br /&gt;
 --native-ctrls=params        Open connection using the FG Native Controls&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native-fdm=params          Open connection using the FG Native FDM&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native=params              Open connection using the FG Native protocol&lt;br /&gt;
 --nmea=params                Open connection using the NMEA protocol&lt;br /&gt;
 --opengc=params              Open connection using the OpenGC protocol&lt;br /&gt;
 --props=params               Open connection using the interactive property&lt;br /&gt;
                              manager (LEGACY/DEAD DO NOT USE same as --telnet)&lt;br /&gt;
 --pve=params                 Open connection using the PVE protocol&lt;br /&gt;
 --ray=params                 Open connection using the Ray Woodworth motion&lt;br /&gt;
                              chair protocol&lt;br /&gt;
 --rul=params                 Open connection using the RUL protocol&lt;br /&gt;
 --atc610x                    Enable atc610x interface&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: --generic=\\.\COM10,out,1,/tmp/data.xml,myproto&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
==== Avionics Options ====&lt;br /&gt;
&lt;br /&gt;
 --com1=frequency             Set the COM1 radio frequency.&lt;br /&gt;
 --com2=frequency             Set the COM2 radio frequency.&lt;br /&gt;
 --nav1=[radial:]frequency    Set the NAV1 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --nav2=[radial:]frequency    Set the NAV2 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --adf=[rotation:]frequency   Set the ADF radio frequency, optionally&lt;br /&gt;
                              preceded by a card rotation.&lt;br /&gt;
 --dme={nav1|nav2|frequency}  Slave the ADF to one of the NAV radios, or set&lt;br /&gt;
                              its internal frequency.&lt;br /&gt;
&lt;br /&gt;
==== Environment Options ====&lt;br /&gt;
&lt;br /&gt;
 --disable-real-weather-fetch Disable METAR based real weather fetching&lt;br /&gt;
 --enable-real-weather-fetch  Enable METAR based real weather fetching (this&lt;br /&gt;
                              requires an open internet connection)&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
 --random-wind&lt;br /&gt;
 --metar=&amp;quot;metar string&amp;quot;       Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
==== Situation Options ====&lt;br /&gt;
&lt;br /&gt;
 --failure={pitot|static|system|vacuum}&lt;br /&gt;
                              Fail the pitot, static, vacuum, or electrical&lt;br /&gt;
                              system (repeat the option for multiple system&lt;br /&gt;
                              failures).&lt;br /&gt;
&lt;br /&gt;
==== Debugging Options ====&lt;br /&gt;
&lt;br /&gt;
 --log-level={bulk|debug|info|warn|alert}&lt;br /&gt;
                              Set the logging level for this session.&lt;br /&gt;
                              0=verbose, 5=alerts only&lt;br /&gt;
 --pid=/pathto/some/file.pid  Write current PID into file.&lt;br /&gt;
 --trace-read=property        Trace the reads for a property;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --trace-write=property       Trace the writes for a property;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
&lt;br /&gt;
=== Source files ===&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115825</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115825"/>
		<updated>2018-08-09T15:05:42Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Flight Model */ wind, turbulence and ceiling are in Environment Options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]].&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== General Options ====&lt;br /&gt;
&lt;br /&gt;
 --help, -h                   Show the most relevant command line options&lt;br /&gt;
 --verbose, -v                Show all command line options when combined with --help or -h&lt;br /&gt;
 --fg-root=path               Specify the root data path&lt;br /&gt;
 --fg-scenery=path[:path...]  Specify the base scenery path;&lt;br /&gt;
                                Defaults to [[$FG_ROOT]]/Scenery&lt;br /&gt;
 --language=code              Select the language for this session&lt;br /&gt;
 --launcher                   Enable Qt launcher &lt;br /&gt;
 --disable-fullscreen         Disable full-screen game mode&lt;br /&gt;
 --enable-fullscreen          Enable full-screen game mode&lt;br /&gt;
 --disable-splash-screen      Disable splash screen&lt;br /&gt;
 --enable-splash-screen       Enable splash screen&lt;br /&gt;
 --disable-mouse-pointer      Disable extra mouse pointer&lt;br /&gt;
 --enable-mouse-pointer       Enable extra mouse pointer&lt;br /&gt;
                                (i.e. for full screen Voodoo based cards)&lt;br /&gt;
 --disable-random-objects     Exclude random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --enable-random-objects      Include random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --disable-ai-models          Disable the AI subsystem.&lt;br /&gt;
                                (This also disables showing the models of other&lt;br /&gt;
                                 multiplayer aircraft)&lt;br /&gt;
 --enable-ai-models           Enable the AI subsystem.&lt;br /&gt;
 --disable-ai-traffic         Disable the autogenerated traffic subsystem.&lt;br /&gt;
 --enable-ai-traffic          Enable the autogenerated traffic subsystem.&lt;br /&gt;
 --disable-freeze             Start in a running state&lt;br /&gt;
 --enable-freeze              Start in a frozen state&lt;br /&gt;
 --disable-fuel-freeze        Fuel is consumed normally&lt;br /&gt;
 --enable-fuel-freeze         Fuel tank quantity forced to remain constant&lt;br /&gt;
 --disable-clock-freeze       Clock advances normally&lt;br /&gt;
 --enable-clock-freeze        Do not advance clock&lt;br /&gt;
 --enable-auto-coordination   Enable auto coordination - rudder and&lt;br /&gt;
                              ailerons will be controlled together&lt;br /&gt;
 --disable-auto-coordination  Disable auto coordination (default)&lt;br /&gt;
 --browser-app=path           Specify path to your web browser&lt;br /&gt;
 --prop:name=value            Set property  to &lt;br /&gt;
 --config=path                Load additional properties from path&lt;br /&gt;
 --units-feet                 Use feet for distances&lt;br /&gt;
 --units-meters               Use meters for distances&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
&lt;br /&gt;
 --disable-panel              Disable instrument panel&lt;br /&gt;
 --enable-panel               Enable instrument panel&lt;br /&gt;
 --disable-sound              Disable sound effects&lt;br /&gt;
 --enable-sound               Enable sound effects&lt;br /&gt;
 --disable-hud                Disable Heads Up Display (HUD)&lt;br /&gt;
 --enable-hud                 Enable Heads Up Display (HUD)&lt;br /&gt;
 --disable-anti-alias-hud     Disable anti-aliased HUD&lt;br /&gt;
 --enable-anti-alias-hud      Enable anti-aliased HUD&lt;br /&gt;
 --disable-hud-3d             Disable 3D HUD&lt;br /&gt;
 --enable-hud-3d              Enable 3D HUD&lt;br /&gt;
 --ai-scenario=scenario       Add and enable a new scenario. Multiple options&lt;br /&gt;
                              are allowed. Scenarios are in /[[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
==== Aircraft ====&lt;br /&gt;
&lt;br /&gt;
 --aircraft=name              Select an aircraft profile as defined by a top&lt;br /&gt;
                              level -set.xml&lt;br /&gt;
 --aircraft-dir=path          Specify the exact directory to use for the&lt;br /&gt;
                              aircraft (normally not required, but may be&lt;br /&gt;
                              useful). Interpreted relatively to the&lt;br /&gt;
                              current directory. Causes the &amp;lt;path-cache&amp;gt;&lt;br /&gt;
                              from autosave_X_Y.xml, as well as&lt;br /&gt;
                              --fg-aircraft options and the FG_AIRCRAFT&lt;br /&gt;
                              environment variable to be bypassed.&lt;br /&gt;
 --show-aircraft              Print a list of the currently available&lt;br /&gt;
                              aircraft types&lt;br /&gt;
&lt;br /&gt;
==== Flight Model ====&lt;br /&gt;
&lt;br /&gt;
 --fdm=name                   Select the core flight dynamics model&lt;br /&gt;
                              Can be one of jsb, larcsim, yasim, magic,&lt;br /&gt;
                              balloon, ada, external, or null&lt;br /&gt;
 --aero=name                  Select aircraft aerodynamics model to load&lt;br /&gt;
 --model-hz=n                 Run the FDM this rate (iterations per second)&lt;br /&gt;
 --speed=n                    Run the FDM 'n' times faster than real time&lt;br /&gt;
 --notrim                     Do NOT attempt to trim the model&lt;br /&gt;
                              (only with fdm=jsbsim)&lt;br /&gt;
 --on-ground                  Start at ground level (default)&lt;br /&gt;
 --in-air                     Start in air (implied when using --altitude)&lt;br /&gt;
&lt;br /&gt;
==== Initial Position and Orientation ====&lt;br /&gt;
&lt;br /&gt;
 --airport=ID                 Specify airport (e.g. KOAK)&lt;br /&gt;
 --runway=rwy_no              Specify starting runway (must also specify an&lt;br /&gt;
                              airport)&lt;br /&gt;
 --vor=ID                     Specify starting position relative to a VOR&lt;br /&gt;
 --ndb=ID                     Specify starting position relative to an NDB&lt;br /&gt;
 --fix=ID                     Specify starting position relative to a fix&lt;br /&gt;
 --parkpos=NAME               Specify a gate at the airport (e.g. 747d11)&lt;br /&gt;
 --offset-distance=nm         Specify distance to reference point (statute&lt;br /&gt;
                              miles)&lt;br /&gt;
 --offset-azimuth=degrees     Specify heading to reference point&lt;br /&gt;
 --lon=degrees                Starting longitude (west = -)&lt;br /&gt;
 --lat=degrees                Starting latitude (south = -)&lt;br /&gt;
 --altitude=value             Starting altitude&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --heading=degrees            Specify heading (yaw) angle (Psi)&lt;br /&gt;
 --roll=degrees               Specify roll angle (Phi)&lt;br /&gt;
 --pitch=degrees              Specify pitch angle (Theta)&lt;br /&gt;
 --uBody=units_per_sec        Specify velocity along the body X axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vBody=units_per_sec        Specify velocity along the body Y axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --wBody=units_per_sec        Specify velocity along the body Z axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vc=knots                   Specify initial airspeed&lt;br /&gt;
 --mach=num                   Specify initial mach number&lt;br /&gt;
 --glideslope=degrees         Specify flight path angle (can be positive)&lt;br /&gt;
 --roc=fpm                    Specify initial climb rate (can be negative)&lt;br /&gt;
&lt;br /&gt;
==== Rendering Options ====&lt;br /&gt;
&lt;br /&gt;
 --bpp=depth                  Specify the bits per pixel&lt;br /&gt;
 --fog-disable                Disable fog/haze&lt;br /&gt;
 --fog-fastest                Enable fastest fog/haze&lt;br /&gt;
 --fog-nicest                 Enable nicest fog/haze&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --disable-enhanced-lighting  Disable enhanced runway lighting&lt;br /&gt;
 --enable-enhanced-lighting   Enable enhanced runway lighting&lt;br /&gt;
 --season=winter              Enable snow covered scenery&lt;br /&gt;
 --disable-distance-attenuation&lt;br /&gt;
                              Disable runway light distance attenuation&lt;br /&gt;
 --enable-distance-attenuation&lt;br /&gt;
                              Enable runway light distance attenuation&lt;br /&gt;
 --disable-specular-highlight&lt;br /&gt;
                              Disable specular reflections on textured&lt;br /&gt;
                              objects&lt;br /&gt;
 --enable-specular-highlight  Enable specular reflections on textured objects&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --fov=degrees                Specify field of view angle&lt;br /&gt;
 --disable-fullscreen         Disable fullscreen mode&lt;br /&gt;
 --enable-fullscreen          Enable fullscreen mode&lt;br /&gt;
 --shading-flat               Enable flat shading&lt;br /&gt;
 --shading-smooth             Enable smooth shading&lt;br /&gt;
 --disable-wireframe          Disable wireframe drawing mode&lt;br /&gt;
 --enable-wireframe           Enable wireframe drawing mode&lt;br /&gt;
 --geometry=WxH               Specify window geometry (640x480, etc)&lt;br /&gt;
 --view-offset=value          Specify the default forward view direction as&lt;br /&gt;
                              an offset from straight ahead. Allowable values&lt;br /&gt;
                              are LEFT, RIGHT, CENTER, or a specific number&lt;br /&gt;
                              in degrees&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --texture-filtering=number   Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
==== Hud Options ====&lt;br /&gt;
&lt;br /&gt;
 --hud-tris                   Hud displays number of triangles rendered&lt;br /&gt;
 --hud-culled                 Hud displays percentage of triangles culled&lt;br /&gt;
&lt;br /&gt;
==== Time Options ====&lt;br /&gt;
&lt;br /&gt;
 --timeofday={dawn,noon,dusk,midnight}&lt;br /&gt;
                              Specify a time of day&lt;br /&gt;
 --time-offset=[+-]hh:mm:ss   Add this time offset&lt;br /&gt;
 --time-match-real            Synchronize time with current time at chosen airport&lt;br /&gt;
 --time-match-local           Synchronize time with system time of computer&lt;br /&gt;
 --start-date-sys=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              system time&lt;br /&gt;
 --start-date-gmt=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Greenwich Mean Time&lt;br /&gt;
 --start-date-lat=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Local Aircraft Time&lt;br /&gt;
&lt;br /&gt;
==== Network Options ====&lt;br /&gt;
&lt;br /&gt;
 --httpd=port                 Enable http server on the specified port&lt;br /&gt;
 --telnet=port                Enable telnet server on the specified port&lt;br /&gt;
 --jpg-httpd=port             Enable screen shot http server on the specified&lt;br /&gt;
                                port&lt;br /&gt;
&lt;br /&gt;
==== MultiPlayer Options ====&lt;br /&gt;
&lt;br /&gt;
 --callsign                   assign a unique name to a player&lt;br /&gt;
 --multiplay={in|out},hz,address,port&lt;br /&gt;
                              Specify multipilot communication settings&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
==== Route/Way Point Options ====&lt;br /&gt;
&lt;br /&gt;
 --wp=ID[@alt]                Specify a waypoint for the GC autopilot;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --flight-plan=file           Read all waypoints from a file&lt;br /&gt;
&lt;br /&gt;
==== IO Options ====&lt;br /&gt;
&lt;br /&gt;
 --generic=params             Open connection using a predefined&lt;br /&gt;
                              communication interface and a preselected&lt;br /&gt;
                              communication protocol&lt;br /&gt;
 --garmin=params              Open connection using the Garmin GPS protocol&lt;br /&gt;
 --joyclient=params           Open connection to an Agwagon joystick&lt;br /&gt;
 --jsclient=params            Open connection to a remote joystick&lt;br /&gt;
 --native-ctrls=params        Open connection using the FG Native Controls&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native-fdm=params          Open connection using the FG Native FDM&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native=params              Open connection using the FG Native protocol&lt;br /&gt;
 --nmea=params                Open connection using the NMEA protocol&lt;br /&gt;
 --opengc=params              Open connection using the OpenGC protocol&lt;br /&gt;
 --props=params               Open connection using the interactive property&lt;br /&gt;
                              manager (LEGACY/DEAD DO NOT USE same as --telnet)&lt;br /&gt;
 --pve=params                 Open connection using the PVE protocol&lt;br /&gt;
 --ray=params                 Open connection using the Ray Woodworth motion&lt;br /&gt;
                              chair protocol&lt;br /&gt;
 --rul=params                 Open connection using the RUL protocol&lt;br /&gt;
 --atc610x                    Enable atc610x interface&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: --generic=\\.\COM10,out,1,/tmp/data.xml,myproto&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
==== Avionics Options ====&lt;br /&gt;
&lt;br /&gt;
 --com1=frequency             Set the COM1 radio frequency.&lt;br /&gt;
 --com2=frequency             Set the COM2 radio frequency.&lt;br /&gt;
 --nav1=[radial:]frequency    Set the NAV1 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --nav2=[radial:]frequency    Set the NAV2 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --adf=[rotation:]frequency   Set the ADF radio frequency, optionally&lt;br /&gt;
                              preceded by a card rotation.&lt;br /&gt;
 --dme={nav1|nav2|frequency}  Slave the ADF to one of the NAV radios, or set&lt;br /&gt;
                              its internal frequency.&lt;br /&gt;
&lt;br /&gt;
==== Environment Options ====&lt;br /&gt;
&lt;br /&gt;
 --disable-real-weather-fetch Disable METAR based real weather fetching&lt;br /&gt;
 --enable-real-weather-fetch  Enable METAR based real weather fetching (this&lt;br /&gt;
                              requires an open internet connection)&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
 --random-wind&lt;br /&gt;
 --metar=&amp;quot;metar string&amp;quot;       Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
==== Situation Options ====&lt;br /&gt;
&lt;br /&gt;
 --failure={pitot|static|system|vacuum}&lt;br /&gt;
                              Fail the pitot, static, vacuum, or electrical&lt;br /&gt;
                              system (repeat the option for multiple system&lt;br /&gt;
                              failures).&lt;br /&gt;
&lt;br /&gt;
==== Debugging Options ====&lt;br /&gt;
&lt;br /&gt;
 --log-level={bulk|debug|info|warn|alert}&lt;br /&gt;
                              Set the logging level for this session.&lt;br /&gt;
                              0=verbose, 5=alerts only&lt;br /&gt;
 --pid=/pathto/some/file.pid  Write current PID into file.&lt;br /&gt;
 --trace-read=property        Trace the reads for a property;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --trace-write=property       Trace the writes for a property;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
&lt;br /&gt;
=== Source files ===&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115824</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115824"/>
		<updated>2018-08-09T15:03:45Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Debugging Options */ alignment with other options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]].&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== General Options ====&lt;br /&gt;
&lt;br /&gt;
 --help, -h                   Show the most relevant command line options&lt;br /&gt;
 --verbose, -v                Show all command line options when combined with --help or -h&lt;br /&gt;
 --fg-root=path               Specify the root data path&lt;br /&gt;
 --fg-scenery=path[:path...]  Specify the base scenery path;&lt;br /&gt;
                                Defaults to [[$FG_ROOT]]/Scenery&lt;br /&gt;
 --language=code              Select the language for this session&lt;br /&gt;
 --launcher                   Enable Qt launcher &lt;br /&gt;
 --disable-fullscreen         Disable full-screen game mode&lt;br /&gt;
 --enable-fullscreen          Enable full-screen game mode&lt;br /&gt;
 --disable-splash-screen      Disable splash screen&lt;br /&gt;
 --enable-splash-screen       Enable splash screen&lt;br /&gt;
 --disable-mouse-pointer      Disable extra mouse pointer&lt;br /&gt;
 --enable-mouse-pointer       Enable extra mouse pointer&lt;br /&gt;
                                (i.e. for full screen Voodoo based cards)&lt;br /&gt;
 --disable-random-objects     Exclude random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --enable-random-objects      Include random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --disable-ai-models          Disable the AI subsystem.&lt;br /&gt;
                                (This also disables showing the models of other&lt;br /&gt;
                                 multiplayer aircraft)&lt;br /&gt;
 --enable-ai-models           Enable the AI subsystem.&lt;br /&gt;
 --disable-ai-traffic         Disable the autogenerated traffic subsystem.&lt;br /&gt;
 --enable-ai-traffic          Enable the autogenerated traffic subsystem.&lt;br /&gt;
 --disable-freeze             Start in a running state&lt;br /&gt;
 --enable-freeze              Start in a frozen state&lt;br /&gt;
 --disable-fuel-freeze        Fuel is consumed normally&lt;br /&gt;
 --enable-fuel-freeze         Fuel tank quantity forced to remain constant&lt;br /&gt;
 --disable-clock-freeze       Clock advances normally&lt;br /&gt;
 --enable-clock-freeze        Do not advance clock&lt;br /&gt;
 --enable-auto-coordination   Enable auto coordination - rudder and&lt;br /&gt;
                              ailerons will be controlled together&lt;br /&gt;
 --disable-auto-coordination  Disable auto coordination (default)&lt;br /&gt;
 --browser-app=path           Specify path to your web browser&lt;br /&gt;
 --prop:name=value            Set property  to &lt;br /&gt;
 --config=path                Load additional properties from path&lt;br /&gt;
 --units-feet                 Use feet for distances&lt;br /&gt;
 --units-meters               Use meters for distances&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
&lt;br /&gt;
 --disable-panel              Disable instrument panel&lt;br /&gt;
 --enable-panel               Enable instrument panel&lt;br /&gt;
 --disable-sound              Disable sound effects&lt;br /&gt;
 --enable-sound               Enable sound effects&lt;br /&gt;
 --disable-hud                Disable Heads Up Display (HUD)&lt;br /&gt;
 --enable-hud                 Enable Heads Up Display (HUD)&lt;br /&gt;
 --disable-anti-alias-hud     Disable anti-aliased HUD&lt;br /&gt;
 --enable-anti-alias-hud      Enable anti-aliased HUD&lt;br /&gt;
 --disable-hud-3d             Disable 3D HUD&lt;br /&gt;
 --enable-hud-3d              Enable 3D HUD&lt;br /&gt;
 --ai-scenario=scenario       Add and enable a new scenario. Multiple options&lt;br /&gt;
                              are allowed. Scenarios are in /[[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
==== Aircraft ====&lt;br /&gt;
&lt;br /&gt;
 --aircraft=name              Select an aircraft profile as defined by a top&lt;br /&gt;
                              level -set.xml&lt;br /&gt;
 --aircraft-dir=path          Specify the exact directory to use for the&lt;br /&gt;
                              aircraft (normally not required, but may be&lt;br /&gt;
                              useful). Interpreted relatively to the&lt;br /&gt;
                              current directory. Causes the &amp;lt;path-cache&amp;gt;&lt;br /&gt;
                              from autosave_X_Y.xml, as well as&lt;br /&gt;
                              --fg-aircraft options and the FG_AIRCRAFT&lt;br /&gt;
                              environment variable to be bypassed.&lt;br /&gt;
 --show-aircraft              Print a list of the currently available&lt;br /&gt;
                              aircraft types&lt;br /&gt;
&lt;br /&gt;
==== Flight Model ====&lt;br /&gt;
&lt;br /&gt;
 --fdm=name                   Select the core flight dynamics model&lt;br /&gt;
                              Can be one of jsb, larcsim, yasim, magic,&lt;br /&gt;
                              balloon, ada, external, or null&lt;br /&gt;
 --aero=name                  Select aircraft aerodynamics model to load&lt;br /&gt;
 --model-hz=n                 Run the FDM this rate (iterations per second)&lt;br /&gt;
 --speed=n                    Run the FDM 'n' times faster than real time&lt;br /&gt;
 --notrim                     Do NOT attempt to trim the model&lt;br /&gt;
                              (only with fdm=jsbsim)&lt;br /&gt;
 --on-ground                  Start at ground level (default)&lt;br /&gt;
 --in-air                     Start in air (implied when using --altitude)&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
&lt;br /&gt;
==== Initial Position and Orientation ====&lt;br /&gt;
&lt;br /&gt;
 --airport=ID                 Specify airport (e.g. KOAK)&lt;br /&gt;
 --runway=rwy_no              Specify starting runway (must also specify an&lt;br /&gt;
                              airport)&lt;br /&gt;
 --vor=ID                     Specify starting position relative to a VOR&lt;br /&gt;
 --ndb=ID                     Specify starting position relative to an NDB&lt;br /&gt;
 --fix=ID                     Specify starting position relative to a fix&lt;br /&gt;
 --parkpos=NAME               Specify a gate at the airport (e.g. 747d11)&lt;br /&gt;
 --offset-distance=nm         Specify distance to reference point (statute&lt;br /&gt;
                              miles)&lt;br /&gt;
 --offset-azimuth=degrees     Specify heading to reference point&lt;br /&gt;
 --lon=degrees                Starting longitude (west = -)&lt;br /&gt;
 --lat=degrees                Starting latitude (south = -)&lt;br /&gt;
 --altitude=value             Starting altitude&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --heading=degrees            Specify heading (yaw) angle (Psi)&lt;br /&gt;
 --roll=degrees               Specify roll angle (Phi)&lt;br /&gt;
 --pitch=degrees              Specify pitch angle (Theta)&lt;br /&gt;
 --uBody=units_per_sec        Specify velocity along the body X axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vBody=units_per_sec        Specify velocity along the body Y axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --wBody=units_per_sec        Specify velocity along the body Z axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vc=knots                   Specify initial airspeed&lt;br /&gt;
 --mach=num                   Specify initial mach number&lt;br /&gt;
 --glideslope=degrees         Specify flight path angle (can be positive)&lt;br /&gt;
 --roc=fpm                    Specify initial climb rate (can be negative)&lt;br /&gt;
&lt;br /&gt;
==== Rendering Options ====&lt;br /&gt;
&lt;br /&gt;
 --bpp=depth                  Specify the bits per pixel&lt;br /&gt;
 --fog-disable                Disable fog/haze&lt;br /&gt;
 --fog-fastest                Enable fastest fog/haze&lt;br /&gt;
 --fog-nicest                 Enable nicest fog/haze&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --disable-enhanced-lighting  Disable enhanced runway lighting&lt;br /&gt;
 --enable-enhanced-lighting   Enable enhanced runway lighting&lt;br /&gt;
 --season=winter              Enable snow covered scenery&lt;br /&gt;
 --disable-distance-attenuation&lt;br /&gt;
                              Disable runway light distance attenuation&lt;br /&gt;
 --enable-distance-attenuation&lt;br /&gt;
                              Enable runway light distance attenuation&lt;br /&gt;
 --disable-specular-highlight&lt;br /&gt;
                              Disable specular reflections on textured&lt;br /&gt;
                              objects&lt;br /&gt;
 --enable-specular-highlight  Enable specular reflections on textured objects&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --fov=degrees                Specify field of view angle&lt;br /&gt;
 --disable-fullscreen         Disable fullscreen mode&lt;br /&gt;
 --enable-fullscreen          Enable fullscreen mode&lt;br /&gt;
 --shading-flat               Enable flat shading&lt;br /&gt;
 --shading-smooth             Enable smooth shading&lt;br /&gt;
 --disable-wireframe          Disable wireframe drawing mode&lt;br /&gt;
 --enable-wireframe           Enable wireframe drawing mode&lt;br /&gt;
 --geometry=WxH               Specify window geometry (640x480, etc)&lt;br /&gt;
 --view-offset=value          Specify the default forward view direction as&lt;br /&gt;
                              an offset from straight ahead. Allowable values&lt;br /&gt;
                              are LEFT, RIGHT, CENTER, or a specific number&lt;br /&gt;
                              in degrees&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --texture-filtering=number   Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
==== Hud Options ====&lt;br /&gt;
&lt;br /&gt;
 --hud-tris                   Hud displays number of triangles rendered&lt;br /&gt;
 --hud-culled                 Hud displays percentage of triangles culled&lt;br /&gt;
&lt;br /&gt;
==== Time Options ====&lt;br /&gt;
&lt;br /&gt;
 --timeofday={dawn,noon,dusk,midnight}&lt;br /&gt;
                              Specify a time of day&lt;br /&gt;
 --time-offset=[+-]hh:mm:ss   Add this time offset&lt;br /&gt;
 --time-match-real            Synchronize time with current time at chosen airport&lt;br /&gt;
 --time-match-local           Synchronize time with system time of computer&lt;br /&gt;
 --start-date-sys=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              system time&lt;br /&gt;
 --start-date-gmt=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Greenwich Mean Time&lt;br /&gt;
 --start-date-lat=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Local Aircraft Time&lt;br /&gt;
&lt;br /&gt;
==== Network Options ====&lt;br /&gt;
&lt;br /&gt;
 --httpd=port                 Enable http server on the specified port&lt;br /&gt;
 --telnet=port                Enable telnet server on the specified port&lt;br /&gt;
 --jpg-httpd=port             Enable screen shot http server on the specified&lt;br /&gt;
                                port&lt;br /&gt;
&lt;br /&gt;
==== MultiPlayer Options ====&lt;br /&gt;
&lt;br /&gt;
 --callsign                   assign a unique name to a player&lt;br /&gt;
 --multiplay={in|out},hz,address,port&lt;br /&gt;
                              Specify multipilot communication settings&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
==== Route/Way Point Options ====&lt;br /&gt;
&lt;br /&gt;
 --wp=ID[@alt]                Specify a waypoint for the GC autopilot;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --flight-plan=file           Read all waypoints from a file&lt;br /&gt;
&lt;br /&gt;
==== IO Options ====&lt;br /&gt;
&lt;br /&gt;
 --generic=params             Open connection using a predefined&lt;br /&gt;
                              communication interface and a preselected&lt;br /&gt;
                              communication protocol&lt;br /&gt;
 --garmin=params              Open connection using the Garmin GPS protocol&lt;br /&gt;
 --joyclient=params           Open connection to an Agwagon joystick&lt;br /&gt;
 --jsclient=params            Open connection to a remote joystick&lt;br /&gt;
 --native-ctrls=params        Open connection using the FG Native Controls&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native-fdm=params          Open connection using the FG Native FDM&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native=params              Open connection using the FG Native protocol&lt;br /&gt;
 --nmea=params                Open connection using the NMEA protocol&lt;br /&gt;
 --opengc=params              Open connection using the OpenGC protocol&lt;br /&gt;
 --props=params               Open connection using the interactive property&lt;br /&gt;
                              manager (LEGACY/DEAD DO NOT USE same as --telnet)&lt;br /&gt;
 --pve=params                 Open connection using the PVE protocol&lt;br /&gt;
 --ray=params                 Open connection using the Ray Woodworth motion&lt;br /&gt;
                              chair protocol&lt;br /&gt;
 --rul=params                 Open connection using the RUL protocol&lt;br /&gt;
 --atc610x                    Enable atc610x interface&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: --generic=\\.\COM10,out,1,/tmp/data.xml,myproto&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
==== Avionics Options ====&lt;br /&gt;
&lt;br /&gt;
 --com1=frequency             Set the COM1 radio frequency.&lt;br /&gt;
 --com2=frequency             Set the COM2 radio frequency.&lt;br /&gt;
 --nav1=[radial:]frequency    Set the NAV1 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --nav2=[radial:]frequency    Set the NAV2 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --adf=[rotation:]frequency   Set the ADF radio frequency, optionally&lt;br /&gt;
                              preceded by a card rotation.&lt;br /&gt;
 --dme={nav1|nav2|frequency}  Slave the ADF to one of the NAV radios, or set&lt;br /&gt;
                              its internal frequency.&lt;br /&gt;
&lt;br /&gt;
==== Environment Options ====&lt;br /&gt;
&lt;br /&gt;
 --disable-real-weather-fetch Disable METAR based real weather fetching&lt;br /&gt;
 --enable-real-weather-fetch  Enable METAR based real weather fetching (this&lt;br /&gt;
                              requires an open internet connection)&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
 --random-wind&lt;br /&gt;
 --metar=&amp;quot;metar string&amp;quot;       Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
==== Situation Options ====&lt;br /&gt;
&lt;br /&gt;
 --failure={pitot|static|system|vacuum}&lt;br /&gt;
                              Fail the pitot, static, vacuum, or electrical&lt;br /&gt;
                              system (repeat the option for multiple system&lt;br /&gt;
                              failures).&lt;br /&gt;
&lt;br /&gt;
==== Debugging Options ====&lt;br /&gt;
&lt;br /&gt;
 --log-level={bulk|debug|info|warn|alert}&lt;br /&gt;
                              Set the logging level for this session.&lt;br /&gt;
                              0=verbose, 5=alerts only&lt;br /&gt;
 --pid=/pathto/some/file.pid  Write current PID into file.&lt;br /&gt;
 --trace-read=property        Trace the reads for a property;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --trace-write=property       Trace the writes for a property;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
&lt;br /&gt;
=== Source files ===&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115823</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115823"/>
		<updated>2018-08-09T15:03:29Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Situation Options */ alignment with other options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]].&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== General Options ====&lt;br /&gt;
&lt;br /&gt;
 --help, -h                   Show the most relevant command line options&lt;br /&gt;
 --verbose, -v                Show all command line options when combined with --help or -h&lt;br /&gt;
 --fg-root=path               Specify the root data path&lt;br /&gt;
 --fg-scenery=path[:path...]  Specify the base scenery path;&lt;br /&gt;
                                Defaults to [[$FG_ROOT]]/Scenery&lt;br /&gt;
 --language=code              Select the language for this session&lt;br /&gt;
 --launcher                   Enable Qt launcher &lt;br /&gt;
 --disable-fullscreen         Disable full-screen game mode&lt;br /&gt;
 --enable-fullscreen          Enable full-screen game mode&lt;br /&gt;
 --disable-splash-screen      Disable splash screen&lt;br /&gt;
 --enable-splash-screen       Enable splash screen&lt;br /&gt;
 --disable-mouse-pointer      Disable extra mouse pointer&lt;br /&gt;
 --enable-mouse-pointer       Enable extra mouse pointer&lt;br /&gt;
                                (i.e. for full screen Voodoo based cards)&lt;br /&gt;
 --disable-random-objects     Exclude random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --enable-random-objects      Include random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --disable-ai-models          Disable the AI subsystem.&lt;br /&gt;
                                (This also disables showing the models of other&lt;br /&gt;
                                 multiplayer aircraft)&lt;br /&gt;
 --enable-ai-models           Enable the AI subsystem.&lt;br /&gt;
 --disable-ai-traffic         Disable the autogenerated traffic subsystem.&lt;br /&gt;
 --enable-ai-traffic          Enable the autogenerated traffic subsystem.&lt;br /&gt;
 --disable-freeze             Start in a running state&lt;br /&gt;
 --enable-freeze              Start in a frozen state&lt;br /&gt;
 --disable-fuel-freeze        Fuel is consumed normally&lt;br /&gt;
 --enable-fuel-freeze         Fuel tank quantity forced to remain constant&lt;br /&gt;
 --disable-clock-freeze       Clock advances normally&lt;br /&gt;
 --enable-clock-freeze        Do not advance clock&lt;br /&gt;
 --enable-auto-coordination   Enable auto coordination - rudder and&lt;br /&gt;
                              ailerons will be controlled together&lt;br /&gt;
 --disable-auto-coordination  Disable auto coordination (default)&lt;br /&gt;
 --browser-app=path           Specify path to your web browser&lt;br /&gt;
 --prop:name=value            Set property  to &lt;br /&gt;
 --config=path                Load additional properties from path&lt;br /&gt;
 --units-feet                 Use feet for distances&lt;br /&gt;
 --units-meters               Use meters for distances&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
&lt;br /&gt;
 --disable-panel              Disable instrument panel&lt;br /&gt;
 --enable-panel               Enable instrument panel&lt;br /&gt;
 --disable-sound              Disable sound effects&lt;br /&gt;
 --enable-sound               Enable sound effects&lt;br /&gt;
 --disable-hud                Disable Heads Up Display (HUD)&lt;br /&gt;
 --enable-hud                 Enable Heads Up Display (HUD)&lt;br /&gt;
 --disable-anti-alias-hud     Disable anti-aliased HUD&lt;br /&gt;
 --enable-anti-alias-hud      Enable anti-aliased HUD&lt;br /&gt;
 --disable-hud-3d             Disable 3D HUD&lt;br /&gt;
 --enable-hud-3d              Enable 3D HUD&lt;br /&gt;
 --ai-scenario=scenario       Add and enable a new scenario. Multiple options&lt;br /&gt;
                              are allowed. Scenarios are in /[[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
==== Aircraft ====&lt;br /&gt;
&lt;br /&gt;
 --aircraft=name              Select an aircraft profile as defined by a top&lt;br /&gt;
                              level -set.xml&lt;br /&gt;
 --aircraft-dir=path          Specify the exact directory to use for the&lt;br /&gt;
                              aircraft (normally not required, but may be&lt;br /&gt;
                              useful). Interpreted relatively to the&lt;br /&gt;
                              current directory. Causes the &amp;lt;path-cache&amp;gt;&lt;br /&gt;
                              from autosave_X_Y.xml, as well as&lt;br /&gt;
                              --fg-aircraft options and the FG_AIRCRAFT&lt;br /&gt;
                              environment variable to be bypassed.&lt;br /&gt;
 --show-aircraft              Print a list of the currently available&lt;br /&gt;
                              aircraft types&lt;br /&gt;
&lt;br /&gt;
==== Flight Model ====&lt;br /&gt;
&lt;br /&gt;
 --fdm=name                   Select the core flight dynamics model&lt;br /&gt;
                              Can be one of jsb, larcsim, yasim, magic,&lt;br /&gt;
                              balloon, ada, external, or null&lt;br /&gt;
 --aero=name                  Select aircraft aerodynamics model to load&lt;br /&gt;
 --model-hz=n                 Run the FDM this rate (iterations per second)&lt;br /&gt;
 --speed=n                    Run the FDM 'n' times faster than real time&lt;br /&gt;
 --notrim                     Do NOT attempt to trim the model&lt;br /&gt;
                              (only with fdm=jsbsim)&lt;br /&gt;
 --on-ground                  Start at ground level (default)&lt;br /&gt;
 --in-air                     Start in air (implied when using --altitude)&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
&lt;br /&gt;
==== Initial Position and Orientation ====&lt;br /&gt;
&lt;br /&gt;
 --airport=ID                 Specify airport (e.g. KOAK)&lt;br /&gt;
 --runway=rwy_no              Specify starting runway (must also specify an&lt;br /&gt;
                              airport)&lt;br /&gt;
 --vor=ID                     Specify starting position relative to a VOR&lt;br /&gt;
 --ndb=ID                     Specify starting position relative to an NDB&lt;br /&gt;
 --fix=ID                     Specify starting position relative to a fix&lt;br /&gt;
 --parkpos=NAME               Specify a gate at the airport (e.g. 747d11)&lt;br /&gt;
 --offset-distance=nm         Specify distance to reference point (statute&lt;br /&gt;
                              miles)&lt;br /&gt;
 --offset-azimuth=degrees     Specify heading to reference point&lt;br /&gt;
 --lon=degrees                Starting longitude (west = -)&lt;br /&gt;
 --lat=degrees                Starting latitude (south = -)&lt;br /&gt;
 --altitude=value             Starting altitude&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --heading=degrees            Specify heading (yaw) angle (Psi)&lt;br /&gt;
 --roll=degrees               Specify roll angle (Phi)&lt;br /&gt;
 --pitch=degrees              Specify pitch angle (Theta)&lt;br /&gt;
 --uBody=units_per_sec        Specify velocity along the body X axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vBody=units_per_sec        Specify velocity along the body Y axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --wBody=units_per_sec        Specify velocity along the body Z axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vc=knots                   Specify initial airspeed&lt;br /&gt;
 --mach=num                   Specify initial mach number&lt;br /&gt;
 --glideslope=degrees         Specify flight path angle (can be positive)&lt;br /&gt;
 --roc=fpm                    Specify initial climb rate (can be negative)&lt;br /&gt;
&lt;br /&gt;
==== Rendering Options ====&lt;br /&gt;
&lt;br /&gt;
 --bpp=depth                  Specify the bits per pixel&lt;br /&gt;
 --fog-disable                Disable fog/haze&lt;br /&gt;
 --fog-fastest                Enable fastest fog/haze&lt;br /&gt;
 --fog-nicest                 Enable nicest fog/haze&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --disable-enhanced-lighting  Disable enhanced runway lighting&lt;br /&gt;
 --enable-enhanced-lighting   Enable enhanced runway lighting&lt;br /&gt;
 --season=winter              Enable snow covered scenery&lt;br /&gt;
 --disable-distance-attenuation&lt;br /&gt;
                              Disable runway light distance attenuation&lt;br /&gt;
 --enable-distance-attenuation&lt;br /&gt;
                              Enable runway light distance attenuation&lt;br /&gt;
 --disable-specular-highlight&lt;br /&gt;
                              Disable specular reflections on textured&lt;br /&gt;
                              objects&lt;br /&gt;
 --enable-specular-highlight  Enable specular reflections on textured objects&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --fov=degrees                Specify field of view angle&lt;br /&gt;
 --disable-fullscreen         Disable fullscreen mode&lt;br /&gt;
 --enable-fullscreen          Enable fullscreen mode&lt;br /&gt;
 --shading-flat               Enable flat shading&lt;br /&gt;
 --shading-smooth             Enable smooth shading&lt;br /&gt;
 --disable-wireframe          Disable wireframe drawing mode&lt;br /&gt;
 --enable-wireframe           Enable wireframe drawing mode&lt;br /&gt;
 --geometry=WxH               Specify window geometry (640x480, etc)&lt;br /&gt;
 --view-offset=value          Specify the default forward view direction as&lt;br /&gt;
                              an offset from straight ahead. Allowable values&lt;br /&gt;
                              are LEFT, RIGHT, CENTER, or a specific number&lt;br /&gt;
                              in degrees&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --texture-filtering=number   Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
==== Hud Options ====&lt;br /&gt;
&lt;br /&gt;
 --hud-tris                   Hud displays number of triangles rendered&lt;br /&gt;
 --hud-culled                 Hud displays percentage of triangles culled&lt;br /&gt;
&lt;br /&gt;
==== Time Options ====&lt;br /&gt;
&lt;br /&gt;
 --timeofday={dawn,noon,dusk,midnight}&lt;br /&gt;
                              Specify a time of day&lt;br /&gt;
 --time-offset=[+-]hh:mm:ss   Add this time offset&lt;br /&gt;
 --time-match-real            Synchronize time with current time at chosen airport&lt;br /&gt;
 --time-match-local           Synchronize time with system time of computer&lt;br /&gt;
 --start-date-sys=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              system time&lt;br /&gt;
 --start-date-gmt=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Greenwich Mean Time&lt;br /&gt;
 --start-date-lat=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Local Aircraft Time&lt;br /&gt;
&lt;br /&gt;
==== Network Options ====&lt;br /&gt;
&lt;br /&gt;
 --httpd=port                 Enable http server on the specified port&lt;br /&gt;
 --telnet=port                Enable telnet server on the specified port&lt;br /&gt;
 --jpg-httpd=port             Enable screen shot http server on the specified&lt;br /&gt;
                                port&lt;br /&gt;
&lt;br /&gt;
==== MultiPlayer Options ====&lt;br /&gt;
&lt;br /&gt;
 --callsign                   assign a unique name to a player&lt;br /&gt;
 --multiplay={in|out},hz,address,port&lt;br /&gt;
                              Specify multipilot communication settings&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
==== Route/Way Point Options ====&lt;br /&gt;
&lt;br /&gt;
 --wp=ID[@alt]                Specify a waypoint for the GC autopilot;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --flight-plan=file           Read all waypoints from a file&lt;br /&gt;
&lt;br /&gt;
==== IO Options ====&lt;br /&gt;
&lt;br /&gt;
 --generic=params             Open connection using a predefined&lt;br /&gt;
                              communication interface and a preselected&lt;br /&gt;
                              communication protocol&lt;br /&gt;
 --garmin=params              Open connection using the Garmin GPS protocol&lt;br /&gt;
 --joyclient=params           Open connection to an Agwagon joystick&lt;br /&gt;
 --jsclient=params            Open connection to a remote joystick&lt;br /&gt;
 --native-ctrls=params        Open connection using the FG Native Controls&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native-fdm=params          Open connection using the FG Native FDM&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native=params              Open connection using the FG Native protocol&lt;br /&gt;
 --nmea=params                Open connection using the NMEA protocol&lt;br /&gt;
 --opengc=params              Open connection using the OpenGC protocol&lt;br /&gt;
 --props=params               Open connection using the interactive property&lt;br /&gt;
                              manager (LEGACY/DEAD DO NOT USE same as --telnet)&lt;br /&gt;
 --pve=params                 Open connection using the PVE protocol&lt;br /&gt;
 --ray=params                 Open connection using the Ray Woodworth motion&lt;br /&gt;
                              chair protocol&lt;br /&gt;
 --rul=params                 Open connection using the RUL protocol&lt;br /&gt;
 --atc610x                    Enable atc610x interface&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: --generic=\\.\COM10,out,1,/tmp/data.xml,myproto&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
==== Avionics Options ====&lt;br /&gt;
&lt;br /&gt;
 --com1=frequency             Set the COM1 radio frequency.&lt;br /&gt;
 --com2=frequency             Set the COM2 radio frequency.&lt;br /&gt;
 --nav1=[radial:]frequency    Set the NAV1 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --nav2=[radial:]frequency    Set the NAV2 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --adf=[rotation:]frequency   Set the ADF radio frequency, optionally&lt;br /&gt;
                              preceded by a card rotation.&lt;br /&gt;
 --dme={nav1|nav2|frequency}  Slave the ADF to one of the NAV radios, or set&lt;br /&gt;
                              its internal frequency.&lt;br /&gt;
&lt;br /&gt;
==== Environment Options ====&lt;br /&gt;
&lt;br /&gt;
 --disable-real-weather-fetch Disable METAR based real weather fetching&lt;br /&gt;
 --enable-real-weather-fetch  Enable METAR based real weather fetching (this&lt;br /&gt;
                              requires an open internet connection)&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
 --random-wind&lt;br /&gt;
 --metar=&amp;quot;metar string&amp;quot;       Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
==== Situation Options ====&lt;br /&gt;
&lt;br /&gt;
 --failure={pitot|static|system|vacuum}&lt;br /&gt;
                              Fail the pitot, static, vacuum, or electrical&lt;br /&gt;
                              system (repeat the option for multiple system&lt;br /&gt;
                              failures).&lt;br /&gt;
&lt;br /&gt;
==== Debugging Options ====&lt;br /&gt;
&lt;br /&gt;
   --log-level={bulk|debug|info|warn|alert}&lt;br /&gt;
                                Set the logging level for this session.&lt;br /&gt;
                                0=verbose, 5=alerts only&lt;br /&gt;
   --pid=/pathto/some/file.pid  Write current PID into file.&lt;br /&gt;
   --trace-read=property        Trace the reads for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
   --trace-write=property       Trace the writes for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
&lt;br /&gt;
=== Source files ===&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115822</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115822"/>
		<updated>2018-08-09T15:03:14Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Environment Options */ alignment with other options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]].&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== General Options ====&lt;br /&gt;
&lt;br /&gt;
 --help, -h                   Show the most relevant command line options&lt;br /&gt;
 --verbose, -v                Show all command line options when combined with --help or -h&lt;br /&gt;
 --fg-root=path               Specify the root data path&lt;br /&gt;
 --fg-scenery=path[:path...]  Specify the base scenery path;&lt;br /&gt;
                                Defaults to [[$FG_ROOT]]/Scenery&lt;br /&gt;
 --language=code              Select the language for this session&lt;br /&gt;
 --launcher                   Enable Qt launcher &lt;br /&gt;
 --disable-fullscreen         Disable full-screen game mode&lt;br /&gt;
 --enable-fullscreen          Enable full-screen game mode&lt;br /&gt;
 --disable-splash-screen      Disable splash screen&lt;br /&gt;
 --enable-splash-screen       Enable splash screen&lt;br /&gt;
 --disable-mouse-pointer      Disable extra mouse pointer&lt;br /&gt;
 --enable-mouse-pointer       Enable extra mouse pointer&lt;br /&gt;
                                (i.e. for full screen Voodoo based cards)&lt;br /&gt;
 --disable-random-objects     Exclude random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --enable-random-objects      Include random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --disable-ai-models          Disable the AI subsystem.&lt;br /&gt;
                                (This also disables showing the models of other&lt;br /&gt;
                                 multiplayer aircraft)&lt;br /&gt;
 --enable-ai-models           Enable the AI subsystem.&lt;br /&gt;
 --disable-ai-traffic         Disable the autogenerated traffic subsystem.&lt;br /&gt;
 --enable-ai-traffic          Enable the autogenerated traffic subsystem.&lt;br /&gt;
 --disable-freeze             Start in a running state&lt;br /&gt;
 --enable-freeze              Start in a frozen state&lt;br /&gt;
 --disable-fuel-freeze        Fuel is consumed normally&lt;br /&gt;
 --enable-fuel-freeze         Fuel tank quantity forced to remain constant&lt;br /&gt;
 --disable-clock-freeze       Clock advances normally&lt;br /&gt;
 --enable-clock-freeze        Do not advance clock&lt;br /&gt;
 --enable-auto-coordination   Enable auto coordination - rudder and&lt;br /&gt;
                              ailerons will be controlled together&lt;br /&gt;
 --disable-auto-coordination  Disable auto coordination (default)&lt;br /&gt;
 --browser-app=path           Specify path to your web browser&lt;br /&gt;
 --prop:name=value            Set property  to &lt;br /&gt;
 --config=path                Load additional properties from path&lt;br /&gt;
 --units-feet                 Use feet for distances&lt;br /&gt;
 --units-meters               Use meters for distances&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
&lt;br /&gt;
 --disable-panel              Disable instrument panel&lt;br /&gt;
 --enable-panel               Enable instrument panel&lt;br /&gt;
 --disable-sound              Disable sound effects&lt;br /&gt;
 --enable-sound               Enable sound effects&lt;br /&gt;
 --disable-hud                Disable Heads Up Display (HUD)&lt;br /&gt;
 --enable-hud                 Enable Heads Up Display (HUD)&lt;br /&gt;
 --disable-anti-alias-hud     Disable anti-aliased HUD&lt;br /&gt;
 --enable-anti-alias-hud      Enable anti-aliased HUD&lt;br /&gt;
 --disable-hud-3d             Disable 3D HUD&lt;br /&gt;
 --enable-hud-3d              Enable 3D HUD&lt;br /&gt;
 --ai-scenario=scenario       Add and enable a new scenario. Multiple options&lt;br /&gt;
                              are allowed. Scenarios are in /[[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
==== Aircraft ====&lt;br /&gt;
&lt;br /&gt;
 --aircraft=name              Select an aircraft profile as defined by a top&lt;br /&gt;
                              level -set.xml&lt;br /&gt;
 --aircraft-dir=path          Specify the exact directory to use for the&lt;br /&gt;
                              aircraft (normally not required, but may be&lt;br /&gt;
                              useful). Interpreted relatively to the&lt;br /&gt;
                              current directory. Causes the &amp;lt;path-cache&amp;gt;&lt;br /&gt;
                              from autosave_X_Y.xml, as well as&lt;br /&gt;
                              --fg-aircraft options and the FG_AIRCRAFT&lt;br /&gt;
                              environment variable to be bypassed.&lt;br /&gt;
 --show-aircraft              Print a list of the currently available&lt;br /&gt;
                              aircraft types&lt;br /&gt;
&lt;br /&gt;
==== Flight Model ====&lt;br /&gt;
&lt;br /&gt;
 --fdm=name                   Select the core flight dynamics model&lt;br /&gt;
                              Can be one of jsb, larcsim, yasim, magic,&lt;br /&gt;
                              balloon, ada, external, or null&lt;br /&gt;
 --aero=name                  Select aircraft aerodynamics model to load&lt;br /&gt;
 --model-hz=n                 Run the FDM this rate (iterations per second)&lt;br /&gt;
 --speed=n                    Run the FDM 'n' times faster than real time&lt;br /&gt;
 --notrim                     Do NOT attempt to trim the model&lt;br /&gt;
                              (only with fdm=jsbsim)&lt;br /&gt;
 --on-ground                  Start at ground level (default)&lt;br /&gt;
 --in-air                     Start in air (implied when using --altitude)&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
&lt;br /&gt;
==== Initial Position and Orientation ====&lt;br /&gt;
&lt;br /&gt;
 --airport=ID                 Specify airport (e.g. KOAK)&lt;br /&gt;
 --runway=rwy_no              Specify starting runway (must also specify an&lt;br /&gt;
                              airport)&lt;br /&gt;
 --vor=ID                     Specify starting position relative to a VOR&lt;br /&gt;
 --ndb=ID                     Specify starting position relative to an NDB&lt;br /&gt;
 --fix=ID                     Specify starting position relative to a fix&lt;br /&gt;
 --parkpos=NAME               Specify a gate at the airport (e.g. 747d11)&lt;br /&gt;
 --offset-distance=nm         Specify distance to reference point (statute&lt;br /&gt;
                              miles)&lt;br /&gt;
 --offset-azimuth=degrees     Specify heading to reference point&lt;br /&gt;
 --lon=degrees                Starting longitude (west = -)&lt;br /&gt;
 --lat=degrees                Starting latitude (south = -)&lt;br /&gt;
 --altitude=value             Starting altitude&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --heading=degrees            Specify heading (yaw) angle (Psi)&lt;br /&gt;
 --roll=degrees               Specify roll angle (Phi)&lt;br /&gt;
 --pitch=degrees              Specify pitch angle (Theta)&lt;br /&gt;
 --uBody=units_per_sec        Specify velocity along the body X axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vBody=units_per_sec        Specify velocity along the body Y axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --wBody=units_per_sec        Specify velocity along the body Z axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vc=knots                   Specify initial airspeed&lt;br /&gt;
 --mach=num                   Specify initial mach number&lt;br /&gt;
 --glideslope=degrees         Specify flight path angle (can be positive)&lt;br /&gt;
 --roc=fpm                    Specify initial climb rate (can be negative)&lt;br /&gt;
&lt;br /&gt;
==== Rendering Options ====&lt;br /&gt;
&lt;br /&gt;
 --bpp=depth                  Specify the bits per pixel&lt;br /&gt;
 --fog-disable                Disable fog/haze&lt;br /&gt;
 --fog-fastest                Enable fastest fog/haze&lt;br /&gt;
 --fog-nicest                 Enable nicest fog/haze&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --disable-enhanced-lighting  Disable enhanced runway lighting&lt;br /&gt;
 --enable-enhanced-lighting   Enable enhanced runway lighting&lt;br /&gt;
 --season=winter              Enable snow covered scenery&lt;br /&gt;
 --disable-distance-attenuation&lt;br /&gt;
                              Disable runway light distance attenuation&lt;br /&gt;
 --enable-distance-attenuation&lt;br /&gt;
                              Enable runway light distance attenuation&lt;br /&gt;
 --disable-specular-highlight&lt;br /&gt;
                              Disable specular reflections on textured&lt;br /&gt;
                              objects&lt;br /&gt;
 --enable-specular-highlight  Enable specular reflections on textured objects&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --fov=degrees                Specify field of view angle&lt;br /&gt;
 --disable-fullscreen         Disable fullscreen mode&lt;br /&gt;
 --enable-fullscreen          Enable fullscreen mode&lt;br /&gt;
 --shading-flat               Enable flat shading&lt;br /&gt;
 --shading-smooth             Enable smooth shading&lt;br /&gt;
 --disable-wireframe          Disable wireframe drawing mode&lt;br /&gt;
 --enable-wireframe           Enable wireframe drawing mode&lt;br /&gt;
 --geometry=WxH               Specify window geometry (640x480, etc)&lt;br /&gt;
 --view-offset=value          Specify the default forward view direction as&lt;br /&gt;
                              an offset from straight ahead. Allowable values&lt;br /&gt;
                              are LEFT, RIGHT, CENTER, or a specific number&lt;br /&gt;
                              in degrees&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --texture-filtering=number   Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
==== Hud Options ====&lt;br /&gt;
&lt;br /&gt;
 --hud-tris                   Hud displays number of triangles rendered&lt;br /&gt;
 --hud-culled                 Hud displays percentage of triangles culled&lt;br /&gt;
&lt;br /&gt;
==== Time Options ====&lt;br /&gt;
&lt;br /&gt;
 --timeofday={dawn,noon,dusk,midnight}&lt;br /&gt;
                              Specify a time of day&lt;br /&gt;
 --time-offset=[+-]hh:mm:ss   Add this time offset&lt;br /&gt;
 --time-match-real            Synchronize time with current time at chosen airport&lt;br /&gt;
 --time-match-local           Synchronize time with system time of computer&lt;br /&gt;
 --start-date-sys=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              system time&lt;br /&gt;
 --start-date-gmt=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Greenwich Mean Time&lt;br /&gt;
 --start-date-lat=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Local Aircraft Time&lt;br /&gt;
&lt;br /&gt;
==== Network Options ====&lt;br /&gt;
&lt;br /&gt;
 --httpd=port                 Enable http server on the specified port&lt;br /&gt;
 --telnet=port                Enable telnet server on the specified port&lt;br /&gt;
 --jpg-httpd=port             Enable screen shot http server on the specified&lt;br /&gt;
                                port&lt;br /&gt;
&lt;br /&gt;
==== MultiPlayer Options ====&lt;br /&gt;
&lt;br /&gt;
 --callsign                   assign a unique name to a player&lt;br /&gt;
 --multiplay={in|out},hz,address,port&lt;br /&gt;
                              Specify multipilot communication settings&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
==== Route/Way Point Options ====&lt;br /&gt;
&lt;br /&gt;
 --wp=ID[@alt]                Specify a waypoint for the GC autopilot;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --flight-plan=file           Read all waypoints from a file&lt;br /&gt;
&lt;br /&gt;
==== IO Options ====&lt;br /&gt;
&lt;br /&gt;
 --generic=params             Open connection using a predefined&lt;br /&gt;
                              communication interface and a preselected&lt;br /&gt;
                              communication protocol&lt;br /&gt;
 --garmin=params              Open connection using the Garmin GPS protocol&lt;br /&gt;
 --joyclient=params           Open connection to an Agwagon joystick&lt;br /&gt;
 --jsclient=params            Open connection to a remote joystick&lt;br /&gt;
 --native-ctrls=params        Open connection using the FG Native Controls&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native-fdm=params          Open connection using the FG Native FDM&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native=params              Open connection using the FG Native protocol&lt;br /&gt;
 --nmea=params                Open connection using the NMEA protocol&lt;br /&gt;
 --opengc=params              Open connection using the OpenGC protocol&lt;br /&gt;
 --props=params               Open connection using the interactive property&lt;br /&gt;
                              manager (LEGACY/DEAD DO NOT USE same as --telnet)&lt;br /&gt;
 --pve=params                 Open connection using the PVE protocol&lt;br /&gt;
 --ray=params                 Open connection using the Ray Woodworth motion&lt;br /&gt;
                              chair protocol&lt;br /&gt;
 --rul=params                 Open connection using the RUL protocol&lt;br /&gt;
 --atc610x                    Enable atc610x interface&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: --generic=\\.\COM10,out,1,/tmp/data.xml,myproto&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
==== Avionics Options ====&lt;br /&gt;
&lt;br /&gt;
 --com1=frequency             Set the COM1 radio frequency.&lt;br /&gt;
 --com2=frequency             Set the COM2 radio frequency.&lt;br /&gt;
 --nav1=[radial:]frequency    Set the NAV1 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --nav2=[radial:]frequency    Set the NAV2 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --adf=[rotation:]frequency   Set the ADF radio frequency, optionally&lt;br /&gt;
                              preceded by a card rotation.&lt;br /&gt;
 --dme={nav1|nav2|frequency}  Slave the ADF to one of the NAV radios, or set&lt;br /&gt;
                              its internal frequency.&lt;br /&gt;
&lt;br /&gt;
==== Environment Options ====&lt;br /&gt;
&lt;br /&gt;
 --disable-real-weather-fetch Disable METAR based real weather fetching&lt;br /&gt;
 --enable-real-weather-fetch  Enable METAR based real weather fetching (this&lt;br /&gt;
                              requires an open internet connection)&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
 --random-wind&lt;br /&gt;
 --metar=&amp;quot;metar string&amp;quot;       Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
==== Situation Options ====&lt;br /&gt;
&lt;br /&gt;
   --failure={pitot|static|system|vacuum}&lt;br /&gt;
                                Fail the pitot, static, vacuum, or electrical&lt;br /&gt;
                                system (repeat the option for multiple system&lt;br /&gt;
                                failures).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Debugging Options ====&lt;br /&gt;
&lt;br /&gt;
   --log-level={bulk|debug|info|warn|alert}&lt;br /&gt;
                                Set the logging level for this session.&lt;br /&gt;
                                0=verbose, 5=alerts only&lt;br /&gt;
   --pid=/pathto/some/file.pid  Write current PID into file.&lt;br /&gt;
   --trace-read=property        Trace the reads for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
   --trace-write=property       Trace the writes for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
&lt;br /&gt;
=== Source files ===&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115821</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115821"/>
		<updated>2018-08-09T15:02:31Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Avionics Options */ alignment with other options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]].&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== General Options ====&lt;br /&gt;
&lt;br /&gt;
 --help, -h                   Show the most relevant command line options&lt;br /&gt;
 --verbose, -v                Show all command line options when combined with --help or -h&lt;br /&gt;
 --fg-root=path               Specify the root data path&lt;br /&gt;
 --fg-scenery=path[:path...]  Specify the base scenery path;&lt;br /&gt;
                                Defaults to [[$FG_ROOT]]/Scenery&lt;br /&gt;
 --language=code              Select the language for this session&lt;br /&gt;
 --launcher                   Enable Qt launcher &lt;br /&gt;
 --disable-fullscreen         Disable full-screen game mode&lt;br /&gt;
 --enable-fullscreen          Enable full-screen game mode&lt;br /&gt;
 --disable-splash-screen      Disable splash screen&lt;br /&gt;
 --enable-splash-screen       Enable splash screen&lt;br /&gt;
 --disable-mouse-pointer      Disable extra mouse pointer&lt;br /&gt;
 --enable-mouse-pointer       Enable extra mouse pointer&lt;br /&gt;
                                (i.e. for full screen Voodoo based cards)&lt;br /&gt;
 --disable-random-objects     Exclude random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --enable-random-objects      Include random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --disable-ai-models          Disable the AI subsystem.&lt;br /&gt;
                                (This also disables showing the models of other&lt;br /&gt;
                                 multiplayer aircraft)&lt;br /&gt;
 --enable-ai-models           Enable the AI subsystem.&lt;br /&gt;
 --disable-ai-traffic         Disable the autogenerated traffic subsystem.&lt;br /&gt;
 --enable-ai-traffic          Enable the autogenerated traffic subsystem.&lt;br /&gt;
 --disable-freeze             Start in a running state&lt;br /&gt;
 --enable-freeze              Start in a frozen state&lt;br /&gt;
 --disable-fuel-freeze        Fuel is consumed normally&lt;br /&gt;
 --enable-fuel-freeze         Fuel tank quantity forced to remain constant&lt;br /&gt;
 --disable-clock-freeze       Clock advances normally&lt;br /&gt;
 --enable-clock-freeze        Do not advance clock&lt;br /&gt;
 --enable-auto-coordination   Enable auto coordination - rudder and&lt;br /&gt;
                              ailerons will be controlled together&lt;br /&gt;
 --disable-auto-coordination  Disable auto coordination (default)&lt;br /&gt;
 --browser-app=path           Specify path to your web browser&lt;br /&gt;
 --prop:name=value            Set property  to &lt;br /&gt;
 --config=path                Load additional properties from path&lt;br /&gt;
 --units-feet                 Use feet for distances&lt;br /&gt;
 --units-meters               Use meters for distances&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
&lt;br /&gt;
 --disable-panel              Disable instrument panel&lt;br /&gt;
 --enable-panel               Enable instrument panel&lt;br /&gt;
 --disable-sound              Disable sound effects&lt;br /&gt;
 --enable-sound               Enable sound effects&lt;br /&gt;
 --disable-hud                Disable Heads Up Display (HUD)&lt;br /&gt;
 --enable-hud                 Enable Heads Up Display (HUD)&lt;br /&gt;
 --disable-anti-alias-hud     Disable anti-aliased HUD&lt;br /&gt;
 --enable-anti-alias-hud      Enable anti-aliased HUD&lt;br /&gt;
 --disable-hud-3d             Disable 3D HUD&lt;br /&gt;
 --enable-hud-3d              Enable 3D HUD&lt;br /&gt;
 --ai-scenario=scenario       Add and enable a new scenario. Multiple options&lt;br /&gt;
                              are allowed. Scenarios are in /[[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
==== Aircraft ====&lt;br /&gt;
&lt;br /&gt;
 --aircraft=name              Select an aircraft profile as defined by a top&lt;br /&gt;
                              level -set.xml&lt;br /&gt;
 --aircraft-dir=path          Specify the exact directory to use for the&lt;br /&gt;
                              aircraft (normally not required, but may be&lt;br /&gt;
                              useful). Interpreted relatively to the&lt;br /&gt;
                              current directory. Causes the &amp;lt;path-cache&amp;gt;&lt;br /&gt;
                              from autosave_X_Y.xml, as well as&lt;br /&gt;
                              --fg-aircraft options and the FG_AIRCRAFT&lt;br /&gt;
                              environment variable to be bypassed.&lt;br /&gt;
 --show-aircraft              Print a list of the currently available&lt;br /&gt;
                              aircraft types&lt;br /&gt;
&lt;br /&gt;
==== Flight Model ====&lt;br /&gt;
&lt;br /&gt;
 --fdm=name                   Select the core flight dynamics model&lt;br /&gt;
                              Can be one of jsb, larcsim, yasim, magic,&lt;br /&gt;
                              balloon, ada, external, or null&lt;br /&gt;
 --aero=name                  Select aircraft aerodynamics model to load&lt;br /&gt;
 --model-hz=n                 Run the FDM this rate (iterations per second)&lt;br /&gt;
 --speed=n                    Run the FDM 'n' times faster than real time&lt;br /&gt;
 --notrim                     Do NOT attempt to trim the model&lt;br /&gt;
                              (only with fdm=jsbsim)&lt;br /&gt;
 --on-ground                  Start at ground level (default)&lt;br /&gt;
 --in-air                     Start in air (implied when using --altitude)&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
&lt;br /&gt;
==== Initial Position and Orientation ====&lt;br /&gt;
&lt;br /&gt;
 --airport=ID                 Specify airport (e.g. KOAK)&lt;br /&gt;
 --runway=rwy_no              Specify starting runway (must also specify an&lt;br /&gt;
                              airport)&lt;br /&gt;
 --vor=ID                     Specify starting position relative to a VOR&lt;br /&gt;
 --ndb=ID                     Specify starting position relative to an NDB&lt;br /&gt;
 --fix=ID                     Specify starting position relative to a fix&lt;br /&gt;
 --parkpos=NAME               Specify a gate at the airport (e.g. 747d11)&lt;br /&gt;
 --offset-distance=nm         Specify distance to reference point (statute&lt;br /&gt;
                              miles)&lt;br /&gt;
 --offset-azimuth=degrees     Specify heading to reference point&lt;br /&gt;
 --lon=degrees                Starting longitude (west = -)&lt;br /&gt;
 --lat=degrees                Starting latitude (south = -)&lt;br /&gt;
 --altitude=value             Starting altitude&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --heading=degrees            Specify heading (yaw) angle (Psi)&lt;br /&gt;
 --roll=degrees               Specify roll angle (Phi)&lt;br /&gt;
 --pitch=degrees              Specify pitch angle (Theta)&lt;br /&gt;
 --uBody=units_per_sec        Specify velocity along the body X axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vBody=units_per_sec        Specify velocity along the body Y axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --wBody=units_per_sec        Specify velocity along the body Z axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vc=knots                   Specify initial airspeed&lt;br /&gt;
 --mach=num                   Specify initial mach number&lt;br /&gt;
 --glideslope=degrees         Specify flight path angle (can be positive)&lt;br /&gt;
 --roc=fpm                    Specify initial climb rate (can be negative)&lt;br /&gt;
&lt;br /&gt;
==== Rendering Options ====&lt;br /&gt;
&lt;br /&gt;
 --bpp=depth                  Specify the bits per pixel&lt;br /&gt;
 --fog-disable                Disable fog/haze&lt;br /&gt;
 --fog-fastest                Enable fastest fog/haze&lt;br /&gt;
 --fog-nicest                 Enable nicest fog/haze&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --disable-enhanced-lighting  Disable enhanced runway lighting&lt;br /&gt;
 --enable-enhanced-lighting   Enable enhanced runway lighting&lt;br /&gt;
 --season=winter              Enable snow covered scenery&lt;br /&gt;
 --disable-distance-attenuation&lt;br /&gt;
                              Disable runway light distance attenuation&lt;br /&gt;
 --enable-distance-attenuation&lt;br /&gt;
                              Enable runway light distance attenuation&lt;br /&gt;
 --disable-specular-highlight&lt;br /&gt;
                              Disable specular reflections on textured&lt;br /&gt;
                              objects&lt;br /&gt;
 --enable-specular-highlight  Enable specular reflections on textured objects&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --fov=degrees                Specify field of view angle&lt;br /&gt;
 --disable-fullscreen         Disable fullscreen mode&lt;br /&gt;
 --enable-fullscreen          Enable fullscreen mode&lt;br /&gt;
 --shading-flat               Enable flat shading&lt;br /&gt;
 --shading-smooth             Enable smooth shading&lt;br /&gt;
 --disable-wireframe          Disable wireframe drawing mode&lt;br /&gt;
 --enable-wireframe           Enable wireframe drawing mode&lt;br /&gt;
 --geometry=WxH               Specify window geometry (640x480, etc)&lt;br /&gt;
 --view-offset=value          Specify the default forward view direction as&lt;br /&gt;
                              an offset from straight ahead. Allowable values&lt;br /&gt;
                              are LEFT, RIGHT, CENTER, or a specific number&lt;br /&gt;
                              in degrees&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --texture-filtering=number   Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
==== Hud Options ====&lt;br /&gt;
&lt;br /&gt;
 --hud-tris                   Hud displays number of triangles rendered&lt;br /&gt;
 --hud-culled                 Hud displays percentage of triangles culled&lt;br /&gt;
&lt;br /&gt;
==== Time Options ====&lt;br /&gt;
&lt;br /&gt;
 --timeofday={dawn,noon,dusk,midnight}&lt;br /&gt;
                              Specify a time of day&lt;br /&gt;
 --time-offset=[+-]hh:mm:ss   Add this time offset&lt;br /&gt;
 --time-match-real            Synchronize time with current time at chosen airport&lt;br /&gt;
 --time-match-local           Synchronize time with system time of computer&lt;br /&gt;
 --start-date-sys=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              system time&lt;br /&gt;
 --start-date-gmt=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Greenwich Mean Time&lt;br /&gt;
 --start-date-lat=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Local Aircraft Time&lt;br /&gt;
&lt;br /&gt;
==== Network Options ====&lt;br /&gt;
&lt;br /&gt;
 --httpd=port                 Enable http server on the specified port&lt;br /&gt;
 --telnet=port                Enable telnet server on the specified port&lt;br /&gt;
 --jpg-httpd=port             Enable screen shot http server on the specified&lt;br /&gt;
                                port&lt;br /&gt;
&lt;br /&gt;
==== MultiPlayer Options ====&lt;br /&gt;
&lt;br /&gt;
 --callsign                   assign a unique name to a player&lt;br /&gt;
 --multiplay={in|out},hz,address,port&lt;br /&gt;
                              Specify multipilot communication settings&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
==== Route/Way Point Options ====&lt;br /&gt;
&lt;br /&gt;
 --wp=ID[@alt]                Specify a waypoint for the GC autopilot;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --flight-plan=file           Read all waypoints from a file&lt;br /&gt;
&lt;br /&gt;
==== IO Options ====&lt;br /&gt;
&lt;br /&gt;
 --generic=params             Open connection using a predefined&lt;br /&gt;
                              communication interface and a preselected&lt;br /&gt;
                              communication protocol&lt;br /&gt;
 --garmin=params              Open connection using the Garmin GPS protocol&lt;br /&gt;
 --joyclient=params           Open connection to an Agwagon joystick&lt;br /&gt;
 --jsclient=params            Open connection to a remote joystick&lt;br /&gt;
 --native-ctrls=params        Open connection using the FG Native Controls&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native-fdm=params          Open connection using the FG Native FDM&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native=params              Open connection using the FG Native protocol&lt;br /&gt;
 --nmea=params                Open connection using the NMEA protocol&lt;br /&gt;
 --opengc=params              Open connection using the OpenGC protocol&lt;br /&gt;
 --props=params               Open connection using the interactive property&lt;br /&gt;
                              manager (LEGACY/DEAD DO NOT USE same as --telnet)&lt;br /&gt;
 --pve=params                 Open connection using the PVE protocol&lt;br /&gt;
 --ray=params                 Open connection using the Ray Woodworth motion&lt;br /&gt;
                              chair protocol&lt;br /&gt;
 --rul=params                 Open connection using the RUL protocol&lt;br /&gt;
 --atc610x                    Enable atc610x interface&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: --generic=\\.\COM10,out,1,/tmp/data.xml,myproto&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
==== Avionics Options ====&lt;br /&gt;
&lt;br /&gt;
 --com1=frequency             Set the COM1 radio frequency.&lt;br /&gt;
 --com2=frequency             Set the COM2 radio frequency.&lt;br /&gt;
 --nav1=[radial:]frequency    Set the NAV1 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --nav2=[radial:]frequency    Set the NAV2 radio frequency, optionally&lt;br /&gt;
                              preceded by a radial.&lt;br /&gt;
 --adf=[rotation:]frequency   Set the ADF radio frequency, optionally&lt;br /&gt;
                              preceded by a card rotation.&lt;br /&gt;
 --dme={nav1|nav2|frequency}  Slave the ADF to one of the NAV radios, or set&lt;br /&gt;
                              its internal frequency.&lt;br /&gt;
&lt;br /&gt;
==== Environment Options ====&lt;br /&gt;
&lt;br /&gt;
   --disable-real-weather-fetch&lt;br /&gt;
                                Disable METAR based real weather fetching&lt;br /&gt;
   --enable-real-weather-fetch  Enable METAR based real weather fetching (this&lt;br /&gt;
                                requires an open internet connection)&lt;br /&gt;
   --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                                horizon&lt;br /&gt;
   --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                                horizon&lt;br /&gt;
   --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
   --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
   --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
   --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
   --visibility=meters          Specify initial visibility&lt;br /&gt;
   --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
   --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                                (knots)&lt;br /&gt;
   --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                                (severe)&lt;br /&gt;
   --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                                Create an overcast ceiling, optionally with a&lt;br /&gt;
                                specific thickness (defaults to 2000 ft).&lt;br /&gt;
   --random-wind&lt;br /&gt;
   --metar=&amp;quot;metar string&amp;quot;       Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
==== Situation Options ====&lt;br /&gt;
&lt;br /&gt;
   --failure={pitot|static|system|vacuum}&lt;br /&gt;
                                Fail the pitot, static, vacuum, or electrical&lt;br /&gt;
                                system (repeat the option for multiple system&lt;br /&gt;
                                failures).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Debugging Options ====&lt;br /&gt;
&lt;br /&gt;
   --log-level={bulk|debug|info|warn|alert}&lt;br /&gt;
                                Set the logging level for this session.&lt;br /&gt;
                                0=verbose, 5=alerts only&lt;br /&gt;
   --pid=/pathto/some/file.pid  Write current PID into file.&lt;br /&gt;
   --trace-read=property        Trace the reads for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
   --trace-write=property       Trace the writes for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
&lt;br /&gt;
=== Source files ===&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115820</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115820"/>
		<updated>2018-08-09T15:02:12Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* IO Options */ alignment with other options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]].&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== General Options ====&lt;br /&gt;
&lt;br /&gt;
 --help, -h                   Show the most relevant command line options&lt;br /&gt;
 --verbose, -v                Show all command line options when combined with --help or -h&lt;br /&gt;
 --fg-root=path               Specify the root data path&lt;br /&gt;
 --fg-scenery=path[:path...]  Specify the base scenery path;&lt;br /&gt;
                                Defaults to [[$FG_ROOT]]/Scenery&lt;br /&gt;
 --language=code              Select the language for this session&lt;br /&gt;
 --launcher                   Enable Qt launcher &lt;br /&gt;
 --disable-fullscreen         Disable full-screen game mode&lt;br /&gt;
 --enable-fullscreen          Enable full-screen game mode&lt;br /&gt;
 --disable-splash-screen      Disable splash screen&lt;br /&gt;
 --enable-splash-screen       Enable splash screen&lt;br /&gt;
 --disable-mouse-pointer      Disable extra mouse pointer&lt;br /&gt;
 --enable-mouse-pointer       Enable extra mouse pointer&lt;br /&gt;
                                (i.e. for full screen Voodoo based cards)&lt;br /&gt;
 --disable-random-objects     Exclude random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --enable-random-objects      Include random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --disable-ai-models          Disable the AI subsystem.&lt;br /&gt;
                                (This also disables showing the models of other&lt;br /&gt;
                                 multiplayer aircraft)&lt;br /&gt;
 --enable-ai-models           Enable the AI subsystem.&lt;br /&gt;
 --disable-ai-traffic         Disable the autogenerated traffic subsystem.&lt;br /&gt;
 --enable-ai-traffic          Enable the autogenerated traffic subsystem.&lt;br /&gt;
 --disable-freeze             Start in a running state&lt;br /&gt;
 --enable-freeze              Start in a frozen state&lt;br /&gt;
 --disable-fuel-freeze        Fuel is consumed normally&lt;br /&gt;
 --enable-fuel-freeze         Fuel tank quantity forced to remain constant&lt;br /&gt;
 --disable-clock-freeze       Clock advances normally&lt;br /&gt;
 --enable-clock-freeze        Do not advance clock&lt;br /&gt;
 --enable-auto-coordination   Enable auto coordination - rudder and&lt;br /&gt;
                              ailerons will be controlled together&lt;br /&gt;
 --disable-auto-coordination  Disable auto coordination (default)&lt;br /&gt;
 --browser-app=path           Specify path to your web browser&lt;br /&gt;
 --prop:name=value            Set property  to &lt;br /&gt;
 --config=path                Load additional properties from path&lt;br /&gt;
 --units-feet                 Use feet for distances&lt;br /&gt;
 --units-meters               Use meters for distances&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
&lt;br /&gt;
 --disable-panel              Disable instrument panel&lt;br /&gt;
 --enable-panel               Enable instrument panel&lt;br /&gt;
 --disable-sound              Disable sound effects&lt;br /&gt;
 --enable-sound               Enable sound effects&lt;br /&gt;
 --disable-hud                Disable Heads Up Display (HUD)&lt;br /&gt;
 --enable-hud                 Enable Heads Up Display (HUD)&lt;br /&gt;
 --disable-anti-alias-hud     Disable anti-aliased HUD&lt;br /&gt;
 --enable-anti-alias-hud      Enable anti-aliased HUD&lt;br /&gt;
 --disable-hud-3d             Disable 3D HUD&lt;br /&gt;
 --enable-hud-3d              Enable 3D HUD&lt;br /&gt;
 --ai-scenario=scenario       Add and enable a new scenario. Multiple options&lt;br /&gt;
                              are allowed. Scenarios are in /[[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
==== Aircraft ====&lt;br /&gt;
&lt;br /&gt;
 --aircraft=name              Select an aircraft profile as defined by a top&lt;br /&gt;
                              level -set.xml&lt;br /&gt;
 --aircraft-dir=path          Specify the exact directory to use for the&lt;br /&gt;
                              aircraft (normally not required, but may be&lt;br /&gt;
                              useful). Interpreted relatively to the&lt;br /&gt;
                              current directory. Causes the &amp;lt;path-cache&amp;gt;&lt;br /&gt;
                              from autosave_X_Y.xml, as well as&lt;br /&gt;
                              --fg-aircraft options and the FG_AIRCRAFT&lt;br /&gt;
                              environment variable to be bypassed.&lt;br /&gt;
 --show-aircraft              Print a list of the currently available&lt;br /&gt;
                              aircraft types&lt;br /&gt;
&lt;br /&gt;
==== Flight Model ====&lt;br /&gt;
&lt;br /&gt;
 --fdm=name                   Select the core flight dynamics model&lt;br /&gt;
                              Can be one of jsb, larcsim, yasim, magic,&lt;br /&gt;
                              balloon, ada, external, or null&lt;br /&gt;
 --aero=name                  Select aircraft aerodynamics model to load&lt;br /&gt;
 --model-hz=n                 Run the FDM this rate (iterations per second)&lt;br /&gt;
 --speed=n                    Run the FDM 'n' times faster than real time&lt;br /&gt;
 --notrim                     Do NOT attempt to trim the model&lt;br /&gt;
                              (only with fdm=jsbsim)&lt;br /&gt;
 --on-ground                  Start at ground level (default)&lt;br /&gt;
 --in-air                     Start in air (implied when using --altitude)&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
&lt;br /&gt;
==== Initial Position and Orientation ====&lt;br /&gt;
&lt;br /&gt;
 --airport=ID                 Specify airport (e.g. KOAK)&lt;br /&gt;
 --runway=rwy_no              Specify starting runway (must also specify an&lt;br /&gt;
                              airport)&lt;br /&gt;
 --vor=ID                     Specify starting position relative to a VOR&lt;br /&gt;
 --ndb=ID                     Specify starting position relative to an NDB&lt;br /&gt;
 --fix=ID                     Specify starting position relative to a fix&lt;br /&gt;
 --parkpos=NAME               Specify a gate at the airport (e.g. 747d11)&lt;br /&gt;
 --offset-distance=nm         Specify distance to reference point (statute&lt;br /&gt;
                              miles)&lt;br /&gt;
 --offset-azimuth=degrees     Specify heading to reference point&lt;br /&gt;
 --lon=degrees                Starting longitude (west = -)&lt;br /&gt;
 --lat=degrees                Starting latitude (south = -)&lt;br /&gt;
 --altitude=value             Starting altitude&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --heading=degrees            Specify heading (yaw) angle (Psi)&lt;br /&gt;
 --roll=degrees               Specify roll angle (Phi)&lt;br /&gt;
 --pitch=degrees              Specify pitch angle (Theta)&lt;br /&gt;
 --uBody=units_per_sec        Specify velocity along the body X axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vBody=units_per_sec        Specify velocity along the body Y axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --wBody=units_per_sec        Specify velocity along the body Z axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vc=knots                   Specify initial airspeed&lt;br /&gt;
 --mach=num                   Specify initial mach number&lt;br /&gt;
 --glideslope=degrees         Specify flight path angle (can be positive)&lt;br /&gt;
 --roc=fpm                    Specify initial climb rate (can be negative)&lt;br /&gt;
&lt;br /&gt;
==== Rendering Options ====&lt;br /&gt;
&lt;br /&gt;
 --bpp=depth                  Specify the bits per pixel&lt;br /&gt;
 --fog-disable                Disable fog/haze&lt;br /&gt;
 --fog-fastest                Enable fastest fog/haze&lt;br /&gt;
 --fog-nicest                 Enable nicest fog/haze&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --disable-enhanced-lighting  Disable enhanced runway lighting&lt;br /&gt;
 --enable-enhanced-lighting   Enable enhanced runway lighting&lt;br /&gt;
 --season=winter              Enable snow covered scenery&lt;br /&gt;
 --disable-distance-attenuation&lt;br /&gt;
                              Disable runway light distance attenuation&lt;br /&gt;
 --enable-distance-attenuation&lt;br /&gt;
                              Enable runway light distance attenuation&lt;br /&gt;
 --disable-specular-highlight&lt;br /&gt;
                              Disable specular reflections on textured&lt;br /&gt;
                              objects&lt;br /&gt;
 --enable-specular-highlight  Enable specular reflections on textured objects&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --fov=degrees                Specify field of view angle&lt;br /&gt;
 --disable-fullscreen         Disable fullscreen mode&lt;br /&gt;
 --enable-fullscreen          Enable fullscreen mode&lt;br /&gt;
 --shading-flat               Enable flat shading&lt;br /&gt;
 --shading-smooth             Enable smooth shading&lt;br /&gt;
 --disable-wireframe          Disable wireframe drawing mode&lt;br /&gt;
 --enable-wireframe           Enable wireframe drawing mode&lt;br /&gt;
 --geometry=WxH               Specify window geometry (640x480, etc)&lt;br /&gt;
 --view-offset=value          Specify the default forward view direction as&lt;br /&gt;
                              an offset from straight ahead. Allowable values&lt;br /&gt;
                              are LEFT, RIGHT, CENTER, or a specific number&lt;br /&gt;
                              in degrees&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --texture-filtering=number   Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
==== Hud Options ====&lt;br /&gt;
&lt;br /&gt;
 --hud-tris                   Hud displays number of triangles rendered&lt;br /&gt;
 --hud-culled                 Hud displays percentage of triangles culled&lt;br /&gt;
&lt;br /&gt;
==== Time Options ====&lt;br /&gt;
&lt;br /&gt;
 --timeofday={dawn,noon,dusk,midnight}&lt;br /&gt;
                              Specify a time of day&lt;br /&gt;
 --time-offset=[+-]hh:mm:ss   Add this time offset&lt;br /&gt;
 --time-match-real            Synchronize time with current time at chosen airport&lt;br /&gt;
 --time-match-local           Synchronize time with system time of computer&lt;br /&gt;
 --start-date-sys=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              system time&lt;br /&gt;
 --start-date-gmt=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Greenwich Mean Time&lt;br /&gt;
 --start-date-lat=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Local Aircraft Time&lt;br /&gt;
&lt;br /&gt;
==== Network Options ====&lt;br /&gt;
&lt;br /&gt;
 --httpd=port                 Enable http server on the specified port&lt;br /&gt;
 --telnet=port                Enable telnet server on the specified port&lt;br /&gt;
 --jpg-httpd=port             Enable screen shot http server on the specified&lt;br /&gt;
                                port&lt;br /&gt;
&lt;br /&gt;
==== MultiPlayer Options ====&lt;br /&gt;
&lt;br /&gt;
 --callsign                   assign a unique name to a player&lt;br /&gt;
 --multiplay={in|out},hz,address,port&lt;br /&gt;
                              Specify multipilot communication settings&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
==== Route/Way Point Options ====&lt;br /&gt;
&lt;br /&gt;
 --wp=ID[@alt]                Specify a waypoint for the GC autopilot;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --flight-plan=file           Read all waypoints from a file&lt;br /&gt;
&lt;br /&gt;
==== IO Options ====&lt;br /&gt;
&lt;br /&gt;
 --generic=params             Open connection using a predefined&lt;br /&gt;
                              communication interface and a preselected&lt;br /&gt;
                              communication protocol&lt;br /&gt;
 --garmin=params              Open connection using the Garmin GPS protocol&lt;br /&gt;
 --joyclient=params           Open connection to an Agwagon joystick&lt;br /&gt;
 --jsclient=params            Open connection to a remote joystick&lt;br /&gt;
 --native-ctrls=params        Open connection using the FG Native Controls&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native-fdm=params          Open connection using the FG Native FDM&lt;br /&gt;
                              protocol&lt;br /&gt;
 --native=params              Open connection using the FG Native protocol&lt;br /&gt;
 --nmea=params                Open connection using the NMEA protocol&lt;br /&gt;
 --opengc=params              Open connection using the OpenGC protocol&lt;br /&gt;
 --props=params               Open connection using the interactive property&lt;br /&gt;
                              manager (LEGACY/DEAD DO NOT USE same as --telnet)&lt;br /&gt;
 --pve=params                 Open connection using the PVE protocol&lt;br /&gt;
 --ray=params                 Open connection using the Ray Woodworth motion&lt;br /&gt;
                              chair protocol&lt;br /&gt;
 --rul=params                 Open connection using the RUL protocol&lt;br /&gt;
 --atc610x                    Enable atc610x interface&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: --generic=\\.\COM10,out,1,/tmp/data.xml,myproto&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
==== Avionics Options ====&lt;br /&gt;
&lt;br /&gt;
   --com1=frequency             Set the COM1 radio frequency.&lt;br /&gt;
   --com2=frequency             Set the COM2 radio frequency.&lt;br /&gt;
   --nav1=[radial:]frequency    Set the NAV1 radio frequency, optionally&lt;br /&gt;
                                preceded by a radial.&lt;br /&gt;
   --nav2=[radial:]frequency    Set the NAV2 radio frequency, optionally&lt;br /&gt;
                                preceded by a radial.&lt;br /&gt;
   --adf=[rotation:]frequency   Set the ADF radio frequency, optionally&lt;br /&gt;
                                preceded by a card rotation.&lt;br /&gt;
   --dme={nav1|nav2|frequency}  Slave the ADF to one of the NAV radios, or set&lt;br /&gt;
                                its internal frequency.&lt;br /&gt;
&lt;br /&gt;
==== Environment Options ====&lt;br /&gt;
&lt;br /&gt;
   --disable-real-weather-fetch&lt;br /&gt;
                                Disable METAR based real weather fetching&lt;br /&gt;
   --enable-real-weather-fetch  Enable METAR based real weather fetching (this&lt;br /&gt;
                                requires an open internet connection)&lt;br /&gt;
   --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                                horizon&lt;br /&gt;
   --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                                horizon&lt;br /&gt;
   --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
   --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
   --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
   --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
   --visibility=meters          Specify initial visibility&lt;br /&gt;
   --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
   --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                                (knots)&lt;br /&gt;
   --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                                (severe)&lt;br /&gt;
   --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                                Create an overcast ceiling, optionally with a&lt;br /&gt;
                                specific thickness (defaults to 2000 ft).&lt;br /&gt;
   --random-wind&lt;br /&gt;
   --metar=&amp;quot;metar string&amp;quot;       Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
==== Situation Options ====&lt;br /&gt;
&lt;br /&gt;
   --failure={pitot|static|system|vacuum}&lt;br /&gt;
                                Fail the pitot, static, vacuum, or electrical&lt;br /&gt;
                                system (repeat the option for multiple system&lt;br /&gt;
                                failures).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Debugging Options ====&lt;br /&gt;
&lt;br /&gt;
   --log-level={bulk|debug|info|warn|alert}&lt;br /&gt;
                                Set the logging level for this session.&lt;br /&gt;
                                0=verbose, 5=alerts only&lt;br /&gt;
   --pid=/pathto/some/file.pid  Write current PID into file.&lt;br /&gt;
   --trace-read=property        Trace the reads for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
   --trace-write=property       Trace the writes for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
&lt;br /&gt;
=== Source files ===&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115819</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115819"/>
		<updated>2018-08-09T15:01:42Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Route/Way Point Options */ alignment with other options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]].&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== General Options ====&lt;br /&gt;
&lt;br /&gt;
 --help, -h                   Show the most relevant command line options&lt;br /&gt;
 --verbose, -v                Show all command line options when combined with --help or -h&lt;br /&gt;
 --fg-root=path               Specify the root data path&lt;br /&gt;
 --fg-scenery=path[:path...]  Specify the base scenery path;&lt;br /&gt;
                                Defaults to [[$FG_ROOT]]/Scenery&lt;br /&gt;
 --language=code              Select the language for this session&lt;br /&gt;
 --launcher                   Enable Qt launcher &lt;br /&gt;
 --disable-fullscreen         Disable full-screen game mode&lt;br /&gt;
 --enable-fullscreen          Enable full-screen game mode&lt;br /&gt;
 --disable-splash-screen      Disable splash screen&lt;br /&gt;
 --enable-splash-screen       Enable splash screen&lt;br /&gt;
 --disable-mouse-pointer      Disable extra mouse pointer&lt;br /&gt;
 --enable-mouse-pointer       Enable extra mouse pointer&lt;br /&gt;
                                (i.e. for full screen Voodoo based cards)&lt;br /&gt;
 --disable-random-objects     Exclude random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --enable-random-objects      Include random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --disable-ai-models          Disable the AI subsystem.&lt;br /&gt;
                                (This also disables showing the models of other&lt;br /&gt;
                                 multiplayer aircraft)&lt;br /&gt;
 --enable-ai-models           Enable the AI subsystem.&lt;br /&gt;
 --disable-ai-traffic         Disable the autogenerated traffic subsystem.&lt;br /&gt;
 --enable-ai-traffic          Enable the autogenerated traffic subsystem.&lt;br /&gt;
 --disable-freeze             Start in a running state&lt;br /&gt;
 --enable-freeze              Start in a frozen state&lt;br /&gt;
 --disable-fuel-freeze        Fuel is consumed normally&lt;br /&gt;
 --enable-fuel-freeze         Fuel tank quantity forced to remain constant&lt;br /&gt;
 --disable-clock-freeze       Clock advances normally&lt;br /&gt;
 --enable-clock-freeze        Do not advance clock&lt;br /&gt;
 --enable-auto-coordination   Enable auto coordination - rudder and&lt;br /&gt;
                              ailerons will be controlled together&lt;br /&gt;
 --disable-auto-coordination  Disable auto coordination (default)&lt;br /&gt;
 --browser-app=path           Specify path to your web browser&lt;br /&gt;
 --prop:name=value            Set property  to &lt;br /&gt;
 --config=path                Load additional properties from path&lt;br /&gt;
 --units-feet                 Use feet for distances&lt;br /&gt;
 --units-meters               Use meters for distances&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
&lt;br /&gt;
 --disable-panel              Disable instrument panel&lt;br /&gt;
 --enable-panel               Enable instrument panel&lt;br /&gt;
 --disable-sound              Disable sound effects&lt;br /&gt;
 --enable-sound               Enable sound effects&lt;br /&gt;
 --disable-hud                Disable Heads Up Display (HUD)&lt;br /&gt;
 --enable-hud                 Enable Heads Up Display (HUD)&lt;br /&gt;
 --disable-anti-alias-hud     Disable anti-aliased HUD&lt;br /&gt;
 --enable-anti-alias-hud      Enable anti-aliased HUD&lt;br /&gt;
 --disable-hud-3d             Disable 3D HUD&lt;br /&gt;
 --enable-hud-3d              Enable 3D HUD&lt;br /&gt;
 --ai-scenario=scenario       Add and enable a new scenario. Multiple options&lt;br /&gt;
                              are allowed. Scenarios are in /[[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
==== Aircraft ====&lt;br /&gt;
&lt;br /&gt;
 --aircraft=name              Select an aircraft profile as defined by a top&lt;br /&gt;
                              level -set.xml&lt;br /&gt;
 --aircraft-dir=path          Specify the exact directory to use for the&lt;br /&gt;
                              aircraft (normally not required, but may be&lt;br /&gt;
                              useful). Interpreted relatively to the&lt;br /&gt;
                              current directory. Causes the &amp;lt;path-cache&amp;gt;&lt;br /&gt;
                              from autosave_X_Y.xml, as well as&lt;br /&gt;
                              --fg-aircraft options and the FG_AIRCRAFT&lt;br /&gt;
                              environment variable to be bypassed.&lt;br /&gt;
 --show-aircraft              Print a list of the currently available&lt;br /&gt;
                              aircraft types&lt;br /&gt;
&lt;br /&gt;
==== Flight Model ====&lt;br /&gt;
&lt;br /&gt;
 --fdm=name                   Select the core flight dynamics model&lt;br /&gt;
                              Can be one of jsb, larcsim, yasim, magic,&lt;br /&gt;
                              balloon, ada, external, or null&lt;br /&gt;
 --aero=name                  Select aircraft aerodynamics model to load&lt;br /&gt;
 --model-hz=n                 Run the FDM this rate (iterations per second)&lt;br /&gt;
 --speed=n                    Run the FDM 'n' times faster than real time&lt;br /&gt;
 --notrim                     Do NOT attempt to trim the model&lt;br /&gt;
                              (only with fdm=jsbsim)&lt;br /&gt;
 --on-ground                  Start at ground level (default)&lt;br /&gt;
 --in-air                     Start in air (implied when using --altitude)&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
&lt;br /&gt;
==== Initial Position and Orientation ====&lt;br /&gt;
&lt;br /&gt;
 --airport=ID                 Specify airport (e.g. KOAK)&lt;br /&gt;
 --runway=rwy_no              Specify starting runway (must also specify an&lt;br /&gt;
                              airport)&lt;br /&gt;
 --vor=ID                     Specify starting position relative to a VOR&lt;br /&gt;
 --ndb=ID                     Specify starting position relative to an NDB&lt;br /&gt;
 --fix=ID                     Specify starting position relative to a fix&lt;br /&gt;
 --parkpos=NAME               Specify a gate at the airport (e.g. 747d11)&lt;br /&gt;
 --offset-distance=nm         Specify distance to reference point (statute&lt;br /&gt;
                              miles)&lt;br /&gt;
 --offset-azimuth=degrees     Specify heading to reference point&lt;br /&gt;
 --lon=degrees                Starting longitude (west = -)&lt;br /&gt;
 --lat=degrees                Starting latitude (south = -)&lt;br /&gt;
 --altitude=value             Starting altitude&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --heading=degrees            Specify heading (yaw) angle (Psi)&lt;br /&gt;
 --roll=degrees               Specify roll angle (Phi)&lt;br /&gt;
 --pitch=degrees              Specify pitch angle (Theta)&lt;br /&gt;
 --uBody=units_per_sec        Specify velocity along the body X axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vBody=units_per_sec        Specify velocity along the body Y axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --wBody=units_per_sec        Specify velocity along the body Z axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vc=knots                   Specify initial airspeed&lt;br /&gt;
 --mach=num                   Specify initial mach number&lt;br /&gt;
 --glideslope=degrees         Specify flight path angle (can be positive)&lt;br /&gt;
 --roc=fpm                    Specify initial climb rate (can be negative)&lt;br /&gt;
&lt;br /&gt;
==== Rendering Options ====&lt;br /&gt;
&lt;br /&gt;
 --bpp=depth                  Specify the bits per pixel&lt;br /&gt;
 --fog-disable                Disable fog/haze&lt;br /&gt;
 --fog-fastest                Enable fastest fog/haze&lt;br /&gt;
 --fog-nicest                 Enable nicest fog/haze&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --disable-enhanced-lighting  Disable enhanced runway lighting&lt;br /&gt;
 --enable-enhanced-lighting   Enable enhanced runway lighting&lt;br /&gt;
 --season=winter              Enable snow covered scenery&lt;br /&gt;
 --disable-distance-attenuation&lt;br /&gt;
                              Disable runway light distance attenuation&lt;br /&gt;
 --enable-distance-attenuation&lt;br /&gt;
                              Enable runway light distance attenuation&lt;br /&gt;
 --disable-specular-highlight&lt;br /&gt;
                              Disable specular reflections on textured&lt;br /&gt;
                              objects&lt;br /&gt;
 --enable-specular-highlight  Enable specular reflections on textured objects&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --fov=degrees                Specify field of view angle&lt;br /&gt;
 --disable-fullscreen         Disable fullscreen mode&lt;br /&gt;
 --enable-fullscreen          Enable fullscreen mode&lt;br /&gt;
 --shading-flat               Enable flat shading&lt;br /&gt;
 --shading-smooth             Enable smooth shading&lt;br /&gt;
 --disable-wireframe          Disable wireframe drawing mode&lt;br /&gt;
 --enable-wireframe           Enable wireframe drawing mode&lt;br /&gt;
 --geometry=WxH               Specify window geometry (640x480, etc)&lt;br /&gt;
 --view-offset=value          Specify the default forward view direction as&lt;br /&gt;
                              an offset from straight ahead. Allowable values&lt;br /&gt;
                              are LEFT, RIGHT, CENTER, or a specific number&lt;br /&gt;
                              in degrees&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --texture-filtering=number   Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
==== Hud Options ====&lt;br /&gt;
&lt;br /&gt;
 --hud-tris                   Hud displays number of triangles rendered&lt;br /&gt;
 --hud-culled                 Hud displays percentage of triangles culled&lt;br /&gt;
&lt;br /&gt;
==== Time Options ====&lt;br /&gt;
&lt;br /&gt;
 --timeofday={dawn,noon,dusk,midnight}&lt;br /&gt;
                              Specify a time of day&lt;br /&gt;
 --time-offset=[+-]hh:mm:ss   Add this time offset&lt;br /&gt;
 --time-match-real            Synchronize time with current time at chosen airport&lt;br /&gt;
 --time-match-local           Synchronize time with system time of computer&lt;br /&gt;
 --start-date-sys=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              system time&lt;br /&gt;
 --start-date-gmt=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Greenwich Mean Time&lt;br /&gt;
 --start-date-lat=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Local Aircraft Time&lt;br /&gt;
&lt;br /&gt;
==== Network Options ====&lt;br /&gt;
&lt;br /&gt;
 --httpd=port                 Enable http server on the specified port&lt;br /&gt;
 --telnet=port                Enable telnet server on the specified port&lt;br /&gt;
 --jpg-httpd=port             Enable screen shot http server on the specified&lt;br /&gt;
                                port&lt;br /&gt;
&lt;br /&gt;
==== MultiPlayer Options ====&lt;br /&gt;
&lt;br /&gt;
 --callsign                   assign a unique name to a player&lt;br /&gt;
 --multiplay={in|out},hz,address,port&lt;br /&gt;
                              Specify multipilot communication settings&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
==== Route/Way Point Options ====&lt;br /&gt;
&lt;br /&gt;
 --wp=ID[@alt]                Specify a waypoint for the GC autopilot;&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
 --flight-plan=file           Read all waypoints from a file&lt;br /&gt;
&lt;br /&gt;
==== IO Options ====&lt;br /&gt;
&lt;br /&gt;
   --generic=params             Open connection using a predefined&lt;br /&gt;
                                communication interface and a preselected&lt;br /&gt;
                                communication protocol&lt;br /&gt;
   --garmin=params              Open connection using the Garmin GPS protocol&lt;br /&gt;
   --joyclient=params           Open connection to an Agwagon joystick&lt;br /&gt;
   --jsclient=params            Open connection to a remote joystick&lt;br /&gt;
   --native-ctrls=params        Open connection using the FG Native Controls&lt;br /&gt;
                                protocol&lt;br /&gt;
   --native-fdm=params          Open connection using the FG Native FDM&lt;br /&gt;
                                protocol&lt;br /&gt;
   --native=params              Open connection using the FG Native protocol&lt;br /&gt;
   --nmea=params                Open connection using the NMEA protocol&lt;br /&gt;
   --opengc=params              Open connection using the OpenGC protocol&lt;br /&gt;
   --props=params               Open connection using the interactive property&lt;br /&gt;
                                manager (LEGACY/DEAD DO NOT USE same as --telnet)&lt;br /&gt;
   --pve=params                 Open connection using the PVE protocol&lt;br /&gt;
   --ray=params                 Open connection using the Ray Woodworth motion&lt;br /&gt;
                                chair protocol&lt;br /&gt;
   --rul=params                 Open connection using the RUL protocol&lt;br /&gt;
   --atc610x                    Enable atc610x interface&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: --generic=\\.\COM10,out,1,/tmp/data.xml,myproto&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
==== Avionics Options ====&lt;br /&gt;
&lt;br /&gt;
   --com1=frequency             Set the COM1 radio frequency.&lt;br /&gt;
   --com2=frequency             Set the COM2 radio frequency.&lt;br /&gt;
   --nav1=[radial:]frequency    Set the NAV1 radio frequency, optionally&lt;br /&gt;
                                preceded by a radial.&lt;br /&gt;
   --nav2=[radial:]frequency    Set the NAV2 radio frequency, optionally&lt;br /&gt;
                                preceded by a radial.&lt;br /&gt;
   --adf=[rotation:]frequency   Set the ADF radio frequency, optionally&lt;br /&gt;
                                preceded by a card rotation.&lt;br /&gt;
   --dme={nav1|nav2|frequency}  Slave the ADF to one of the NAV radios, or set&lt;br /&gt;
                                its internal frequency.&lt;br /&gt;
&lt;br /&gt;
==== Environment Options ====&lt;br /&gt;
&lt;br /&gt;
   --disable-real-weather-fetch&lt;br /&gt;
                                Disable METAR based real weather fetching&lt;br /&gt;
   --enable-real-weather-fetch  Enable METAR based real weather fetching (this&lt;br /&gt;
                                requires an open internet connection)&lt;br /&gt;
   --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                                horizon&lt;br /&gt;
   --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                                horizon&lt;br /&gt;
   --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
   --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
   --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
   --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
   --visibility=meters          Specify initial visibility&lt;br /&gt;
   --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
   --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                                (knots)&lt;br /&gt;
   --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                                (severe)&lt;br /&gt;
   --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                                Create an overcast ceiling, optionally with a&lt;br /&gt;
                                specific thickness (defaults to 2000 ft).&lt;br /&gt;
   --random-wind&lt;br /&gt;
   --metar=&amp;quot;metar string&amp;quot;       Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
==== Situation Options ====&lt;br /&gt;
&lt;br /&gt;
   --failure={pitot|static|system|vacuum}&lt;br /&gt;
                                Fail the pitot, static, vacuum, or electrical&lt;br /&gt;
                                system (repeat the option for multiple system&lt;br /&gt;
                                failures).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Debugging Options ====&lt;br /&gt;
&lt;br /&gt;
   --log-level={bulk|debug|info|warn|alert}&lt;br /&gt;
                                Set the logging level for this session.&lt;br /&gt;
                                0=verbose, 5=alerts only&lt;br /&gt;
   --pid=/pathto/some/file.pid  Write current PID into file.&lt;br /&gt;
   --trace-read=property        Trace the reads for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
   --trace-write=property       Trace the writes for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
&lt;br /&gt;
=== Source files ===&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115818</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115818"/>
		<updated>2018-08-09T15:01:30Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* MultiPlayer Options */ alignment with other options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]].&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== General Options ====&lt;br /&gt;
&lt;br /&gt;
 --help, -h                   Show the most relevant command line options&lt;br /&gt;
 --verbose, -v                Show all command line options when combined with --help or -h&lt;br /&gt;
 --fg-root=path               Specify the root data path&lt;br /&gt;
 --fg-scenery=path[:path...]  Specify the base scenery path;&lt;br /&gt;
                                Defaults to [[$FG_ROOT]]/Scenery&lt;br /&gt;
 --language=code              Select the language for this session&lt;br /&gt;
 --launcher                   Enable Qt launcher &lt;br /&gt;
 --disable-fullscreen         Disable full-screen game mode&lt;br /&gt;
 --enable-fullscreen          Enable full-screen game mode&lt;br /&gt;
 --disable-splash-screen      Disable splash screen&lt;br /&gt;
 --enable-splash-screen       Enable splash screen&lt;br /&gt;
 --disable-mouse-pointer      Disable extra mouse pointer&lt;br /&gt;
 --enable-mouse-pointer       Enable extra mouse pointer&lt;br /&gt;
                                (i.e. for full screen Voodoo based cards)&lt;br /&gt;
 --disable-random-objects     Exclude random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --enable-random-objects      Include random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --disable-ai-models          Disable the AI subsystem.&lt;br /&gt;
                                (This also disables showing the models of other&lt;br /&gt;
                                 multiplayer aircraft)&lt;br /&gt;
 --enable-ai-models           Enable the AI subsystem.&lt;br /&gt;
 --disable-ai-traffic         Disable the autogenerated traffic subsystem.&lt;br /&gt;
 --enable-ai-traffic          Enable the autogenerated traffic subsystem.&lt;br /&gt;
 --disable-freeze             Start in a running state&lt;br /&gt;
 --enable-freeze              Start in a frozen state&lt;br /&gt;
 --disable-fuel-freeze        Fuel is consumed normally&lt;br /&gt;
 --enable-fuel-freeze         Fuel tank quantity forced to remain constant&lt;br /&gt;
 --disable-clock-freeze       Clock advances normally&lt;br /&gt;
 --enable-clock-freeze        Do not advance clock&lt;br /&gt;
 --enable-auto-coordination   Enable auto coordination - rudder and&lt;br /&gt;
                              ailerons will be controlled together&lt;br /&gt;
 --disable-auto-coordination  Disable auto coordination (default)&lt;br /&gt;
 --browser-app=path           Specify path to your web browser&lt;br /&gt;
 --prop:name=value            Set property  to &lt;br /&gt;
 --config=path                Load additional properties from path&lt;br /&gt;
 --units-feet                 Use feet for distances&lt;br /&gt;
 --units-meters               Use meters for distances&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
&lt;br /&gt;
 --disable-panel              Disable instrument panel&lt;br /&gt;
 --enable-panel               Enable instrument panel&lt;br /&gt;
 --disable-sound              Disable sound effects&lt;br /&gt;
 --enable-sound               Enable sound effects&lt;br /&gt;
 --disable-hud                Disable Heads Up Display (HUD)&lt;br /&gt;
 --enable-hud                 Enable Heads Up Display (HUD)&lt;br /&gt;
 --disable-anti-alias-hud     Disable anti-aliased HUD&lt;br /&gt;
 --enable-anti-alias-hud      Enable anti-aliased HUD&lt;br /&gt;
 --disable-hud-3d             Disable 3D HUD&lt;br /&gt;
 --enable-hud-3d              Enable 3D HUD&lt;br /&gt;
 --ai-scenario=scenario       Add and enable a new scenario. Multiple options&lt;br /&gt;
                              are allowed. Scenarios are in /[[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
==== Aircraft ====&lt;br /&gt;
&lt;br /&gt;
 --aircraft=name              Select an aircraft profile as defined by a top&lt;br /&gt;
                              level -set.xml&lt;br /&gt;
 --aircraft-dir=path          Specify the exact directory to use for the&lt;br /&gt;
                              aircraft (normally not required, but may be&lt;br /&gt;
                              useful). Interpreted relatively to the&lt;br /&gt;
                              current directory. Causes the &amp;lt;path-cache&amp;gt;&lt;br /&gt;
                              from autosave_X_Y.xml, as well as&lt;br /&gt;
                              --fg-aircraft options and the FG_AIRCRAFT&lt;br /&gt;
                              environment variable to be bypassed.&lt;br /&gt;
 --show-aircraft              Print a list of the currently available&lt;br /&gt;
                              aircraft types&lt;br /&gt;
&lt;br /&gt;
==== Flight Model ====&lt;br /&gt;
&lt;br /&gt;
 --fdm=name                   Select the core flight dynamics model&lt;br /&gt;
                              Can be one of jsb, larcsim, yasim, magic,&lt;br /&gt;
                              balloon, ada, external, or null&lt;br /&gt;
 --aero=name                  Select aircraft aerodynamics model to load&lt;br /&gt;
 --model-hz=n                 Run the FDM this rate (iterations per second)&lt;br /&gt;
 --speed=n                    Run the FDM 'n' times faster than real time&lt;br /&gt;
 --notrim                     Do NOT attempt to trim the model&lt;br /&gt;
                              (only with fdm=jsbsim)&lt;br /&gt;
 --on-ground                  Start at ground level (default)&lt;br /&gt;
 --in-air                     Start in air (implied when using --altitude)&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
&lt;br /&gt;
==== Initial Position and Orientation ====&lt;br /&gt;
&lt;br /&gt;
 --airport=ID                 Specify airport (e.g. KOAK)&lt;br /&gt;
 --runway=rwy_no              Specify starting runway (must also specify an&lt;br /&gt;
                              airport)&lt;br /&gt;
 --vor=ID                     Specify starting position relative to a VOR&lt;br /&gt;
 --ndb=ID                     Specify starting position relative to an NDB&lt;br /&gt;
 --fix=ID                     Specify starting position relative to a fix&lt;br /&gt;
 --parkpos=NAME               Specify a gate at the airport (e.g. 747d11)&lt;br /&gt;
 --offset-distance=nm         Specify distance to reference point (statute&lt;br /&gt;
                              miles)&lt;br /&gt;
 --offset-azimuth=degrees     Specify heading to reference point&lt;br /&gt;
 --lon=degrees                Starting longitude (west = -)&lt;br /&gt;
 --lat=degrees                Starting latitude (south = -)&lt;br /&gt;
 --altitude=value             Starting altitude&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --heading=degrees            Specify heading (yaw) angle (Psi)&lt;br /&gt;
 --roll=degrees               Specify roll angle (Phi)&lt;br /&gt;
 --pitch=degrees              Specify pitch angle (Theta)&lt;br /&gt;
 --uBody=units_per_sec        Specify velocity along the body X axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vBody=units_per_sec        Specify velocity along the body Y axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --wBody=units_per_sec        Specify velocity along the body Z axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vc=knots                   Specify initial airspeed&lt;br /&gt;
 --mach=num                   Specify initial mach number&lt;br /&gt;
 --glideslope=degrees         Specify flight path angle (can be positive)&lt;br /&gt;
 --roc=fpm                    Specify initial climb rate (can be negative)&lt;br /&gt;
&lt;br /&gt;
==== Rendering Options ====&lt;br /&gt;
&lt;br /&gt;
 --bpp=depth                  Specify the bits per pixel&lt;br /&gt;
 --fog-disable                Disable fog/haze&lt;br /&gt;
 --fog-fastest                Enable fastest fog/haze&lt;br /&gt;
 --fog-nicest                 Enable nicest fog/haze&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --disable-enhanced-lighting  Disable enhanced runway lighting&lt;br /&gt;
 --enable-enhanced-lighting   Enable enhanced runway lighting&lt;br /&gt;
 --season=winter              Enable snow covered scenery&lt;br /&gt;
 --disable-distance-attenuation&lt;br /&gt;
                              Disable runway light distance attenuation&lt;br /&gt;
 --enable-distance-attenuation&lt;br /&gt;
                              Enable runway light distance attenuation&lt;br /&gt;
 --disable-specular-highlight&lt;br /&gt;
                              Disable specular reflections on textured&lt;br /&gt;
                              objects&lt;br /&gt;
 --enable-specular-highlight  Enable specular reflections on textured objects&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --fov=degrees                Specify field of view angle&lt;br /&gt;
 --disable-fullscreen         Disable fullscreen mode&lt;br /&gt;
 --enable-fullscreen          Enable fullscreen mode&lt;br /&gt;
 --shading-flat               Enable flat shading&lt;br /&gt;
 --shading-smooth             Enable smooth shading&lt;br /&gt;
 --disable-wireframe          Disable wireframe drawing mode&lt;br /&gt;
 --enable-wireframe           Enable wireframe drawing mode&lt;br /&gt;
 --geometry=WxH               Specify window geometry (640x480, etc)&lt;br /&gt;
 --view-offset=value          Specify the default forward view direction as&lt;br /&gt;
                              an offset from straight ahead. Allowable values&lt;br /&gt;
                              are LEFT, RIGHT, CENTER, or a specific number&lt;br /&gt;
                              in degrees&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --texture-filtering=number   Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
==== Hud Options ====&lt;br /&gt;
&lt;br /&gt;
 --hud-tris                   Hud displays number of triangles rendered&lt;br /&gt;
 --hud-culled                 Hud displays percentage of triangles culled&lt;br /&gt;
&lt;br /&gt;
==== Time Options ====&lt;br /&gt;
&lt;br /&gt;
 --timeofday={dawn,noon,dusk,midnight}&lt;br /&gt;
                              Specify a time of day&lt;br /&gt;
 --time-offset=[+-]hh:mm:ss   Add this time offset&lt;br /&gt;
 --time-match-real            Synchronize time with current time at chosen airport&lt;br /&gt;
 --time-match-local           Synchronize time with system time of computer&lt;br /&gt;
 --start-date-sys=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              system time&lt;br /&gt;
 --start-date-gmt=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Greenwich Mean Time&lt;br /&gt;
 --start-date-lat=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Local Aircraft Time&lt;br /&gt;
&lt;br /&gt;
==== Network Options ====&lt;br /&gt;
&lt;br /&gt;
 --httpd=port                 Enable http server on the specified port&lt;br /&gt;
 --telnet=port                Enable telnet server on the specified port&lt;br /&gt;
 --jpg-httpd=port             Enable screen shot http server on the specified&lt;br /&gt;
                                port&lt;br /&gt;
&lt;br /&gt;
==== MultiPlayer Options ====&lt;br /&gt;
&lt;br /&gt;
 --callsign                   assign a unique name to a player&lt;br /&gt;
 --multiplay={in|out},hz,address,port&lt;br /&gt;
                              Specify multipilot communication settings&lt;br /&gt;
                              multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
==== Route/Way Point Options ====&lt;br /&gt;
&lt;br /&gt;
   --wp=ID[@alt]                Specify a waypoint for the GC autopilot;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
   --flight-plan=file           Read all waypoints from a file&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== IO Options ====&lt;br /&gt;
&lt;br /&gt;
   --generic=params             Open connection using a predefined&lt;br /&gt;
                                communication interface and a preselected&lt;br /&gt;
                                communication protocol&lt;br /&gt;
   --garmin=params              Open connection using the Garmin GPS protocol&lt;br /&gt;
   --joyclient=params           Open connection to an Agwagon joystick&lt;br /&gt;
   --jsclient=params            Open connection to a remote joystick&lt;br /&gt;
   --native-ctrls=params        Open connection using the FG Native Controls&lt;br /&gt;
                                protocol&lt;br /&gt;
   --native-fdm=params          Open connection using the FG Native FDM&lt;br /&gt;
                                protocol&lt;br /&gt;
   --native=params              Open connection using the FG Native protocol&lt;br /&gt;
   --nmea=params                Open connection using the NMEA protocol&lt;br /&gt;
   --opengc=params              Open connection using the OpenGC protocol&lt;br /&gt;
   --props=params               Open connection using the interactive property&lt;br /&gt;
                                manager (LEGACY/DEAD DO NOT USE same as --telnet)&lt;br /&gt;
   --pve=params                 Open connection using the PVE protocol&lt;br /&gt;
   --ray=params                 Open connection using the Ray Woodworth motion&lt;br /&gt;
                                chair protocol&lt;br /&gt;
   --rul=params                 Open connection using the RUL protocol&lt;br /&gt;
   --atc610x                    Enable atc610x interface&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: --generic=\\.\COM10,out,1,/tmp/data.xml,myproto&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
==== Avionics Options ====&lt;br /&gt;
&lt;br /&gt;
   --com1=frequency             Set the COM1 radio frequency.&lt;br /&gt;
   --com2=frequency             Set the COM2 radio frequency.&lt;br /&gt;
   --nav1=[radial:]frequency    Set the NAV1 radio frequency, optionally&lt;br /&gt;
                                preceded by a radial.&lt;br /&gt;
   --nav2=[radial:]frequency    Set the NAV2 radio frequency, optionally&lt;br /&gt;
                                preceded by a radial.&lt;br /&gt;
   --adf=[rotation:]frequency   Set the ADF radio frequency, optionally&lt;br /&gt;
                                preceded by a card rotation.&lt;br /&gt;
   --dme={nav1|nav2|frequency}  Slave the ADF to one of the NAV radios, or set&lt;br /&gt;
                                its internal frequency.&lt;br /&gt;
&lt;br /&gt;
==== Environment Options ====&lt;br /&gt;
&lt;br /&gt;
   --disable-real-weather-fetch&lt;br /&gt;
                                Disable METAR based real weather fetching&lt;br /&gt;
   --enable-real-weather-fetch  Enable METAR based real weather fetching (this&lt;br /&gt;
                                requires an open internet connection)&lt;br /&gt;
   --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                                horizon&lt;br /&gt;
   --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                                horizon&lt;br /&gt;
   --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
   --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
   --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
   --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
   --visibility=meters          Specify initial visibility&lt;br /&gt;
   --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
   --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                                (knots)&lt;br /&gt;
   --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                                (severe)&lt;br /&gt;
   --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                                Create an overcast ceiling, optionally with a&lt;br /&gt;
                                specific thickness (defaults to 2000 ft).&lt;br /&gt;
   --random-wind&lt;br /&gt;
   --metar=&amp;quot;metar string&amp;quot;       Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
==== Situation Options ====&lt;br /&gt;
&lt;br /&gt;
   --failure={pitot|static|system|vacuum}&lt;br /&gt;
                                Fail the pitot, static, vacuum, or electrical&lt;br /&gt;
                                system (repeat the option for multiple system&lt;br /&gt;
                                failures).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Debugging Options ====&lt;br /&gt;
&lt;br /&gt;
   --log-level={bulk|debug|info|warn|alert}&lt;br /&gt;
                                Set the logging level for this session.&lt;br /&gt;
                                0=verbose, 5=alerts only&lt;br /&gt;
   --pid=/pathto/some/file.pid  Write current PID into file.&lt;br /&gt;
   --trace-read=property        Trace the reads for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
   --trace-write=property       Trace the writes for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
&lt;br /&gt;
=== Source files ===&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115817</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115817"/>
		<updated>2018-08-09T15:01:16Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Network Options */ alignment with other options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]].&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== General Options ====&lt;br /&gt;
&lt;br /&gt;
 --help, -h                   Show the most relevant command line options&lt;br /&gt;
 --verbose, -v                Show all command line options when combined with --help or -h&lt;br /&gt;
 --fg-root=path               Specify the root data path&lt;br /&gt;
 --fg-scenery=path[:path...]  Specify the base scenery path;&lt;br /&gt;
                                Defaults to [[$FG_ROOT]]/Scenery&lt;br /&gt;
 --language=code              Select the language for this session&lt;br /&gt;
 --launcher                   Enable Qt launcher &lt;br /&gt;
 --disable-fullscreen         Disable full-screen game mode&lt;br /&gt;
 --enable-fullscreen          Enable full-screen game mode&lt;br /&gt;
 --disable-splash-screen      Disable splash screen&lt;br /&gt;
 --enable-splash-screen       Enable splash screen&lt;br /&gt;
 --disable-mouse-pointer      Disable extra mouse pointer&lt;br /&gt;
 --enable-mouse-pointer       Enable extra mouse pointer&lt;br /&gt;
                                (i.e. for full screen Voodoo based cards)&lt;br /&gt;
 --disable-random-objects     Exclude random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --enable-random-objects      Include random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --disable-ai-models          Disable the AI subsystem.&lt;br /&gt;
                                (This also disables showing the models of other&lt;br /&gt;
                                 multiplayer aircraft)&lt;br /&gt;
 --enable-ai-models           Enable the AI subsystem.&lt;br /&gt;
 --disable-ai-traffic         Disable the autogenerated traffic subsystem.&lt;br /&gt;
 --enable-ai-traffic          Enable the autogenerated traffic subsystem.&lt;br /&gt;
 --disable-freeze             Start in a running state&lt;br /&gt;
 --enable-freeze              Start in a frozen state&lt;br /&gt;
 --disable-fuel-freeze        Fuel is consumed normally&lt;br /&gt;
 --enable-fuel-freeze         Fuel tank quantity forced to remain constant&lt;br /&gt;
 --disable-clock-freeze       Clock advances normally&lt;br /&gt;
 --enable-clock-freeze        Do not advance clock&lt;br /&gt;
 --enable-auto-coordination   Enable auto coordination - rudder and&lt;br /&gt;
                              ailerons will be controlled together&lt;br /&gt;
 --disable-auto-coordination  Disable auto coordination (default)&lt;br /&gt;
 --browser-app=path           Specify path to your web browser&lt;br /&gt;
 --prop:name=value            Set property  to &lt;br /&gt;
 --config=path                Load additional properties from path&lt;br /&gt;
 --units-feet                 Use feet for distances&lt;br /&gt;
 --units-meters               Use meters for distances&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
&lt;br /&gt;
 --disable-panel              Disable instrument panel&lt;br /&gt;
 --enable-panel               Enable instrument panel&lt;br /&gt;
 --disable-sound              Disable sound effects&lt;br /&gt;
 --enable-sound               Enable sound effects&lt;br /&gt;
 --disable-hud                Disable Heads Up Display (HUD)&lt;br /&gt;
 --enable-hud                 Enable Heads Up Display (HUD)&lt;br /&gt;
 --disable-anti-alias-hud     Disable anti-aliased HUD&lt;br /&gt;
 --enable-anti-alias-hud      Enable anti-aliased HUD&lt;br /&gt;
 --disable-hud-3d             Disable 3D HUD&lt;br /&gt;
 --enable-hud-3d              Enable 3D HUD&lt;br /&gt;
 --ai-scenario=scenario       Add and enable a new scenario. Multiple options&lt;br /&gt;
                              are allowed. Scenarios are in /[[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
==== Aircraft ====&lt;br /&gt;
&lt;br /&gt;
 --aircraft=name              Select an aircraft profile as defined by a top&lt;br /&gt;
                              level -set.xml&lt;br /&gt;
 --aircraft-dir=path          Specify the exact directory to use for the&lt;br /&gt;
                              aircraft (normally not required, but may be&lt;br /&gt;
                              useful). Interpreted relatively to the&lt;br /&gt;
                              current directory. Causes the &amp;lt;path-cache&amp;gt;&lt;br /&gt;
                              from autosave_X_Y.xml, as well as&lt;br /&gt;
                              --fg-aircraft options and the FG_AIRCRAFT&lt;br /&gt;
                              environment variable to be bypassed.&lt;br /&gt;
 --show-aircraft              Print a list of the currently available&lt;br /&gt;
                              aircraft types&lt;br /&gt;
&lt;br /&gt;
==== Flight Model ====&lt;br /&gt;
&lt;br /&gt;
 --fdm=name                   Select the core flight dynamics model&lt;br /&gt;
                              Can be one of jsb, larcsim, yasim, magic,&lt;br /&gt;
                              balloon, ada, external, or null&lt;br /&gt;
 --aero=name                  Select aircraft aerodynamics model to load&lt;br /&gt;
 --model-hz=n                 Run the FDM this rate (iterations per second)&lt;br /&gt;
 --speed=n                    Run the FDM 'n' times faster than real time&lt;br /&gt;
 --notrim                     Do NOT attempt to trim the model&lt;br /&gt;
                              (only with fdm=jsbsim)&lt;br /&gt;
 --on-ground                  Start at ground level (default)&lt;br /&gt;
 --in-air                     Start in air (implied when using --altitude)&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
&lt;br /&gt;
==== Initial Position and Orientation ====&lt;br /&gt;
&lt;br /&gt;
 --airport=ID                 Specify airport (e.g. KOAK)&lt;br /&gt;
 --runway=rwy_no              Specify starting runway (must also specify an&lt;br /&gt;
                              airport)&lt;br /&gt;
 --vor=ID                     Specify starting position relative to a VOR&lt;br /&gt;
 --ndb=ID                     Specify starting position relative to an NDB&lt;br /&gt;
 --fix=ID                     Specify starting position relative to a fix&lt;br /&gt;
 --parkpos=NAME               Specify a gate at the airport (e.g. 747d11)&lt;br /&gt;
 --offset-distance=nm         Specify distance to reference point (statute&lt;br /&gt;
                              miles)&lt;br /&gt;
 --offset-azimuth=degrees     Specify heading to reference point&lt;br /&gt;
 --lon=degrees                Starting longitude (west = -)&lt;br /&gt;
 --lat=degrees                Starting latitude (south = -)&lt;br /&gt;
 --altitude=value             Starting altitude&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --heading=degrees            Specify heading (yaw) angle (Psi)&lt;br /&gt;
 --roll=degrees               Specify roll angle (Phi)&lt;br /&gt;
 --pitch=degrees              Specify pitch angle (Theta)&lt;br /&gt;
 --uBody=units_per_sec        Specify velocity along the body X axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vBody=units_per_sec        Specify velocity along the body Y axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --wBody=units_per_sec        Specify velocity along the body Z axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vc=knots                   Specify initial airspeed&lt;br /&gt;
 --mach=num                   Specify initial mach number&lt;br /&gt;
 --glideslope=degrees         Specify flight path angle (can be positive)&lt;br /&gt;
 --roc=fpm                    Specify initial climb rate (can be negative)&lt;br /&gt;
&lt;br /&gt;
==== Rendering Options ====&lt;br /&gt;
&lt;br /&gt;
 --bpp=depth                  Specify the bits per pixel&lt;br /&gt;
 --fog-disable                Disable fog/haze&lt;br /&gt;
 --fog-fastest                Enable fastest fog/haze&lt;br /&gt;
 --fog-nicest                 Enable nicest fog/haze&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --disable-enhanced-lighting  Disable enhanced runway lighting&lt;br /&gt;
 --enable-enhanced-lighting   Enable enhanced runway lighting&lt;br /&gt;
 --season=winter              Enable snow covered scenery&lt;br /&gt;
 --disable-distance-attenuation&lt;br /&gt;
                              Disable runway light distance attenuation&lt;br /&gt;
 --enable-distance-attenuation&lt;br /&gt;
                              Enable runway light distance attenuation&lt;br /&gt;
 --disable-specular-highlight&lt;br /&gt;
                              Disable specular reflections on textured&lt;br /&gt;
                              objects&lt;br /&gt;
 --enable-specular-highlight  Enable specular reflections on textured objects&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --fov=degrees                Specify field of view angle&lt;br /&gt;
 --disable-fullscreen         Disable fullscreen mode&lt;br /&gt;
 --enable-fullscreen          Enable fullscreen mode&lt;br /&gt;
 --shading-flat               Enable flat shading&lt;br /&gt;
 --shading-smooth             Enable smooth shading&lt;br /&gt;
 --disable-wireframe          Disable wireframe drawing mode&lt;br /&gt;
 --enable-wireframe           Enable wireframe drawing mode&lt;br /&gt;
 --geometry=WxH               Specify window geometry (640x480, etc)&lt;br /&gt;
 --view-offset=value          Specify the default forward view direction as&lt;br /&gt;
                              an offset from straight ahead. Allowable values&lt;br /&gt;
                              are LEFT, RIGHT, CENTER, or a specific number&lt;br /&gt;
                              in degrees&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --texture-filtering=number   Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
==== Hud Options ====&lt;br /&gt;
&lt;br /&gt;
 --hud-tris                   Hud displays number of triangles rendered&lt;br /&gt;
 --hud-culled                 Hud displays percentage of triangles culled&lt;br /&gt;
&lt;br /&gt;
==== Time Options ====&lt;br /&gt;
&lt;br /&gt;
 --timeofday={dawn,noon,dusk,midnight}&lt;br /&gt;
                              Specify a time of day&lt;br /&gt;
 --time-offset=[+-]hh:mm:ss   Add this time offset&lt;br /&gt;
 --time-match-real            Synchronize time with current time at chosen airport&lt;br /&gt;
 --time-match-local           Synchronize time with system time of computer&lt;br /&gt;
 --start-date-sys=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              system time&lt;br /&gt;
 --start-date-gmt=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Greenwich Mean Time&lt;br /&gt;
 --start-date-lat=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Local Aircraft Time&lt;br /&gt;
&lt;br /&gt;
==== Network Options ====&lt;br /&gt;
&lt;br /&gt;
 --httpd=port                 Enable http server on the specified port&lt;br /&gt;
 --telnet=port                Enable telnet server on the specified port&lt;br /&gt;
 --jpg-httpd=port             Enable screen shot http server on the specified&lt;br /&gt;
                                port&lt;br /&gt;
&lt;br /&gt;
==== MultiPlayer Options ====&lt;br /&gt;
&lt;br /&gt;
   --callsign                   assign a unique name to a player&lt;br /&gt;
   --multiplay={in|out},hz,address,port&lt;br /&gt;
                                Specify multipilot communication settings&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Route/Way Point Options ====&lt;br /&gt;
&lt;br /&gt;
   --wp=ID[@alt]                Specify a waypoint for the GC autopilot;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
   --flight-plan=file           Read all waypoints from a file&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== IO Options ====&lt;br /&gt;
&lt;br /&gt;
   --generic=params             Open connection using a predefined&lt;br /&gt;
                                communication interface and a preselected&lt;br /&gt;
                                communication protocol&lt;br /&gt;
   --garmin=params              Open connection using the Garmin GPS protocol&lt;br /&gt;
   --joyclient=params           Open connection to an Agwagon joystick&lt;br /&gt;
   --jsclient=params            Open connection to a remote joystick&lt;br /&gt;
   --native-ctrls=params        Open connection using the FG Native Controls&lt;br /&gt;
                                protocol&lt;br /&gt;
   --native-fdm=params          Open connection using the FG Native FDM&lt;br /&gt;
                                protocol&lt;br /&gt;
   --native=params              Open connection using the FG Native protocol&lt;br /&gt;
   --nmea=params                Open connection using the NMEA protocol&lt;br /&gt;
   --opengc=params              Open connection using the OpenGC protocol&lt;br /&gt;
   --props=params               Open connection using the interactive property&lt;br /&gt;
                                manager (LEGACY/DEAD DO NOT USE same as --telnet)&lt;br /&gt;
   --pve=params                 Open connection using the PVE protocol&lt;br /&gt;
   --ray=params                 Open connection using the Ray Woodworth motion&lt;br /&gt;
                                chair protocol&lt;br /&gt;
   --rul=params                 Open connection using the RUL protocol&lt;br /&gt;
   --atc610x                    Enable atc610x interface&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: --generic=\\.\COM10,out,1,/tmp/data.xml,myproto&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
==== Avionics Options ====&lt;br /&gt;
&lt;br /&gt;
   --com1=frequency             Set the COM1 radio frequency.&lt;br /&gt;
   --com2=frequency             Set the COM2 radio frequency.&lt;br /&gt;
   --nav1=[radial:]frequency    Set the NAV1 radio frequency, optionally&lt;br /&gt;
                                preceded by a radial.&lt;br /&gt;
   --nav2=[radial:]frequency    Set the NAV2 radio frequency, optionally&lt;br /&gt;
                                preceded by a radial.&lt;br /&gt;
   --adf=[rotation:]frequency   Set the ADF radio frequency, optionally&lt;br /&gt;
                                preceded by a card rotation.&lt;br /&gt;
   --dme={nav1|nav2|frequency}  Slave the ADF to one of the NAV radios, or set&lt;br /&gt;
                                its internal frequency.&lt;br /&gt;
&lt;br /&gt;
==== Environment Options ====&lt;br /&gt;
&lt;br /&gt;
   --disable-real-weather-fetch&lt;br /&gt;
                                Disable METAR based real weather fetching&lt;br /&gt;
   --enable-real-weather-fetch  Enable METAR based real weather fetching (this&lt;br /&gt;
                                requires an open internet connection)&lt;br /&gt;
   --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                                horizon&lt;br /&gt;
   --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                                horizon&lt;br /&gt;
   --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
   --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
   --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
   --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
   --visibility=meters          Specify initial visibility&lt;br /&gt;
   --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
   --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                                (knots)&lt;br /&gt;
   --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                                (severe)&lt;br /&gt;
   --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                                Create an overcast ceiling, optionally with a&lt;br /&gt;
                                specific thickness (defaults to 2000 ft).&lt;br /&gt;
   --random-wind&lt;br /&gt;
   --metar=&amp;quot;metar string&amp;quot;       Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
==== Situation Options ====&lt;br /&gt;
&lt;br /&gt;
   --failure={pitot|static|system|vacuum}&lt;br /&gt;
                                Fail the pitot, static, vacuum, or electrical&lt;br /&gt;
                                system (repeat the option for multiple system&lt;br /&gt;
                                failures).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Debugging Options ====&lt;br /&gt;
&lt;br /&gt;
   --log-level={bulk|debug|info|warn|alert}&lt;br /&gt;
                                Set the logging level for this session.&lt;br /&gt;
                                0=verbose, 5=alerts only&lt;br /&gt;
   --pid=/pathto/some/file.pid  Write current PID into file.&lt;br /&gt;
   --trace-read=property        Trace the reads for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
   --trace-write=property       Trace the writes for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
&lt;br /&gt;
=== Source files ===&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115816</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115816"/>
		<updated>2018-08-09T15:01:04Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Time Options */ alignment with other options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]].&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== General Options ====&lt;br /&gt;
&lt;br /&gt;
 --help, -h                   Show the most relevant command line options&lt;br /&gt;
 --verbose, -v                Show all command line options when combined with --help or -h&lt;br /&gt;
 --fg-root=path               Specify the root data path&lt;br /&gt;
 --fg-scenery=path[:path...]  Specify the base scenery path;&lt;br /&gt;
                                Defaults to [[$FG_ROOT]]/Scenery&lt;br /&gt;
 --language=code              Select the language for this session&lt;br /&gt;
 --launcher                   Enable Qt launcher &lt;br /&gt;
 --disable-fullscreen         Disable full-screen game mode&lt;br /&gt;
 --enable-fullscreen          Enable full-screen game mode&lt;br /&gt;
 --disable-splash-screen      Disable splash screen&lt;br /&gt;
 --enable-splash-screen       Enable splash screen&lt;br /&gt;
 --disable-mouse-pointer      Disable extra mouse pointer&lt;br /&gt;
 --enable-mouse-pointer       Enable extra mouse pointer&lt;br /&gt;
                                (i.e. for full screen Voodoo based cards)&lt;br /&gt;
 --disable-random-objects     Exclude random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --enable-random-objects      Include random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --disable-ai-models          Disable the AI subsystem.&lt;br /&gt;
                                (This also disables showing the models of other&lt;br /&gt;
                                 multiplayer aircraft)&lt;br /&gt;
 --enable-ai-models           Enable the AI subsystem.&lt;br /&gt;
 --disable-ai-traffic         Disable the autogenerated traffic subsystem.&lt;br /&gt;
 --enable-ai-traffic          Enable the autogenerated traffic subsystem.&lt;br /&gt;
 --disable-freeze             Start in a running state&lt;br /&gt;
 --enable-freeze              Start in a frozen state&lt;br /&gt;
 --disable-fuel-freeze        Fuel is consumed normally&lt;br /&gt;
 --enable-fuel-freeze         Fuel tank quantity forced to remain constant&lt;br /&gt;
 --disable-clock-freeze       Clock advances normally&lt;br /&gt;
 --enable-clock-freeze        Do not advance clock&lt;br /&gt;
 --enable-auto-coordination   Enable auto coordination - rudder and&lt;br /&gt;
                              ailerons will be controlled together&lt;br /&gt;
 --disable-auto-coordination  Disable auto coordination (default)&lt;br /&gt;
 --browser-app=path           Specify path to your web browser&lt;br /&gt;
 --prop:name=value            Set property  to &lt;br /&gt;
 --config=path                Load additional properties from path&lt;br /&gt;
 --units-feet                 Use feet for distances&lt;br /&gt;
 --units-meters               Use meters for distances&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
&lt;br /&gt;
 --disable-panel              Disable instrument panel&lt;br /&gt;
 --enable-panel               Enable instrument panel&lt;br /&gt;
 --disable-sound              Disable sound effects&lt;br /&gt;
 --enable-sound               Enable sound effects&lt;br /&gt;
 --disable-hud                Disable Heads Up Display (HUD)&lt;br /&gt;
 --enable-hud                 Enable Heads Up Display (HUD)&lt;br /&gt;
 --disable-anti-alias-hud     Disable anti-aliased HUD&lt;br /&gt;
 --enable-anti-alias-hud      Enable anti-aliased HUD&lt;br /&gt;
 --disable-hud-3d             Disable 3D HUD&lt;br /&gt;
 --enable-hud-3d              Enable 3D HUD&lt;br /&gt;
 --ai-scenario=scenario       Add and enable a new scenario. Multiple options&lt;br /&gt;
                              are allowed. Scenarios are in /[[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
==== Aircraft ====&lt;br /&gt;
&lt;br /&gt;
 --aircraft=name              Select an aircraft profile as defined by a top&lt;br /&gt;
                              level -set.xml&lt;br /&gt;
 --aircraft-dir=path          Specify the exact directory to use for the&lt;br /&gt;
                              aircraft (normally not required, but may be&lt;br /&gt;
                              useful). Interpreted relatively to the&lt;br /&gt;
                              current directory. Causes the &amp;lt;path-cache&amp;gt;&lt;br /&gt;
                              from autosave_X_Y.xml, as well as&lt;br /&gt;
                              --fg-aircraft options and the FG_AIRCRAFT&lt;br /&gt;
                              environment variable to be bypassed.&lt;br /&gt;
 --show-aircraft              Print a list of the currently available&lt;br /&gt;
                              aircraft types&lt;br /&gt;
&lt;br /&gt;
==== Flight Model ====&lt;br /&gt;
&lt;br /&gt;
 --fdm=name                   Select the core flight dynamics model&lt;br /&gt;
                              Can be one of jsb, larcsim, yasim, magic,&lt;br /&gt;
                              balloon, ada, external, or null&lt;br /&gt;
 --aero=name                  Select aircraft aerodynamics model to load&lt;br /&gt;
 --model-hz=n                 Run the FDM this rate (iterations per second)&lt;br /&gt;
 --speed=n                    Run the FDM 'n' times faster than real time&lt;br /&gt;
 --notrim                     Do NOT attempt to trim the model&lt;br /&gt;
                              (only with fdm=jsbsim)&lt;br /&gt;
 --on-ground                  Start at ground level (default)&lt;br /&gt;
 --in-air                     Start in air (implied when using --altitude)&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
&lt;br /&gt;
==== Initial Position and Orientation ====&lt;br /&gt;
&lt;br /&gt;
 --airport=ID                 Specify airport (e.g. KOAK)&lt;br /&gt;
 --runway=rwy_no              Specify starting runway (must also specify an&lt;br /&gt;
                              airport)&lt;br /&gt;
 --vor=ID                     Specify starting position relative to a VOR&lt;br /&gt;
 --ndb=ID                     Specify starting position relative to an NDB&lt;br /&gt;
 --fix=ID                     Specify starting position relative to a fix&lt;br /&gt;
 --parkpos=NAME               Specify a gate at the airport (e.g. 747d11)&lt;br /&gt;
 --offset-distance=nm         Specify distance to reference point (statute&lt;br /&gt;
                              miles)&lt;br /&gt;
 --offset-azimuth=degrees     Specify heading to reference point&lt;br /&gt;
 --lon=degrees                Starting longitude (west = -)&lt;br /&gt;
 --lat=degrees                Starting latitude (south = -)&lt;br /&gt;
 --altitude=value             Starting altitude&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --heading=degrees            Specify heading (yaw) angle (Psi)&lt;br /&gt;
 --roll=degrees               Specify roll angle (Phi)&lt;br /&gt;
 --pitch=degrees              Specify pitch angle (Theta)&lt;br /&gt;
 --uBody=units_per_sec        Specify velocity along the body X axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vBody=units_per_sec        Specify velocity along the body Y axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --wBody=units_per_sec        Specify velocity along the body Z axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vc=knots                   Specify initial airspeed&lt;br /&gt;
 --mach=num                   Specify initial mach number&lt;br /&gt;
 --glideslope=degrees         Specify flight path angle (can be positive)&lt;br /&gt;
 --roc=fpm                    Specify initial climb rate (can be negative)&lt;br /&gt;
&lt;br /&gt;
==== Rendering Options ====&lt;br /&gt;
&lt;br /&gt;
 --bpp=depth                  Specify the bits per pixel&lt;br /&gt;
 --fog-disable                Disable fog/haze&lt;br /&gt;
 --fog-fastest                Enable fastest fog/haze&lt;br /&gt;
 --fog-nicest                 Enable nicest fog/haze&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --disable-enhanced-lighting  Disable enhanced runway lighting&lt;br /&gt;
 --enable-enhanced-lighting   Enable enhanced runway lighting&lt;br /&gt;
 --season=winter              Enable snow covered scenery&lt;br /&gt;
 --disable-distance-attenuation&lt;br /&gt;
                              Disable runway light distance attenuation&lt;br /&gt;
 --enable-distance-attenuation&lt;br /&gt;
                              Enable runway light distance attenuation&lt;br /&gt;
 --disable-specular-highlight&lt;br /&gt;
                              Disable specular reflections on textured&lt;br /&gt;
                              objects&lt;br /&gt;
 --enable-specular-highlight  Enable specular reflections on textured objects&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --fov=degrees                Specify field of view angle&lt;br /&gt;
 --disable-fullscreen         Disable fullscreen mode&lt;br /&gt;
 --enable-fullscreen          Enable fullscreen mode&lt;br /&gt;
 --shading-flat               Enable flat shading&lt;br /&gt;
 --shading-smooth             Enable smooth shading&lt;br /&gt;
 --disable-wireframe          Disable wireframe drawing mode&lt;br /&gt;
 --enable-wireframe           Enable wireframe drawing mode&lt;br /&gt;
 --geometry=WxH               Specify window geometry (640x480, etc)&lt;br /&gt;
 --view-offset=value          Specify the default forward view direction as&lt;br /&gt;
                              an offset from straight ahead. Allowable values&lt;br /&gt;
                              are LEFT, RIGHT, CENTER, or a specific number&lt;br /&gt;
                              in degrees&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --texture-filtering=number   Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
==== Hud Options ====&lt;br /&gt;
&lt;br /&gt;
 --hud-tris                   Hud displays number of triangles rendered&lt;br /&gt;
 --hud-culled                 Hud displays percentage of triangles culled&lt;br /&gt;
&lt;br /&gt;
==== Time Options ====&lt;br /&gt;
&lt;br /&gt;
 --timeofday={dawn,noon,dusk,midnight}&lt;br /&gt;
                              Specify a time of day&lt;br /&gt;
 --time-offset=[+-]hh:mm:ss   Add this time offset&lt;br /&gt;
 --time-match-real            Synchronize time with current time at chosen airport&lt;br /&gt;
 --time-match-local           Synchronize time with system time of computer&lt;br /&gt;
 --start-date-sys=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              system time&lt;br /&gt;
 --start-date-gmt=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Greenwich Mean Time&lt;br /&gt;
 --start-date-lat=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                              Specify a starting date/time with respect to&lt;br /&gt;
                              Local Aircraft Time&lt;br /&gt;
&lt;br /&gt;
==== Network Options ====&lt;br /&gt;
&lt;br /&gt;
   --httpd=port                 Enable http server on the specified port&lt;br /&gt;
   --telnet=port                Enable telnet server on the specified port&lt;br /&gt;
   --jpg-httpd=port             Enable screen shot http server on the specified&lt;br /&gt;
                                port&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== MultiPlayer Options ====&lt;br /&gt;
&lt;br /&gt;
   --callsign                   assign a unique name to a player&lt;br /&gt;
   --multiplay={in|out},hz,address,port&lt;br /&gt;
                                Specify multipilot communication settings&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Route/Way Point Options ====&lt;br /&gt;
&lt;br /&gt;
   --wp=ID[@alt]                Specify a waypoint for the GC autopilot;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
   --flight-plan=file           Read all waypoints from a file&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== IO Options ====&lt;br /&gt;
&lt;br /&gt;
   --generic=params             Open connection using a predefined&lt;br /&gt;
                                communication interface and a preselected&lt;br /&gt;
                                communication protocol&lt;br /&gt;
   --garmin=params              Open connection using the Garmin GPS protocol&lt;br /&gt;
   --joyclient=params           Open connection to an Agwagon joystick&lt;br /&gt;
   --jsclient=params            Open connection to a remote joystick&lt;br /&gt;
   --native-ctrls=params        Open connection using the FG Native Controls&lt;br /&gt;
                                protocol&lt;br /&gt;
   --native-fdm=params          Open connection using the FG Native FDM&lt;br /&gt;
                                protocol&lt;br /&gt;
   --native=params              Open connection using the FG Native protocol&lt;br /&gt;
   --nmea=params                Open connection using the NMEA protocol&lt;br /&gt;
   --opengc=params              Open connection using the OpenGC protocol&lt;br /&gt;
   --props=params               Open connection using the interactive property&lt;br /&gt;
                                manager (LEGACY/DEAD DO NOT USE same as --telnet)&lt;br /&gt;
   --pve=params                 Open connection using the PVE protocol&lt;br /&gt;
   --ray=params                 Open connection using the Ray Woodworth motion&lt;br /&gt;
                                chair protocol&lt;br /&gt;
   --rul=params                 Open connection using the RUL protocol&lt;br /&gt;
   --atc610x                    Enable atc610x interface&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: --generic=\\.\COM10,out,1,/tmp/data.xml,myproto&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
==== Avionics Options ====&lt;br /&gt;
&lt;br /&gt;
   --com1=frequency             Set the COM1 radio frequency.&lt;br /&gt;
   --com2=frequency             Set the COM2 radio frequency.&lt;br /&gt;
   --nav1=[radial:]frequency    Set the NAV1 radio frequency, optionally&lt;br /&gt;
                                preceded by a radial.&lt;br /&gt;
   --nav2=[radial:]frequency    Set the NAV2 radio frequency, optionally&lt;br /&gt;
                                preceded by a radial.&lt;br /&gt;
   --adf=[rotation:]frequency   Set the ADF radio frequency, optionally&lt;br /&gt;
                                preceded by a card rotation.&lt;br /&gt;
   --dme={nav1|nav2|frequency}  Slave the ADF to one of the NAV radios, or set&lt;br /&gt;
                                its internal frequency.&lt;br /&gt;
&lt;br /&gt;
==== Environment Options ====&lt;br /&gt;
&lt;br /&gt;
   --disable-real-weather-fetch&lt;br /&gt;
                                Disable METAR based real weather fetching&lt;br /&gt;
   --enable-real-weather-fetch  Enable METAR based real weather fetching (this&lt;br /&gt;
                                requires an open internet connection)&lt;br /&gt;
   --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                                horizon&lt;br /&gt;
   --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                                horizon&lt;br /&gt;
   --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
   --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
   --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
   --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
   --visibility=meters          Specify initial visibility&lt;br /&gt;
   --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
   --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                                (knots)&lt;br /&gt;
   --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                                (severe)&lt;br /&gt;
   --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                                Create an overcast ceiling, optionally with a&lt;br /&gt;
                                specific thickness (defaults to 2000 ft).&lt;br /&gt;
   --random-wind&lt;br /&gt;
   --metar=&amp;quot;metar string&amp;quot;       Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
==== Situation Options ====&lt;br /&gt;
&lt;br /&gt;
   --failure={pitot|static|system|vacuum}&lt;br /&gt;
                                Fail the pitot, static, vacuum, or electrical&lt;br /&gt;
                                system (repeat the option for multiple system&lt;br /&gt;
                                failures).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Debugging Options ====&lt;br /&gt;
&lt;br /&gt;
   --log-level={bulk|debug|info|warn|alert}&lt;br /&gt;
                                Set the logging level for this session.&lt;br /&gt;
                                0=verbose, 5=alerts only&lt;br /&gt;
   --pid=/pathto/some/file.pid  Write current PID into file.&lt;br /&gt;
   --trace-read=property        Trace the reads for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
   --trace-write=property       Trace the writes for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
&lt;br /&gt;
=== Source files ===&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115815</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115815"/>
		<updated>2018-08-09T15:00:35Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Hud Options */ alignment with other options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]].&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== General Options ====&lt;br /&gt;
&lt;br /&gt;
 --help, -h                   Show the most relevant command line options&lt;br /&gt;
 --verbose, -v                Show all command line options when combined with --help or -h&lt;br /&gt;
 --fg-root=path               Specify the root data path&lt;br /&gt;
 --fg-scenery=path[:path...]  Specify the base scenery path;&lt;br /&gt;
                                Defaults to [[$FG_ROOT]]/Scenery&lt;br /&gt;
 --language=code              Select the language for this session&lt;br /&gt;
 --launcher                   Enable Qt launcher &lt;br /&gt;
 --disable-fullscreen         Disable full-screen game mode&lt;br /&gt;
 --enable-fullscreen          Enable full-screen game mode&lt;br /&gt;
 --disable-splash-screen      Disable splash screen&lt;br /&gt;
 --enable-splash-screen       Enable splash screen&lt;br /&gt;
 --disable-mouse-pointer      Disable extra mouse pointer&lt;br /&gt;
 --enable-mouse-pointer       Enable extra mouse pointer&lt;br /&gt;
                                (i.e. for full screen Voodoo based cards)&lt;br /&gt;
 --disable-random-objects     Exclude random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --enable-random-objects      Include random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --disable-ai-models          Disable the AI subsystem.&lt;br /&gt;
                                (This also disables showing the models of other&lt;br /&gt;
                                 multiplayer aircraft)&lt;br /&gt;
 --enable-ai-models           Enable the AI subsystem.&lt;br /&gt;
 --disable-ai-traffic         Disable the autogenerated traffic subsystem.&lt;br /&gt;
 --enable-ai-traffic          Enable the autogenerated traffic subsystem.&lt;br /&gt;
 --disable-freeze             Start in a running state&lt;br /&gt;
 --enable-freeze              Start in a frozen state&lt;br /&gt;
 --disable-fuel-freeze        Fuel is consumed normally&lt;br /&gt;
 --enable-fuel-freeze         Fuel tank quantity forced to remain constant&lt;br /&gt;
 --disable-clock-freeze       Clock advances normally&lt;br /&gt;
 --enable-clock-freeze        Do not advance clock&lt;br /&gt;
 --enable-auto-coordination   Enable auto coordination - rudder and&lt;br /&gt;
                              ailerons will be controlled together&lt;br /&gt;
 --disable-auto-coordination  Disable auto coordination (default)&lt;br /&gt;
 --browser-app=path           Specify path to your web browser&lt;br /&gt;
 --prop:name=value            Set property  to &lt;br /&gt;
 --config=path                Load additional properties from path&lt;br /&gt;
 --units-feet                 Use feet for distances&lt;br /&gt;
 --units-meters               Use meters for distances&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
&lt;br /&gt;
 --disable-panel              Disable instrument panel&lt;br /&gt;
 --enable-panel               Enable instrument panel&lt;br /&gt;
 --disable-sound              Disable sound effects&lt;br /&gt;
 --enable-sound               Enable sound effects&lt;br /&gt;
 --disable-hud                Disable Heads Up Display (HUD)&lt;br /&gt;
 --enable-hud                 Enable Heads Up Display (HUD)&lt;br /&gt;
 --disable-anti-alias-hud     Disable anti-aliased HUD&lt;br /&gt;
 --enable-anti-alias-hud      Enable anti-aliased HUD&lt;br /&gt;
 --disable-hud-3d             Disable 3D HUD&lt;br /&gt;
 --enable-hud-3d              Enable 3D HUD&lt;br /&gt;
 --ai-scenario=scenario       Add and enable a new scenario. Multiple options&lt;br /&gt;
                              are allowed. Scenarios are in /[[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
==== Aircraft ====&lt;br /&gt;
&lt;br /&gt;
 --aircraft=name              Select an aircraft profile as defined by a top&lt;br /&gt;
                              level -set.xml&lt;br /&gt;
 --aircraft-dir=path          Specify the exact directory to use for the&lt;br /&gt;
                              aircraft (normally not required, but may be&lt;br /&gt;
                              useful). Interpreted relatively to the&lt;br /&gt;
                              current directory. Causes the &amp;lt;path-cache&amp;gt;&lt;br /&gt;
                              from autosave_X_Y.xml, as well as&lt;br /&gt;
                              --fg-aircraft options and the FG_AIRCRAFT&lt;br /&gt;
                              environment variable to be bypassed.&lt;br /&gt;
 --show-aircraft              Print a list of the currently available&lt;br /&gt;
                              aircraft types&lt;br /&gt;
&lt;br /&gt;
==== Flight Model ====&lt;br /&gt;
&lt;br /&gt;
 --fdm=name                   Select the core flight dynamics model&lt;br /&gt;
                              Can be one of jsb, larcsim, yasim, magic,&lt;br /&gt;
                              balloon, ada, external, or null&lt;br /&gt;
 --aero=name                  Select aircraft aerodynamics model to load&lt;br /&gt;
 --model-hz=n                 Run the FDM this rate (iterations per second)&lt;br /&gt;
 --speed=n                    Run the FDM 'n' times faster than real time&lt;br /&gt;
 --notrim                     Do NOT attempt to trim the model&lt;br /&gt;
                              (only with fdm=jsbsim)&lt;br /&gt;
 --on-ground                  Start at ground level (default)&lt;br /&gt;
 --in-air                     Start in air (implied when using --altitude)&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
&lt;br /&gt;
==== Initial Position and Orientation ====&lt;br /&gt;
&lt;br /&gt;
 --airport=ID                 Specify airport (e.g. KOAK)&lt;br /&gt;
 --runway=rwy_no              Specify starting runway (must also specify an&lt;br /&gt;
                              airport)&lt;br /&gt;
 --vor=ID                     Specify starting position relative to a VOR&lt;br /&gt;
 --ndb=ID                     Specify starting position relative to an NDB&lt;br /&gt;
 --fix=ID                     Specify starting position relative to a fix&lt;br /&gt;
 --parkpos=NAME               Specify a gate at the airport (e.g. 747d11)&lt;br /&gt;
 --offset-distance=nm         Specify distance to reference point (statute&lt;br /&gt;
                              miles)&lt;br /&gt;
 --offset-azimuth=degrees     Specify heading to reference point&lt;br /&gt;
 --lon=degrees                Starting longitude (west = -)&lt;br /&gt;
 --lat=degrees                Starting latitude (south = -)&lt;br /&gt;
 --altitude=value             Starting altitude&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --heading=degrees            Specify heading (yaw) angle (Psi)&lt;br /&gt;
 --roll=degrees               Specify roll angle (Phi)&lt;br /&gt;
 --pitch=degrees              Specify pitch angle (Theta)&lt;br /&gt;
 --uBody=units_per_sec        Specify velocity along the body X axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vBody=units_per_sec        Specify velocity along the body Y axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --wBody=units_per_sec        Specify velocity along the body Z axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vc=knots                   Specify initial airspeed&lt;br /&gt;
 --mach=num                   Specify initial mach number&lt;br /&gt;
 --glideslope=degrees         Specify flight path angle (can be positive)&lt;br /&gt;
 --roc=fpm                    Specify initial climb rate (can be negative)&lt;br /&gt;
&lt;br /&gt;
==== Rendering Options ====&lt;br /&gt;
&lt;br /&gt;
 --bpp=depth                  Specify the bits per pixel&lt;br /&gt;
 --fog-disable                Disable fog/haze&lt;br /&gt;
 --fog-fastest                Enable fastest fog/haze&lt;br /&gt;
 --fog-nicest                 Enable nicest fog/haze&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --disable-enhanced-lighting  Disable enhanced runway lighting&lt;br /&gt;
 --enable-enhanced-lighting   Enable enhanced runway lighting&lt;br /&gt;
 --season=winter              Enable snow covered scenery&lt;br /&gt;
 --disable-distance-attenuation&lt;br /&gt;
                              Disable runway light distance attenuation&lt;br /&gt;
 --enable-distance-attenuation&lt;br /&gt;
                              Enable runway light distance attenuation&lt;br /&gt;
 --disable-specular-highlight&lt;br /&gt;
                              Disable specular reflections on textured&lt;br /&gt;
                              objects&lt;br /&gt;
 --enable-specular-highlight  Enable specular reflections on textured objects&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --fov=degrees                Specify field of view angle&lt;br /&gt;
 --disable-fullscreen         Disable fullscreen mode&lt;br /&gt;
 --enable-fullscreen          Enable fullscreen mode&lt;br /&gt;
 --shading-flat               Enable flat shading&lt;br /&gt;
 --shading-smooth             Enable smooth shading&lt;br /&gt;
 --disable-wireframe          Disable wireframe drawing mode&lt;br /&gt;
 --enable-wireframe           Enable wireframe drawing mode&lt;br /&gt;
 --geometry=WxH               Specify window geometry (640x480, etc)&lt;br /&gt;
 --view-offset=value          Specify the default forward view direction as&lt;br /&gt;
                              an offset from straight ahead. Allowable values&lt;br /&gt;
                              are LEFT, RIGHT, CENTER, or a specific number&lt;br /&gt;
                              in degrees&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --texture-filtering=number   Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
==== Hud Options ====&lt;br /&gt;
&lt;br /&gt;
 --hud-tris                   Hud displays number of triangles rendered&lt;br /&gt;
 --hud-culled                 Hud displays percentage of triangles culled&lt;br /&gt;
&lt;br /&gt;
==== Time Options ====&lt;br /&gt;
&lt;br /&gt;
   --timeofday={dawn,noon,dusk,midnight}&lt;br /&gt;
                                Specify a time of day&lt;br /&gt;
   --time-offset=[+-]hh:mm:ss   Add this time offset&lt;br /&gt;
   --time-match-real            Synchronize time with current time at chosen airport&lt;br /&gt;
   --time-match-local           Synchronize time with system time of computer&lt;br /&gt;
   --start-date-sys=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                                Specify a starting date/time with respect to&lt;br /&gt;
                                system time&lt;br /&gt;
   --start-date-gmt=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                                Specify a starting date/time with respect to&lt;br /&gt;
                                Greenwich Mean Time&lt;br /&gt;
   --start-date-lat=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                                Specify a starting date/time with respect to&lt;br /&gt;
                                Local Aircraft Time&lt;br /&gt;
&lt;br /&gt;
==== Network Options ====&lt;br /&gt;
&lt;br /&gt;
   --httpd=port                 Enable http server on the specified port&lt;br /&gt;
   --telnet=port                Enable telnet server on the specified port&lt;br /&gt;
   --jpg-httpd=port             Enable screen shot http server on the specified&lt;br /&gt;
                                port&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== MultiPlayer Options ====&lt;br /&gt;
&lt;br /&gt;
   --callsign                   assign a unique name to a player&lt;br /&gt;
   --multiplay={in|out},hz,address,port&lt;br /&gt;
                                Specify multipilot communication settings&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Route/Way Point Options ====&lt;br /&gt;
&lt;br /&gt;
   --wp=ID[@alt]                Specify a waypoint for the GC autopilot;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
   --flight-plan=file           Read all waypoints from a file&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== IO Options ====&lt;br /&gt;
&lt;br /&gt;
   --generic=params             Open connection using a predefined&lt;br /&gt;
                                communication interface and a preselected&lt;br /&gt;
                                communication protocol&lt;br /&gt;
   --garmin=params              Open connection using the Garmin GPS protocol&lt;br /&gt;
   --joyclient=params           Open connection to an Agwagon joystick&lt;br /&gt;
   --jsclient=params            Open connection to a remote joystick&lt;br /&gt;
   --native-ctrls=params        Open connection using the FG Native Controls&lt;br /&gt;
                                protocol&lt;br /&gt;
   --native-fdm=params          Open connection using the FG Native FDM&lt;br /&gt;
                                protocol&lt;br /&gt;
   --native=params              Open connection using the FG Native protocol&lt;br /&gt;
   --nmea=params                Open connection using the NMEA protocol&lt;br /&gt;
   --opengc=params              Open connection using the OpenGC protocol&lt;br /&gt;
   --props=params               Open connection using the interactive property&lt;br /&gt;
                                manager (LEGACY/DEAD DO NOT USE same as --telnet)&lt;br /&gt;
   --pve=params                 Open connection using the PVE protocol&lt;br /&gt;
   --ray=params                 Open connection using the Ray Woodworth motion&lt;br /&gt;
                                chair protocol&lt;br /&gt;
   --rul=params                 Open connection using the RUL protocol&lt;br /&gt;
   --atc610x                    Enable atc610x interface&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: --generic=\\.\COM10,out,1,/tmp/data.xml,myproto&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
==== Avionics Options ====&lt;br /&gt;
&lt;br /&gt;
   --com1=frequency             Set the COM1 radio frequency.&lt;br /&gt;
   --com2=frequency             Set the COM2 radio frequency.&lt;br /&gt;
   --nav1=[radial:]frequency    Set the NAV1 radio frequency, optionally&lt;br /&gt;
                                preceded by a radial.&lt;br /&gt;
   --nav2=[radial:]frequency    Set the NAV2 radio frequency, optionally&lt;br /&gt;
                                preceded by a radial.&lt;br /&gt;
   --adf=[rotation:]frequency   Set the ADF radio frequency, optionally&lt;br /&gt;
                                preceded by a card rotation.&lt;br /&gt;
   --dme={nav1|nav2|frequency}  Slave the ADF to one of the NAV radios, or set&lt;br /&gt;
                                its internal frequency.&lt;br /&gt;
&lt;br /&gt;
==== Environment Options ====&lt;br /&gt;
&lt;br /&gt;
   --disable-real-weather-fetch&lt;br /&gt;
                                Disable METAR based real weather fetching&lt;br /&gt;
   --enable-real-weather-fetch  Enable METAR based real weather fetching (this&lt;br /&gt;
                                requires an open internet connection)&lt;br /&gt;
   --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                                horizon&lt;br /&gt;
   --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                                horizon&lt;br /&gt;
   --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
   --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
   --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
   --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
   --visibility=meters          Specify initial visibility&lt;br /&gt;
   --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
   --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                                (knots)&lt;br /&gt;
   --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                                (severe)&lt;br /&gt;
   --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                                Create an overcast ceiling, optionally with a&lt;br /&gt;
                                specific thickness (defaults to 2000 ft).&lt;br /&gt;
   --random-wind&lt;br /&gt;
   --metar=&amp;quot;metar string&amp;quot;       Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
==== Situation Options ====&lt;br /&gt;
&lt;br /&gt;
   --failure={pitot|static|system|vacuum}&lt;br /&gt;
                                Fail the pitot, static, vacuum, or electrical&lt;br /&gt;
                                system (repeat the option for multiple system&lt;br /&gt;
                                failures).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Debugging Options ====&lt;br /&gt;
&lt;br /&gt;
   --log-level={bulk|debug|info|warn|alert}&lt;br /&gt;
                                Set the logging level for this session.&lt;br /&gt;
                                0=verbose, 5=alerts only&lt;br /&gt;
   --pid=/pathto/some/file.pid  Write current PID into file.&lt;br /&gt;
   --trace-read=property        Trace the reads for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
   --trace-write=property       Trace the writes for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
&lt;br /&gt;
=== Source files ===&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115814</id>
		<title>Command line options</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Command_line_options&amp;diff=115814"/>
		<updated>2018-08-09T15:00:21Z</updated>

		<summary type="html">&lt;p&gt;Wkitty42: /* Rendering Options */ alignment with other options&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Command line options''' are a common way to tell applications what to do/how to act on startup. With [[FlightGear]] they are used for many things, from simple ones like selecting an aircraft up to complex stuff like network traffic and weather parameters.&lt;br /&gt;
&lt;br /&gt;
The easiest way to handle those options for FlightGear is using a tool with a graphical user interface like the [[FlightGear Qt launcher]]. This way one doesn't have to bother about them at all.&lt;br /&gt;
&lt;br /&gt;
However, there are users who don't want or are not able to run a GUI and therefore are interested in this. Those who need them or just want to learn more about FlightGear, but have no idea what we are talking about, may read the wiki page on the general usage of the [[command line]].&lt;br /&gt;
&lt;br /&gt;
A good place to store the personal options is a file called [[fgfsrc]]. This file is read by FlightGear on each startup.&lt;br /&gt;
&lt;br /&gt;
The following lists show the options for FlightGear including a short description and sorted by categories. Please have in mind that keeping those lists up to date on the wiki is not an easy task. Also there are different versions of FlightGear out there which don't share exactly the same options. Therefore you better also check your versions ones with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. If this command fails, you may add the option &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; as well, see below.&lt;br /&gt;
&lt;br /&gt;
It is sad but true, not even this command is, at least in Git, up to date all the time. At the time of writing at least one option which is supported is not shown with &amp;lt;code&amp;gt;fgfs --help --verbose&amp;lt;/code&amp;gt;. So if you have serious issues with an option, the source code is, as always, also the best source for info. In the file ''src/Main/options.cxx'' all the options are listed with their hard coded ''default'' setting and type.&lt;br /&gt;
&lt;br /&gt;
The file [[$FG_ROOT]]/options.xml is used to generate the output for &amp;lt;code&amp;gt;fgfs --help [--verbose]&amp;lt;/code&amp;gt;. That's the reason why &amp;lt;code&amp;gt;--fg-root=[path]&amp;lt;/code&amp;gt; has to be added to this, if it is not set as environmental variable or as option in fgfsrc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;code&amp;gt;fgfs [OPTION [OPTION ...]]&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== General Options ====&lt;br /&gt;
&lt;br /&gt;
 --help, -h                   Show the most relevant command line options&lt;br /&gt;
 --verbose, -v                Show all command line options when combined with --help or -h&lt;br /&gt;
 --fg-root=path               Specify the root data path&lt;br /&gt;
 --fg-scenery=path[:path...]  Specify the base scenery path;&lt;br /&gt;
                                Defaults to [[$FG_ROOT]]/Scenery&lt;br /&gt;
 --language=code              Select the language for this session&lt;br /&gt;
 --launcher                   Enable Qt launcher &lt;br /&gt;
 --disable-fullscreen         Disable full-screen game mode&lt;br /&gt;
 --enable-fullscreen          Enable full-screen game mode&lt;br /&gt;
 --disable-splash-screen      Disable splash screen&lt;br /&gt;
 --enable-splash-screen       Enable splash screen&lt;br /&gt;
 --disable-mouse-pointer      Disable extra mouse pointer&lt;br /&gt;
 --enable-mouse-pointer       Enable extra mouse pointer&lt;br /&gt;
                                (i.e. for full screen Voodoo based cards)&lt;br /&gt;
 --disable-random-objects     Exclude random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --enable-random-objects      Include random scenery objects&lt;br /&gt;
                                (buildings, etc.)&lt;br /&gt;
 --disable-ai-models          Disable the AI subsystem.&lt;br /&gt;
                                (This also disables showing the models of other&lt;br /&gt;
                                 multiplayer aircraft)&lt;br /&gt;
 --enable-ai-models           Enable the AI subsystem.&lt;br /&gt;
 --disable-ai-traffic         Disable the autogenerated traffic subsystem.&lt;br /&gt;
 --enable-ai-traffic          Enable the autogenerated traffic subsystem.&lt;br /&gt;
 --disable-freeze             Start in a running state&lt;br /&gt;
 --enable-freeze              Start in a frozen state&lt;br /&gt;
 --disable-fuel-freeze        Fuel is consumed normally&lt;br /&gt;
 --enable-fuel-freeze         Fuel tank quantity forced to remain constant&lt;br /&gt;
 --disable-clock-freeze       Clock advances normally&lt;br /&gt;
 --enable-clock-freeze        Do not advance clock&lt;br /&gt;
 --enable-auto-coordination   Enable auto coordination - rudder and&lt;br /&gt;
                              ailerons will be controlled together&lt;br /&gt;
 --disable-auto-coordination  Disable auto coordination (default)&lt;br /&gt;
 --browser-app=path           Specify path to your web browser&lt;br /&gt;
 --prop:name=value            Set property  to &lt;br /&gt;
 --config=path                Load additional properties from path&lt;br /&gt;
 --units-feet                 Use feet for distances&lt;br /&gt;
 --units-meters               Use meters for distances&lt;br /&gt;
&lt;br /&gt;
==== Features ====&lt;br /&gt;
&lt;br /&gt;
 --disable-panel              Disable instrument panel&lt;br /&gt;
 --enable-panel               Enable instrument panel&lt;br /&gt;
 --disable-sound              Disable sound effects&lt;br /&gt;
 --enable-sound               Enable sound effects&lt;br /&gt;
 --disable-hud                Disable Heads Up Display (HUD)&lt;br /&gt;
 --enable-hud                 Enable Heads Up Display (HUD)&lt;br /&gt;
 --disable-anti-alias-hud     Disable anti-aliased HUD&lt;br /&gt;
 --enable-anti-alias-hud      Enable anti-aliased HUD&lt;br /&gt;
 --disable-hud-3d             Disable 3D HUD&lt;br /&gt;
 --enable-hud-3d              Enable 3D HUD&lt;br /&gt;
 --ai-scenario=scenario       Add and enable a new scenario. Multiple options&lt;br /&gt;
                              are allowed. Scenarios are in /[[$FG_ROOT]]/AI/.&lt;br /&gt;
&lt;br /&gt;
==== Aircraft ====&lt;br /&gt;
&lt;br /&gt;
 --aircraft=name              Select an aircraft profile as defined by a top&lt;br /&gt;
                              level -set.xml&lt;br /&gt;
 --aircraft-dir=path          Specify the exact directory to use for the&lt;br /&gt;
                              aircraft (normally not required, but may be&lt;br /&gt;
                              useful). Interpreted relatively to the&lt;br /&gt;
                              current directory. Causes the &amp;lt;path-cache&amp;gt;&lt;br /&gt;
                              from autosave_X_Y.xml, as well as&lt;br /&gt;
                              --fg-aircraft options and the FG_AIRCRAFT&lt;br /&gt;
                              environment variable to be bypassed.&lt;br /&gt;
 --show-aircraft              Print a list of the currently available&lt;br /&gt;
                              aircraft types&lt;br /&gt;
&lt;br /&gt;
==== Flight Model ====&lt;br /&gt;
&lt;br /&gt;
 --fdm=name                   Select the core flight dynamics model&lt;br /&gt;
                              Can be one of jsb, larcsim, yasim, magic,&lt;br /&gt;
                              balloon, ada, external, or null&lt;br /&gt;
 --aero=name                  Select aircraft aerodynamics model to load&lt;br /&gt;
 --model-hz=n                 Run the FDM this rate (iterations per second)&lt;br /&gt;
 --speed=n                    Run the FDM 'n' times faster than real time&lt;br /&gt;
 --notrim                     Do NOT attempt to trim the model&lt;br /&gt;
                              (only with fdm=jsbsim)&lt;br /&gt;
 --on-ground                  Start at ground level (default)&lt;br /&gt;
 --in-air                     Start in air (implied when using --altitude)&lt;br /&gt;
 --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                              (knots)&lt;br /&gt;
 --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                              (severe)&lt;br /&gt;
 --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                              Create an overcast ceiling, optionally with a&lt;br /&gt;
                              specific thickness (defaults to 2000 ft).&lt;br /&gt;
&lt;br /&gt;
==== Initial Position and Orientation ====&lt;br /&gt;
&lt;br /&gt;
 --airport=ID                 Specify airport (e.g. KOAK)&lt;br /&gt;
 --runway=rwy_no              Specify starting runway (must also specify an&lt;br /&gt;
                              airport)&lt;br /&gt;
 --vor=ID                     Specify starting position relative to a VOR&lt;br /&gt;
 --ndb=ID                     Specify starting position relative to an NDB&lt;br /&gt;
 --fix=ID                     Specify starting position relative to a fix&lt;br /&gt;
 --parkpos=NAME               Specify a gate at the airport (e.g. 747d11)&lt;br /&gt;
 --offset-distance=nm         Specify distance to reference point (statute&lt;br /&gt;
                              miles)&lt;br /&gt;
 --offset-azimuth=degrees     Specify heading to reference point&lt;br /&gt;
 --lon=degrees                Starting longitude (west = -)&lt;br /&gt;
 --lat=degrees                Starting latitude (south = -)&lt;br /&gt;
 --altitude=value             Starting altitude&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --heading=degrees            Specify heading (yaw) angle (Psi)&lt;br /&gt;
 --roll=degrees               Specify roll angle (Phi)&lt;br /&gt;
 --pitch=degrees              Specify pitch angle (Theta)&lt;br /&gt;
 --uBody=units_per_sec        Specify velocity along the body X axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vBody=units_per_sec        Specify velocity along the body Y axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --wBody=units_per_sec        Specify velocity along the body Z axis&lt;br /&gt;
                              (in feet unless --units-meters specified)&lt;br /&gt;
 --vc=knots                   Specify initial airspeed&lt;br /&gt;
 --mach=num                   Specify initial mach number&lt;br /&gt;
 --glideslope=degrees         Specify flight path angle (can be positive)&lt;br /&gt;
 --roc=fpm                    Specify initial climb rate (can be negative)&lt;br /&gt;
&lt;br /&gt;
==== Rendering Options ====&lt;br /&gt;
&lt;br /&gt;
 --bpp=depth                  Specify the bits per pixel&lt;br /&gt;
 --fog-disable                Disable fog/haze&lt;br /&gt;
 --fog-fastest                Enable fastest fog/haze&lt;br /&gt;
 --fog-nicest                 Enable nicest fog/haze&lt;br /&gt;
 --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                              horizon&lt;br /&gt;
 --disable-enhanced-lighting  Disable enhanced runway lighting&lt;br /&gt;
 --enable-enhanced-lighting   Enable enhanced runway lighting&lt;br /&gt;
 --season=winter              Enable snow covered scenery&lt;br /&gt;
 --disable-distance-attenuation&lt;br /&gt;
                              Disable runway light distance attenuation&lt;br /&gt;
 --enable-distance-attenuation&lt;br /&gt;
                              Enable runway light distance attenuation&lt;br /&gt;
 --disable-specular-highlight&lt;br /&gt;
                              Disable specular reflections on textured&lt;br /&gt;
                              objects&lt;br /&gt;
 --enable-specular-highlight  Enable specular reflections on textured objects&lt;br /&gt;
 --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
 --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
 --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
 --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
 --fov=degrees                Specify field of view angle&lt;br /&gt;
 --disable-fullscreen         Disable fullscreen mode&lt;br /&gt;
 --enable-fullscreen          Enable fullscreen mode&lt;br /&gt;
 --shading-flat               Enable flat shading&lt;br /&gt;
 --shading-smooth             Enable smooth shading&lt;br /&gt;
 --disable-wireframe          Disable wireframe drawing mode&lt;br /&gt;
 --enable-wireframe           Enable wireframe drawing mode&lt;br /&gt;
 --geometry=WxH               Specify window geometry (640x480, etc)&lt;br /&gt;
 --view-offset=value          Specify the default forward view direction as&lt;br /&gt;
                              an offset from straight ahead. Allowable values&lt;br /&gt;
                              are LEFT, RIGHT, CENTER, or a specific number&lt;br /&gt;
                              in degrees&lt;br /&gt;
 --visibility=meters          Specify initial visibility&lt;br /&gt;
 --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
 --texture-filtering=number   Specify anisotropic filtering of terrain textures. Valid values is 1, 2, 4, 8, 16. Default is 1.&lt;br /&gt;
&lt;br /&gt;
==== Hud Options ====&lt;br /&gt;
&lt;br /&gt;
   --hud-tris                   Hud displays number of triangles rendered&lt;br /&gt;
   --hud-culled                 Hud displays percentage of triangles culled&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Time Options ====&lt;br /&gt;
&lt;br /&gt;
   --timeofday={dawn,noon,dusk,midnight}&lt;br /&gt;
                                Specify a time of day&lt;br /&gt;
   --time-offset=[+-]hh:mm:ss   Add this time offset&lt;br /&gt;
   --time-match-real            Synchronize time with current time at chosen airport&lt;br /&gt;
   --time-match-local           Synchronize time with system time of computer&lt;br /&gt;
   --start-date-sys=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                                Specify a starting date/time with respect to&lt;br /&gt;
                                system time&lt;br /&gt;
   --start-date-gmt=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                                Specify a starting date/time with respect to&lt;br /&gt;
                                Greenwich Mean Time&lt;br /&gt;
   --start-date-lat=yyyy:mm:dd:hh:mm:ss&lt;br /&gt;
                                Specify a starting date/time with respect to&lt;br /&gt;
                                Local Aircraft Time&lt;br /&gt;
&lt;br /&gt;
==== Network Options ====&lt;br /&gt;
&lt;br /&gt;
   --httpd=port                 Enable http server on the specified port&lt;br /&gt;
   --telnet=port                Enable telnet server on the specified port&lt;br /&gt;
   --jpg-httpd=port             Enable screen shot http server on the specified&lt;br /&gt;
                                port&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== MultiPlayer Options ====&lt;br /&gt;
&lt;br /&gt;
   --callsign                   assign a unique name to a player&lt;br /&gt;
   --multiplay={in|out},hz,address,port&lt;br /&gt;
                                Specify multipilot communication settings&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Route/Way Point Options ====&lt;br /&gt;
&lt;br /&gt;
   --wp=ID[@alt]                Specify a waypoint for the GC autopilot;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
   --flight-plan=file           Read all waypoints from a file&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== IO Options ====&lt;br /&gt;
&lt;br /&gt;
   --generic=params             Open connection using a predefined&lt;br /&gt;
                                communication interface and a preselected&lt;br /&gt;
                                communication protocol&lt;br /&gt;
   --garmin=params              Open connection using the Garmin GPS protocol&lt;br /&gt;
   --joyclient=params           Open connection to an Agwagon joystick&lt;br /&gt;
   --jsclient=params            Open connection to a remote joystick&lt;br /&gt;
   --native-ctrls=params        Open connection using the FG Native Controls&lt;br /&gt;
                                protocol&lt;br /&gt;
   --native-fdm=params          Open connection using the FG Native FDM&lt;br /&gt;
                                protocol&lt;br /&gt;
   --native=params              Open connection using the FG Native protocol&lt;br /&gt;
   --nmea=params                Open connection using the NMEA protocol&lt;br /&gt;
   --opengc=params              Open connection using the OpenGC protocol&lt;br /&gt;
   --props=params               Open connection using the interactive property&lt;br /&gt;
                                manager (LEGACY/DEAD DO NOT USE same as --telnet)&lt;br /&gt;
   --pve=params                 Open connection using the PVE protocol&lt;br /&gt;
   --ray=params                 Open connection using the Ray Woodworth motion&lt;br /&gt;
                                chair protocol&lt;br /&gt;
   --rul=params                 Open connection using the RUL protocol&lt;br /&gt;
   --atc610x                    Enable atc610x interface&lt;br /&gt;
&lt;br /&gt;
Under Windows, you must use a special escape sequence if you need to specify a COM port higher than 9.&lt;br /&gt;
&lt;br /&gt;
Example: --generic=\\.\COM10,out,1,/tmp/data.xml,myproto&lt;br /&gt;
&lt;br /&gt;
This is per the Microsoft KB article here: http://msdn.microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx&lt;br /&gt;
&lt;br /&gt;
==== Avionics Options ====&lt;br /&gt;
&lt;br /&gt;
   --com1=frequency             Set the COM1 radio frequency.&lt;br /&gt;
   --com2=frequency             Set the COM2 radio frequency.&lt;br /&gt;
   --nav1=[radial:]frequency    Set the NAV1 radio frequency, optionally&lt;br /&gt;
                                preceded by a radial.&lt;br /&gt;
   --nav2=[radial:]frequency    Set the NAV2 radio frequency, optionally&lt;br /&gt;
                                preceded by a radial.&lt;br /&gt;
   --adf=[rotation:]frequency   Set the ADF radio frequency, optionally&lt;br /&gt;
                                preceded by a card rotation.&lt;br /&gt;
   --dme={nav1|nav2|frequency}  Slave the ADF to one of the NAV radios, or set&lt;br /&gt;
                                its internal frequency.&lt;br /&gt;
&lt;br /&gt;
==== Environment Options ====&lt;br /&gt;
&lt;br /&gt;
   --disable-real-weather-fetch&lt;br /&gt;
                                Disable METAR based real weather fetching&lt;br /&gt;
   --enable-real-weather-fetch  Enable METAR based real weather fetching (this&lt;br /&gt;
                                requires an open internet connection)&lt;br /&gt;
   --disable-horizon-effect     Disable celestial body growth illusion near the&lt;br /&gt;
                                horizon&lt;br /&gt;
   --enable-horizon-effect      Enable celestial body growth illusion near the&lt;br /&gt;
                                horizon&lt;br /&gt;
   --enable-clouds              Enable 2D (flat) cloud layers&lt;br /&gt;
   --disable-clouds             Disable 2D (flat) cloud layers&lt;br /&gt;
   --enable-clouds3d            Enable 3D (volumetric) cloud layers&lt;br /&gt;
   --disable-clouds3d           Disable 3D (volumetric) cloud layers&lt;br /&gt;
   --visibility=meters          Specify initial visibility&lt;br /&gt;
   --visibility-miles=miles     Specify initial visibility in miles&lt;br /&gt;
   --wind=DIR@SPEED             Specify wind coming from DIR (degrees) at SPEED&lt;br /&gt;
                                (knots)&lt;br /&gt;
   --turbulence=0.0 to 1.0      Specify turbulence from 0.0 (calm) to 1.0&lt;br /&gt;
                                (severe)&lt;br /&gt;
   --ceiling=FT_ASL[:THICKNESS_FT]&lt;br /&gt;
                                Create an overcast ceiling, optionally with a&lt;br /&gt;
                                specific thickness (defaults to 2000 ft).&lt;br /&gt;
   --random-wind&lt;br /&gt;
   --metar=&amp;quot;metar string&amp;quot;       Starts with a certain METAR string. Only works if live weather is disabled.&lt;br /&gt;
&lt;br /&gt;
==== Situation Options ====&lt;br /&gt;
&lt;br /&gt;
   --failure={pitot|static|system|vacuum}&lt;br /&gt;
                                Fail the pitot, static, vacuum, or electrical&lt;br /&gt;
                                system (repeat the option for multiple system&lt;br /&gt;
                                failures).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Debugging Options ====&lt;br /&gt;
&lt;br /&gt;
   --log-level={bulk|debug|info|warn|alert}&lt;br /&gt;
                                Set the logging level for this session.&lt;br /&gt;
                                0=verbose, 5=alerts only&lt;br /&gt;
   --pid=/pathto/some/file.pid  Write current PID into file.&lt;br /&gt;
   --trace-read=property        Trace the reads for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
   --trace-write=property       Trace the writes for a property;&lt;br /&gt;
                                multiple instances can be used&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Command line]]&lt;br /&gt;
&lt;br /&gt;
=== Source files ===&lt;br /&gt;
* {{fgdata file|options.xml}}&lt;br /&gt;
* {{flightgear file|src/Main/options.hxx}}&lt;br /&gt;
* {{flightgear file|src/Main/options.cxx}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
[[de:Command Line Options]]&lt;br /&gt;
[[fr:Options de ligne de commande]]&lt;/div&gt;</summary>
		<author><name>Wkitty42</name></author>
	</entry>
</feed>